diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 50d48a2cb..f142cd30e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,73 +1,88 @@ -# Contributing to MineClone 5 -So you want to MineClone 5? -Wow, thank you! :-) - -But first, some things to note: - -MineClone 5's development target is to make a free software clone of Minecraft + some Optifine features supported by the Minetest Engine. - -MineClone 5 is maintained by kay27 and the Community. - -You can find us in: -- [Mesehub issue tracker](https://git.minetest.land/MineClone5/MineClone5/issues), -- [Minetest forums](https://forum.minetest.net/viewtopic.php?f=50&t=16407), -- IRC in the #mineclone2 channel on irc.freenode.net, , -- [Matrix](https://app.element.io/#/room/#mc2:matrix.org). - -There is **no** guarantee we will accept anything from anybody. - -By sending us patches or asking us to include your changes in this game, you agree that they fall under the terms of the GPLv3, which basically means they will become part of a free software. - -## The suggested workflow - -Fork the repository and clone your fork. - -Before you start coding, consider opening an issue at Mesehub to discuss the suitability and implementation of your intended contribution with the core developers. - -Any Pull Request that isn't a bug fix can be closed within a week unless it receives a concept approval from the Community. For this reason, it is recommended that you open an issue for any such pull requests before doing the work, to avoid disappointment. - -Start coding! - -Refer to Minetest Lua API, Developer Wiki and other documentation. - -Follow Lua code style guidelines. Use tabs, not spaces for indentation (tab size = 8). Never use `minetest.env`. - -Check your code works as expected. - -Commit & push your changes to a new branch (not master, one change per branch) - -Commit messages should use the present tense and be descriptive. - -Once you are happy with your changes, submit a pull request. - -A pull-request is considered merge-able when: - -#### Contributors - -Contributors are credited in `CREDITS.md`. - -## Audio and visual assets - -Audio and visual assets are subject to different licensing *(see LEGAL.md)* compared to the source code of the game. Because our goal is to offer a free and open source game similar to Minecraft, it is important that all contributions are original work licensed under a license that allows copying, the modification and distribution of either original or modified assets. - -If you want to contribute assets based on existing work, make sure you honor their license and don't do minor tweaks to works released under restrictive licenses that prohibit modification and distribution. We will make a reasonable effort to determine if the contributed work is appropriate for our project and we ask you to do your part in creating and offering contributions that will not be subject to legal issues. - -### Audio - -We greatly appreciate contributions that enhance the game experience in a non-visual way and all we ask is that your contribution won't give anyone legal headaches. :) - -### Visual -We mainly use the [Pixel Perfection texture pack](https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/resource-packs/1242533-pixel-perfection-now-with-polar-bears-1-11) created by XSSheep and its faithful continuation [Pixel Perfection Legacy](https://www.planetminecraft.com/texture-pack/pixel-perfection-chorus-edit/) by Nova_Wostra and other members of the Minecraft community. - -The rest of the graphics were done in a similar style, for visual consistency reasons. If the graphics necessary for your contribution are not yet available, there are options: -- contacting Nova_Wostra, who is likely aware of the missing assets and can offer a time frame for their completion; -- create it yourself in a similar style and contribute it directly to their texture pack under the same permissive license that allows everyone, including us, to use it; -- contact us by opening a discussion in our issue tracker, and we'll find a solution. - -## Reporting bugs -Report all bugs here: - - - -## Direct discussion -See contacts at the top of the page. +# Contributing to MineClone 5 +So you want to MineClone 5? +Wow, thank you! :-) + +But first, some things to note: + +MineClone 5's development target is to make a free software clone of Minecraft + some Optifine features supported by the Minetest Engine. + +MineClone 5 is maintained by kay27 and the Community. + +You can find us in: +- [Mesehub issue tracker](https://git.minetest.land/MineClone5/MineClone5/issues), +- [Minetest forums](https://forum.minetest.net/viewtopic.php?f=50&t=27107), +- [Discord](https://discord.gg/PUm5YRn7dX). + +There is **no** guarantee we will accept anything from anybody. + +By sending us patches or asking us to include your changes in this game, you agree that they fall under the terms of the GPLv3, which basically means they will become part of a free software. + +## The suggested workflow + +Fork the repository and clone your fork. + +Before you start coding, consider opening an issue at Mesehub to discuss the suitability and implementation of your intended contribution with the core developers. + +Any Pull Request that isn't a bug fix can be closed within a week unless it receives a concept approval from the Community. For this reason, it is recommended that you open an issue for any such pull requests before doing the work, to avoid disappointment. + +Start coding! + +Refer to [Minetest Lua API](https://github.com/minetest/minetest/blob/master/doc/lua_api.txt), [Developer Wiki](https://dev.minetest.net/), [MineClone 5 Wiki](https://git.minetest.land/MineClone5/MineClone5/wiki/) and other documentation. + +Follow [Lua code style guidelines](https://dev.minetest.net/Lua_code_style_guidelines). Use tabs, not spaces for indentation (tab size = 8). Never use `minetest.env`. + +Check your code works as expected. + +Commit & push your changes to a new branch (not master, one change per a branch). + +Commit messages should use the present tense and be descriptive. + +Once you are happy with your changes, submit a pull request. + +A pull-request is considered merge-able when it looks good to one person from the community. + +Please invite other developers to review your contribution when you know they are online. If there is no any reaction during 24 hours after posting the invitation and pinging developers - you are welcome to do a self-review and merge the request. + +If someone else's contribution looks good to you - you are free to merge it ASAP. + +Different git branches are welcomed! Releases by different people are welcomed! Releases from different branches are welcomed! Frequent releases are welcomed! + +It is nice not to block other developers by your work and don't dictate them what to do, unsless they really want that. Git branches and forks are recommended to avoid conflicts at development stage. + +It is nice to try splitting big features into small steps. + +It is nice to create an issue for any work and mention the issue in the commit text, like `#123 Fix blast resistance of cactus`, where `#123` is the issue number. + +Actually, it looks like we all love what we do, so any stupid situations should be carefully discussed before merging into upstreams. But nothing prevents us from releasing controversial stuff through dedicated branches. Release your contribution when you need more feedback. + +Feel free to break the rules if you're sure you have to. + +#### Contributors + +Contributors are credited in `CREDITS.md`. + +## Audio and visual assets + +Audio and visual assets are subject to different licensing *(see LEGAL.md)* compared to the source code of the game. Because our goal is to offer a free and open source game similar to Minecraft, it is important that all contributions are original work licensed under a license that allows copying, the modification and distribution of either original or modified assets. + +If you want to contribute assets based on existing work, make sure you honor their license and don't do minor tweaks to works released under restrictive licenses that prohibit modification and distribution. We will make a reasonable effort to determine if the contributed work is appropriate for our project and we ask you to do your part in creating and offering contributions that will not be subject to legal issues. + +### Audio + +We greatly appreciate contributions that enhance the game experience in a non-visual way and all we ask is that your contribution won't give anyone legal headaches. :) + +### Visual +We mainly use the [Pixel Perfection texture pack](https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/resource-packs/1242533-pixel-perfection-now-with-polar-bears-1-11) created by XSSheep and its faithful continuation [Pixel Perfection Legacy](https://www.planetminecraft.com/texture-pack/pixel-perfection-chorus-edit/) by Nova_Wostra and other members of the Minecraft community. + +The rest of the graphics were done in a similar style, for visual consistency reasons. If the graphics necessary for your contribution are not yet available, there are options: +- contacting Nova_Wostra, who is likely aware of the missing assets and can offer a time frame for their completion; +- create it yourself in a similar style and contribute it directly to their texture pack under the same permissive license that allows everyone, including us, to use it; +- contact us by opening a discussion in our issue tracker, and we'll find a solution. + +## Reporting bugs +Report all bugs here: + + + +## Direct discussion +See contacts at the top of the page. diff --git a/CREDITS.md b/CREDITS.md index bd8a49e65..22d78fe98 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -43,6 +43,7 @@ * Laurent Rocher * Li0n * Marcin Serwin +* Mental-Inferno * Midgard * MysticTempest * Nicholas Niro @@ -105,6 +106,7 @@ ## Textures * XSSheep +* Nova_Wostra * Wuzzy * kingoscargames * leorockway diff --git a/GROUPS.md b/GROUPS.md index 0aba2c7da..c65b2eb46 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -71,6 +71,7 @@ Please read to learn how digging times * `coral_block=X`: Coral block (1 = alive, 2 = dead) * `coral_species=X`: Specifies the species of a coral; equal X means equal species * `set_on_fire=X`: Sets any (not fire-resistant) mob or player on fire for X seconds when touching +* `compostability`: Amount from 1 to 100 that defines the percentage of likelyhood that the composter will advance a level. #### Footnotes diff --git a/README.md b/README.md index 722f4cad9..e980efa91 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ # MineClone 5 -Version: 0.71.7 Release Candidate 0 MineClone 5 is a fork of MineClone 2 with different workflow: * No Minecraft version limitation, target version is Latest Java Edition @@ -70,9 +69,8 @@ Use the `/giveme` chat command to obtain them. See the in-game help for an explanation. ## Installation -This game requires [Minetest](http://minetest.net) to run (version 5.4.1 or -later). So you need to install Minetest first. Only stable versions of Minetest -are officially supported. +This game requires latest stable [Minetest](http://minetest.net) to run, please install +it first. Only stable versions of Minetest are officially supported. There is no support for running MineClone 5 in development versions of Minetest. To install MineClone 5 (if you haven't already), move this directory into the @@ -83,10 +81,8 @@ Minetest to learn more. The MineClone 5 repository is hosted at Mesehub. To contribute or report issues, head there. * Mesehub: -* IRC: -* Matrix: -* Reddit: -* Minetest forums: +* Minetest forums: +* Semi-official Discord: ## Project description The main goal of **MineClone 5** is to be a clone of Minecraft and to be released as free software. @@ -155,7 +151,7 @@ The following features are incomplete: * Special minecarts * A couple of non-trivial blocks and items -Bonus features (not found in Minecraft 1.12): +Bonus features (not found in Minecraft): * Built-in crafting guide which shows you crafting and smelting recipes * In-game help system containing extensive help about gameplay basics, blocks, items and more @@ -168,6 +164,7 @@ Bonus features (not found in Minecraft 1.12): * Nether Brick Fence Gate * Red Nether Brick Fence * Red Nether Brick Fence Gate +* Arbitrary-shaped Nether portals Technical differences from Minecraft: @@ -191,3 +188,7 @@ Technical differences from Minecraft: * `API.md`: For Minetest modders who want to mod this game * `LEGAL.md`: Legal information * `CREDITS.md`: List of everyone who contributed + +## Menu music + +* horizonchris96 — 02_what_we_ll_build_next diff --git a/menu/icon.png b/menu/icon.png index e479dfff5..6832f3f07 100644 Binary files a/menu/icon.png and b/menu/icon.png differ diff --git a/menu/theme.ogg b/menu/theme.ogg new file mode 100644 index 000000000..375d3ada0 Binary files /dev/null and b/menu/theme.ogg differ diff --git a/minetest.conf b/minetest.conf index 223587f4d..423ac3a34 100644 --- a/minetest.conf +++ b/minetest.conf @@ -32,6 +32,14 @@ movement_gravity = 10.4 # humid_rivers would cause the MushroomIsland biome to appear frequently around rivers. mgvalleys_spflags = noaltitude_chill,noaltitude_dry,nohumid_rivers,vary_river_depth +# From how far blocks are generated for clients, stated in mapblocks (16 nodes). +# Probably values >10 won't work because of numerous overridings. Type: int. +max_block_generate_distance = 13 + +# Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes). +# type: int +chunksize = 4 + # MCL2-specific stuff keepInventory = false diff --git a/mods/CORE/mcl_bubble_column/LICENSE b/mods/CORE/mcl_bubble_column/LICENSE deleted file mode 100644 index f288702d2..000000000 --- a/mods/CORE/mcl_bubble_column/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/mods/CORE/mcl_bubble_column/README.md b/mods/CORE/mcl_bubble_column/README.md deleted file mode 100644 index f56d30145..000000000 --- a/mods/CORE/mcl_bubble_column/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# mcl_bubble_column by j45 - -https://github.com/Minetest-j45/mcl_bubble_column/ - -Adds whirlpools and upwards bubble columns to Mineclone2/5 - -A bubble column is a block generated by placing magma blocks or soul sand in water (source). - -Bubble columns push or pull entities and items in certain directions. diff --git a/mods/CORE/mcl_bubble_column/init.lua b/mods/CORE/mcl_bubble_column/init.lua deleted file mode 100644 index ed3bcc5b3..000000000 --- a/mods/CORE/mcl_bubble_column/init.lua +++ /dev/null @@ -1,195 +0,0 @@ -mcl_bubble_column = {} - -minetest.register_abm{ - label = "bubbleColumnUpStop", - nodenames = {"group:water"}, - interval = 0.05, - chance = 1, - action = function(pos) - local meta = minetest.get_meta(pos) - if meta:get_int("bubbly") == 1 then--bubble column - --check down if current needs to be deleted - local downpos = vector.add(pos, {x = 0, y = -1, z = 0}) - local downposnode = minetest.get_node(downpos) - local downmeta = minetest.get_meta(downpos) - if (downmeta:get_int("bubbly") ~= 1 and downposnode.name ~= "mcl_nether:soul_sand") then - meta:set_int("bubbly", 0) - end - --check up to see if needs to go up - local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) - local upposnode = minetest.get_node(uppos) - local upmeta = minetest.get_meta(uppos) - if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("bubbly") ~= 1) then - upmeta:set_int("bubbly", 1) - end - elseif meta:get_int("whirly") == 1 then--whirlpool - --check down if current needs to be deleted - local downpos = vector.add(pos, {x = 0, y = -1, z = 0}) - local downposnode = minetest.get_node(downpos) - local downmeta = minetest.get_meta(downpos) - if (downmeta:get_int("whirly") ~= 1 and downposnode.name ~= "mcl_nether:magma") then - meta:set_int("whirly", 0) - end - --check up to see if needs to go up - local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) - local upposnode = minetest.get_node(uppos) - local upmeta = minetest.get_meta(uppos) - if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("whirly") ~= 1) then - upmeta:set_int("whirly", 1) - end - end - end, -} - -minetest.register_abm{ - label = "startBubbleColumn", - nodenames = {"mcl_nether:soul_sand"}, - interval = 0.05, - chance = 1, - action = function(pos) - local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) - local upposnode = minetest.get_node(uppos) - local upmeta = minetest.get_meta(uppos) - if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("bubbly") ~= 1) then - upmeta:set_int("bubbly", 1) - end - end, -} - -minetest.register_abm{ - label = "startWhirlpool", - nodenames = {"mcl_nether:magma"}, - interval = 0.05, - chance = 1, - action = function(pos) - local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) - local upposnode = minetest.get_node(uppos) - local upmeta = minetest.get_meta(uppos) - if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("whirly") ~= 1) then - upmeta:set_int("whirly", 1) - end - end, -} - - -mcl_bubble_column.on_enter_bubble_column = function(self) - local velocity = self:get_velocity() - --[[if down.name == "mcl_nether:soul_sand" then - self:add_velocity({x = 0, y = math.min(10, math.abs(velocity.y)+9.4), z = 0}) - else]] - self:add_velocity({x = 0, y = math.min(3.6, math.abs(velocity.y)+3), z = 0}) - --end -end - -mcl_bubble_column.on_enter_whirlpool = function(self) - local velocity = self:get_velocity() - --self:add_velocity({x = 0, y = math.max(-3, (-math.abs(velocity.y))-2), z = 0}) - self:add_velocity({x = 0, y = math.max(-0.3, (-math.abs(velocity.y))-0.03), z = 0}) -end - -mcl_bubble_column.on_enter_bubble_column_with_air_above = function(self) - local velocity = self:get_velocity() - --[[if down.name == "mcl_nether:soul_sand" then - self:add_velocity({x = 0, y = math.min(4.3, math.abs(velocity.y)+2.8), z = 0}) - else]] - self:add_velocity({x = 0, y = math.min(2.6, math.abs(velocity.y)+2), z = 0}) - --end -end - -mcl_bubble_column.on_enter_whirlpool_with_air_above = function(self) - local velocity = self:get_velocity() - --self:add_velocity({x = 0, y = math.max(-3.5, (-math.abs(velocity.y))-2), z = 0}) - self:add_velocity({x = 0, y = math.max(-0.9, (-math.abs(velocity.y))-0.03), z = 0}) -end - -minetest.register_abm{ - label = "entGo", - nodenames = {"group:water"}, - interval = 0.05, - chance = 1, - action = function(pos) - --if not bubble column block return - local meta = minetest.get_meta(pos) - if meta:get_int("bubbly") == 1 then - local up = minetest.get_node(vector.add(pos, {x = 0, y = 1, z = 0})) - for _,entity in pairs(minetest.get_objects_inside_radius(pos, 0.75)) do - if up.name == "air" then - mcl_bubble_column.on_enter_bubble_column_with_air_above(entity) - else - mcl_bubble_column.on_enter_bubble_column(entity) - end - end - elseif meta:get_int("whirly") == 1 then - local up = minetest.get_node(vector.add(pos, {x = 0, y = 1, z = 0})) - for _,entity in pairs(minetest.get_objects_inside_radius(pos, 0.75)) do - if up.name == "air" then - mcl_bubble_column.on_enter_whirlpool_with_air_above(entity) - else - mcl_bubble_column.on_enter_whirlpool(entity) - end - end - end - end, -} - -minetest.register_globalstep(function() - for _,player in ipairs(minetest.get_connected_players()) do - local ppos = player:get_pos() - local eyepos = {x = ppos.x, y = ppos.y + player:get_properties().eye_height, z = ppos.z} - local node = minetest.get_node(ppos) - local eyenode = minetest.get_node(eyepos) - local meta = minetest.get_meta(ppos) - local eyemeta = minetest.get_meta(eyepos) - - local eyemeta = minetest.get_meta(ppos) - --if minetest.get_item_group(node.name, "water") == 3 and minetest.get_item_group(eyenode.name, "water") == 3 then return end - if meta:get_int("bubbly") == 1 or eyemeta:get_int("bubbly") == 1 then - local up = minetest.get_node(vector.add(eyepos, {x = 0, y = 1, z = 0})) - if up.name == "air" then - mcl_bubble_column.on_enter_bubble_column_with_air_above(player) - else - mcl_bubble_column.on_enter_bubble_column(player) - end - elseif meta:get_int("whirly") == 1 or eyemeta:get_int("whirly") == 1 then - local up = minetest.get_node(vector.add(ppos, {x = 0, y = 1, z = 0})) - if up.name == "air" then - mcl_bubble_column.on_enter_whirlpool_with_air_above(player) - else - mcl_bubble_column.on_enter_whirlpool(player) - end - end - end -end) - ---abms to remove and replace old bubble columns/whirlpools -minetest.register_abm{ - label = "removeOldFlowingColumns", - nodenames = {"mcl_bubble_column:water_flowing_up", "mcl_bubble_column:water_flowing_down"}, - interval = 1,--reduce lag - chance = 1, - action = function(pos) - minetest.set_node(pos, {name = "air"}) - end, -} -minetest.register_abm{ - label = "replaceBubbleColumns", - nodenames = {"mcl_bubble_column:water_source_up"}, - interval = 1,--reduce lag - chance = 1, - action = function(pos) - minetest.set_node(pos, {name = "mcl_core:water_source"}) - local meta = minetest.get_meta(pos) - meta:set_int("bubbly", 1) - end, -} -minetest.register_abm{ - label = "replaceWhirlpools", - nodenames = {"mcl_bubble_column:water_source_down"}, - interval = 1,--reduce lag - chance = 1, - action = function(pos) - minetest.set_node(pos, {name = "mcl_core:water_source"}) - local meta = minetest.get_meta(pos) - meta:set_int("whirly", 1) - end, -} \ No newline at end of file diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr new file mode 100644 index 000000000..afa5e8261 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 est mort(e) dans une explosion \ No newline at end of file diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr new file mode 100644 index 000000000..a91c96b07 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 попал под взрыв. diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.zh_CN.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.zh_CN.tr new file mode 100644 index 000000000..664de1503 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.zh_CN.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 困于爆炸. \ No newline at end of file diff --git a/mods/CORE/mcl_explosions/locale/template.txt b/mods/CORE/mcl_explosions/locale/template.txt new file mode 100644 index 000000000..656b444f9 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.= \ No newline at end of file diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index 7e0d28e55..a495935f5 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -24,240 +24,9 @@ mcl_vars.inventory_header = "" -- Tool wield size mcl_vars.tool_wield_scale = { x = 1.8, y = 1.8, z = 1 } --- Mapgen variables -local mg_name = minetest.get_mapgen_setting("mg_name") -local minecraft_height_limit = 256 -local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" -local singlenode = mg_name == "singlenode" - --- Calculate mapgen_edge_min/mapgen_edge_max -mcl_vars.chunksize = math.max(1, tonumber(minetest.get_mapgen_setting("chunksize")) or 5) -mcl_vars.MAP_BLOCKSIZE = math.max(1, minetest.MAP_BLOCKSIZE or 16) -mcl_vars.mapgen_limit = math.max(1, tonumber(minetest.get_mapgen_setting("mapgen_limit")) or 31000) -mcl_vars.MAX_MAP_GENERATION_LIMIT = math.max(1, minetest.MAX_MAP_GENERATION_LIMIT or 31000) -local central_chunk_offset = -math.floor(mcl_vars.chunksize / 2) -mcl_vars.central_chunk_offset_in_nodes = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE -mcl_vars.chunk_size_in_nodes = mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE -local central_chunk_min_pos = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE -local central_chunk_max_pos = central_chunk_min_pos + mcl_vars.chunk_size_in_nodes - 1 -local ccfmin = central_chunk_min_pos - mcl_vars.MAP_BLOCKSIZE -- Fullminp/fullmaxp of central chunk, in nodes -local ccfmax = central_chunk_max_pos + mcl_vars.MAP_BLOCKSIZE -local mapgen_limit_b = math.floor(math.min(mcl_vars.mapgen_limit, mcl_vars.MAX_MAP_GENERATION_LIMIT) / mcl_vars.MAP_BLOCKSIZE) -local mapgen_limit_min = -mapgen_limit_b * mcl_vars.MAP_BLOCKSIZE -local mapgen_limit_max = (mapgen_limit_b + 1) * mcl_vars.MAP_BLOCKSIZE - 1 -local numcmin = math.max(math.floor((ccfmin - mapgen_limit_min) / mcl_vars.chunk_size_in_nodes), 0) -- Number of complete chunks from central chunk -local numcmax = math.max(math.floor((mapgen_limit_max - ccfmax) / mcl_vars.chunk_size_in_nodes), 0) -- fullminp/fullmaxp to effective mapgen limits. -mcl_vars.mapgen_edge_min = central_chunk_min_pos - numcmin * mcl_vars.chunk_size_in_nodes -mcl_vars.mapgen_edge_max = central_chunk_max_pos + numcmax * mcl_vars.chunk_size_in_nodes - -local function coordinate_to_block(x) - return math.floor(x / mcl_vars.MAP_BLOCKSIZE) -end - -local function coordinate_to_chunk(x) - return math.floor((coordinate_to_block(x) - central_chunk_offset) / mcl_vars.chunksize) -end - -function mcl_vars.pos_to_block(pos) - return { - x = coordinate_to_block(pos.x), - y = coordinate_to_block(pos.y), - z = coordinate_to_block(pos.z) - } -end - -function mcl_vars.pos_to_chunk(pos) - return { - x = coordinate_to_chunk(pos.x), - y = coordinate_to_chunk(pos.y), - z = coordinate_to_chunk(pos.z) - } -end - -local k_positive = math.ceil(mcl_vars.MAX_MAP_GENERATION_LIMIT / mcl_vars.chunk_size_in_nodes) -local k_positive_z = k_positive * 2 -local k_positive_y = k_positive_z * k_positive_z - -function mcl_vars.get_chunk_number(pos) -- unsigned int - local c = mcl_vars.pos_to_chunk(pos) - return - (c.y + k_positive) * k_positive_y + - (c.z + k_positive) * k_positive_z + - c.x + k_positive -end - -if not superflat and not singlenode then - -- Normal mode - --[[ Realm stacking (h is for height) - - Overworld (h>=256) - - Void (h>=1000) - - Realm Barrier (h=11), to allow escaping the End - - End (h>=256) - - Void (h>=1000) - - Nether (h=128) - - Void (h>=1000) - ]] - - -- Overworld - mcl_vars.mg_overworld_min = -62 - mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit - mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min - mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min + 4 - mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min + 10 - mcl_vars.mg_lava = true - mcl_vars.mg_bedrock_is_rough = true - -elseif singlenode then - mcl_vars.mg_overworld_min = -66 - mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit - mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min - mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min - mcl_vars.mg_lava = false - mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min - mcl_vars.mg_bedrock_is_rough = false -else - -- Classic superflat - local ground = minetest.get_mapgen_setting("mgflat_ground_level") - ground = tonumber(ground) - if not ground then - ground = 8 - end - mcl_vars.mg_overworld_min = ground - 3 - mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit - mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min - mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min - mcl_vars.mg_lava = false - mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min - mcl_vars.mg_bedrock_is_rough = false -end - -mcl_vars.mg_overworld_max = mcl_vars.mapgen_edge_max - --- The Nether (around Y = -29000) -mcl_vars.mg_nether_min = -29067 -- Carefully chosen to be at a mapchunk border -mcl_vars.mg_nether_max = mcl_vars.mg_nether_min + 128 -mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min -mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max -if not superflat then - mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4 - mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4 - mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31 -else - -- Thin bedrock in classic superflat mapgen - mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min - mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 2 -end -if mg_name == "flat" then - if superflat then - mcl_vars.mg_flat_nether_floor = mcl_vars.mg_bedrock_nether_bottom_max + 4 - mcl_vars.mg_flat_nether_ceiling = mcl_vars.mg_bedrock_nether_bottom_max + 52 - else - mcl_vars.mg_flat_nether_floor = mcl_vars.mg_lava_nether_max + 4 - mcl_vars.mg_flat_nether_ceiling = mcl_vars.mg_lava_nether_max + 52 - end -end - --- The End (surface at ca. Y = -27000) -mcl_vars.mg_end_min = -27073 -- Carefully chosen to be at a mapchunk border -mcl_vars.mg_end_max_official = mcl_vars.mg_end_min + minecraft_height_limit -mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 -mcl_vars.mg_end_platform_pos = { x = 100, y = mcl_vars.mg_end_min + 74, z = 0 } - --- Realm barrier used to safely separate the End from the void below the Overworld -mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max -mcl_vars.mg_realm_barrier_overworld_end_min = mcl_vars.mg_end_max - 11 - --- Use MineClone 5-style dungeons -mcl_vars.mg_dungeons = true - -- Set default stack sizes minetest.nodedef_default.stack_max = 64 minetest.craftitemdef_default.stack_max = 64 -- Set random seed for all other mods (Remember to make sure no other mod calls this function) math.randomseed(os.time()) - -local chunks = {} -- intervals of chunks generated -function mcl_vars.add_chunk(pos) - local n = mcl_vars.get_chunk_number(pos) -- unsigned int - local prev - for i, d in pairs(chunks) do - if n <= d[2] then -- we've found it - if (n == d[2]) or (n >= d[1]) then return end -- already here - if n == d[1]-1 then -- right before: - if prev and (prev[2] == n-1) then - prev[2] = d[2] - table.remove(chunks, i) - return - end - d[1] = n - return - end - if prev and (prev[2] == n-1) then --join to previous - prev[2] = n - return - end - table.insert(chunks, i, {n, n}) -- insert new interval before i - return - end - prev = d - end - chunks[#chunks+1] = {n, n} -end -function mcl_vars.is_generated(pos) - local n = mcl_vars.get_chunk_number(pos) -- unsigned int - for i, d in pairs(chunks) do - if n <= d[2] then - return (n >= d[1]) - end - end - return false -end - --- "Trivial" (actually NOT) function to just read the node and some stuff to not just return "ignore", like mt 5.4 does. --- p: Position, if it's wrong, {name="error"} node will return. --- force: optional (default: false) - Do the maximum to still read the node within us_timeout. --- us_timeout: optional (default: 244 = 0.000244 s = 1/80/80/80), set it at least to 3000000 to let mapgen to finish its job. --- --- returns node definition, eg. {name="air"}. Unfortunately still can return {name="ignore"}. -function mcl_vars.get_node(p, force, us_timeout) - -- check initial circumstances - if not p or not p.x or not p.y or not p.z then return {name="error"} end - - -- try common way - local node = minetest.get_node(p) - if node.name ~= "ignore" then - return node - end - - -- copy table to get sure it won't changed by other threads - local pos = {x=p.x,y=p.y,z=p.z} - - -- try LVM - minetest.get_voxel_manip():read_from_map(pos, pos) - node = minetest.get_node(pos) - if node.name ~= "ignore" or not force then - return node - end - - -- all ways failed - need to emerge (or forceload if generated) - local us_timeout = us_timeout or 244 - if mcl_vars.is_generated(pos) then - minetest.chat_send_all("IMPOSSIBLE! Please report this to MCL2 issue tracker!") - minetest.forceload_block(pos) - else - minetest.emerge_area(pos, pos) - end - - local t = minetest.get_us_time() - - node = minetest.get_node(pos) - - while (not node or node.name == "ignore") and (minetest.get_us_time() - t < us_timeout) do - node = minetest.get_node(pos) - end - - return node - -- it still can return "ignore", LOL, even if force = true, but only after time out -end diff --git a/mods/CORE/mcl_mapgen/API.md b/mods/CORE/mcl_mapgen/API.md new file mode 100644 index 000000000..d489b3ad5 --- /dev/null +++ b/mods/CORE/mcl_mapgen/API.md @@ -0,0 +1,120 @@ +# mcl_mapgen +------------ +Helps to avoid problems caused by 'chunk-in-shell' feature of mapgen.cpp. + +It also queues your generators to run them in proper order: + +### mcl_mapgen.register_on_generated(lvm_callback_function, order_number) +------------------------------------------------------------------------- +Replacement of engine API function `minetest.register_on_generated(function(vm_context))` + +It is still unsafe. Cavegen part can and will overwrite outer 1-block layer of the chunk which is expected to be generated. + +Nodes marked as `is_ground_content` could be overwritten. Air and water are usually 'ground content' too. +For Minetest 5.4 it doesn't recommended to place blocks within lvm callback function. + +See https://git.minetest.land/MineClone2/MineClone2/issues/1395 + + * `lvm_callback_function`: chunk callback LVM function definition: + * `function(vm_context)`: + * `vm_context` will pass into next lvm callback function from the queue! + * `vm_context`: a table which already contains some LVM data as the fields, and some of them can be added in your lvm callback function: + * `vm`: curent voxel manipulator object itself; + * `chunkseed`: seed of this mapchunk; + * `minp` & `maxp`: minimum and maximum chunk position; + * `emin` & `emax`: minimum and maximum chunk position WITH SHELL AROUND IT; + * `area`: voxel area, can be helpful to access data; + * `data`: LVM buffer data array, data loads into it before the callbacks; + * `write`: set it to true in your lvm callback functionm, if you changed `data` and want to write it; + * `param2_data`: LVM buffer data array of `param2`, *NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS* - you load it yourself: + * `vm_context.param2_data = vm_context.param2_data or vm_context.vm:get_param2_data(vm_context.lvm_param2_buffer)` + * `write_param2`: set it to true in your lvm callback function, if you used `param2_data` and want to write it; + * `light`: LVM buffer data array of light, *NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS* - you load it yourself: + * `vm_context.light = vm_context.light or vm_context.vm.get_light_data(vm_context.lvm_light_buffer)` + * `write_light`: set it to true in your lvm callback function, if you used `light` and want to write it; + * `lvm_param2_buffer`: static `param2` buffer pointer, used to load `param2_data` array; + * `shadow`: set it to false to disable shadow propagation; + * `heightmap`: mapgen object contanting y coordinates of ground level, + * *NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS* - load it yourself: + * `vm_context.heightmap = vm_context.heightmap or minetest.get_mapgen_object('heightmap')` + * `biomemap`: mapgen object contanting biome IDs of nodes, + * *NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS* - load it yourself: + * `vm_context.biomemap = vm_context.biomemap or minetest.get_mapgen_object('biomemap')` + * `heatmap`: mapgen object contanting temperature values of nodes, + * *NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS* - load it yourself: + * `vm_context.heatmap = vm_context.heatmap or minetest.get_mapgen_object('heatmap')` + * `humiditymap`: mapgen object contanting humidity values of nodes, + * *NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS* - load it yourself: + * `vm_context.humiditymap = vm_context.humiditymap or minetest.get_mapgen_object('humiditymap')` + * `gennotify`: mapgen object contanting mapping table of structures, see Minetest Lua API for explanation, + * *NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS* - load it yourself: + * `vm_context.gennotify = vm_context.gennotify or minetest.get_mapgen_object('gennotify')` + * `order_number` (optional): the less, the earlier, + * e.g. `mcl_mapgen.order.BUILDINGS` or `mcl_mapgen.order.LARGE_BUILDINGS` + +### mcl_mapgen.register_mapgen_block_lvm(lvm_callback_function, order_number) +----------------------------------------------------------------------------- +Registers lvm callback function to be called when current block (usually 16x16x16 nodes) generation is REALLY 100% finished. + +`vm_context` passes into lvm callback function. + * `lvm_callback_function`: the block callback LVM function definition - same as for chunks - see definition example above; + * `order_number` (optional): the less, the earlier, + * e.g. `mcl_mapgen.order.BUILDINGS` or `mcl_mapgen.order.LARGE_BUILDINGS` + +### mcl_mapgen.register_mapgen_block(node_callback_function, order_number) +-------------------------------------------------------------------------- +Registers node_callback function to be called when current block (usually 16x16x16 nodes) generation is REALLY 100% finished. + * `node_callback_function`: node callback function definition: + * `function(minp, maxp, seed)`: + * `minp` & `maxp`: minimum and maximum block position; + * `seed`: seed of this mapblock; + * `order_number` (optional): the less, the earlier, + * e.g. `mcl_mapgen.order.BUILDINGS` or `mcl_mapgen.order.LARGE_BUILDINGS` + +### mcl_mapgen.register_mapgen(callback_function, order_number) +--------------------------------------------------------------- +Registers callback function to be called when current chunk generation is REALLY 100% finished. + +For LVM it's the most frustrating function from this mod. + +It can't provide you access to mapgen objects. They are probably gone long ago. + +Don't use it for accessing mapgen objects please. + +To use VM you have to run `vm_context.vm = mcl_mapgen.get_voxel_manip(vm_context.emin, vm_context.emax)`. + * `callback_function`: callback function definition: + * `function(minp, maxp, seed, vm_context)`: + * `minp` & `maxp`: minimum and maximum block position; + * `seed`: seed of this mapblock; + * `vm_context`: a table - see description above. + * `order_number` (optional): the less, the earlier. + +### mcl_mapgen.register_mapgen_lvm(lvm_callback_function, order_number) +----------------------------------------------------------------------- +Registers lvm callback function to be called when current chunk generation is REALLY 100% finished. + +It's the most frustrating function from this mod. It can't provide you access to mapgen objects. They are probably gone long ago. + +Don't use it for accessing mapgen objects please. + +`vm_context` passes into lvm callback function. + * `lvm_callback_function`: the block callback LVM function definition - same as above; + * `order_number` (optional): the less, the earlier. + +### mcl_mapgen.get_far_node(pos) +-------------------------------- +Returns node if it is generated, otherwise returns `{name = "ignore"}`. + +### mcl_mapgen.clamp_to_chunk(x, size) +-------------------------------------- +Returns new `x`, slighty tuned to make structure of size `size` be within single chunk side of 80 nodes. + +### function mcl_mapgen.get_chunk_beginning(x) +---------------------------------------------- +Returns chunk beginning of `x`. It is the same as `minp.axis` for per-chunk callbacks, but we don't always have `minp`. + +## Constants: + * `mcl_mapgen.EDGE_MIN`, `mcl_mapgen.EDGE_MAX` - world edges, min & max. + * `mcl_mapgen.seed`, `mcl_mapgen.name` - mapgen seed & name. + * `mcl_mapgen.v6`, `mcl_mapgen.superflat`, `mcl_mapgen.singlenode` - is mapgen v6, superflat, singlenode. + * `mcl_mapgen.normal` is mapgen normal (not superflat or singlenode). diff --git a/mods/CORE/mcl_mapgen/init.lua b/mods/CORE/mcl_mapgen/init.lua new file mode 100644 index 000000000..4aca65f54 --- /dev/null +++ b/mods/CORE/mcl_mapgen/init.lua @@ -0,0 +1,535 @@ +mcl_mapgen = {} + +local order = { -- mcl_mapgen.order... + DEFAULT = 5000, + CHORUS = 100000, + BUILDINGS = 200000, + VILLAGES = 900000, + DUNGEONS = 950000, + STRONGHOLDS = 999999, + OCEAN_MONUMENT = 1000000, + LARGE_BUILDINGS = 2000000, +} + +local math_floor = math.floor +local math_max = math.max +local minetest_get_node = minetest.get_node +local minetest_get_voxel_manip = minetest.get_voxel_manip +local minetest_log = minetest.log +local minetest_pos_to_string = minetest.pos_to_string + +-- Calculate mapgen_edge_min/mapgen_edge_max +mcl_mapgen.CS = math_max(1, tonumber(minetest.get_mapgen_setting("chunksize")) or 5) +mcl_mapgen.BS = math_max(1, core.MAP_BLOCKSIZE or 16) +mcl_mapgen.LIMIT = math_max(1, tonumber(minetest.get_mapgen_setting("mapgen_limit")) or 31000) +mcl_mapgen.MAX_LIMIT = 31000 -- MAX_MAP_GENERATION_LIMIT, https://github.com/minetest/minetest/issues/10428 +mcl_mapgen.OFFSET = - math_floor(mcl_mapgen.CS / 2) +mcl_mapgen.OFFSET_NODES = mcl_mapgen.OFFSET * mcl_mapgen.BS +mcl_mapgen.CS_NODES = mcl_mapgen.CS * mcl_mapgen.BS +mcl_mapgen.LAST_BLOCK = mcl_mapgen.CS - 1 +mcl_mapgen.LAST_NODE_IN_BLOCK = mcl_mapgen.BS - 1 +mcl_mapgen.LAST_NODE_IN_CHUNK = mcl_mapgen.CS_NODES - 1 +mcl_mapgen.HALF_CS_NODES = math_floor(mcl_mapgen.CS_NODES / 2) +mcl_mapgen.HALF_BS = math_floor(mcl_mapgen.BS / 2) +mcl_mapgen.CS_3D = mcl_mapgen.CS^3 +mcl_mapgen.CHUNK_WITH_SHELL = mcl_mapgen.CS + 2 +mcl_mapgen.CHUNK_WITH_SHELL_3D = mcl_mapgen.CHUNK_WITH_SHELL^3 + +local central_chunk_min_pos = mcl_mapgen.OFFSET * mcl_mapgen.BS +local central_chunk_max_pos = central_chunk_min_pos + mcl_mapgen.CS_NODES - 1 + +local ccfmin = central_chunk_min_pos - mcl_mapgen.BS -- Fullminp/fullmaxp of central chunk, in nodes +local ccfmax = central_chunk_max_pos + mcl_mapgen.BS + +local mapgen_limit_b = math_floor(math.min(mcl_mapgen.LIMIT, mcl_mapgen.MAX_LIMIT) / mcl_mapgen.BS) +local mapgen_limit_min = - mapgen_limit_b * mcl_mapgen.BS +local mapgen_limit_max = (mapgen_limit_b + 1) * mcl_mapgen.BS - 1 + +local numcmin = math_max(math_floor((ccfmin - mapgen_limit_min) / mcl_mapgen.CS_NODES), 0) -- Number of complete chunks from central chunk +local numcmax = math_max(math_floor((mapgen_limit_max - ccfmax) / mcl_mapgen.CS_NODES), 0) -- fullminp/fullmaxp to effective mapgen limits. + +mcl_mapgen.EDGE_MIN = central_chunk_min_pos - numcmin * mcl_mapgen.CS_NODES +mcl_mapgen.EDGE_MAX = central_chunk_max_pos + numcmax * mcl_mapgen.CS_NODES + +minetest_log("action", "[mcl_mapgen] World edges: mcl_mapgen.EDGE_MIN = " .. tostring(mcl_mapgen.EDGE_MIN) .. ", mcl_mapgen.EDGE_MAX = " .. tostring(mcl_mapgen.EDGE_MAX)) +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +-- Mapgen variables +local overworld, end_, nether = {}, {}, {} +local seed = minetest.get_mapgen_setting("seed") +mcl_mapgen.seed = seed +mcl_mapgen.name = minetest.get_mapgen_setting("mg_name") +mcl_mapgen.v6 = mcl_mapgen.name == "v6" +mcl_mapgen.flat = mcl_mapgen.name == "flat" +mcl_mapgen.superflat = mcl_mapgen.flat and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" +mcl_mapgen.singlenode = mcl_mapgen.name == "singlenode" +mcl_mapgen.normal = not mcl_mapgen.superflat and not mcl_mapgen.singlenode +local flat, superflat, singlenode, normal = mcl_mapgen.flat, mcl_mapgen.superflat, mcl_mapgen.singlenode, mcl_mapgen.normal + +minetest_log("action", "[mcl_mapgen] Mapgen mode: " .. (normal and "normal" or (superflat and "superflat" or (flat and "flat" or "singlenode")))) +------------------------------------------------------------------------------------------------------------------------------------------------- + +-- Generator queues +local queue_unsafe_engine = {} +local queue_chunks_nodes = {} +local queue_chunks_lvm = {} +local queue_blocks_nodes = {} +local queue_blocks_lvm = {} + +-- Requirements. 0 means 'none', greater than 0 means 'required' +local block = 0 +local queue_blocks_lvm_counter = 0 +local lvm_chunk = 0 +local param2 = 0 +local nodes_block = 0 +local nodes_chunk = 0 +local safe_functions = 0 + +local BS, CS = mcl_mapgen.BS, mcl_mapgen.CS -- Mapblock size (in nodes), Mapchunk size (in blocks) +local offset = mcl_mapgen.OFFSET -- Central mapchunk offset (in blocks) +local CS_NODES = mcl_mapgen.CS_NODES +local LAST_BLOCK = mcl_mapgen.LAST_BLOCK +local LAST_NODE_IN_BLOCK = mcl_mapgen.LAST_NODE_IN_BLOCK +local LAST_NODE_IN_CHUNK = mcl_mapgen.LAST_NODE_IN_CHUNK +local HALF_CS_NODES = mcl_mapgen.HALF_CS_NODES +local CS_3D = mcl_mapgen.CS_3D +local CHUNK_WITH_SHELL = mcl_mapgen.CHUNK_WITH_SHELL +local CHUNK_WITH_SHELL_3D = mcl_mapgen.CHUNK_WITH_SHELL_3D + +local DEFAULT_ORDER = order.DEFAULT + +function mcl_mapgen.register_on_generated(callback_function, order) + queue_unsafe_engine[#queue_unsafe_engine+1] = {i = order or DEFAULT_ORDER, f = callback_function} + table.sort(queue_unsafe_engine, function(a, b) return (a.i <= b.i) end) +end +function mcl_mapgen.register_mapgen(callback_function, order) + nodes_chunk = nodes_chunk + 1 + safe_functions = safe_functions + 1 + queue_chunks_nodes[nodes_chunk] = {i = order or DEFAULT_ORDER, f = callback_function} + table.sort(queue_chunks_nodes, function(a, b) return (a.i <= b.i) end) +end +function mcl_mapgen.register_mapgen_lvm(callback_function, order) + lvm_chunk = lvm_chunk + 1 + safe_functions = safe_functions + 1 + queue_chunks_lvm[lvm_chunk] = {i = order or DEFAULT_ORDER, f = callback_function} + table.sort(queue_chunks_lvm, function(a, b) return (a.i <= b.i) end) +end +function mcl_mapgen.register_mapgen_block(callback_function, order) + block = block + 1 + nodes_block = nodes_block + 1 + safe_functions = safe_functions + 1 + queue_blocks_nodes[nodes_block] = {i = order or DEFAULT_ORDER, f = callback_function} + table.sort(queue_blocks_nodes, function(a, b) return (a.i <= b.i) end) +end +function mcl_mapgen.register_mapgen_block_lvm(callback_function, order) + block = block + 1 + queue_blocks_lvm_counter = queue_blocks_lvm_counter + 1 + safe_functions = safe_functions + 1 + queue_blocks_lvm[queue_blocks_lvm_counter] = {order = order or DEFAULT_ORDER, callback_function = callback_function} + table.sort(queue_blocks_lvm, function(a, b) return (a.order <= b.order) end) +end + +local vm_context -- here will be many references and flags, like: param2, light_data, heightmap, biomemap, heatmap, humiditymap, gennotify, write_lvm, write_param2, shadow +local data, param2_data, light, area +local lvm_buffer, lvm_param2_buffer, lvm_light_buffer = {}, {}, {} -- Static buffer pointers + +local all_blocks_in_chunk = {} +for x = -1, LAST_BLOCK+1 do + for y = -1, LAST_BLOCK+1 do + for z = -1, LAST_BLOCK+1 do + all_blocks_in_chunk[CHUNK_WITH_SHELL * (CHUNK_WITH_SHELL * y + z) + x] = vector.new(x, y, z) + end + end +end + +local chunk_scan_range = { + [-CS_NODES] = {-1 , -1 }, + [ 0 ] = {-1 , LAST_BLOCK+1}, + [ CS_NODES] = {LAST_BLOCK+1, LAST_BLOCK+1}, +} + +local function is_chunk_finished(minp) + local center = vector.add(minp, HALF_CS_NODES) + for check_x = center.x - CS_NODES, center.x + CS_NODES, CS_NODES do + for check_y = center.y - CS_NODES, center.y + CS_NODES, CS_NODES do + for check_z = center.z - CS_NODES, center.z + CS_NODES, CS_NODES do + local pos = vector.new(check_x, check_y, check_z) + if pos ~= center then + minetest_get_voxel_manip():read_from_map(pos, pos) + local node = minetest_get_node(pos) + if node.name == "ignore" then + return + end + end + end + end + end + return true +end + +local function uint32_t(v) + if v >= 0 then + return v % 0x100000000 + end + return 0x100000000 - (math.abs(v) % 0x100000000) +end + +local function get_block_seed(pos, current_seed) + local current_seed = current_seed or uint32_t(tonumber(seed)) + return uint32_t(uint32_t(23 * pos.x) + uint32_t(42123 * pos.y) + uint32_t(38134234 * pos.z) + current_seed) +end + +local function get_block_seed2(pos, current_seed) + local current_seed = current_seed or uint32_t(tonumber(seed)) + local n = uint32_t(uint32_t(1619 * pos.x) + uint32_t(31337 * pos.y) + uint32_t(52591 * pos.z) + uint32_t(1013 * current_seed)) + n = bit.bxor(bit.rshift(n, 13), n) + local seed = uint32_t((n * uint32_t(n * n * 60493 + 19990303) + 1376312589)) + return seed +end + +local function get_block_seed3(pos, current_seed) + local current_seed = uint32_t(current_seed or uint32_t(tonumber(seed))) + local x = uint32_t((pos.x + 32768) * 13) + local y = uint32_t((pos.y + 32767) * 13873) + local z = uint32_t((pos.z + 76705) * 115249) + local seed = uint32_t(bit.bxor(current_seed, x, y, z)) + return seed +end + +minetest.register_on_generated(function(minp, maxp, chunkseed) + local minp, maxp, chunkseed = minp, maxp, chunkseed + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + data = vm:get_data(lvm_buffer) + area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + vm_context = { + data = data, + param2_data = param2_data, + light = light, + area = area, + lvm_buffer = lvm_buffer, + lvm_param2_buffer = lvm_param2_buffer, + lvm_light_buffer = lvm_light_buffer, + vm = vm, + emin = emin, + emax = emax, + minp = minp, + maxp = maxp, + chunkseed = chunkseed, + } + + local current_blocks = {} + local current_chunks = {} + if safe_functions > 0 then + local ready_blocks = table.copy(all_blocks_in_chunk) + local p0 = vector.new(minp) + local center = vector.add(p0, HALF_CS_NODES) + for x = -CS_NODES, CS_NODES, CS_NODES do + for y = -CS_NODES, CS_NODES, CS_NODES do + for z = -CS_NODES, CS_NODES, CS_NODES do + if x ~= 0 or y ~= 0 or z ~= 0 then + local offset = vector.new(x, y, z) + local pos = center + offset + minetest_get_voxel_manip():read_from_map(pos, pos) + local node = minetest_get_node(pos) + local is_generated = node.name ~= "ignore" + if is_generated then + local adjacent_chunk_pos = p0 + offset + if is_chunk_finished(adjacent_chunk_pos) then + current_chunks[#current_chunks + 1] = adjacent_chunk_pos + end + else + local scan_range_x = chunk_scan_range[x] + for cut_x = scan_range_x[1], scan_range_x[2] do + local scan_range_y = chunk_scan_range[y] + for cut_y = scan_range_y[1], scan_range_y[2] do + local scan_range_z = chunk_scan_range[z] + for cut_z = scan_range_z[1], scan_range_z[2] do + ready_blocks[CHUNK_WITH_SHELL * (CHUNK_WITH_SHELL * cut_y + cut_z) + cut_x] = nil + end + end + end + end + end + end + end + end + local number_of_blocks = 0 + for k, offset in pairs(ready_blocks) do + if queue_blocks_lvm_counter > 0 or nodes_block > 0 then + local block_minp = p0 + vector.multiply(offset, BS) + local block_maxp = vector.add(block_minp, LAST_NODE_IN_BLOCK) + local blockseed = get_block_seed3(block_minp) + vm_context.minp, vm_context.maxp, vm_context.blockseed = block_minp, block_maxp, blockseed + -- -- + -- mcl_mapgen.register_mapgen_block_lvm(function(vm_context), order_number) -- + -- -- + for _, v in pairs(queue_blocks_lvm) do + v.callback_function(vm_context) + end + if nodes_block > 0 then + current_blocks[#current_blocks + 1] = { minp = block_minp, maxp = block_maxp, blockseed = blockseed } + end + end + number_of_blocks = number_of_blocks + 1 + end + if number_of_blocks == CHUNK_WITH_SHELL_3D then + current_chunks[#current_chunks + 1] = p0 + end + end + + if #queue_unsafe_engine > 0 then + vm_context.minp, vm_context.maxp = minp, maxp + -- * U N S A F E -- + -- mcl_mapgen.register_on_generated(function(vm_context), order_number) -- + -- * U N S A F E -- + for _, v in pairs(queue_unsafe_engine) do + v.f(vm_context) + end + if vm_context.write then + vm:set_data(data) + end + if vm_context.write_param2 then + vm:set_param2_data(vm_context.param2_data) + end + if vm_context.write_light then + vm:set_light_data(light) + end + if vm_context.write or vm_context.write_param2 or vm_context.write_light then + vm:calc_lighting(minp, maxp, (vm_context.shadow ~= nil) or true) + vm:write_to_map() + vm:update_liquids() + elseif vm_context.calc_lighting then + vm:calc_lighting(minp, maxp, (vm_context.shadow ~= nil) or true) + end + end + + for i, chunk_minp in pairs(current_chunks) do + local chunk_maxp = vector.add(chunk_minp, LAST_NODE_IN_CHUNK) + local current_chunk_seed = get_block_seed3(vector.subtract(chunk_minp, BS)) + area = VoxelArea:new({MinEdge=minp, MaxEdge=maxp}) + vm_context = { + data = data, + param2_data = param2_data, + light = light, + area = area, + lvm_buffer = lvm_buffer, + lvm_param2_buffer = lvm_param2_buffer, + lvm_light_buffer = lvm_light_buffer, + emin = chunk_minp, + emax = chunk_maxp, + minp = chunk_minp, + maxp = chunk_maxp, + chunkseed = current_chunk_seed, + } + -- -- + -- mcl_mapgen.register_mapgen_lvm(function(vm_context), order_number) -- + -- -- + for _, v in pairs(queue_chunks_lvm) do + vm_context = v.f(vm_context) + end + -- -- + -- mcl_mapgen.register_mapgen(function(minp, maxp, chunkseed, vm_context), order_number) -- + -- -- + for _, v in pairs(queue_chunks_nodes) do + v.f(chunk_minp, chunk_maxp, current_chunk_seed, vm_context) + end + if vm_context.write or vm_context.write_param2 or vm_context.write_light then + if vm_context.write then + vm:set_data(data) + end + if vm_context.write_param2 then + vm:set_param2_data(param2_data) + end + if vm_context.write_light then + vm:set_light_data(light) + end + -- caused error from torches (?) + -- vm:calc_lighting(minp, maxp, vm_context.shadow or true) + vm:write_to_map() + vm:update_liquids() + elseif vm_context.calc_lighting then + vm:calc_lighting(minp, maxp, (vm_context.shadow ~= nil) or true) + end + end + + for _, b in pairs(current_blocks) do + -- -- + -- mcl_mapgen.register_mapgen_block(function(minp, maxp, blockseed), order_number) -- + -- -- + for _, v in pairs(queue_blocks_nodes) do + v.f(b.minp, b.maxp, b.blockseed) + end + end +end) + +minetest.register_on_generated = mcl_mapgen.register_chunk_generator + +function mcl_mapgen.get_far_node(p) + local p = p + local node = minetest_get_node(p) + if node.name ~= "ignore" then return node end + minetest_get_voxel_manip():read_from_map(p, p) + return minetest_get_node(p) +end + +local function coordinate_to_block(x) + return math_floor(x / BS) +end + +local function coordinate_to_chunk(x) + return math_floor((coordinate_to_block(x) - offset) / CS) +end + +function mcl_mapgen.pos_to_block(pos) + return { + x = coordinate_to_block(pos.x), + y = coordinate_to_block(pos.y), + z = coordinate_to_block(pos.z) + } +end + +function mcl_mapgen.pos_to_chunk(pos) + return { + x = coordinate_to_chunk(pos.x), + y = coordinate_to_chunk(pos.y), + z = coordinate_to_chunk(pos.z) + } +end + +local k_positive = math.ceil(mcl_mapgen.MAX_LIMIT / mcl_mapgen.CS_NODES) +local k_positive_z = k_positive * 2 +local k_positive_y = k_positive_z * k_positive_z + +function mcl_mapgen.get_chunk_number(pos) -- unsigned int + local c = mcl_mapgen.pos_to_chunk(pos) + return + (c.y + k_positive) * k_positive_y + + (c.z + k_positive) * k_positive_z + + c.x + k_positive +end + +mcl_mapgen.minecraft_height_limit = 256 + +mcl_mapgen.bedrock_is_rough = normal + +-- Overworld +overworld.min = -62 +if superflat then + mcl_mapgen.ground = tonumber(minetest.get_mapgen_setting("mgflat_ground_level")) or 8 + overworld.min = mcl_mapgen.ground - 3 +end +-- if singlenode then mcl_mapgen.overworld.min = -66 end -- DONT KNOW WHY +overworld.max = mcl_mapgen.EDGE_MAX + +overworld.bedrock_min = overworld.min +overworld.bedrock_max = overworld.bedrock_min + (mcl_mapgen.bedrock_is_rough and 4 or 0) + +mcl_mapgen.lava = normal +overworld.lava_max = overworld.min + (normal and 10 or 0) + + +-- The Nether (around Y = -29000) +nether.min = -29067 -- Carefully chosen to be at a mapchunk border +nether.max = nether.min + 128 +nether.bedrock_bottom_min = nether.min +nether.bedrock_top_max = nether.max +if not superflat then + nether.bedrock_bottom_max = nether.bedrock_bottom_min + 4 + nether.bedrock_top_min = nether.bedrock_top_max - 4 + nether.lava_max = nether.min + 31 +else + -- Thin bedrock in classic superflat mapgen + nether.bedrock_bottom_max = nether.bedrock_bottom_min + nether.bedrock_top_min = nether.bedrock_top_max + nether.lava_max = nether.min + 2 +end +if superflat then + nether.flat_floor = nether.bedrock_bottom_max + 4 + nether.flat_ceiling = nether.bedrock_bottom_max + 52 +elseif flat then + nether.flat_floor = nether.lava_max + 4 + nether.flat_ceiling = nether.lava_max + 52 +end + +-- The End (surface at ca. Y = -27000) +end_.min = -27073 -- Carefully chosen to be at a mapchunk border +end_.max = overworld.min - 2000 +end_.platform_pos = { x = 100, y = end_.min + 74, z = 0 } + +-- Realm barrier used to safely separate the End from the void below the Overworld +mcl_mapgen.realm_barrier_overworld_end_max = end_.max +mcl_mapgen.realm_barrier_overworld_end_min = end_.max - 11 + +-- Use MineClone 2-style dungeons for normal mapgen +mcl_mapgen.dungeons = normal + +mcl_mapgen.overworld = overworld +mcl_mapgen.end_ = end_ +mcl_mapgen["end"] = mcl_mapgen.end_ +mcl_mapgen.nether = nether + +mcl_mapgen.order = order + +function mcl_mapgen.get_voxel_manip(vm_context) + if vm_context.vm then + return vm + end + vm_context.vm = minetest.get_voxel_manip(vm_context.emin, vm_context.emax) + vm_context.emin, vm_context.emax = vm_context.vm:read_from_map(vm_context.emin, vm_context.emax) + vm_context.area = VoxelArea:new({MinEdge=vm_context.emin, MaxEdge=vm_context.emax}) + return vm_context.vm +end + +function mcl_mapgen.clamp_to_chunk(x, size) + if not size then + minetest.log("warning", "[mcl_mapgen] Couldn't clamp " .. tostring(x) .. " - missing size") + return x + end + if size > CS_NODES then + minetest.log("warning", "[mcl_mapgen] Couldn't clamp " .. tostring(x) .. " - given size " .. tostring(size) .. " greater than chunk size " .. tostring(mcl_mapgen.CS_NODES)) + return x + end + local offset_in_chunk = (x + central_chunk_min_pos) % CS_NODES + local x2_in_chunk = offset_in_chunk + size + if x2_in_chunk <= CS_NODES then + return x + end + local overflow = x2_in_chunk - CS_NODES + if overflow > size / 2 then + local next_x = x + (size - overflow) + if next_x < mcl_mapgen.EDGE_MAX then + return next_x + end + end + return x - overflow +end + +function mcl_mapgen.get_chunk_beginning(x) + if tonumber(x) then + return x - ((x + central_chunk_min_pos) % CS_NODES) + end + if x.x then + return { + x = mcl_mapgen.get_chunk_beginning(x.x), + y = mcl_mapgen.get_chunk_beginning(x.y), + z = mcl_mapgen.get_chunk_beginning(x.z) + } + end +end + +function mcl_mapgen.get_chunk_ending(x) + if tonumber(x) then + return mcl_mapgen.get_chunk_beginning(x) + LAST_NODE_IN_CHUNK + end + if x.x then + return { + x = mcl_mapgen.get_chunk_beginning(x.x) + LAST_NODE_IN_CHUNK, + y = mcl_mapgen.get_chunk_beginning(x.y) + LAST_NODE_IN_CHUNK, + z = mcl_mapgen.get_chunk_beginning(x.z) + LAST_NODE_IN_CHUNK + } + end +end + +mcl_mapgen.get_block_seed = get_block_seed +mcl_mapgen.get_block_seed2 = get_block_seed2 +mcl_mapgen.get_block_seed3 = get_block_seed3 diff --git a/mods/CORE/mcl_mapgen/mod.conf b/mods/CORE/mcl_mapgen/mod.conf new file mode 100644 index 000000000..fa734ae2b --- /dev/null +++ b/mods/CORE/mcl_mapgen/mod.conf @@ -0,0 +1,4 @@ +name = mcl_mapgen +author = kay27 +description = MineClone 2/5 MapGen Basic Stuff +depends = mcl_init diff --git a/mods/CORE/mcl_time/README.md b/mods/CORE/mcl_time/README.md new file mode 100644 index 000000000..ff4263f3f --- /dev/null +++ b/mods/CORE/mcl_time/README.md @@ -0,0 +1,107 @@ +# mcl_time v2.2 +## by kay27 for MineClone 5 +--------------------------- +This mod counts time when all players sleep or some area is inactive. + +It depends very much on `time_speed` configuration variable, which could be changed 'on the fly' by a chat command: + * `/set time_speed 72` + +If `time_speed` set to 0, this mod logs warnings and returns zeroes. + +### mcl_time.get_seconds_irl() +------------------------------ +Returns: Integer value of realtime (not in-game) seconds since world creation. + +Usually this value grow smoothly. But when you skip the night being in the bed, or leave some area for some time, you may experience value jumps. That's basically the idea of this mod. + +### mcl_time.get_number_of_times(last_time, interval, chance) +------------------------------------------------------------- +Returns the number of how many times something would probably happen if the area was active and we didn't skip the nights. + +Arguments: + * `last_time` - you pass last known for you value of `seconds_irl` + * `interval` and `chance` - interval and chance like from ABM setup + +Returns: + * Integer number of how many times something would probably happen if the area was active all the time and we didn't skip the nights. + * Integer value of in-real-life (not in-game) seconds since world creation. + +### mcl_time.touch(pos) +----------------------- +This function 'toches' node at position `pos` by writing `_t` meta variable of `seconds_irl`. + +### mcl_time.get_number_of_times_at_pos(pos, interval, chance) +-------------------------------------------------------------- +Returns the number of how many times something would probably happen for node at pos `pos` if the area was active and we didn't skip the nights. +It reads and updates meta variable `_t` from position `pos` and uses it as previous `seconds_irl`, so we don't need to remember it. + +Argunments: + * `pos` - node position + * `interval` and `chance` - interval and chance like from ABM setup + +Returns: + * Integer number of how many times something would happen to the node at position `pos` if the area was active all the time and we didn't skip the nights. + * For unclear conditions, like missing meta or zero `time_speed`, this function will return `0`. + +### mcl_time.get_number_of_times_at_pos_or_1(pos, interval, chance) +------------------------------------------------------------------- +Returns the number of how many times something would probably happen for node at pos `pos` if the area was active and we didn't skip the nights. +It reads and updates meta variable `_t` from position `pos` and uses it as previous `seconds_irl`, so we don't need to remember it. + +Argunments: + * `pos` - node position + * `interval` and `chance` - interval and chance like from ABM setup + +Returns: + * Integer number of how many times something would happen to the node at position `pos` if the area was active all the time and we didn't skip the nights. + * For unclear conditions, like missing meta or zero `time_speed`, this function will return `1`. + +### mcl_time.get_number_of_times_at_pos_or_nil(pos, interval, chance) +--------------------------------------------------------------------- +Returns the number of how many times something would probably happen for node at pos `pos` if the area was active and we didn't skip the nights. +It reads and updates meta variable `_t` from position `pos` and uses it as previous `seconds_irl`, so we don't need to remember it. + +Argunments: + * `pos` - node position + * `interval` and `chance` - interval and chance like from ABM setup + +Returns: + * Integer number of how many times something would happen to the node at position `pos` if the area was active all the time and we didn't skip the nights. + * For unclear conditions, like missing meta or zero `time_speed`, this function will return `nil`. + +### mcl_time.get_irl_seconds_passed_at_pos(pos) +----------------------------------------------- +Returns the number of how many in-real-life seconds would be passed for the node at position `pos`, if the area was active all the time and we didn't skip the nights. +It uses node meta variable `_t` to calculate this value. + +Argunments: + * `pos` - node position + +Returns: + * Integer number of how many in-real-life seconds would be passed for the node at position `pos, if the area was active all the time and we didn't skip the nights. + * For unclear conditions, like missing meta or zero `time_speed`, this function will return `0`. + +### mcl_time.get_irl_seconds_passed_at_pos_or_1(pos) +---------------------------------------------------- +Returns the number of how many in-real-life seconds would be passed for the node at position `pos`, if the area was active all the time and we didn't skip the nights. +It uses node meta variable `_t` to calculate this value. + +Argunments: + * `pos` - node position + +Returns: + * Integer number of how many in-real-life seconds would be passed for the node at position `pos, if the area was active all the time and we didn't skip the nights. + * For unclear conditions, like missing meta or zero `time_speed`, this function will return `1`. + +### mcl_time.get_irl_seconds_passed_at_pos_or_nil(pos) +---------------------------------------------------- +Returns the number of how many in-real-life seconds would be passed for the node at position `pos`, if the area was active all the time and we didn't skip the nights. +It uses node meta variable `_t` to calculate this value. + +Argunments: + * `pos` - node position + +Returns: + * Integer number of how many in-real-life seconds would be passed for the node at position `pos, if the area was active all the time and we didn't skip the nights. + * For unclear conditions, like missing meta or zero `time_speed`, this function will return `nil`. + diff --git a/mods/CORE/mcl_time/init.lua b/mods/CORE/mcl_time/init.lua new file mode 100644 index 000000000..5a3a2487a --- /dev/null +++ b/mods/CORE/mcl_time/init.lua @@ -0,0 +1,162 @@ +mcl_time = {} + +local time_update_interval = 2 +local retry_on_fail_interval = 500 +local default_time_speed = 72 +local save_to_storage_interval = 600 +local meta_name = "_t" + +local current_time_update_interval = time_update_interval + +local storage = minetest.get_mod_storage() +local seconds_irl_public = tonumber(storage:get_string("seconds_irl")) or -2 +local last_save_seconds_irl = seconds_irl_public +local next_save_seconds_irl = last_save_seconds_irl + save_to_storage_interval + +local previous_seconds_irl = -2 +local time_speed_is_ok = true + +local function get_seconds_irl() + local time_speed = tonumber(minetest.settings:get("time_speed") or default_time_speed) + if time_speed < 1 then + if time_speed_is_ok then + minetest.log("warning", "[mcl_time] time_speed < 1 - please increase to make mcl_time api work (default: " .. default_time_speed .. ")") + time_speed_is_ok = false + end + return 0 + else + if not time_speed_is_ok then + minetest.log("warning", "[mcl_time] time_speed is now " .. time_speed) + time_speed_is_ok = true + end + end + local irl_multiplier = 86400 / time_speed + local day_count = minetest.get_day_count() + local timeofday = minetest.get_timeofday() + local seconds_irl + if not day_count or not timeofday then + seconds_irl = seconds_irl_public + else + local days_ig = 0.0 + day_count + timeofday + seconds_irl = days_ig * irl_multiplier + end + + if previous_seconds_irl == seconds_irl then + current_time_update_interval = math.min(current_time_update_interval * 2, retry_on_fail_interval) + minetest.log("warning", "[mcl_time] Time doesn't change! seconds_irl=" .. tostring(seconds_irl) + .. ", day_count = " .. tostring(day_count) .. ", timeofday=" .. tostring(timeofday) + .. " - increasing update interval to " .. tostring(current_time_update_interval)) + else + previous_seconds_irl = seconds_irl + if current_time_update_interval ~= time_update_interval then + current_time_update_interval = time_update_interval + minetest.log("action", "[mcl_time] Time is changing again: seconds_irl=" .. tostring(seconds_irl) + .. ", day_count = " .. tostring(day_count) .. ", timeofday=" .. tostring(timeofday) + .. ", update_interval=" .. tostring(current_time_update_interval)) + end + end + + if last_save_seconds_irl >= next_save_seconds_irl then + storage:set_string("seconds_irl", tostring(seconds_irl)) + next_save_seconds_irl = seconds_irl + save_to_storage_interval + end + + return math.floor(seconds_irl) +end + +seconds_irl_public = get_seconds_irl() + +function mcl_time.get_seconds_irl() + return seconds_irl_public +end + +local function time_runner() + seconds_irl_public = get_seconds_irl() + minetest.after(current_time_update_interval, time_runner) +end + +function mcl_time.get_number_of_times(last_time, interval, chance) + if not last_time then return 0, seconds_irl_publicend end + if seconds_irl_public < 2 then return 0, seconds_irl_public end + if not interval then return 0, seconds_irl_public end + if not chance then return 0, seconds_irl_public end + if interval < 1 then return 0, seconds_irl_public end + if chance < 1 then return 0, seconds_irl_public end + local number_of_intervals = (seconds_irl_public - last_time) / interval + if number_of_intervals < 1 then return 0, seconds_irl_public end + local average_chance = (1 + chance) / 2 + local number_of_times = math.floor(number_of_intervals / average_chance) + return number_of_times, seconds_irl_public +end + +local get_number_of_times = mcl_time.get_number_of_times + +function mcl_time.touch(pos) + local meta = minetest.get_meta(pos) + meta:set_int(meta_name, seconds_irl_public) +end + +function mcl_time.get_number_of_times_at_pos(pos, interval, chance) + if not pos then return 0 end + if not time_speed_is_ok then return 0 end + local meta = minetest.get_meta(pos) + local last_time = meta:get_int(meta_name) + meta:set_int(meta_name, seconds_irl_public) + local number_of_times = (last_time <= 0) and 0 or get_number_of_times(last_time, interval, chance) + return number_of_times +end + +local get_number_of_times_at_pos = mcl_time.get_number_of_times_at_pos + +function mcl_time.get_number_of_times_at_pos_or_1(pos, interval, chance) + return math.max(get_number_of_times_at_pos(pos, interval, chance), 1) +end + +function mcl_time.get_number_of_times_at_pos_or_nil(pos, interval, chance) + local number_of_times_at_pos = get_number_of_times_at_pos(pos, interval, chance) + if number_of_times_at_pos > 0 then + return number_of_times_at_pos + end +end + +function mcl_time.get_irl_seconds_passed_at_pos(pos) + if not pos then return 0 end + if not time_speed_is_ok then return 0 end + local meta = minetest.get_meta(pos) + local last_time = meta:get_int(meta_name) + meta:set_int(meta_name, seconds_irl_public) + local irl_seconds_passed = (last_time <= 0) and 0 or (seconds_irl_public - last_time) + return irl_seconds_passed +end + +function mcl_time.get_irl_seconds_passed_at_pos_or_1(pos) + if not pos then return 1 end + if not time_speed_is_ok then return 1 end + local meta = minetest.get_meta(pos) + local last_time = meta:get_int(meta_name) + meta:set_int(meta_name, seconds_irl_public) + local irl_seconds_passed = (last_time <= 0) and 1 or (seconds_irl_public - last_time) + return irl_seconds_passed +end + +function mcl_time.get_irl_seconds_passed_at_pos_or_nil(pos) + if not pos then return end + if not time_speed_is_ok then return end + local meta = minetest.get_meta(pos) + local last_time = meta:get_int(meta_name) + meta:set_int(meta_name, seconds_irl_public) + if last_time <= 0 then return end + local delta_time = seconds_irl_public - last_time + if delta_time <= 0 then return end + return delta_time +end + +time_runner() +local day_count = minetest.get_day_count() +local timeofday = minetest.get_timeofday() +minetest.log("action", "[mcl_time] time runner started, current in-real-life seconds: " .. seconds_irl_public + .. ", time_speed: " .. tostring(minetest.settings:get("time_speed")) + .. ", day_count: " .. tostring(day_count) + .. ", timeofday: " .. tostring(timeofday) + .. ", update_interval=" .. tostring(current_time_update_interval) +) diff --git a/mods/CORE/mcl_time/mod.conf b/mods/CORE/mcl_time/mod.conf new file mode 100644 index 000000000..c1f6f0948 --- /dev/null +++ b/mods/CORE/mcl_time/mod.conf @@ -0,0 +1,3 @@ +name = mcl_time +author = kay27 +description = This mod counts time when all players sleep or some area is inactive diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index d548f6cac..90e44cedc 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -22,100 +22,14 @@ function table.update_nil(t, ...) return t end --- Based on minetest.rotate_and_place +-- Creates a function that calls to the minetest +-- function minetest_rotate_and_place. It rotates +-- a block based on where it thinks the player is facing +-- at the moment. This is typically called by pillar-like nodes. ---[[ -Attempt to predict the desired orientation of the pillar-like node -defined by `itemstack`, and place it accordingly in one of 3 possible -orientations (X, Y or Z). - -Stacks are handled normally if the `infinitestacks` -field is false or omitted (else, the itemstack is not changed). -* `invert_wall`: if `true`, place wall-orientation on the ground and ground- - orientation on wall - -This function is a simplified version of minetest.rotate_and_place. -The Minetest function is seen as inappropriate because this includes mirror -images of possible orientations, causing problems with pillar shadings. -]] -function mcl_util.rotate_axis_and_place(itemstack, placer, pointed_thing, infinitestacks, invert_wall) - local unode = minetest.get_node_or_nil(pointed_thing.under) - if not unode then - return - end - local undef = minetest.registered_nodes[unode.name] - if undef and undef.on_rightclick then - undef.on_rightclick(pointed_thing.under, unode, placer, - itemstack, pointed_thing) - return - end - local fdir = minetest.dir_to_facedir(placer:get_look_dir()) - local wield_name = itemstack:get_name() - - local above = pointed_thing.above - local under = pointed_thing.under - local is_x = (above.x ~= under.x) - local is_y = (above.y ~= under.y) - local is_z = (above.z ~= under.z) - - local anode = minetest.get_node_or_nil(above) - if not anode then - return - end - local pos = pointed_thing.above - local node = anode - - if undef and undef.buildable_to then - pos = pointed_thing.under - node = unode - end - - if minetest.is_protected(pos, placer:get_player_name()) then - minetest.record_protection_violation(pos, placer:get_player_name()) - return - end - - local ndef = minetest.registered_nodes[node.name] - if not ndef or not ndef.buildable_to then - return - end - - local p2 - if is_y then - if invert_wall then - if fdir == 3 or fdir == 1 then - p2 = 12 - else - p2 = 6 - end - end - elseif is_x then - if invert_wall then - p2 = 0 - else - p2 = 12 - end - elseif is_z then - if invert_wall then - p2 = 0 - else - p2 = 6 - end - end - minetest.set_node(pos, {name = wield_name, param2 = p2}) - - if not infinitestacks then - itemstack:take_item() - return itemstack - end -end - --- Wrapper of above function for use as `on_place` callback (Recommended). --- Similar to minetest.rotate_node. function mcl_util.rotate_axis(itemstack, placer, pointed_thing) - mcl_util.rotate_axis_and_place(itemstack, placer, pointed_thing, - minetest.is_creative_enabled(placer:get_player_name()), - placer:get_player_control().sneak) + minetest.rotate_and_place(itemstack, placer, pointed_thing, + minetest.is_creative_enabled(placer:get_player_name())) return itemstack end @@ -571,3 +485,37 @@ function mcl_util.replace_mob(obj, mob) obj:set_yaw(rot) return obj end + +function mcl_util.get_pointed_thing(player) + local pos = vector.offset(player:get_pos(), 0, player:get_properties().eye_height, 0) + local look_dir = vector.multiply(player:get_look_dir(), 5) + local pos2 = vector.add(pos, look_dir) + local ray = minetest.raycast(pos, pos2, false, true) + + if ray then + for pointed_thing in ray do + return pointed_thing + end + end +end + +local possible_hackers = {} + +function mcl_util.is_player(obj) + if not obj then return end + if not obj.is_player then return end + if not obj:is_player() then return end + local name = obj:get_player_name() + if not name then return end + if possible_hackers[name] then return end + return true +end + +minetest.register_on_authplayer(function(name, ip, is_success) + if not is_success then return end + possible_hackers[name] = true +end) + +minetest.register_on_joinplayer(function(player) + possible_hackers[player:get_player_name()] = nil +end) diff --git a/mods/CORE/mcl_worlds/init.lua b/mods/CORE/mcl_worlds/init.lua index 203f69401..eb366013e 100644 --- a/mods/CORE/mcl_worlds/init.lua +++ b/mods/CORE/mcl_worlds/init.lua @@ -5,25 +5,25 @@ local get_connected_players = minetest.get_connected_players -- For a given position, returns a 2-tuple: -- 1st return value: true if pos is in void -- 2nd return value: true if it is in the deadly part of the void +local min1, min2, min3 = mcl_mapgen.overworld.min, mcl_mapgen.end_.min, mcl_mapgen.nether.min +local max1, max2, max3 = mcl_mapgen.overworld.max, mcl_mapgen.end_.max, mcl_mapgen.nether.max+128 function mcl_worlds.is_in_void(pos) - local void = - not ((pos.y < mcl_vars.mg_overworld_max and pos.y > mcl_vars.mg_overworld_min) or - (pos.y < mcl_vars.mg_nether_max+128 and pos.y > mcl_vars.mg_nether_min) or - (pos.y < mcl_vars.mg_end_max and pos.y > mcl_vars.mg_end_min)) + local y = pos.y + local void = not ((y < max1 and y > min1) or (y < max2 and y > min2) or (y < max3 and y > min3)) local void_deadly = false local deadly_tolerance = 64 -- the player must be this many nodes “deep” into the void to be damaged if void then -- Overworld → Void → End → Void → Nether → Void - if pos.y < mcl_vars.mg_overworld_min and pos.y > mcl_vars.mg_end_max then - void_deadly = pos.y < mcl_vars.mg_overworld_min - deadly_tolerance - elseif pos.y < mcl_vars.mg_end_min and pos.y > mcl_vars.mg_nether_max+128 then + if y < min1 and y > max2 then + void_deadly = y < min1 - deadly_tolerance + elseif y < min2 and y > max3 then -- The void between End and Nether. Like usual, but here, the void -- *above* the Nether also has a small tolerance area, so player -- can fly above the Nether without getting hurt instantly. - void_deadly = (pos.y < mcl_vars.mg_end_min - deadly_tolerance) and (pos.y > mcl_vars.mg_nether_max+128 + deadly_tolerance) - elseif pos.y < mcl_vars.mg_nether_min then - void_deadly = pos.y < mcl_vars.mg_nether_min - deadly_tolerance + void_deadly = (y < min2 - deadly_tolerance) and (y > max3 + deadly_tolerance) + elseif y < min3 then + void_deadly = y < min3 - deadly_tolerance end end return void, void_deadly @@ -35,15 +35,15 @@ end -- If the Y coordinate is not located in any dimension, it will return: -- nil, "void" function mcl_worlds.y_to_layer(y) - if y >= mcl_vars.mg_overworld_min then - return y - mcl_vars.mg_overworld_min, "overworld" - elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max+128 then - return y - mcl_vars.mg_nether_min, "nether" - elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then - return y - mcl_vars.mg_end_min, "end" - else - return nil, "void" - end + if y >= min1 then + return y - min1, "overworld" + elseif y >= min3 and y <= max3 then + return y - min3, "nether" + elseif y >= min2 and y <= max2 then + return y - min2, "end" + else + return nil, "void" + end end local y_to_layer = mcl_worlds.y_to_layer @@ -61,38 +61,38 @@ local pos_to_dimension = mcl_worlds.pos_to_dimension -- MineClone 2. -- mc_dimension is one of "overworld", "nether", "end" (default: "overworld"). function mcl_worlds.layer_to_y(layer, mc_dimension) - if mc_dimension == "overworld" or mc_dimension == nil then - return layer + mcl_vars.mg_overworld_min - elseif mc_dimension == "nether" then - return layer + mcl_vars.mg_nether_min - elseif mc_dimension == "end" then - return layer + mcl_vars.mg_end_min - end + if not mc_dimension or mc_dimension == "overworld" then + return layer + min1 + elseif mc_dimension == "nether" then + return layer + min3 + elseif mc_dimension == "end" then + return layer + min2 + end end -- Takes a position and returns true if this position can have weather function mcl_worlds.has_weather(pos) - -- Weather in the Overworld and the high part of the void below - return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 + -- Weather in the Overworld and the high part of the void below + return pos.y <= max1 and pos.y >= min1 - 64 end -- Takes a position and returns true if this position can have Nether dust function mcl_worlds.has_dust(pos) - -- Weather in the Overworld and the high part of the void below - return pos.y <= mcl_vars.mg_nether_max + 138 and pos.y >= mcl_vars.mg_nether_min - 10 + -- Weather in the Overworld and the high part of the void below + return pos.y <= max3 + 138 and pos.y >= min3 - 10 end -- Takes a position (pos) and returns true if compasses are working here function mcl_worlds.compass_works(pos) - -- It doesn't work in Nether and the End, but it works in the Overworld and in the high part of the void below - local _, dim = mcl_worlds.y_to_layer(pos.y) - if dim == "nether" or dim == "end" then - return false - elseif dim == "void" then - return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 - else - return true - end + -- It doesn't work in Nether and the End, but it works in the Overworld and in the high part of the void below + local _, dim = mcl_worlds.y_to_layer(pos.y) + if dim == "nether" or dim == "end" then + return false + elseif dim == "void" then + return pos.y <= max1 and pos.y >= min1 - 64 + else + return true + end end -- Takes a position (pos) and returns true if clocks are working here @@ -152,4 +152,3 @@ minetest.register_globalstep(function(dtime) dimtimer = 0 end end) - diff --git a/mods/CORE/mcl_worlds/mod.conf b/mods/CORE/mcl_worlds/mod.conf index 4b979b4fe..8a44f4e01 100644 --- a/mods/CORE/mcl_worlds/mod.conf +++ b/mods/CORE/mcl_worlds/mod.conf @@ -1,5 +1,4 @@ name = mcl_worlds author = Wuzzy description = Utility functions for worlds and the “dimensions”. -depends = mcl_init - +depends = mcl_mapgen diff --git a/mods/CORE/tga_encoder/README.md b/mods/CORE/tga_encoder/README.md deleted file mode 100644 index 9b3293dda..000000000 --- a/mods/CORE/tga_encoder/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# tga_encoder -A TGA Encoder written in Lua without the use of external Libraries. - -May be used as a Minetest mod. diff --git a/mods/CORE/tga_encoder/init.lua b/mods/CORE/tga_encoder/init.lua deleted file mode 100644 index 39309c9c9..000000000 --- a/mods/CORE/tga_encoder/init.lua +++ /dev/null @@ -1,92 +0,0 @@ -tga_encoder = {} - -local image = setmetatable({}, { - __call = function(self, ...) - local t = setmetatable({}, {__index = self}) - t:constructor(...) - return t - end, -}) - -function image:constructor(pixels) - self.data = "" - self.pixels = pixels - self.width = #pixels[1] - self.height = #pixels - - self:encode() -end - -function image:encode_colormap_spec() - self.data = self.data - .. string.char(0, 0) -- first entry index - .. string.char(0, 0) -- number of entries - .. string.char(0) -- bits per pixel -end - -function image:encode_image_spec() - self.data = self.data - .. string.char(0, 0) -- X-origin - .. string.char(0, 0) -- Y-origin - .. string.char(self.width % 256, math.floor(self.width / 256)) -- width - .. string.char(self.height % 256, math.floor(self.height / 256)) -- height - .. string.char(24) -- pixel depth (RGB = 3 bytes = 24 bits) - .. string.char(0) -- image descriptor -end - -function image:encode_header() - self.data = self.data - .. string.char(0) -- image id - .. string.char(0) -- color map type - .. string.char(10) -- image type (RLE RGB = 10) - self:encode_colormap_spec() -- color map specification - self:encode_image_spec() -- image specification -end - -function image:encode_data() - local current_pixel = '' - local previous_pixel = '' - local count = 1 - local packets = {} - local rle_packet = '' - for _, row in ipairs(self.pixels) do - for _, pixel in ipairs(row) do - current_pixel = string.char(pixel[3], pixel[2], pixel[1]) - if current_pixel ~= previous_pixel or count == 128 then - packets[#packets +1] = rle_packet - count = 1 - previous_pixel = current_pixel - else - count = count + 1 - end - rle_packet = string.char(128 + count - 1) .. current_pixel - end - end - packets[#packets +1] = rle_packet - self.data = self.data .. table.concat(packets) -end - -function image:encode_footer() - self.data = self.data - .. string.char(0, 0, 0, 0) -- extension area offset - .. string.char(0, 0, 0, 0) -- developer area offset - .. "TRUEVISION-XFILE" - .. "." - .. string.char(0) -end - -function image:encode() - self:encode_header() -- header - -- no color map and image id data - self:encode_data() -- encode data - -- no extension or developer area - self:encode_footer() -- footer -end - -function image:save(filename) - local f = assert(io.open(filename, "w")) - f:write(self.data) - f:close() -end - -tga_encoder.image = image diff --git a/mods/CORE/tga_encoder/mod.conf b/mods/CORE/tga_encoder/mod.conf deleted file mode 100644 index e4bfac898..000000000 --- a/mods/CORE/tga_encoder/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = tga_encoder -author = Fleckenstein -description = A TGA Encoder written in Lua without the use of external Libraries. diff --git a/mods/ENTITIES/extra_mobs/fox.lua b/mods/ENTITIES/extra_mobs/fox.lua index 7df04b554..10f9ca898 100644 --- a/mods/ENTITIES/extra_mobs/fox.lua +++ b/mods/ENTITIES/extra_mobs/fox.lua @@ -18,12 +18,7 @@ local S = minetest.get_translator("extra_mobs") --################### fox --################### -local followitem = "" -if minetest.get_modpath("mc_sweet_berry") then - followitem = "mc_sweet_berry:sweet_berry" -else - followitem = nil -end +local followitem = "mcl_farming:sweet_berry" local fox = { type = "monster", @@ -123,35 +118,30 @@ local fox = { mobs:register_mob("extra_mobs:fox", fox) -- spawning -mobs:spawn_specific( -"extra_mobs:fox", -"overworld", -"ground", -{ -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", -}, -0, -minetest.LIGHT_MAX+1, -30, -6000, -3, -mobs_mc.spawn_height.water, -mobs_mc.spawn_height.overworld_max) +mobs:spawn_setup({ + name = "extra_mobs:fox", + biomes = { + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "ColdTaiga", + "SunflowerPlains", + "RoofedForest", + "MesaPlateauFM_grasstop", + "ExtremeHillsM", + "BirchForestM", + }, + interval = 30, + chance = 6000, + min_height = mobs_mc.spawn_height.water, +}) --mobs:spawn_specific("extra_mobs:fox", "overworld", "ground", 0, minetest.LIGHT_MAX+1, 30, 6000, 3, 0, 500) --[[ diff --git a/mods/ENTITIES/extra_mobs/glow_squid_items.lua b/mods/ENTITIES/extra_mobs/glow_squid_items.lua index db4d88e89..c7f30662b 100644 --- a/mods/ENTITIES/extra_mobs/glow_squid_items.lua +++ b/mods/ENTITIES/extra_mobs/glow_squid_items.lua @@ -54,10 +54,11 @@ minetest.register_entity("extra_mobs:glow_item_frame_item",{ end end, get_staticdata = function(self) + if not self then return end if self._nodename ~= nil and self._texture ~= nil then local ret = self._nodename .. ';' .. self._texture if self._scale ~= nil then - ret = ret .. ';' .. self._scale + ret = ret .. ';' .. tostring(self._scale) end return ret end diff --git a/mods/ENTITIES/extra_mobs/locale/extra_mobs.ru.tr b/mods/ENTITIES/extra_mobs/locale/extra_mobs.ru.tr new file mode 100644 index 000000000..6ebba543e --- /dev/null +++ b/mods/ENTITIES/extra_mobs/locale/extra_mobs.ru.tr @@ -0,0 +1,17 @@ +# textdomain:extra_mobs +Hoglin=Хоглин +piglin=Пиглин +piglin Brute=Жестокий пиглин +Strider=Страйдер +Fox=Лиса +Cod=Треска +Salmon=Лосось +dolphin=Дельфин +Glow Squid=Светящийся спрут +Glow Ink Sac=Светящийся чернильный мешок +Use it to craft the Glow Item Frame.=Используется для крафта светящейся рамки. +Use the Glow Ink Sac and the normal Item Frame to craft the Glow Item Frame.=Используйте светящийся чернильный мешок и обычную рамку для крафта светящейся рамки. +Glow Item Frame=Светящаяся рамка +Can hold an item and glows=Светится и может хранить предмет +Glow Item frames are decorative blocks in which items can be placed.=Светящаяся рамка это декоративный блок в который можно положить предметы. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Просто используйте любой предмет на рамке. Используйте рамку снова, чтобы забрать предмет. \ No newline at end of file diff --git a/mods/ENTITIES/extra_mobs/locale/template.txt b/mods/ENTITIES/extra_mobs/locale/template.txt new file mode 100644 index 000000000..1eaf2a4ed --- /dev/null +++ b/mods/ENTITIES/extra_mobs/locale/template.txt @@ -0,0 +1,17 @@ +# textdomain:extra_mobs +Hoglin= +piglin= +piglin Brute= +Strider= +Fox= +Cod= +Salmon= +dolphin= +Glow Squid= +Glow Ink Sac= +Use it to craft the Glow Item Frame.= +Use the Glow Ink Sac and the normal Item Frame to craft the Glow Item Frame.= +Glow Item Frame= +Can hold an item and glows= +Glow Item frames are decorative blocks in which items can be placed.= +Just place any item on the item frame. Use the item frame again to retrieve the item.= \ No newline at end of file diff --git a/mods/ENTITIES/extra_mobs/strider.lua b/mods/ENTITIES/extra_mobs/strider.lua index d6c854207..bc86379cd 100644 --- a/mods/ENTITIES/extra_mobs/strider.lua +++ b/mods/ENTITIES/extra_mobs/strider.lua @@ -213,20 +213,36 @@ baby_strider.child = 1 mobs:register_mob("extra_mobs:baby_strider", baby_strider) -- Regular spawning in the Nether -mobs:spawn_specific( -"extra_mobs:strider", -"nether", -"lava", -{ -"Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -6000, -3, -mobs_mc.spawn_height.nether_min, -mobs_mc.spawn_height.nether_max) + +mobs:spawn_setup({ + name = "extra_mobs:strider", + type_of_spawning = "lava", + dimension = "nether", + biomes = { + "Nether" + }, + min_height = mcl_mapgen.nether.min, + max_height = mcl_mapgen.nether.max, + chance = 2000, + check_position = function(pos) + return minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name:find("lava") + end +}) + +mobs:spawn_setup({ + name = "extra_mobs:baby_strider", + type_of_spawning = "lava", + dimension = "nether", + biomes = { + "Nether" + }, + min_height = mcl_mapgen.nether.min, + max_height = mcl_mapgen.nether.max, + chance = 100, + check_position = function(pos) + return minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name:find("lava") + end +}) -- spawn eggs mobs:register_egg("extra_mobs:strider", S("Strider"), "extra_mobs_spawn_icon_strider.png", 0) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index beff5fb52..3a26c1b36 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -41,7 +41,22 @@ local function check_object(obj) end local function get_visual_size(obj) - return obj:is_player() and {x = 1, y = 1, z = 1} or obj:get_luaentity()._old_visual_size or obj:get_properties().visual_size + if not obj or obj:is_player() then + return boat_visual_size + end + local luaentity = obj:get_luaentity() + if luaentity then + if luaentity._old_visual_size then + return luaentity._old_visual_size + else + return boat_visual_size + end + end + local obj_properties = obj:get_properties() + if not obj_properties then + return boat_visual_size + end + return obj_properties.visual_size end local function set_attach(boat) @@ -97,7 +112,9 @@ local function detach_object(obj, change_pos) mcl_player.player_attached[obj:get_player_name()] = false mcl_player.player_set_animation(obj, "stand" , 30) else - obj:get_luaentity()._old_visual_size = nil + local luaentity = obj:get_luaentity() + if not luaentity then return end + luaentity._old_visual_size = nil end if change_pos then obj:set_pos(vector.add(obj:get_pos(), vector.new(0, 0.2, 0))) @@ -158,10 +175,13 @@ function boat.on_activate(self, staticdata, dtime_s) end function boat.get_staticdata(self) + if not self then return end + local object = self.object + local object_properties = object and object.get_properties and object:get_properties() return minetest.serialize({ v = self._v, itemstring = self._itemstring, - textures = self.object:get_properties().textures + textures = object_properties and object_properties.textures }) end @@ -267,7 +287,7 @@ function boat.on_step(self, dtime, moveresult) return end local yaw = self.object:get_yaw() - if ctrl.up then + if ctrl and ctrl.up then -- Forwards self._v = self._v + 0.1 * v_factor @@ -276,7 +296,7 @@ function boat.on_step(self, dtime, moveresult) self.object:set_animation({x=0, y=40}, paddling_speed, 0, true) self._animation = 1 end - elseif ctrl.down then + elseif ctrl and ctrl.down then -- Backwards self._v = self._v - 0.1 * v_factor diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr index 785d50146..91be07c32 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr @@ -9,4 +9,4 @@ Oak Boat=Bateau en Chêne Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=Faites un clic droit sur une source d'eau pour placer le bateau. Faites un clic droit sur le bateau pour y entrer. Utilisez [Gauche] et [Droite] pour diriger, [Avant] pour accélérer et [Arrière] pour ralentir ou reculer. Utilisez [Sneak] pour le quitter, frappez le bateau pour le faire tomber en tant qu'objet. Spruce Boat=Bateau en Sapin Water vehicle=Véhicule aquatique -Sneak to dismount= \ No newline at end of file +Sneak to dismount=S'accroupir (sneak) pour descendre \ No newline at end of file diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr index 5bd6e4c4d..ce128659b 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr @@ -4,8 +4,9 @@ Birch Boat=Берёзовая лодка Boat=Лодка Boats are used to travel on the surface of water.=С помощью лодки можно путешествовать по водной поверхности. Dark Oak Boat=Лодка из тёмного дуба -Jungle Boat=Лодка из дерева джунглей +Jungle Boat=Лодка из тропического дерева Oak Boat=Дубовая лодка -Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Правый клик по воде спустит лодку на воду. Правый клик по лодке разместит вас в ней. [Влево] и [Вправо] - рулить, [Вперед] - разгоняться, [Назад] - тормозить или плыть назад. Правый клик по лодке, когда вы в ней, позволит выйти из неё. Удар по лодке превратит её обратно в предмет. +Obsidian Boat=Обсидиановая лодка +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Правый клик по воде спустит лодку на воду. Правый клик по лодке, чтобы сесть в неё. [Влево] и [Вправо] - рулить, [Вперед] для ускорения, [Назад] - тормозить или плыть назад. Правый клик по лодке, когда вы в ней, позволит выйти из неё. Удар по лодке превратит её обратно в предмет. Spruce Boat=Еловая лодка Water vehicle=Водный транспорт diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.zh_CN.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.zh_CN.tr new file mode 100644 index 000000000..691b61996 --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.zh_CN.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_boats +Acacia Boat=金合欢木船 +Birch Boat=白桦木船 +Boat=船 +Boats are used to travel on the surface of water.=船是用来在水面上航行的. +Dark Oak Boat=黑色橡木船 +Jungle Boat=从林木船 +Oak Boat=橡木船 +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=右键单击水源以放置船。右键单击船进入。使用[左]和[右]转向,[前]加速,[后]减速或向后移动。使用[潜行]离开船,击打船使其作为物品掉落。 +Spruce Boat=云杉船 +Water vehicle=水上交通工具 +Sneak to dismount=潜行以下船 diff --git a/mods/ENTITIES/mcl_boats/locale/template.txt b/mods/ENTITIES/mcl_boats/locale/template.txt index ac52bc19f..10c810402 100644 --- a/mods/ENTITIES/mcl_boats/locale/template.txt +++ b/mods/ENTITIES/mcl_boats/locale/template.txt @@ -6,6 +6,7 @@ Boats are used to travel on the surface of water.= Dark Oak Boat= Jungle Boat= Oak Boat= +Obsidian Boat= Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.= Spruce Boat= Water vehicle= diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index a47824537..077b1e1a8 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -16,6 +16,10 @@ dofile(modpath .. "/api.lua") minetest.register_globalstep(function(dtime) for _, player in pairs(get_connected_players()) do local storage = mcl_burning.storage[player] + if not storage then + mcl_burning.init_player(player) + storage = mcl_burning.storage[player] + end if not mcl_burning.tick(player, dtime, storage) and not mcl_burning.is_affected_by_rain(player) then local nodes = mcl_burning.get_touching_nodes(player, {"group:puts_out_fire", "group:set_on_fire"}, storage) local burn_time = 0 diff --git a/mods/ENTITIES/mcl_dripping/init.lua b/mods/ENTITIES/mcl_dripping/init.lua index 57ba7ecfe..b1cf79796 100644 --- a/mods/ENTITIES/mcl_dripping/init.lua +++ b/mods/ENTITIES/mcl_dripping/init.lua @@ -1,16 +1,24 @@ -- Dripping Water Mod -- by kddekadenz - -local math = math - -- License of code, textures & sounds: CC0 -local function register_drop(liquid, glow, sound, nodes) - minetest.register_entity("mcl_dripping:drop_" .. liquid, { +local math_random = math.random + +local all_dirs = { + {x = 0, y = 0, z = 1}, + {x = 0, y = 1, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z =-1}, + {x = 0, y =-1, z = 0}, + {x =-1, y = 0, z = 0}, +} + +local function register_drop_entity(substance, glow, sound, texture_file_name) + minetest.register_entity("mcl_dripping:drop_" .. substance, { hp_max = 1, physical = true, collide_with_objects = false, - collisionbox = {-0.01, 0.01, -0.01, 0.01, 0.01, 0.01}, + collisionbox = {-0.01, -0.01, -0.01, 0.01, 0.01, 0.01}, glow = glow, pointable = false, visual = "sprite", @@ -22,11 +30,18 @@ local function register_drop(liquid, glow, sound, nodes) _dropped = false, on_activate = function(self) self.object:set_properties({ - textures = {"[combine:2x2:" .. -math.random(1, 16) .. "," .. -math.random(1, 16) .. "=default_" .. liquid .. "_source_animated.png"} + textures = { + "[combine:2x2:" + .. -math_random(1, 16) + .. "," + .. -math_random(1, 16) + .. "=" + .. (texture_file_name or ("default_" .. substance .. "_source_animated.png")) + } }) end, on_step = function(self, dtime) - local k = math.random(1, 222) + local k = math_random(1, 222) local ownpos = self.object:get_pos() if k == 1 then self.object:set_acceleration(vector.new(0, -5, 0)) @@ -38,7 +53,9 @@ local function register_drop(liquid, glow, sound, nodes) local ent = self.object:get_luaentity() if not ent._dropped then ent._dropped = true - minetest.sound_play({name = "drippingwater_" .. sound .. "drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + if sound then + minetest.sound_play({name = "drippingwater_" .. sound .. "drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + end end if k < 3 then self.object:remove() @@ -46,6 +63,10 @@ local function register_drop(liquid, glow, sound, nodes) end end, }) +end + +local function register_liquid_drop(liquid, glow, sound, nodes) + register_drop_entity(liquid, glow, sound) minetest.register_abm({ label = "Create drops", nodenames = nodes, @@ -55,12 +76,31 @@ local function register_drop(liquid, glow, sound, nodes) action = function(pos) if minetest.get_item_group(minetest.get_node(vector.offset(pos, 0, 1, 0)).name, liquid) ~= 0 and minetest.get_node(vector.offset(pos, 0, -1, 0)).name == "air" then - local x, z = math.random(-45, 45) / 100, math.random(-45, 45) / 100 + local x, z = math_random(-45, 45) / 100, math_random(-45, 45) / 100 minetest.add_entity(vector.offset(pos, x, -0.520, z), "mcl_dripping:drop_" .. liquid) end end, }) end -register_drop("water", 1, "", {"group:opaque", "group:leaves"}) -register_drop("lava", math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), "lava", {"group:opaque"}) \ No newline at end of file +register_liquid_drop("water", 1, "", {"group:opaque", "group:leaves"}) +register_liquid_drop("lava", math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), "lava", {"group:opaque"}) + +register_drop_entity("crying_obsidian", 10, nil, "mcl_core_crying_obsidian.png") +minetest.register_abm({ + label = "Create crying obsidian drops", + nodenames = {"mcl_core:crying_obsidian"}, + neighbors = {"air"}, + interval = 2, + chance = 22, + action = function(pos) + local i0 = math_random(1, 6) + for i = i0, i0 + 5 do + local dir = all_dirs[(i % 6) + 1] + if minetest.get_node(vector.add(pos, dir)).name == "air" then + minetest.add_entity(vector.offset(pos, dir.x * 0.52, dir.y * 0.52, dir.z * 0.52), "mcl_dripping:drop_crying_obsidian") + return + end + end + end, +}) diff --git a/mods/ENTITIES/mcl_dripping/readme.txt b/mods/ENTITIES/mcl_dripping/readme.txt index afe35608e..583cb65d7 100644 --- a/mods/ENTITIES/mcl_dripping/readme.txt +++ b/mods/ENTITIES/mcl_dripping/readme.txt @@ -1,29 +1,30 @@ -Dripping Mod -by kddekadenz - -modified for MineClone 2 by Wuzzy and NO11 - - -Installing instructions: - - 1. Copy the mcl_dripping mod folder into games/gamemode/mods - - 2. Start game and enjoy :) - - -Manual: - --> drops are generated rarely under solid nodes --> they will stay some time at the generated block and than they fall down --> when they collide with the ground, a sound is played and they are destroyed - - -License: - -code & sounds: CC0 - - -Changelog: - -16.04.2012 - first release -28.04.2012 - drops are now 3D; added lava drops; fixed generating of drops (not at edges now) +Dripping Mod +by kddekadenz + +modified for MineClone 2 by Wuzzy and NO11 +modified for MineClone 5 by kay27 + + +Installing instructions: + + 1. Copy the mcl_dripping mod folder into games/gamemode/mods + + 2. Start game and enjoy :) + + +Manual: + +-> drops are generated rarely under solid nodes +-> they will stay some time at the generated block and than they fall down +-> when they collide with the ground, a sound is played and they are destroyed + + +License: + +code & sounds: CC0 + + +Changelog: + +16.04.2012 - first release +28.04.2012 - drops are now 3D; added lava drops; fixed generating of drops (not at edges now) diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index d527603de..769f1d4a9 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -89,6 +89,7 @@ minetest.register_entity(":__builtin:falling_node", { }) end, get_staticdata = function(self) + if not self then return end local meta = self.meta -- Workaround: Save inventory seperately from metadata. -- Because Minetest crashes when a node with inventory gets deactivated diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr new file mode 100644 index 000000000..115dcb0a5 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 a été écrasé par une enclume. +@1 was smashed by a falling block.=@1 a été écrasé par un bloc. \ No newline at end of file diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr new file mode 100644 index 000000000..1f55df7ef --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 был(а) раздавлен упавшей наковальней. +@1 was smashed by a falling block.=@1 был(а) раздавлен упавшим блоком. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.zh_CN.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.zh_CN.tr new file mode 100644 index 000000000..32decb0ef --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 被落下的铁砧砸碎了. +@1 was smashed by a falling block.=@1 被落下的方块砸碎了. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt new file mode 100644 index 000000000..2e7b446fc --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.= +@1 was smashed by a falling block.= \ No newline at end of file diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 678f8e2b7..e88f4dd80 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -6,9 +6,8 @@ local pool = {} local tick = false -minetest.register_on_joinplayer(function(player) - local name - name = player:get_player_name() +minetest.register_on_authplayer(function(name, ip, is_success) + if not is_success then return end pool[name] = 0 end) @@ -27,6 +26,11 @@ local mcl_item_entity = {} local item_drop_settings = {} --settings table item_drop_settings.dug_buffer = 0.65 -- the warm up period before a dug item can be collected item_drop_settings.age = 1.0 --how old a dropped item (_insta_collect==false) has to be before collecting +item_drop_settings.fluid_flow_rate = 1.39 --the speed of a flowing fluid, used when computing push and drag forces of water on items; default is tuned to Minecraft +item_drop_settings.fluid_drag = 1.8 --how much drag water has on items (how quickly an item's motion will settle onto the water's flow speed) +item_drop_settings.ground_drag = 3.0 --how much friction with the ground slows items sliding on it +item_drop_settings.slippery_drag_factor = 0.25 --scales item friction with the ground on slippery floors (e.g. ice) +item_drop_settings.slippery_fluid_drag_factor = 0.4 --scales item drag with waterflow on slippery floors (e.g. ice) item_drop_settings.radius_magnet = 2.0 --radius of item magnet. MUST BE LARGER THAN radius_collect! item_drop_settings.xp_radius_magnet = 7.25 --radius of xp magnet. MUST BE LARGER THAN radius_collect! item_drop_settings.radius_collect = 0.2 --radius of collection @@ -38,6 +42,8 @@ item_drop_settings.drop_single_item = false --if true, the drop control dro item_drop_settings.magnet_time = 0.75 -- how many seconds an item follows the player before giving up +local is_player = mcl_util.is_player + local function get_gravity() return tonumber(minetest.settings:get("movement_gravity")) or 9.81 end @@ -128,7 +134,7 @@ minetest.register_globalstep(function(dtime) --magnet and collection for _,object in pairs(minetest.get_objects_inside_radius(checkpos, item_drop_settings.xp_radius_magnet)) do - if not object:is_player() and vector.distance(checkpos, object:get_pos()) < item_drop_settings.radius_magnet and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and object:get_luaentity()._magnet_timer and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then + if not is_player(object) and vector.distance(checkpos, object:get_pos()) < item_drop_settings.radius_magnet and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and object:get_luaentity()._magnet_timer and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then if object:get_luaentity()._magnet_timer >= 0 and object:get_luaentity()._magnet_timer < item_drop_settings.magnet_time and inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then @@ -162,7 +168,7 @@ minetest.register_globalstep(function(dtime) end end - elseif not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "mcl_experience:orb" then + elseif not is_player(object) and object:get_luaentity() and object:get_luaentity().name == "mcl_experience:orb" then local entity = object:get_luaentity() entity.collector = player:get_player_name() entity.collected = true @@ -225,7 +231,7 @@ function minetest.handle_node_drops(pos, drops, digger) -- This means there is no digger. This is a special case which allows this function to be called -- by hand. Creative Mode is intentionally ignored in this case. - if (digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name())) or doTileDrops == false then + if (digger and is_player(digger) and minetest.is_creative_enabled(digger:get_player_name())) or doTileDrops == false then return end @@ -335,7 +341,7 @@ end -- Drop single items by default function minetest.item_drop(itemstack, dropper, pos) - if dropper and dropper:is_player() then + if dropper and is_player(dropper) then local v = dropper:get_look_dir() local p = {x=pos.x, y=pos.y+1.2, z=pos.z} local cs = itemstack:get_count() @@ -480,6 +486,7 @@ minetest.register_entity(":__builtin:item", { end, get_staticdata = function(self) + if not self then return end local data = minetest.serialize({ itemstring = self.itemstring, always_collect = self.always_collect, @@ -778,11 +785,35 @@ minetest.register_entity(":__builtin:item", { -- Just to make sure we don't manipulate the speed for no reason if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = 1.39 - -- Set new item moving speed into the direciton of the liquid - local newv = vector.multiply(vec, f) + local f = item_drop_settings.fluid_flow_rate --1.39 + + -- Apply the force of the flowing liquid onto the item's velocity + local newv = vector.multiply(vec, f) self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) + + local oldvel = self.object:get_velocity() -- v is vector, vel is velocity + + -- drag + local fluid_drag = item_drop_settings.fluid_drag + + local floornn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name + local floornode = floornn and minetest.registered_nodes[floornn] + if floornode and minetest.get_item_group(floornode.name, "slippery") then + -- scale fluid drag on slippery floors + fluid_drag = fluid_drag * item_drop_settings.slippery_fluid_drag_factor + end + + newv.x = newv.x - (oldvel.x - newv.x) * fluid_drag * dtime + newv.y = newv.y - (oldvel.y - newv.y) * fluid_drag * dtime + newv.z = newv.z - (oldvel.z - newv.z) * fluid_drag * dtime + + newv.y = newv.y + -0.22 -- (keep slight downward thrust from previous version of code) + -- NOTE: is there any particular reason we have this, anyway? + -- since fluid drag is now on, we could as well just + -- apply gravity here; drag will slow down the fall + -- realistically + + self.object:set_velocity({x = oldvel.x + newv.x * dtime, y = oldvel.y + newv.y * dtime, z = oldvel.z + newv.z * dtime}) self.physical_state = true self._flowing = true @@ -794,15 +825,17 @@ minetest.register_entity(":__builtin:item", { elseif self._flowing == true then -- Disable flowing physics if not on/in flowing liquid self._flowing = false - enable_physics(self.object, self, true) + --enable_physics(self.object, self, true) -- do not reset velocity upon leaving water! + self.object:set_acceleration({x=0,y=-get_gravity(),z=0}) -- resume applying gravity return end -- If node is not registered or node is walkably solid and resting on nodebox local nn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name local v = self.object:get_velocity() + local node = nn and minetest.registered_nodes[nn] - if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable and v.y == 0 then + if not node or node.walkable and v.y == 0 then if self.physical_state then local own_stack = ItemStack(self.object:get_luaentity().itemstring) -- Merge with close entities of the same item @@ -815,7 +848,28 @@ minetest.register_entity(":__builtin:item", { end end end - disable_physics(self.object, self) + --disable_physics(self.object, self) + -- apply ground drag + local oldvel = self.object:get_velocity() + + -- ignore momentum if it's tiny + if math.abs(oldvel.x) < 0.05 and math.abs(oldvel.z) < 0.05 then + disable_physics(self.object, self) + return + end + + local ground_drag = item_drop_settings.ground_drag + + if node and minetest.get_item_group(node.name, "slippery") ~= 0 then + ground_drag = ground_drag * item_drop_settings.slippery_drag_factor + end + + local newvel = { + x = oldvel.x - oldvel.x * ground_drag * dtime, + y = 0, + z = oldvel.z - oldvel.z * ground_drag * dtime + } + self.object:set_velocity(newvel) end else if self._magnet_active == false then diff --git a/mods/ENTITIES/mcl_item_entity/mod.conf b/mods/ENTITIES/mcl_item_entity/mod.conf index acd9f00f3..120b64aa7 100644 --- a/mods/ENTITIES/mcl_item_entity/mod.conf +++ b/mods/ENTITIES/mcl_item_entity/mod.conf @@ -1,4 +1,4 @@ name = mcl_item_entity author = PilzAdam description = Dropped items will be attracted to the player like a magnet. -depends = flowlib, mcl_enchanting +depends = flowlib, mcl_enchanting, mcl_util diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 119a13523..4294c4630 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -503,6 +503,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o end function cart:get_staticdata() + if not self then return end return minetest.serialize({_railtype = self._railtype}) end diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr index 67ed5eb1b..318e28d03 100644 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr @@ -5,32 +5,32 @@ Minecarts only ride on rails and always follow the tracks. At a T-junction with You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Vous pouvez placer le wagonnet sur des rails. Faites un clic droit dessus pour entrer dedans. Frappez-le pour le faire bouger. To obtain the minecart, punch it while holding down the sneak key.=Pour obtenir la wagonnet, frappez-le tout en maintenant la touche furtive enfoncée. A minecart with TNT is an explosive vehicle that travels on rail.=Un wagonnet avec de la TNT est un véhicule explosif qui se déplace sur rail. -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Placez-le sur des rails. Frappez-le pour le déplacer. Le TNT est allumé avec un briquet ou lorsque le minecart est sur un rail d'activation alimenté. -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Pour obtenir la wagonnet et la TNT, frappez-les tout en maintenant la touche furtive enfoncée. Vous ne pouvez pas faire cela si le TNT a été allumé. -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Une wagonnet avec un four est un véhicule qui se déplace sur rails. Il peut se propulser avec du carburant. -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Placez-le sur des rails. Si vous lui donnez du charbon, le four commencera à brûler pendant longtemps et le wagonnet pourra se déplacer. Frappez-le pour le faire bouger. -To obtain the minecart and furnace, punch them while holding down the sneak key.=Pour obtenir le wagonnet et le four, frappez-les tout en maintenant la touche furtive enfoncée. +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Placez-le sur des rails. Frappez-le pour le déplacer. La TNT est allumée avec un briquet ou lorsque le minecart est sur un rail d'activation alimenté. +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Pour obtenir le wagonnet avec la TNT, frappez-les tout en maintenant la touche furtive [Sneak] enfoncée. Vous ne pouvez pas faire cela si la TNT a été allumée. +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Un wagonnet avec un four est un véhicule qui se déplace sur rails. Il peut se propulser avec du carburant. +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Placez-le sur des rails. Si vous lui donnez du charbon, le four commencera à brûler pour longtemps et le wagonnet pourra se déplacer. Frappez-le pour le faire bouger. +To obtain the minecart and furnace, punch them while holding down the sneak key.=Pour obtenir le wagonnet avec le four, frappez-les tout en maintenant la touche furtive [Sneak] enfoncée. Minecart with Chest=Wagonnet avec Coffre Minecart with Furnace=Wagonnet avec Four Minecart with Command Block=Wagonnet avec Bloc de Commande -Minecart with Hopper=Wagonnet avec Entonoir +Minecart with Hopper=Wagonnet avec Entonnoir Minecart with TNT=Wagonnet avec TNT Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Placez-les sur le sol pour construire votre chemin de fer, les rails se connecteront automatiquement les uns aux autres et se transformeront en courbes, en jonctions en T, en traversées et en pentes au besoin. Rail=Rail Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails ralentissent légèrement les wagonnets en raison de la friction. -Powered Rail=Rail allimenté +Powered Rail=Rail alimenté Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails motorisés sont capables d'accélérer et de freiner les wagonnets. Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sans énergie de redstone, le rail freinera les wagonnets. Pour que ce rail accélère les minecarts, alimentez-le avec une source d'énergie redstone. Activator Rail=Rail d'activation -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Des rails activateurs sont utilisés pour activer des wagonnets spéciaux. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Pour activer ce rail, activez les wagonnets, alimentez-le avec de l'énergie redstone et envoyez un wagonnet sur ce morceau de rail. +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails activateurs sont utilisés pour activer des wagonnets spéciaux. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Pour activer ce rail, activez le wagonnet, alimentez-le avec de l'énergie redstone et envoyez un wagonnet sur ce morceau de rail. Detector Rail=Rail de détection Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Un rail de détection est capable de détecter un wagonnet au-dessus et alimente les mécanismes de redstone. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Pour détecter un wagonnet et fournir une alimentation redstone, connectez-le aux câble redstone ou aux mécanismes redstone et envoyez n'importe quel wagonnet sur le rail. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Pour détecter un wagonnet et fournir une alimentation redstone, connectez-le aux câbles redstone ou aux mécanismes redstone et envoyez n'importe quel wagonnet sur le rail. Track for minecarts=Piste pour wagonnets Speed up when powered, slow down when not powered=Accélérez lorsqu'il est alimenté, ralentissez lorsqu'il n'est pas alimenté Activates minecarts when powered=Active les wagonnets lorsqu'il est alimenté Emits redstone power when a minecart is detected=Émet de l'énergie redstone lorsqu'un wagonnet est détecté Vehicle for fast travel on rails=Véhicule pour voyager rapidement sur rails Can be ignited by tools or powered activator rail=Peut être allumé par des outils ou un rail d'activation motorisé -Sneak to dismount= \ No newline at end of file +Sneak to dismount=S'accroupir [Sneak] pour descendre \ No newline at end of file diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr index 6189bac84..962d6857c 100644 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr @@ -1,36 +1,36 @@ # textdomain: mcl_minecarts Minecart=Вагонетка -Minecarts can be used for a quick transportion on rails.=Вагонетки нужны, чтобы быстро перемещаться по рельсам. -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Вагонетки едут строго по проложенному железнодорожному пути. На Т-образной развилке они поворачивают налево. Скорость зависит от типа рельсов. -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Вы ставите вагонетку на рельсы. Правым кликом садитесь в неё. Стукаете, чтобы начать движение. -To obtain the minecart, punch it while holding down the sneak key.=Чтобы взять вагонетку, стукните её, удерживая клавишу [Красться]. -A minecart with TNT is an explosive vehicle that travels on rail.=Вагон тротила это подрывной железнодорожный транспорт. -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Поместите его на рельсы. Стукните, чтобы он поехал. Тротил воспламеняется, если его поджечь огнивом, либо при попадании на подключенный рельсовый активатор. -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Чтобы взять вагон тротила, стукните его, удерживая клавишу [Красться]. Если тротил воспламенён, сделать это нельзя. -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Вагон с печью - это железнодорожный транспорт. Он может двигаться за счёт топлива. -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Поставьте его на рельсы. Если добавить немного угля, то печь зажжётся на продолжительное время и вагон сможет ехать. Стукните вагон для начала движения. -To obtain the minecart and furnace, punch them while holding down the sneak key.=Чтобы взять вагон с печью, стукните его, удерживая клавишу [Красться]. -Minecart with Chest=Вагон с сундуком -Minecart with Furnace=Вагон с печью -Minecart with Command Block=Вагон с командным блоком -Minecart with Hopper=Вагон с бункером -Minecart with TNT=Вагон тротила -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Поместите на землю, чтобы сделать железную дорогу, рельсы автоматически соединятся между собой и будут превращаться в плавный повороты, T-образные развилки, перекрёстки и уклоны там, где это потребуется. +Minecarts can be used for a quick transportion on rails.=Вагонетка может быть использована для быстрого перемещения по рельсам. +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Вагонетки едут только по проложенным рельсам. На Т-образной развилке они поворачивают налево. Скорость зависит от типа рельсов. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Вы можете поставить вагонетку на рельсы. Правым кликом сядьте в неё. Бейте по вагонетке, чтобы она ехала. +To obtain the minecart, punch it while holding down the sneak key.=Чтобы забрать вагонетку, ударьте по ней, удерживая клавишу [Красться]. +A minecart with TNT is an explosive vehicle that travels on rail.=Вагонетка с ТНТ это взрывающийся железнодорожный транспорт. +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Поместите вагонетку на рельсы. Ударьте по ней, чтобы она поехала. ТНТ активируется, если его поджечь огнивом или когда вагонетка проедет через подключенные активирующие рельсы. +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Чтобы забрать вагонетку с ТНТ, ударьте по ней, удерживая клавишу [Красться]. Если ТНТ подожжён, сделать это нельзя. +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Вагонетка с печью - это железнодорожный транспорт. Она может ехать сама за счёт топлива. +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Поставьте вагонетку на рельсы. Если добавить в неё угля, то печь зажжётся на продолжительное время и вагонетка сможет поехать сама. Ударьте по ней для начала движения. +To obtain the minecart and furnace, punch them while holding down the sneak key.=Чтобы забрать вагонетку с печью, ударьте по ней, удерживая клавишу [Красться]. +Minecart with Chest=Вагонетка с сундуком +Minecart with Furnace=Вагонетка с печью +Minecart with Command Block=Вагонетка с командным блоком +Minecart with Hopper=Вагонетка с воронкой +Minecart with TNT=Вагонетка с ТНТ +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Поместите рельсы на землю, чтобы сделать железную дорогу, рельсы автоматически соединятся между собой и будут образовывать повороты, T-образные развилки, перекрёстки и склоны там, где это потребуется. Rail=Рельсы Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Рельсы используются для строительства железной дороги. Обычные рельсы немного замедляют движение вагонеток из-за трения. -Powered Rail=Подключаемые рельсы -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Рельсы используются для строительства железной дороги. Подключённые рельсы могут разгонять и тормозить вагонетки. -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Без энергии редстоуна рельсы будут тормозить вагонетки. -Activator Rail=Рельсовый активатор -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Рельсы используются для строительства железной дороги. Рельсовый активатор активирует особые вагонетки. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Чтобы этот блок рельсов активировал вагонетку, подключите его к энергии редстоуна и направьте вагонетку через него. -Detector Rail=Рельсовый детектор -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Рельсы используются для строительства железной дороги. Рельсовый детектор может обнаруживать вагонетку у себя наверху и подключать механизмы редстоуна. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Чтобы обнаруживать вагонетку и подавать энергию редстоуна, подключите его к дорожке редстоуна или механизму редстоуна, после чего направьте любую вагонетку через него. +Powered Rail=Энергорельсы +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Энергорельсы используются для строительства железной дороги. Энергорельсы могут ускорять и тормозить вагонетки. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Неподключенные энергорельсы замедляют вагонетки. Чтобы энергорельсы ускоряли вагонетки, проведите к ним сигнал редстоуна. +Activator Rail=Активирующие рельсы +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Активирующие рельсы используются для строительства железной дороги. Активирующие рельсы активируют некоторые особые вагонетки. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Чтобы эти рельсы активировали вагонетки, подключите активирующие рельсы к сигналу редстоуна и направьте вагонетку через них. +Detector Rail=Нажимные рельсы +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Нажимные рельсы используются для строительства железной дороги. Нажимные рельсы реагируют на проезжающие по ним вагонетки и выдают сигнал для механизмов из редстоуна. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Подсоедините к нажимным рельсам провод редстоуна или редстоуновые механизмы, чтобы активировать их когда по рельсам проезжает вагонетка. Track for minecarts=Железная дорога -Speed up when powered, slow down when not powered=Разгоняет, если подключён, тормозит, если не подключён -Activates minecarts when powered=Активирует особые вагонетки, если подключён -Emits redstone power when a minecart is detected=Испускает энергию редстоуна при обнаружении вагонетки +Speed up when powered, slow down when not powered=Разгоняет, если подключёны, тормозит, если не подключёны +Activates minecarts when powered=Активирует особые вагонетки, если подключёны +Emits redstone power when a minecart is detected=Подает сигнал редстоуна при обнаружении вагонетки Vehicle for fast travel on rails=Быстрый железнодорожный транспорт -Can be ignited by tools or powered activator rail=Можно воспламенить с помощью инструмента или подключенного рельсового активатора +Can be ignited by tools or powered activator rail=Можно поджечь с помощью инструмента или активирующими рельсами Sneak to dismount=Нажмите [Красться] для высадки diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 639eb517d..c72dca0bd 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -144,6 +144,7 @@ dofile(api_path .. "mob_effects.lua") dofile(api_path .. "projectile_handling.lua") dofile(api_path .. "breeding.lua") dofile(api_path .. "head_logic.lua") +dofile(api_path .. "monster_light.lua") mobs.spawning_mobs = {} @@ -424,7 +425,9 @@ function mobs:register_mob(name, def) end, get_staticdata = function(self) - return mobs.mob_staticdata(self) + if self and mobs then + return mobs.mob_staticdata(self) + end end, --harmed_by_heal = def.harmed_by_heal, @@ -436,55 +439,6 @@ function mobs:register_mob(name, def) end -- END mobs:register_mob function - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- register arrow for shoot attack function mobs:register_arrow(name, def) @@ -586,36 +540,6 @@ function mobs:register_arrow(name, def) self.object:remove(); return end - - --[[ - local entity = player:get_luaentity() - - if entity - and self.hit_mob - and entity._cmi_is_mob == true - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name - and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then - - --self.hit_mob(self, player) - self.object:remove(); - return - end - ]]-- - - --[[ - if entity - and self.hit_object - and (not entity._cmi_is_mob) - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name - and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then - - --self.hit_object(self, player) - self.object:remove(); - return - end - ]]-- end end @@ -630,7 +554,6 @@ end -- * spawn_egg=1: Spawn egg (generic mob, no metadata) -- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) function mobs:register_egg(mob, desc, background, addegg, no_creative) - local grp = {spawn_egg = 1} -- do NOT add this egg to creative inventory (e.g. dungeon master) @@ -647,7 +570,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) -- register old stackable mob egg minetest.register_craftitem(mob, { - description = desc, inventory_image = invimg, groups = grp, @@ -668,20 +590,50 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) if pos --and within_limits(pos, 0) + + --testing to see if the block you are trying to mess with is protected and not minetest.is_protected(pos, placer:get_player_name()) then + --getting the name of the player that placed the egg, and their privileges. local name = placer:get_player_name() local privs = minetest.get_player_privs(name) + if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then + --If the thing you are trying to spawn the egg on is protected + --the violation gets reported if minetest.is_protected(pointed_thing.under, name) then minetest.record_protection_violation(pointed_thing.under, name) return itemstack end + if not privs.maphack then minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) return itemstack end - mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) + + --Changes the mob spawner type with the egg that you used to click on it + --determining monster spawn lvl + + local hold_light = 15 + local mon_name + + --Extracts mob name from item name + for name in string.gmatch(itemstack:get_name(), ":%a.*") do + mon_name = name:gsub(":", "") + end + + --For every monster in the monster_lightlvl table check if + --it matches the spawn egg you're holding + for name, lightlvl in pairs(monster_lightlvl) do + print(mon_name == name) + if name == mon_name then + hold_light = lightlvl + end + end + + --Switch out the mob spawner to spawn mobs from the egg that you're holding + mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name(), 0, hold_light) + if not mobs.is_creative(name) then itemstack:take_item() end @@ -691,7 +643,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) if not minetest_registered_entities[mob] then return itemstack end - + + --If only peaceful mobs are allowed, player is not allowed to spawn a monster if minetest_settings:get_bool("only_peaceful_mobs", false) and minetest_registered_entities[mob].type == "monster" then minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) @@ -699,18 +652,11 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end local mob = minetest_add_entity(pos, mob) + + --Log that a mob was spawned by the player who spawned it and the coordinates minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) local ent = mob:get_luaentity() - -- don't set owner if monster or sneak pressed - --[[ - if ent.type ~= "monster" - and not placer:get_player_control().sneak then - ent.owner = placer:get_player_name() - ent.tamed = true - end - ]]-- - -- set nametag local nametag = itemstack:get_meta():get_string("name") if nametag ~= "" then @@ -721,7 +667,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) --update_tag(ent) end - -- if not in creative then take item + -- if not in creative then remove the item from the stack + -- taking the player's item if not mobs.is_creative(placer:get_player_name()) then itemstack:take_item() end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index cdcffd81c..ab91a0542 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -801,20 +801,6 @@ function mobs.mob_step(self, dtime) return false end - - --DEBUG TIME! - --REMEMBER TO MOVE THIS AFTER DEATH CHECK - - --if self.has_head then - -- mobs.do_head_logic(self,dtime) - --end - - - - --if true then--DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - -- return - --end - --despawn mechanism --don't despawned tamed or bred mobs if not self.tamed and not self.bred then @@ -833,7 +819,7 @@ function mobs.mob_step(self, dtime) self.object:set_texture_mod("^[colorize:red:120") --fix double death sound if self.health > 0 then - mobs.play_sound(self,"damage") + mobs.play_sound(self, "damage") end end self.old_health = self.health @@ -863,7 +849,7 @@ function mobs.mob_step(self, dtime) return end - mobs.random_sound_handling(self,dtime) + mobs.random_sound_handling(self, dtime) --mobs drowning mechanic if not self.breathes_in_water then @@ -893,6 +879,43 @@ function mobs.mob_step(self, dtime) end end + local pos = self.object:get_pos() + local node = minetest_get_node(pos).name + + --water damage + if self.water_damage and self.water_damage ~= 0 and minetest_get_item_group(node, "water") ~= 0 then + self.water_counter = (self.water_counter or 0) + dtime + if self.water_counter >= 1 then + mobs.smoke_effect(self) + self.health = self.health - self.water_damage + self:teleport() + self.water_counter = 0 + end + end + + --lava damage + local lava_damage = self.lava_damage + if lava_damage and lava_damage ~= 0 and minetest_get_item_group(node, "lava") ~= 0 then + self.lava_counter = (self.lava_counter or 0) + dtime + if self.lava_counter >= 1 then + minetest.sound_play("default_punch", { + object = self.object, + max_hear_distance = 5 + }, true) +--[[ if not mcl_burning.is_burning(self.object) then + mcl_burning.set_on_fire(self.object, 1.1) + else +]] self.object:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.lava_damage} + }, nil) +-- end + self.lava_counter = 0 + self.health = self.health - lava_damage + self:teleport() + end + end + --set mobs on fire when burned by sunlight if self.ignited_by_sunlight then local pos = self.object:get_pos() diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index 5c431135e..22013e35e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -175,16 +175,16 @@ end -- check if within physical map limits (-30911 to 30927) -- within_limits, wmin, wmax = nil, -30913, 30928 mobs.within_limits = function(pos, radius) - local wmin, wmax - if mcl_vars then - if mcl_vars.mapgen_edge_min and mcl_vars.mapgen_edge_max then - wmin, wmax = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max + local wmin, wmax + if mcl_mapgen then + if mcl_mapgen.EDGE_MIN and mcl_mapgen.EDGE_MAX then + wmin, wmax = mcl_mapgen.EDGE_MIN, mcl_mapgen.EDGE_MAX + return pos + and (pos.x - radius) > wmin and (pos.x + radius) < wmax + and (pos.y - radius) > wmin and (pos.y + radius) < wmax + and (pos.z - radius) > wmin and (pos.z + radius) < wmax end end - return pos - and (pos.x - radius) > wmin and (pos.x + radius) < wmax - and (pos.y - radius) > wmin and (pos.y + radius) < wmax - and (pos.z - radius) > wmin and (pos.z + radius) < wmax end -- get node but use fallback for nil or unknown @@ -211,25 +211,6 @@ mobs.teleport = function(self, target) end end ---a function used for despawning mobs -mobs.check_for_player_within_area = function(self, radius) - local pos1 = self.object:get_pos() - --get players in radius - for _,player in pairs(minetest_get_connected_players()) do - if player and player:get_hp() > 0 then - local pos2 = player:get_pos() - local distance = vector_distance(pos1,pos2) - if distance < radius then - --found a player - return true - end - end - end - --did not find a player - return false -end - - --a simple helper function for mobs following mobs.get_2d_distance = function(pos1,pos2) pos1.y = 0 diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua index 83df80992..26513a648 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua @@ -147,4 +147,24 @@ mobs.breeding_effect = function(self) vertical = false, texture = "heart.png", }) -end \ No newline at end of file +end + +mobs.smoke_effect = function(self) + local pos = self.object:get_pos() + minetest.add_particlespawner({ + amount = 5, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -1, y = -1, z = -1}, + maxvel = {x = 1, y = 1, z = 1}, + minacc = {x = 0, y = 10, z = 0}, + maxacc = {x = 0, y = 10, z = 0}, + minexptime = 0.1, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + collisiondetection = false, + texture = "mcl_particles_smoke.png", + }) +end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/monster_light.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/monster_light.lua new file mode 100644 index 000000000..266ade6f8 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/monster_light.lua @@ -0,0 +1,18 @@ +-- This file contains all of the light levels for monsters in the game +-- If the mob is not here they either do not exist or can spawn at any light level +monster_lightlvl = { + zombie = 0, + skeleton = 0, + stray = 0, + blaze = 11, + skeleton_wither = 7, + pigman = 10, + baby_pigman = 10, + slime_big = 7, + creeper = 0, + witch = 0, + spider = 0, + silverfish = 11, + endermen = 7, + bat = 3 +} diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index b10d794ea..cbc2076e7 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -43,6 +43,11 @@ mobs.float = function(self) self.object:set_acceleration({x=0, y=0, z=0}) end + if self.jump_only then + self.object:set_acceleration({x=acceleration.x, y=-5, z=acceleration.z}) + return + end + local current_velocity = self.object:get_velocity() local new_velocity_addition = DEFAULT_FLOAT_SPEED - current_velocity.y diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua index a4b4c075e..bafb12737 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua @@ -28,12 +28,14 @@ mobs.shoot_projectile_handling = function(arrow_item, pos, dir, yaw, shooter, po obj:set_acceleration({x=0, y=gravity, z=0}) obj:set_yaw(yaw-math.pi/2) local le = obj:get_luaentity() - le._shooter = shooter - le._damage = damage - le._is_critical = is_critical - le._startpos = pos - le._knockback = knockback - le._collectable = collectable + if le then + le._shooter = shooter + le._damage = damage + le._is_critical = is_critical + le._startpos = pos + le._knockback = knockback + le._collectable = collectable + end --play custom shoot sound if shooter and shooter.shoot_sound then diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua index b9cf2f669..d9cc4237c 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -5,9 +5,27 @@ local minetest_settings = minetest.settings -- CMI support check local use_cmi = minetest.global_exists("cmi") +local vector_distance = vector.distance +local minetest_get_connected_players = minetest.get_connected_players +local math_random = math.random + mobs.can_despawn = function(self) - return (not self.tamed and not self.bred and not self.nametag and - not mobs.check_for_player_within_area(self, 64)); + if self.tamed or self.bred or self.nametag then return false end + local mob_pos = self.object:get_pos() + if not mob_pos then return true end + local distance = 999 + for _, player in pairs(minetest_get_connected_players()) do + if player and player:get_hp() > 0 then + local player_pos = player:get_pos() + local new_distance = vector_distance(player_pos, mob_pos) + if new_distance < distance then + distance = new_distance + if distance < 33 then return false end + if distance < 128 and math_random(1, 42) ~= 11 then return false end + end + end + end + return true end -- get entity staticdata @@ -24,7 +42,7 @@ mobs.mob_staticdata = function(self) self.following = nil if use_cmi then - self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) + self.serialized_cmi_components = cmi and cmi.serialize_components(self._cmi_components) end local tmp = {} diff --git a/mods/ENTITIES/mcl_mobs/api/mount.lua b/mods/ENTITIES/mcl_mobs/api/mount.lua index 11b2e5e89..dc56ee353 100644 --- a/mods/ENTITIES/mcl_mobs/api/mount.lua +++ b/mods/ENTITIES/mcl_mobs/api/mount.lua @@ -229,7 +229,8 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) -- mob rotation local rotate = entity.rotate if rotate then - local yaw = entity.driver:get_look_horizontal() - rotate + local driver_look_horizontal = entity.driver:get_look_horizontal() or 0 + local yaw = driver_look_horizontal - rotate entity.yaw = yaw entity.object:set_yaw(yaw) end diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index bf07ca94d..424989426 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -6,11 +6,14 @@ local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air local get_biome_name = minetest.get_biome_name local get_objects_inside_radius = minetest.get_objects_inside_radius local get_connected_players = minetest.get_connected_players - +local minetest_get_perlin = minetest.get_perlin local math_random = math.random local math_floor = math.floor ---local max = math.max +local math_ceil = math.ceil +local math_cos = math.cos +local math_sin = math.sin +local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end --local vector_distance = vector.distance local vector_new = vector.new @@ -22,151 +25,171 @@ local table_remove = table.remove local pairs = pairs -- range for mob count -local aoc_range = 48 +local aoc_range = 32 --do mobs spawn? local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false ---[[ -THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs +local noise_params = { + offset = 0, + scale = 3, + spread = { + x = 301, + y = 50, + z = 304, + }, + seed = 100, + octaves = 3, + persistence = 0.5, +} -underground: -"FlowerForest_underground", -"JungleEdge_underground",local spawning_position = spawning_position_list[math.random(1,#spawning_position_list)] -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", +-- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs +-- Also used for missing parameter +-- Please update the list when adding new biomes! -ocean: -"RoofedForest_ocean", -"JungleEdgeM_ocean", -"BirchForestM_ocean", -"BirchForest_ocean", -"IcePlains_deep_ocean", -"Jungle_deep_ocean", -"Savanna_ocean", -"MesaPlateauF_ocean", -"ExtremeHillsM_deep_ocean", -"Savanna_deep_ocean", -"SunflowerPlains_ocean", -"Swampland_deep_ocean", -"Swampland_ocean", -"MegaSpruceTaiga_deep_ocean", -"ExtremeHillsM_ocean", -"JungleEdgeM_deep_ocean", -"SunflowerPlains_deep_ocean", -"BirchForest_deep_ocean", -"IcePlainsSpikes_ocean", -"Mesa_ocean", -"StoneBeach_ocean", -"Plains_deep_ocean", -"JungleEdge_deep_ocean", -"SavannaM_deep_ocean", -"Desert_deep_ocean", -"Mesa_deep_ocean", -"ColdTaiga_deep_ocean", -"Plains_ocean", -"MesaPlateauFM_ocean", -"Forest_deep_ocean", -"JungleM_deep_ocean", -"FlowerForest_deep_ocean", -"MushroomIsland_ocean", -"MegaTaiga_ocean", -"StoneBeach_deep_ocean", -"IcePlainsSpikes_deep_ocean", -"ColdTaiga_ocean", -"SavannaM_ocean", -"MesaPlateauF_deep_ocean", -"MesaBryce_deep_ocean", -"ExtremeHills+_deep_ocean", -"ExtremeHills_ocean", -"MushroomIsland_deep_ocean", -"Forest_ocean", -"MegaTaiga_deep_ocean", -"JungleEdge_ocean", -"MesaBryce_ocean", -"MegaSpruceTaiga_ocean", -"ExtremeHills+_ocean", -"Jungle_ocean", -"RoofedForest_deep_ocean", -"IcePlains_ocean", -"FlowerForest_ocean", -"ExtremeHills_deep_ocean", -"MesaPlateauFM_deep_ocean", -"Desert_ocean", -"Taiga_ocean", -"BirchForestM_deep_ocean", -"Taiga_deep_ocean", -"JungleM_ocean", +local list_of_all_biomes = { -water or beach? -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", + -- underground: -beach: -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", + "FlowerForest_underground", + "JungleEdge_underground", + "ColdTaiga_underground", + "IcePlains_underground", + "IcePlainsSpikes_underground", + "MegaTaiga_underground", + "Taiga_underground", + "ExtremeHills+_underground", + "JungleM_underground", + "ExtremeHillsM_underground", + "JungleEdgeM_underground", -dimension biome: -"Nether", -"End", + -- ocean: -Overworld regular: -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -]]-- + "RoofedForest_ocean", + "JungleEdgeM_ocean", + "BirchForestM_ocean", + "BirchForest_ocean", + "IcePlains_deep_ocean", + "Jungle_deep_ocean", + "Savanna_ocean", + "MesaPlateauF_ocean", + "ExtremeHillsM_deep_ocean", + "Savanna_deep_ocean", + "SunflowerPlains_ocean", + "Swampland_deep_ocean", + "Swampland_ocean", + "MegaSpruceTaiga_deep_ocean", + "ExtremeHillsM_ocean", + "JungleEdgeM_deep_ocean", + "SunflowerPlains_deep_ocean", + "BirchForest_deep_ocean", + "IcePlainsSpikes_ocean", + "Mesa_ocean", + "StoneBeach_ocean", + "Plains_deep_ocean", + "JungleEdge_deep_ocean", + "SavannaM_deep_ocean", + "Desert_deep_ocean", + "Mesa_deep_ocean", + "ColdTaiga_deep_ocean", + "Plains_ocean", + "MesaPlateauFM_ocean", + "Forest_deep_ocean", + "JungleM_deep_ocean", + "FlowerForest_deep_ocean", + "MushroomIsland_ocean", + "MegaTaiga_ocean", + "StoneBeach_deep_ocean", + "IcePlainsSpikes_deep_ocean", + "ColdTaiga_ocean", + "SavannaM_ocean", + "MesaPlateauF_deep_ocean", + "MesaBryce_deep_ocean", + "ExtremeHills+_deep_ocean", + "ExtremeHills_ocean", + "MushroomIsland_deep_ocean", + "Forest_ocean", + "MegaTaiga_deep_ocean", + "JungleEdge_ocean", + "MesaBryce_ocean", + "MegaSpruceTaiga_ocean", + "ExtremeHills+_ocean", + "Jungle_ocean", + "RoofedForest_deep_ocean", + "IcePlains_ocean", + "FlowerForest_ocean", + "ExtremeHills_deep_ocean", + "MesaPlateauFM_deep_ocean", + "Desert_ocean", + "Taiga_ocean", + "BirchForestM_deep_ocean", + "Taiga_deep_ocean", + "JungleM_ocean", + -- water or beach? + "MesaPlateauFM_sandlevel", + "MesaPlateauF_sandlevel", + "MesaBryce_sandlevel", + "Mesa_sandlevel", + + -- beach: + + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "MushroomIslandShore", + "JungleM_shore", + "Jungle_shore", + + -- dimension biome: + + "Nether", + "End", + + -- Overworld regular: + + "Mesa", + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "Jungle", + "Savanna", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "Desert", + "ColdTaiga", + "MushroomIsland", + "IcePlainsSpikes", + "SunflowerPlains", + "IcePlains", + "RoofedForest", + "ExtremeHills+_snowtop", + "MesaPlateauFM_grasstop", + "JungleEdgeM", + "ExtremeHillsM", + "JungleM", + "BirchForestM", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "JungleEdge", + "SavannaM", +} -- count how many mobs are in an area local function count_mobs(pos) @@ -216,11 +239,73 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua?? --this is where all of the spawning information is kept local spawn_dictionary = {} +local summary_chance = 0 + +function mobs:spawn_setup(def) + if not mobs_spawn then return end + + if not def then + minetest.log("warning", "Empty mob spawn setup definition") + return + end + + local name = def.name + if not name then + minetest.log("warning", "Missing mob name") + return + end + + local dimension = def.dimension or "overworld" + local type_of_spawning = def.type_of_spawning or "ground" + local biomes = def.biomes or list_of_all_biomes + local min_light = def.min_light or 0 + local max_light = def.max_light or (minetest.LIGHT_MAX + 1) + local chance = def.chance or 1000 + local aoc = def.aoc or aoc_range + local min_height = def.min_height or mcl_mapgen.overworld.min + local max_height = def.max_height or mcl_mapgen.overworld.max + local day_toggle = def.day_toggle + local on_spawn = def.on_spawn + local check_position = def.check_position + + -- chance/spawn number override in minetest.conf for registered mob + local numbers = minetest.settings:get(name) + if numbers then + numbers = numbers:split(",") + chance = tonumber(numbers[1]) or chance + aoc = tonumber(numbers[2]) or aoc + if chance == 0 then + minetest.log("warning", string.format("[mobs] %s has spawning disabled", name)) + return + end + minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + end + + if chance < 1 then + chance = 1 + minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")") + end + + spawn_dictionary[#spawn_dictionary + 1] = { + name = name, + dimension = dimension, + type_of_spawning = type_of_spawning, + biomes = biomes, + min_light = min_light, + max_light = max_light, + chance = chance, + aoc = aoc, + min_height = min_height, + max_height = max_height, + day_toggle = day_toggle, + check_position = check_position, + on_spawn = on_spawn, + } + summary_chance = summary_chance + chance +end function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) - --print(dump(biomes)) - -- Do mobs spawn at all? if not mobs_spawn then return @@ -239,179 +324,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh return end - minetest.log("action", - string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) - end - - --[[ - local function spawn_action(pos, node, active_object_count, active_object_count_wider, name) - - local orig_pos = table.copy(pos) - -- is mob actually registered? - if not mobs.spawning_mobs[name] - or not minetest.registered_entities[name] then - minetest.log("warning", "Mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!") - return - end - - -- additional custom checks for spawning mob - if mobs:spawn_abm_check(pos, node, name) == true then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!") - return - end - - -- count nearby mobs in same spawn class - local entdef = minetest.registered_entities[name] - local spawn_class = entdef and entdef.spawn_class - if not spawn_class then - if entdef.type == "monster" then - spawn_class = "hostile" - else - spawn_class = "passive" - end - end - local in_class_cap = count_mobs(pos, "!"..spawn_class) < MOB_CAP[spawn_class] - -- do not spawn if too many of same mob in area - if active_object_count_wider >= max_per_block -- large-range mob cap - or (not in_class_cap) -- spawn class mob cap - or count_mobs(pos, name) >= aoc then -- per-mob mob cap - -- too many entities - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!") - return - end - - -- if toggle set to nil then ignore day/night check - if day_toggle then - - local tod = (minetest.get_timeofday() or 0) * 24000 - - if tod > 4500 and tod < 19500 then - -- daylight, but mob wants night - if day_toggle == false then - -- mob needs night - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!") - return - end - else - -- night time but mob wants day - if day_toggle == true then - -- mob needs day - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!") - return - end - end - end - - -- spawn above node - pos.y = pos.y + 1 - - -- only spawn away from player - local objs = minetest.get_objects_inside_radius(pos, 24) - - for n = 1, #objs do - - if objs[n]:is_player() then - -- player too close - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!") - return - end - end - - -- mobs cannot spawn in protected areas when enabled - if not spawn_protected - and minetest.is_protected(pos, "") then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!") - return - end - - -- are we spawning within height limits? - if pos.y > max_height - or pos.y < min_height then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!") - return - end - - -- are light levels ok? - local light = minetest.get_node_light(pos) - if not light - or light > max_light - or light < min_light then - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!") - return - end - - -- do we have enough space to spawn mob? - local ent = minetest.registered_entities[name] - local width_x = max(1, math.ceil(ent.collisionbox[4] - ent.collisionbox[1])) - local min_x, max_x - if width_x % 2 == 0 then - max_x = math.floor(width_x/2) - min_x = -(max_x-1) - else - max_x = math.floor(width_x/2) - min_x = -max_x - end - - local width_z = max(1, math.ceil(ent.collisionbox[6] - ent.collisionbox[3])) - local min_z, max_z - if width_z % 2 == 0 then - max_z = math.floor(width_z/2) - min_z = -(max_z-1) - else - max_z = math.floor(width_z/2) - min_z = -max_z - end - - local max_y = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) - - for y = 0, max_y do - for x = min_x, max_x do - for z = min_z, max_z do - local pos2 = {x = pos.x+x, y = pos.y+y, z = pos.z+z} - if minetest.registered_nodes[node_ok(pos2).name].walkable == true then - -- inside block - minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!") - if ent.spawn_small_alternative and (not minetest.registered_nodes[node_ok(pos).name].walkable) then - minetest.log("info", "Trying to spawn smaller alternative mob: "..ent.spawn_small_alternative) - spawn_action(orig_pos, node, active_object_count, active_object_count_wider, ent.spawn_small_alternative) - end - return - end - end - end - end - - -- tweak X/Y/Z spawn pos - if width_x % 2 == 0 then - pos.x = pos.x + 0.5 - end - if width_z % 2 == 0 then - pos.z = pos.z + 0.5 - end - pos.y = pos.y - 0.5 - - local mob = minetest.add_entity(pos, name) - minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) - - if on_spawn then - - local ent = mob:get_luaentity() - - on_spawn(ent, pos) - end - end - - local function spawn_abm_action(pos, node, active_object_count, active_object_count_wider) - spawn_action(pos, node, active_object_count, active_object_count_wider, name) - end - ]]-- - - local entdef = minetest.registered_entities[name] - local spawn_class - if entdef.type == "monster" then - spawn_class = "hostile" - else - spawn_class = "passive" + minetest.log("action", string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) end --load information into the spawn dictionary @@ -423,107 +336,34 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh spawn_dictionary[key]["biomes"] = biomes spawn_dictionary[key]["min_light"] = min_light spawn_dictionary[key]["max_light"] = max_light - spawn_dictionary[key]["interval"] = interval spawn_dictionary[key]["chance"] = chance spawn_dictionary[key]["aoc"] = aoc spawn_dictionary[key]["min_height"] = min_height spawn_dictionary[key]["max_height"] = max_height spawn_dictionary[key]["day_toggle"] = day_toggle - --spawn_dictionary[key]["on_spawn"] = spawn_abm_action - spawn_dictionary[key]["spawn_class"] = spawn_class - --[[ - minetest.register_abm({ - label = name .. " spawning", - nodenames = nodes, - neighbors = neighbors, - interval = interval, - chance = floor(max(1, chance * mobs_spawn_chance)), - catch_up = false, - action = spawn_abm_action, - }) - ]]-- + summary_chance = summary_chance + chance end --- compatibility with older mob registration --- we're going to forget about this for now -j4i ---[[ -function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) - - mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, - chance, active_object_count, -31000, max_height, day_toggle) +local two_pi = 2 * math.pi +local function get_next_mob_spawn_pos(pos) + local distance = math_random(25, 32) + local angle = math_random() * two_pi + return { + x = math_round(pos.x + distance * math_cos(angle)), + y = pos.y, + z = math_round(pos.z + distance * math_sin(angle)) + } end -]]-- - - ---Don't disable this yet-j4i --- MarkBu's spawn function - -function mobs:spawn(def) - --does nothing for now - --[[ - local name = def.name - local nodes = def.nodes or {"group:soil", "group:stone"} - local neighbors = def.neighbors or {"air"} - local min_light = def.min_light or 0 - local max_light = def.max_light or 15 - local interval = def.interval or 30 - local chance = def.chance or 5000 - local active_object_count = def.active_object_count or 1 - local min_height = def.min_height or -31000 - local max_height = def.max_height or 31000 - local day_toggle = def.day_toggle - local on_spawn = def.on_spawn - - mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, - chance, active_object_count, min_height, max_height, day_toggle, on_spawn) - ]]-- -end - - - -local axis ---inner and outer part of square donut radius -local inner = 15 -local outer = 64 -local int = {-1,1} - -local function position_calculation(pos) - - pos = vector_floor(pos) - - --this is used to determine the axis buffer from the player - axis = math_random(0,1) - - --cast towards the direction - if axis == 0 then --x - pos.x = pos.x + math_random(inner,outer)*int[math_random(1,2)] - pos.z = pos.z + math_random(-outer,outer) - else --z - pos.z = pos.z + math_random(inner,outer)*int[math_random(1,2)] - pos.x = pos.x + math_random(-outer,outer) - end - return pos -end - ---[[ -local decypher_limits_dictionary = { - ["overworld"] = {mcl_vars.mg_overworld_min,mcl_vars.mg_overworld_max}, - ["nether"] = {mcl_vars.mg_nether_min, mcl_vars.mg_nether_max}, - ["end"] = {mcl_vars.mg_end_min, mcl_vars.mg_end_max} -} -]]-- local function decypher_limits(posy) - --local min_max_table = decypher_limits_dictionary[dimension] - --return min_max_table[1],min_max_table[2] posy = math_floor(posy) return posy - 32, posy + 32 end --a simple helper function for mob_spawn local function biome_check(biome_list, biome_goal) - for _,data in ipairs(biome_list) do + for _, data in pairs(biome_list) do if data == biome_goal then return true end @@ -533,176 +373,102 @@ local function biome_check(biome_list, biome_goal) end ---todo mob limiting ---MAIN LOOP - if mobs_spawn then + + local perlin_noise + + local function spawn_a_mob(pos, dimension, y_min, y_max) + local dimension = dimension or mcl_worlds.pos_to_dimension(pos) + local goal_pos = get_next_mob_spawn_pos(pos) + local spawning_position_list = find_nodes_in_area_under_air( + {x = goal_pos.x, y = y_min, z = goal_pos.z}, + {x = goal_pos.x, y = y_max, z = goal_pos.z}, + {"group:solid", "group:water", "group:lava"} + ) + if #spawning_position_list <= 0 then return end + local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)] + + --hard code mob limit in area to 5 for now + if count_mobs(spawning_position) >= 5 then return end + + local gotten_node = get_node(spawning_position).name + local gotten_biome = minetest.get_biome_data(spawning_position) + if not gotten_node or not gotten_biome then return end + gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with + + --add this so mobs don't spawn inside nodes + spawning_position.y = spawning_position.y + 1 + + --only need to poll for node light if everything else worked + local gotten_light = get_node_light(spawning_position) + + local is_water = get_item_group(gotten_node, "water") ~= 0 + local is_lava = get_item_group(gotten_node, "lava") ~= 0 + local is_ground = not (is_water or is_lava) + if not is_ground then + spawning_position.y = spawning_position.y - 1 + end + + local mob_def + + --create a disconnected clone of the spawn dictionary + --prevents memory leak + local mob_library_worker_table = table_copy(spawn_dictionary) + + --grab mob that fits into the spawning location + --randomly grab a mob, don't exclude any possibilities + perlin_noise = perlin_noise or minetest_get_perlin(noise_params) + local noise = perlin_noise:get_3d(spawning_position) + local current_summary_chance = summary_chance + while #mob_library_worker_table > 0 do + local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1 + local mob_index = 1 + local mob_chance = mob_library_worker_table[mob_index].chance + local step_chance = mob_chance + while step_chance < mob_chance_offset do + mob_index = mob_index + 1 + mob_chance = mob_library_worker_table[mob_index].chance + step_chance = step_chance + mob_chance + end + local mob_def = mob_library_worker_table[mob_index] + if mob_def + and spawning_position.y >= mob_def.min_height + and spawning_position.y <= mob_def.max_height + and mob_def.dimension == dimension + and biome_check(mob_def.biomes, gotten_biome) + and gotten_light >= mob_def.min_light + and gotten_light <= mob_def.max_light + and (is_ground or mob_def.type_of_spawning ~= "ground") + and (mob_def.check_position and mob_def.check_position(spawning_position) or true) + then + --everything is correct, spawn mob + local object = minetest.add_entity(spawning_position, mob_def.name) + if object then + return mob_def.on_spawn and mob_def.on_spawn(object, pos) + end + end + current_summary_chance = current_summary_chance - mob_chance + table_remove(mob_library_worker_table, mob_index) + end + end + + + --MAIN LOOP + local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime - if timer >= 10 then - timer = 0 - for _,player in pairs(get_connected_players()) do - -- after this line each "break" means "continue" - local do_mob_spawning = true - repeat - --don't need to get these variables more than once - --they happen in a single server step - - local player_pos = player:get_pos() - local dimension = mcl_worlds.pos_to_dimension(player_pos) - - if dimension == "void" or dimension == "default" then - break -- ignore void and unloaded area - end - - local min, max = decypher_limits(player_pos.y) - - for i = 1, math_random(1,4) do - -- after this line each "break" means "continue" - local do_mob_algorithm = true - repeat - - local goal_pos = position_calculation(player_pos) - - local spawning_position_list = find_nodes_in_area_under_air(vector_new(goal_pos.x,min,goal_pos.z), vector_new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) - - --couldn't find node - if #spawning_position_list <= 0 then - break - end - - local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] - - --Prevent strange behavior --- this is commented out: /too close to player --fixed with inner circle - if not spawning_position then -- or vector_distance(player_pos, spawning_position) < 15 - break - end - - --hard code mob limit in area to 5 for now - if count_mobs(spawning_position) >= 5 then - break - end - - local gotten_node = get_node(spawning_position).name - - if not gotten_node or gotten_node == "air" then --skip air nodes - break - end - - local gotten_biome = minetest.get_biome_data(spawning_position) - - if not gotten_biome then - break --skip if in unloaded area - end - - gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with - - --add this so mobs don't spawn inside nodes - spawning_position.y = spawning_position.y + 1 - - --only need to poll for node light if everything else worked - local gotten_light = get_node_light(spawning_position) - - local is_water = get_item_group(gotten_node, "water") ~= 0 - local is_lava = get_item_group(gotten_node, "lava") ~= 0 - - local mob_def = nil - - --create a disconnected clone of the spawn dictionary - --prevents memory leak - local mob_library_worker_table = table_copy(spawn_dictionary) - - --grab mob that fits into the spawning location - --randomly grab a mob, don't exclude any possibilities - local repeat_mob_search = true - repeat - - --do not infinite loop - if #mob_library_worker_table <= 0 then - --print("breaking infinite loop") - break - end - - local skip = false - - --use this for removing table elements of mobs that do not match - local temp_index = math_random(1,#mob_library_worker_table) - - local temp_def = mob_library_worker_table[temp_index] - - --skip if something ridiculous happens (nil mob def) - --something truly horrible has happened if skip gets - --activated at this point - if not temp_def then - skip = true - end - - if not skip and (spawning_position.y < temp_def.min_height or spawning_position.y > temp_def.max_height) then - skip = true - end - - --skip if not correct dimension - if not skip and (temp_def.dimension ~= dimension) then - skip = true - end - - --skip if not in correct biome - if not skip and (not biome_check(temp_def.biomes, gotten_biome)) then - skip = true - end - - --don't spawn if not in light limits - if not skip and (gotten_light < temp_def.min_light or gotten_light > temp_def.max_light) then - skip = true - end - - --skip if not in correct spawning type - if not skip and (temp_def.type_of_spawning == "ground" and is_water) then - skip = true - end - - if not skip and (temp_def.type_of_spawning == "ground" and is_lava) then - skip = true - end - - --found a mob, exit out of loop - if not skip then - --minetest.log("warning", "found mob:"..temp_def.name) - --print("found mob:"..temp_def.name) - mob_def = table_copy(temp_def) - break - else - --minetest.log("warning", "deleting temp index "..temp_index) - --print("deleting temp index") - table_remove(mob_library_worker_table, temp_index) - end - - until repeat_mob_search == false --this is needed to sort through mobs randomly - - - --catch if went through all mobs and something went horribly wrong - --could not find a valid mob to spawn that fits the environment - if not mob_def then - break - end - - --adjust the position for water and lava mobs - if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then - spawning_position.y = spawning_position.y - 1 - end - - --print("spawning: " .. mob_def.name) - - --everything is correct, spawn mob - minetest.add_entity(spawning_position, mob_def.name) - - break - until do_mob_algorithm == false --this is a safety catch - end - - break - until do_mob_spawning == false --this is a performance catch + if timer < 10 then return end + timer = 0 + for _, player in pairs(get_connected_players()) do + local pos = player:get_pos() + local dimension = mcl_worlds.pos_to_dimension(pos) + -- ignore void and unloaded area + if dimension ~= "void" and dimension ~= "default" then + local y_min, y_max = decypher_limits(pos.y) + for i = 1, math_random(1, 4) do + spawn_a_mob(pos, dimension, y_min, y_max) + end end end end) diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr index 96ac6a817..89b09ab10 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr @@ -6,6 +6,6 @@ You need the “maphack” privilege to change the mob spawner.=Vous avez besoin Name Tag=Étiquette de nom A name tag is an item to name a mob.=Une étiquette de nom est un élément pour nommer un mob. Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Avant d'utiliser l'étiquette de nom, vous devez définir un nom sur une enclume. Ensuite, vous pouvez utiliser l'étiquette de nom pour nommer un mob. Cela utilise l'étiquette de nom. -Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées! +Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisés! Give names to mobs=Donne des noms aux mobs Set name at anvil=Définir le nom sur l'enclume diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr index 3fb2eb2f1..3ce64ced6 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr @@ -1,11 +1,11 @@ # textdomain: mcl_mobs Peaceful mode active! No monsters will spawn.=Мирный режим включён! Монстры не будут появляться. This allows you to place a single mob.=Позволяет вам разместить одного моба. -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Просто поместите это туда, где хотите, чтобы появился моб. Животные будут появляться уже прирученные, если это не нужно, удерживайте клавишу [Красться] при размещении. Если поместить это на спаунер, появляющийся из него моб будет изменён. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Используйте предмет там, где хотите, чтобы появился моб. Животные будут появляться уже прирученные, если это не нужно, удерживайте клавишу [Красться] при использовании. Если поместить это на спаунер, появляющийся из него моб будет изменён. You need the “maphack” privilege to change the mob spawner.=Вам нужно обладать привилегией “maphack”, чтобы изменить спаунер моба. -Name Tag=Именная бирка -A name tag is an item to name a mob.=Именная бирка это предмет, чтобы дать мобу имя. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать именную бирку, нужно задать имя на наковальне. Тогда вы сможете использовать бирку, чтобы дать имя мобу. +Name Tag=Бирка +A name tag is an item to name a mob.=Бирка это предмет, которым можно дать мобу имя. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать бирку, переименуйте её на наковальне. Тогда вы сможете использовать бирку на мобе, чтобы дать ему имя. Only peaceful mobs allowed!=Разрешены только мирные мобы! Give names to mobs=Даёт имена мобам -Set name at anvil=Задайте имя при помощи наковальни +Set name at anvil=Переименуйте на наковальне \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/mod.conf b/mods/ENTITIES/mcl_mobs/mod.conf index 2a91a7764..6d3a8acc0 100644 --- a/mods/ENTITIES/mcl_mobs/mod.conf +++ b/mods/ENTITIES/mcl_mobs/mod.conf @@ -1,5 +1,5 @@ name = mcl_mobs author = PilzAdam description = Adds a mob API for mods to add animals or monsters, etc. -depends = mcl_particles +depends = mcl_mapgen, mcl_particles optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience diff --git a/mods/ENTITIES/mcl_paintings/init.lua b/mods/ENTITIES/mcl_paintings/init.lua index 26bd2c61b..74e7341ca 100644 --- a/mods/ENTITIES/mcl_paintings/init.lua +++ b/mods/ENTITIES/mcl_paintings/init.lua @@ -160,6 +160,7 @@ minetest.register_entity("mcl_paintings:painting", { set_entity(self.object) end, get_staticdata = function(self) + if not self then return end local data = { _facing = self._facing, _pos = self._pos, diff --git a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr index cc2f52778..3cd8ebca7 100644 --- a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr +++ b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr @@ -1,2 +1,2 @@ # textdomain:mcl_paintings -Painting=Рисование +Painting=Картина diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index c8ac421cc..d792af0a2 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -525,7 +525,7 @@ if c("totem") then inventory_image = "mcl_totems_totem.png", wield_image = "mcl_totems_totem.png", stack_max = 1, - groups = {combat_item=1}, + groups = {combat_item = 1, offhand_item = 1}, }) end diff --git a/mods/ENTITIES/mobs_mc/README.md b/mods/ENTITIES/mobs_mc/README.md index d3ac29a16..4718c6b1f 100644 --- a/mods/ENTITIES/mobs_mc/README.md +++ b/mods/ENTITIES/mobs_mc/README.md @@ -10,6 +10,7 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers * [22i](https://github.com/22i): Models (done in Blender) and mob icons for spawn eggs * [XSSheep](https://www.planetminecraft.com/member/xssheep/): Mob and item textures (from [Pixel Perfection](https://www.planetminecraft.com/texture_pack/131pixel-perfection/)) * MysticTempest: More mob textures +* [Mental-Inferno](https://github.com/Mental-Inferno): Code * See `LICENSE_media.md` for detailed credits about each file ## Licensing diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 0f62c5388..e02c57a8f 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -68,7 +68,7 @@ mobs:register_mob("mobs_mc:blaze", { light_damage = 0, view_range = 16, attack_type = "projectile", - arrow = "mobs_mc:blaze_fireball", + arrow = "mobs_mc:blaze_fireball_entity", shoot_interval = 3.5, shoot_offset = 1.0, passive = false, @@ -89,10 +89,13 @@ mobs:register_mob("mobs_mc:blaze", { end, do_custom = function(self) - if self.attacking and self.state == "attack" and vector.distance(self.object:get_pos(), self.attacking:get_pos()) < 1.2 then - mcl_burning.set_on_fire(self.attacking, 5) - end local pos = self.object:get_pos() + if self.attacking and self.state == "attack" then + local attacking_pos = self.attacking:get_pos() + if attacking_pos and vector.distance(pos, attacking_pos) < 1.2 then + mcl_burning.set_on_fire(self.attacking, 5) + end + end minetest.add_particle({ pos = {x=pos.x+math.random(-0.7,0.7)*math.random()/2,y=pos.y+math.random(0.7,1.2),z=pos.z+math.random(-0.7,0.7)*math.random()/2}, velocity = {x=0, y=math.random(1,1), z=0}, diff --git a/mods/ENTITIES/mobs_mc/depends.txt b/mods/ENTITIES/mobs_mc/depends.txt deleted file mode 100644 index 674eb8094..000000000 --- a/mods/ENTITIES/mobs_mc/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mcl_mobs \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr index 4c8bd562d..74d664659 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr @@ -1,7 +1,7 @@ # textdomain: mobs_mc Totem of Undying=Totem d'immortalité A totem of undying is a rare artifact which may safe you from certain death.=Un totem d'immortalité est un artefact rare qui peut vous protéger d'une mort certaine. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé(e) de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit. Agent=Agent Bat=Chauve-souris Blaze=Blaze @@ -58,7 +58,7 @@ Iron horse armor can be worn by horses to increase their protection from harm a Golden Horse Armor=Armure de cheval en or Golden horse armor can be worn by horses to increase their protection from harm.=Une armure de cheval en or peut être portée par les chevaux pour augmenter leur protection contre les dommages. Diamond Horse Armor=Armure de cheval en diamant -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diament peut être portée par les chevaux pour augmenter fortement leur protection contre les dommages. +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Une armure de cheval en diamant peut être portée par les chevaux pour augmenter fortement leur protection contre les dommages. Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Placez-la sur un cheval pour mettre l'armure de cheval. Les ânes et les mules ne peuvent pas porter d'armure de cheval. Farmer=Fermier Fisherman=Pêcheur @@ -73,4 +73,4 @@ Weapon Smith=Fabriquant d'arme Tool Smith=Fabriquant d'outil Cleric=Clerc Nitwit=Crétin -Protects you from death while wielding it=Vous protège de la mort en la maniant +Protects you from death while wielding it=Vous protège de la mort en le maniant diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr index 8857dda97..6733f22b2 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr @@ -1,24 +1,24 @@ # textdomain: mobs_mc Totem of Undying=Тотем бессмертия A totem of undying is a rare artifact which may safe you from certain death.=Тотем бессмертия это редкий артефакт, способный спасти вас от смерти. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Тотем работает только когда вы держите его в руке. Если вы получаете смертельный урон, вы спасаетесь от смерти и получаете второй шанс с 1 HP. Однако тотем при этом уничтожается. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Тотем работает только тогда, когда вы держите его в руке. Если вы получаете смертельный урон, вы спасаетесь от смерти и получаете второй шанс с 1 HP. Однако тотем при этом уничтожается. Agent=Агент Bat=Летучая мышь Blaze=Ифрит Chicken=Курица Cow=Корова -Mooshroom=Гриб +Mooshroom=Грибная корова Creeper=Крипер -Ender Dragon=Дракон Предела +Ender Dragon=Дракон Края Enderman=Эндермен Endermite=Эндермит Ghast=Гаст Elder Guardian=Древний страж Guardian=Страж Horse=Лошадь -Skeleton Horse=Скелет лошади -Zombie Horse=Зомби-лошадь -Donkey=Ослик +Skeleton Horse=Лошадь-скелет +Zombie Horse=Лошадь-зомби +Donkey=Осёл Mule=Мул Iron Golem=Железный голем Llama=Лама @@ -36,7 +36,7 @@ Skeleton=Скелет Stray=Странник Wither Skeleton=Скелет-иссушитель Magma Cube=Лавовый куб -Slime=Слизняк +Slime=Слизень Snow Golem=Снежный голем Spider=Паук Cave Spider=Пещерный паук @@ -53,13 +53,13 @@ Wolf=Волк Husk=Кадавр Zombie=Зомби Zombie Pigman=Зомби-свиночеловек -Iron Horse Armor=Железные доспехи лошади -Iron horse armor can be worn by horses to increase their protection from harm a bit.=Железные доспехи лошади, надетые на лошадь, немного защищают её от вреда. -Golden Horse Armor=Золотые доспехи лошади -Golden horse armor can be worn by horses to increase their protection from harm.=Золотые доспехи лошади, надетые на лошадь, защищают её от вреда. -Diamond Horse Armor=Алмазные доспехи лошади -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Алмазные доспехи лошади, надетые на лошадь, отлично защищают её от вреда. -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Поместите это на лошадь, чтобы одеть лошадь в доспехи. Ослики и мулы не могут носить лошадиные доспехи. +Iron Horse Armor=Железная конская броня +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Железная конская броня может быть надета на лошадь, чтобы повысить её защиту от урона. +Golden Horse Armor=Золотая конская броня +Golden horse armor can be worn by horses to increase their protection from harm.=Золотая конская броня может быть надета на лошадь, чтобы повысить её защиту от урона. +Diamond Horse Armor=Алмазная конская броня +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Алмазная конская броня может быть надета на лошадь, чтобы повысить её защиту от урона. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Поместите это на лошадь, чтобы одеть лошадь в броню. Ослы и мулы не могут носить конскую броню. Farmer=Фермер Fisherman=Рыбак Fletcher=Лучник @@ -71,6 +71,6 @@ Leatherworker=Кожевник Butcher=Мясник Weapon Smith=Оружейник Tool Smith=Инструментальщик -Cleric=Церковник +Cleric=Священник Nitwit=Нищий -Protects you from death while wielding it=Защищает вас от смерти, пока вы владеете им +Protects you from death while wielding it=Защищает вас от смерти, пока вы держите его diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index ac3991ad1..70f358fb2 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -2,6 +2,8 @@ --################### SILVERFISH --################### +local PLAYER_SCAN_RADIUS = 5 + local S = minetest.get_translator(minetest.get_current_modname()) mobs:register_mob("mobs_mc:silverfish", { @@ -46,6 +48,20 @@ mobs:register_mob("mobs_mc:silverfish", { view_range = 16, attack_type = "punch", damage = 1, + do_custom = function(self, dtime) + self.do_custom_time = (self.do_custom_time or 0) + dtime + if self.do_custom_time < 1.5 then return end + self.do_custom_time = 0 + local selfpos = self.object:get_pos() + local objects = minetest.get_objects_inside_radius(selfpos, PLAYER_SCAN_RADIUS) + for _, obj in pairs(objects) do + if obj:is_player() and not minetest.is_creative_enabled(obj:get_player_name()) then + self.attacking = obj + mobs.group_attack_initialization(self) + return + end + end + end }) mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "mobs_mc_spawn_icon_silverfish.png", 0) diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index e1be9c3ed..49eff8ca1 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -76,7 +76,122 @@ local spider = { } mobs:register_mob("mobs_mc:spider", spider) --- Cave spider + + +--Cave Spider + +local cave_spider = { + description = S("Cave Spider"), + type = "monster", + spawn_class = "hostile", + passive = false, + hostile = true, + always_climb = true, + docile_by_day = true, + rotate = 270, + + --[[work-around for poison until punch augmentations are added to mob API + works functionally but the jump while punching animation in gone--]] + reach = 0.5, --makes it look like it's biting + attack_type = "projectile", + arrow = "spider_venom", --ultra short range projectile to inflict poison effect + punch damage + projectile_cooldown_min = 1, + projectile_cooldown_max = 1, + shoot_arrow = function(self, pos, dir) + local dmg = 2 + mobs.shoot_projectile_handling("mobs_mc:spider_venom", pos, dir, self.object:get_yaw(), self.object, 1, dmg,nil,nil,nil,-0.6) + end, + + hp_min = 12, --reflect Minecraft health + hp_max = 12, + ignores_cobwebs = true, + xp_min = 5, + xp_max = 5, + eye_height = 0.475, + armor = {fleshy = 100, arthropod = 100}, + collisionbox = {-0.35, -0.01, -0.35, 0.35, 0.49, 0.35}, + visual = "mesh", + mesh = "mobs_mc_spider.b3d", + textures = { + {"mobs_mc_cave_spider.png^(mobs_mc_spider_eyes.png^[makealpha:0,0,0)"}, + }, + visual_size = {x=1.66666, y=1.5}, + makes_footstep_sound = false, + sounds = { + random = "mobs_mc_spider_random", + attack = "mobs_mc_spider_attack", + damage = "mobs_mc_spider_hurt", + death = "mobs_mc_spider_death", + -- TODO: sounds: walk + distance = 16, + }, + base_pitch = 1.25, + walk_velocity = 1.3, + run_velocity = 3.5, --Compenstaing for the loss of aility to leap while attacking + jump = true, + jump_height = 4, + view_range = 16, + floats = 1, + drops = { + {name = mobs_mc.items.string, chance = 1, min = 0, max = 2, looting = "common"}, + {name = mobs_mc.items.spider_eye, chance = 3, min = 1, max = 1, looting = "common", looting_chance_function = function(lvl) + return 1 - 2 / (lvl + 3) + end}, + }, + specific_attack = { "player", "mobs_mc:iron_golem" }, + fear_height = 4, + animation = { + stand_speed = 10, + walk_speed = 25, + run_speed = 50, + stand_start = 20, + stand_end = 40, + walk_start = 0, + walk_end = 20, + run_start = 0, + run_end = 20, + }, +} +mobs:register_mob("mobs_mc:cave_spider", cave_spider) + + +-- spider_venom (projectile) +mobs:register_arrow("mobs_mc:spider_venom", { + visual = "sprite", + visual_size = {x = 0.1, y = 0.1}, + textures = {"hbhunger_icon_health_poison.png"}, + velocity = 1, + collisionbox = {-.5, -.5, -.5, .5, .5, .5}, + tail = 0, + + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self._damage}, + }, nil) + + mcl_potions.poison_func(player, 0.5, 8) --modified cuz MC rate is an unessesarily bad fraction + local vel = player:get_velocity() + player:add_velocity({x=(vel.x * -1.5), y=6, z=(vel.z * -1.5)}) --"chaos knockback" effect (Temporary until I understand how to implement knockback for a projectile) + end, + + hit_mob = function(self, mob) + if mob ~= self then --due to low power of attack, spider can shoot itself while chasing a target + mob:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self._damage}, + }, nil) + + if ((mob ~= "mobs_mc:cave_spider") and (mob ~= "mobs_mc:spider")) then --spider's don't have automatic immunity to poison yet so this is a stop gap solution + mcl_potions.poison_func(mob, 0.5, 8) --modified cuz MC rate is an unessesarily bad fraction + end + local vel = mob:get_velocity() + mob:add_velocity({x=(-1 * vel.z), y=6, z=(-1 * vel.x)}) --"chaos knockback" effect (Temporary until I understand how to implement knockback for a projectile) + end + end, +}) + +--[[ Cave spider (Previous code) local cave_spider = table.copy(spider) cave_spider.description = S("Cave Spider") cave_spider.textures = { {"mobs_mc_cave_spider.png^(mobs_mc_spider_eyes.png^[makealpha:0,0,0)"} } @@ -91,7 +206,7 @@ cave_spider.walk_velocity = 1.3 cave_spider.run_velocity = 3.2 cave_spider.sounds = table.copy(spider.sounds) cave_spider.sounds.base_pitch = 1.25 -mobs:register_mob("mobs_mc:cave_spider", cave_spider) +mobs:register_mob("mobs_mc:cave_spider", cave_spider)--]] mobs:spawn_specific( diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index e1247d8bd..3eb0122a7 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -9,6 +9,95 @@ local S = minetest.get_translator(minetest.get_current_modname()) --################### ZOMBIE --################### +local husk_biomes = { + "Desert", + "SavannaM", + "Savanna", + "Savanna_beach", +} + +local zombie_biomes = { + "FlowerForest_underground", + "JungleEdge_underground", + "StoneBeach_underground", + "MesaBryce_underground", + "Mesa_underground", + "RoofedForest_underground", + "Jungle_underground", + "Swampland_underground", + "MushroomIsland_underground", + "BirchForest_underground", + "Plains_underground", + "MesaPlateauF_underground", + "ExtremeHills_underground", + "MegaSpruceTaiga_underground", + "BirchForestM_underground", + "SavannaM_underground", + "MesaPlateauFM_underground", + "Desert_underground", + "Savanna_underground", + "Forest_underground", + "SunflowerPlains_underground", + "ColdTaiga_underground", + "IcePlains_underground", + "IcePlainsSpikes_underground", + "MegaTaiga_underground", + "Taiga_underground", + "ExtremeHills+_underground", + "JungleM_underground", + "ExtremeHillsM_underground", + "JungleEdgeM_underground", + "Mesa", + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "Jungle", + "Savanna", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "Desert", + "ColdTaiga", + "MushroomIsland", + "IcePlainsSpikes", + "SunflowerPlains", + "IcePlains", + "RoofedForest", + "ExtremeHills+_snowtop", + "MesaPlateauFM_grasstop", + "JungleEdgeM", + "ExtremeHillsM", + "JungleM", + "BirchForestM", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "JungleEdge", + "SavannaM", + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "MushroomIslandShore", + "JungleM_shore", + "Jungle_shore", + "MesaPlateauFM_sandlevel", + "MesaPlateauF_sandlevel", + "MesaBryce_sandlevel", + "Mesa_sandlevel", +} + local drops_common = { {name = mobs_mc.items.rotten_flesh, chance = 1, @@ -166,230 +255,36 @@ baby_husk.child = 1 mobs:register_mob("mobs_mc:baby_husk", baby_husk) - -- Spawning -mobs:spawn_specific( -"mobs_mc:zombie", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -}, -0, -7, -30, -6000, -4, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mobs:spawn_setup({ + name = "mobs_mc:zombie", + biomes = zombie_biomes, + max_light = 7, + chance = 2000, +}) + -- Baby zombie is 20 times less likely than regular zombies -mobs:spawn_specific( -"mobs_mc:baby_zombie", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -}, -0, -7, -30, -60000, -4, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mobs:spawn_setup({ + name = "mobs_mc:baby_zombie", + biomes = zombie_biomes, + max_lignt = 7, + chance = 100, +}) +mobs:spawn_setup({ + name = "mobs_mc:husk", + biomes = husk_biomes, + max_light = 7, + chance = 2000, +}) -mobs:spawn_specific( -"mobs_mc:husk", -"overworld", -"ground", -{ -"Desert", -"SavannaM", -"Savanna", -"Savanna_beach", -}, -0, -7, -30, -6500, -4, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) -mobs:spawn_specific( -"mobs_mc:baby_husk", -"overworld", -"ground", -{ -"Desert", -"SavannaM", -"Savanna", -"Savanna_beach", -}, -0, -7, -30, -65000, -4, -mobs_mc.spawn_height.overworld_min, -mobs_mc.spawn_height.overworld_max) +mobs:spawn_setup({ + name = "mobs_mc:baby_husk", + biomes = husk_biomes, + max_light = 7, + chance = 100, +}) -- Spawn eggs mobs:register_egg("mobs_mc:husk", S("Husk"), "mobs_mc_spawn_icon_husk.png", 0) diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index 27cb4b4bf..7be16e482 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -233,15 +233,15 @@ mobs_mc.override.spawn_height = { water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld -- Overworld boundaries (inclusive) - overworld_min = mcl_vars.mg_overworld_min, - overworld_max = mcl_vars.mg_overworld_max, + overworld_min = mcl_mapgen.overworld.min, + overworld_max = mcl_mapgen.overworld.max, -- Nether boundaries (inclusive) - nether_min = mcl_vars.mg_nether_min, - nether_max = mcl_vars.mg_nether_max, + nether_min = mcl_mapgen.nether.min, + nether_max = mcl_mapgen.nether.max, -- End boundaries (inclusive) - end_min = mcl_vars.mg_end_min, - end_max = mcl_vars.mg_end_max, + end_min = mcl_mapgen.end_.min, + end_max = mcl_mapgen.end_.max, } diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.fr.tr b/mods/ENVIRONMENT/lightning/locale/lightning.fr.tr index 18c61d51c..96c5dc9fa 100644 --- a/mods/ENVIRONMENT/lightning/locale/lightning.fr.tr +++ b/mods/ENVIRONMENT/lightning/locale/lightning.fr.tr @@ -1,4 +1,4 @@ # textdomain: lightning -@1 was struck by lightning.=@1 a été frappé par la foudre. -Let lightning strike at the specified position or yourself=Laissez la foudre frapper à la position spécifiée ou sur vous-même +@1 was struck by lightning.=@1 a été frappé(e) par la foudre. +Let lightning strike at the specified position or yourself=Fait frapper la foudre à la position spécifiée ou sur vous-même No position specified and unknown player=Aucune position spécifiée et joueur inconnu diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr b/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr index 68bcf3555..bbed8d1f6 100644 --- a/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr +++ b/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr @@ -1,4 +1,4 @@ # textdomain: lightning -@1 was struck by lightning.=@1 убило молнией. -Let lightning strike at the specified position or yourself=Позволяет молнии бить в заданную позицию или в вас -No position specified and unknown player=Позиция не задана и игрок неизвестен +@1 was struck by lightning.=@1 убит(а) молнией. +Let lightning strike at the specified position or yourself=Бьёт молнией в заданную позицию или в вас +No position specified and unknown player=Позиция не определена и игрок неизвестен diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.fr.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.fr.tr index 515d1c999..747e9be39 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.fr.tr +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.fr.tr @@ -1,3 +1,3 @@ # textdomain: mcl_void_damage The void is off-limits to you!=Le vide vous est interdit! -@1 fell into the endless void.=@1 est tombé dans le vide sans fin. +@1 fell into the endless void.=@1 est tombé(e) dans le vide sans fin. diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.ru.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.ru.tr index 35feb9684..66859f374 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.ru.tr +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.ru.tr @@ -1,3 +1,3 @@ # textdomain: mcl_void_damage -The void is off-limits to you!=Пустота запрещена для вас! -@1 fell into the endless void.=@1 упал(а) в бесконечную пустоту. +The void is off-limits to you!=Пустота ограничена для вас! +@1 fell into the endless void.=@1 упал в пустоту. diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr index 0c3773b7a..9498a2732 100644 --- a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr @@ -1,9 +1,8 @@ # textdomain: mcl_weather -Gives ability to control weather=Предоставляет возможность управлять погодой -Changes the weather to the specified parameter.=Меняет погоду на заданное значение. -Error: No weather specified.=Ошибка: Не указана погода. -Error: Invalid parameters.=Ошибка: Недопустимые параметры. +Gives ability to control weather=Даёт возможность управлять погодой +Changes the weather to the specified parameter.=Меняет погоду на заданный параметр. +Error: No weather specified.=Ошибка: не указана погода. +Error: Invalid parameters.=Ошибка: недопустимые параметры. Error: Duration can't be less than 1 second.=Ошибка: длительность не может быть менее 1 секунды. -Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Ошибка: Указана неправильная погода. Возможны варианты: “clear” (ясная), “rain” (дождь), “snow” (снег) или “thunder” (гроза). -Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Переключает между ясной погодой и осадками (случайно выбирается дождь, грозовой шторм или снег) - +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Ошибка: указана неправильная погода. Возможны варианты: “clear” (ясная), “rain” (дождь), “snow” (снег) или “thunder” (гроза). +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Переключает между ясной погодой и осадками (случайно выбирается дождь, гроза или снег) diff --git a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua index 488745eec..49c726eb5 100644 --- a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua +++ b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua @@ -21,14 +21,14 @@ local psdef= { } local function check_player(player) - local name=player:get_player_name(name) + local name=player:get_player_name(player) if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then return true end end mcl_weather.nether_dust.add_particlespawners = function(player) - local name=player:get_player_name(name) + local name=player:get_player_name(player) mcl_weather.nether_dust.particlespawners[name]={} psdef.playername = name psdef.attached = player @@ -40,7 +40,7 @@ mcl_weather.nether_dust.add_particlespawners = function(player) end mcl_weather.nether_dust.delete_particlespawners = function(player) - local name=player:get_player_name(name) + local name=player:get_player_name(player) if mcl_weather.nether_dust.particlespawners[name] then for i=1,3 do minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i]) diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 220b61006..0caef5c6f 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -1,5 +1,5 @@ -local PARTICLES_COUNT_RAIN = 30 -local PARTICLES_COUNT_THUNDER = 45 +local PARTICLES_COUNT_RAIN = 100 +local PARTICLES_COUNT_THUNDER = 300 local get_connected_players = minetest.get_connected_players @@ -19,6 +19,45 @@ mcl_weather.rain = { init_done = false, } +local update_sound={} +local vel=math.random(0,3) +local falling_speed=math.random(10,15) +local size = math.random(1,3) +local psdef= { + amount = mcl_weather.rain.particles_count, + time=0, + minpos = vector.new(-6,3,-6), + maxpos = vector.new(6,15,6), + minvel = vector.new(-vel,-falling_speed,-vel), + maxvel = vector.new(vel,-falling_speed+vel,vel), + minacc = vector.new(0,0,0), + maxacc = vector.new(0,-0.4,0), + minexptime = 0.5, + maxexptime = 2, + minsize = size, + maxsize= size*2, + collisiondetection = true, + collision_removal = true, + vertical = true, +} +local psdef_backsplash= { + amount = 10, + time=0, + minpos = vector.new(-3,-1,-3), + maxpos = vector.new(3,0,3), + minvel = vector.new(-vel,falling_speed*2,-vel), + maxvel = vector.new(vel,falling_speed*2+vel,vel), + minacc = vector.new(0,0,0), + maxacc = vector.new(0,0,0), + minexptime = 0.1, + maxexptime = 0.2, + minsize = size*0.1, + maxsize= size*0.5, + collisiondetection = true, + collision_removal = true, + vertical = true, +} +local textures = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png", "weather_pack_rain_raindrop_1.png"} function mcl_weather.rain.sound_handler(player) return minetest.sound_play("weather_rain", { @@ -44,42 +83,18 @@ function mcl_weather.rain.set_sky_box() end end --- creating manually parctiles instead of particles spawner because of easier to control --- spawn position. +-- no no no NO NO f*.. no. no manual particle creatin' PLS!! this sends EVERY particle over the net. function mcl_weather.rain.add_rain_particles(player) - mcl_weather.rain.last_rp_count = 0 - for i=mcl_weather.rain.particles_count, 1,-1 do - local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) - if mcl_weather.is_outdoor({x=random_pos_x, y=random_pos_y, z=random_pos_z}) then - mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 - minetest.add_particle({ - pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, - velocity = {x=0, y=-10, z=0}, - acceleration = {x=0, y=-30, z=0}, - expirationtime = 1.0, - size = math.random(0.5, 3), - collisiondetection = true, - collision_removal = true, - vertical = true, - texture = mcl_weather.rain.get_texture(), - playername = player:get_player_name() - }) - end + mcl_weather.rain.last_rp_count = mcl_weather.rain.particles_count + for k,v in pairs(textures) do + psdef.texture=v + mcl_weather.add_spawner_player(player,"rain"..k,psdef) end -end - --- Simple random texture getter -function mcl_weather.rain.get_texture() - local texture_name - local random_number = math.random() - if random_number > 0.33 then - texture_name = "weather_pack_rain_raindrop_1.png" - elseif random_number > 0.66 then - texture_name = "weather_pack_rain_raindrop_2.png" - else - texture_name = "weather_pack_rain_raindrop_3.png" + psdef_backsplash.texture=textures[math.random(1,#textures)] + local l=mcl_weather.add_spawner_player(player,"rainbacksplash",psdef_backsplash) + if l then + update_sound[player:get_player_name()]=true end - return texture_name; end -- register player for rain weather. @@ -89,6 +104,7 @@ function mcl_weather.rain.add_player(player) local player_meta = {} player_meta.origin_sky = {player:get_sky()} mcl_weather.players[player:get_player_name()] = player_meta + update_sound[player:get_player_name()]=true end end @@ -99,26 +115,15 @@ function mcl_weather.rain.remove_player(player) if player_meta and player_meta.origin_sky then player:set_clouds({color="#FFF0F0E5"}) mcl_weather.players[player:get_player_name()] = nil + update_sound[player:get_player_name()]=true end end -mcl_worlds.register_on_dimension_change(function(player, dimension) - if dimension ~= "overworld" and dimension ~= "void" then - mcl_weather.rain.remove_sound(player) - mcl_weather.rain.remove_player(player) - elseif dimension == "overworld" then - mcl_weather.rain.update_sound(player) - if mcl_weather.rain.raining then - mcl_weather.rain.add_rain_particles(player) - mcl_weather.rain.add_player(player) - end - end -end) - -- adds and removes rain sound depending how much rain particles around player currently exist. -- have few seconds delay before each check to avoid on/off sound too often -- when player stay on 'edge' where sound should play and stop depending from random raindrop appearance. function mcl_weather.rain.update_sound(player) + if not update_sound[player:get_player_name()] then return end local player_meta = mcl_weather.players[player:get_player_name()] if player_meta then if player_meta.sound_updated and player_meta.sound_updated + 5 > minetest.get_gametime() then @@ -136,6 +141,7 @@ function mcl_weather.rain.update_sound(player) player_meta.sound_updated = minetest.get_gametime() end + update_sound[player:get_player_name()]=false end -- rain sound removed from player. @@ -158,7 +164,8 @@ function mcl_weather.rain.clear() for _, player in pairs(get_connected_players()) do mcl_weather.rain.remove_sound(player) mcl_weather.rain.remove_player(player) - end + mcl_weather.remove_spawners_player(player) + end end minetest.register_globalstep(function(dtime) @@ -177,8 +184,10 @@ function mcl_weather.rain.make_weather() end for _, player in pairs(get_connected_players()) do - if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then + local pos=player:get_pos() + if mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(pos) or not mcl_weather.is_outdoor(pos) then mcl_weather.rain.remove_sound(player) + mcl_weather.remove_spawners_player(player) return false end mcl_weather.rain.add_player(player) @@ -190,8 +199,12 @@ end -- Switch the number of raindrops: "thunder" for many raindrops, otherwise for normal raindrops function mcl_weather.rain.set_particles_mode(mode) if mode == "thunder" then + psdef.amount=PARTICLES_COUNT_THUNDER + psdef_backsplash.amount=PARTICLES_COUNT_THUNDER mcl_weather.rain.particles_count = PARTICLES_COUNT_THUNDER else + psdef.amount=PARTICLES_COUNT_RAIN + psdef_backsplash.amount=PARTICLES_COUNT_RAIN mcl_weather.rain.particles_count = PARTICLES_COUNT_RAIN end end diff --git a/mods/ENVIRONMENT/mcl_weather/snow.lua b/mods/ENVIRONMENT/mcl_weather/snow.lua index 9f89a3a0a..b60283127 100644 --- a/mods/ENVIRONMENT/mcl_weather/snow.lua +++ b/mods/ENVIRONMENT/mcl_weather/snow.lua @@ -5,30 +5,25 @@ mcl_weather.snow = {} mcl_weather.snow.particles_count = 15 mcl_weather.snow.init_done = false --- calculates coordinates and draw particles for snow weather -function mcl_weather.snow.add_snow_particles(player) - mcl_weather.rain.last_rp_count = 0 - for i=mcl_weather.snow.particles_count, 1,-1 do - local random_pos_x, _, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) - local random_pos_y = math.random() + math.random(player:get_pos().y - 1, player:get_pos().y + 7) - if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then - mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 - minetest.add_particle({ - pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, - velocity = {x = math.random(-100,100)*0.001, y = math.random(-300,-100)*0.004, z = math.random(-100,100)*0.001}, - acceleration = {x = 0, y=0, z = 0}, - expirationtime = 8.0, - size = 1, - collisiondetection = true, - collision_removal = true, - object_collision = false, - vertical = false, - texture = mcl_weather.snow.get_texture(), - playername = player:get_player_name() - }) - end - end -end +local psdef= { + amount = 99, + time = 0, --stay on til we turn it off + minpos = vector.new(-15,-5,-15), + maxpos =vector.new(15,10,15), + minvel = vector.new(0,-1,0), + maxvel = vector.new(0,-4,0), + minacc = vector.new(0,-1,0), + maxacc = vector.new(0,-4,0), + minexptime = 1, + maxexptime = 1, + minsize = 0.5, + maxsize = 5, + collisiondetection = true, + collision_removal = true, + object_collision = true, + vertical = true, + glow = 1 +} function mcl_weather.snow.set_sky_box() mcl_weather.skycolor.add_layer( @@ -48,6 +43,7 @@ end function mcl_weather.snow.clear() mcl_weather.skycolor.remove_layer("weather-pack-snow-sky") mcl_weather.snow.init_done = false + mcl_weather.remove_all_spawners() end -- Simple random texture getter @@ -74,10 +70,14 @@ minetest.register_globalstep(function(dtime) end for _, player in pairs(get_connected_players()) do - if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then + if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos()) or not mcl_weather.is_outdoor(player:get_pos())) then + mcl_weather.remove_spawners_player(player) return false end - mcl_weather.snow.add_snow_particles(player) + for i=1,2 do + psdef.texture="weather_pack_snow_snowflake"..i..".png" + mcl_weather.add_spawner_player(player,"snow"..i,psdef) + end end end) diff --git a/mods/ENVIRONMENT/mcl_weather/weather_core.lua b/mods/ENVIRONMENT/mcl_weather/weather_core.lua index 34f69406d..f7316bcfb 100644 --- a/mods/ENVIRONMENT/mcl_weather/weather_core.lua +++ b/mods/ENVIRONMENT/mcl_weather/weather_core.lua @@ -47,6 +47,35 @@ local function save_weather() end minetest.register_on_shutdown(save_weather) +local particlespawners={} +function mcl_weather.add_spawner_player(pl,id,ps) + local name=pl:get_player_name() + if not particlespawners[name] then + particlespawners[name] = {} + end + if not particlespawners[name][id] then + ps.playername =name + ps.attached = pl + particlespawners[name][id]=minetest.add_particlespawner(ps) + return particlespawners[name][id] + end +end +function mcl_weather.remove_spawners_player(pl) + local name=pl:get_player_name() + if not particlespawners[name] then return end + for k,v in pairs(particlespawners[name]) do + minetest.delete_particlespawner(v) + end + particlespawners[name] = nil + return true +end + +function mcl_weather.remove_all_spawners() + for k,v in pairs(minetest.get_connected_players()) do + mcl_weather.remove_spawners_player(v) + end +end + function mcl_weather.get_rand_end_time(min_duration, max_duration) local r if min_duration and max_duration then @@ -92,36 +121,6 @@ function mcl_weather.is_underwater(player) return false end --- trying to locate position for particles by player look direction for performance reason. --- it is costly to generate many particles around player so goal is focus mainly on front view. -function mcl_weather.get_random_pos_by_player_look_dir(player) - local look_dir = player:get_look_dir() - local player_pos = player:get_pos() - - local random_pos_x, random_pos_y, random_pos_z - - if look_dir.x > 0 then - if look_dir.z > 0 then - random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5) - random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5) - else - random_pos_x = math.random() + math.random(player_pos.x - 2.5, player_pos.x + 5) - random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5) - end - else - if look_dir.z > 0 then - random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5) - random_pos_z = math.random() + math.random(player_pos.z - 2.5, player_pos.z + 5) - else - random_pos_x = math.random() + math.random(player_pos.x - 5, player_pos.x + 2.5) - random_pos_z = math.random() + math.random(player_pos.z - 5, player_pos.z + 2.5) - end - end - - random_pos_y = math.random() + math.random(player_pos.y + 10, player_pos.y + 15) - return random_pos_x, random_pos_y, random_pos_z -end - local t, wci = 0, mcl_weather.check_interval minetest.register_globalstep(function(dtime) diff --git a/mods/HELP/doc/doc/init.lua b/mods/HELP/doc/doc/init.lua index 304900753..fc684246b 100644 --- a/mods/HELP/doc/doc/init.lua +++ b/mods/HELP/doc/doc/init.lua @@ -1124,10 +1124,10 @@ minetest.register_chatcommand("helpform", { } ) -minetest.register_on_joinplayer(function(player) - local playername = player:get_player_name() +minetest.register_on_authplayer(function(playername, ip, is_success) + if not is_success then return end local playerdata = doc.data.players[playername] - if playerdata == nil then + if not playerdata then -- Initialize player data doc.data.players[playername] = {} playerdata = doc.data.players[playername] @@ -1171,7 +1171,9 @@ minetest.register_on_joinplayer(function(player) playerdata.stored_data.revealed_count[cid] = rc end end +end) +minetest.register_on_joinplayer(function(player) -- Add button for Inventory++ if mod_inventory_plus then inventory_plus.register_button(player, "doc_inventory_plus", S("Help")) diff --git a/mods/HELP/doc/doc/locale/doc.fr.tr b/mods/HELP/doc/doc/locale/doc.fr.tr index f7f33b0f5..2e92fd0a8 100644 --- a/mods/HELP/doc/doc/locale/doc.fr.tr +++ b/mods/HELP/doc/doc/locale/doc.fr.tr @@ -29,7 +29,7 @@ No categories have been registered, but they are required to provide help.=Aucun The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Le Système de Documentation [doc] n'est fourni avec aucun contenu d'aide, il a besoin d'autres mods pour ajouter le contenu de l'aide. Vérifiez que de tels mods sont activés pour ce monde, et réessayez. Number of entries: @1=Nombre de pages : @1 OK=OK -Open a window providing help entries about Minetest and more=Ouvrire une fenêtre contenant les pages d'aides à propos de Minetest. +Open a window providing help entries about Minetest and more=Ouvrir une fenêtre contenant les pages d'aides à propos de Minetest. Please select a category you wish to learn more about:=Veuillez choisir une catégorie pour laquelle vous souhaitez en savoir plus : Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Mods recommandés : doc_basics, doc_items, doc_identifier, doc_encyclopedia. Reveal all hidden help entries to you=Révéler toutes les pages d'aide cachées pour vous. @@ -41,7 +41,7 @@ This category does not have any entries.=Cette catégorie ne contient aucune pag This category has the following entries:=Cette catégorie contient les pages suivantes : This category is empty.=Cette catégorie est vide. This is the help.=Ceci est l'aide. -You haven't chosen a category yet. Please choose one in the category list first.=Vous n'avez pas encore choisi de catégorie. Veulliez d'abord en choisir une dans la liste. +You haven't chosen a category yet. Please choose one in the category list first.=Vous n'avez pas encore choisi de catégorie. Veuillez d'abord en choisir une dans la liste. You haven't chosen an entry yet. Please choose one in the entry list first.=Vous n'avez pas encore choisi de page. Veuillez d'abord en choisir une dans la liste. Collection of help texts=Collection des textes d'aide Notify me when new help is available=Recevoir une notification quand une nouvelle page d'aide est disponible diff --git a/mods/HELP/doc/doc/locale/doc.ru.tr b/mods/HELP/doc/doc/locale/doc.ru.tr index 105f92b11..23dc35f08 100644 --- a/mods/HELP/doc/doc/locale/doc.ru.tr +++ b/mods/HELP/doc/doc/locale/doc.ru.tr @@ -1,7 +1,7 @@ # textdomain:doc <=< >=> -Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=Доступ к запрошенной записи запрещён; эта запись засекречена. Вы можете получить доступ к ней, продвигаясь в игре. Найдите свой способ раскрыть эту запись. +Access to the requested entry has been denied; this entry is secret. You may unlock access by progressing in the game. Figure out on your own how to unlock this entry.=Доступ к запрошенной записи запрещён; эта запись засекречена. Вы можете получить доступ к ней по мере продвижение в игре. Найдите свой способ раскрыть эту запись. All entries read.=Все записи прочитаны. All help entries revealed!=Все подсказки открыты! All help entries are already revealed.=Все подсказки уже открыты. @@ -27,8 +27,8 @@ New help entry unlocked: @1 > @2=Новая подсказка разблоки No categories have been registered, but they are required to provide help.=Для предоставления помощи требуются зарегистрированные категории, но они отсутствуют. The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Система документации [doc] не предоставляет помощи сама по себе, нужны дополнительные моды для добавления справочной информации. Пожалуйста, убедитесь, что моды включены для этого мира, после чего попробуйте снова. Number of entries: @1=Количество записей: @1 -OK=О'кей -Open a window providing help entries about Minetest and more=Открыть окно с подсказками о игре Minetest и т. п. +OK=Окей +Open a window providing help entries about Minetest and more=Открыть окно с подсказками об игре Minetest и т. п. Please select a category you wish to learn more about:=Пожалуйста, выберите категорию, о которой хотите узнать больше: Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Рекомендованные моды: doc_basics, doc_items, doc_identifier, doc_encyclopedia. Reveal all hidden help entries to you=Раскрыть все подсказки для вас diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr index 1080a3186..23f9cfa45 100644 --- a/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr @@ -1,5 +1,5 @@ # textdomain:doc_identifier -Error: This node, item or object is undefined. This is always an error.=Ошибка: Данный узел, предмет или объект не определён. Это всегда вызывает ошибку. +Error: This node, item or object is undefined. This is always an error.=Ошибка: Данный блок, предмет или объект не определён. Это всегда вызывает ошибку. This can happen for the following reasons:=Это может произойти по одной из причин: • The mod which is required for it is not enabled=• Не включён мод, требуемый для этого • The author of the game or a mod has made a mistake=• Автор игры или мода допустил ошибку @@ -10,8 +10,8 @@ Lookup Tool=Инструмент просмотра No help entry for this block could be found.=Не удаётся найти справочной записи для этого блока. No help entry for this item could be found.=Не удаётся найти справочной записи для этого предмета. No help entry for this object could be found.=Не удаётся найти справочной записи для этого объекта. -OK=О'кей -Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Стукните любой блок, предмет или другую вещь, про которую хотите узнать больше. Откроется соответствующая справочная запись. Инструмент работает в двух режимах, меняющихся при использовании. В жидком режиме инструмент указывает на жидкости, в твёрдом режиме нет. +OK=Окей +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Ударьте по любому блоку, предмету и прочим вещам, про который вы хотите узнать больше. Откроется соответствующая справочная запись. Инструмент работает в двух режимах, меняющихся при использовании. В жидком режиме инструмент указывает на жидкости, в твёрдом режиме нет. This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Этот блок не может быть идентифицирован, потому что мир не ещё материализовался в этой точке. This is a player.=Это игрок. This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Этот маленький помощник выдаст вам быструю справку о чём-то из ближайшего окружения. Он идентифицирует и анализирует блоки, предметы и другие вещи и показывает подробную информацию о вещах, к которым они применимы. diff --git a/mods/HELP/doc/doc_items/locale/doc_items.fr.tr b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr index 824ceeeba..cf0ea1aff 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.fr.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr @@ -18,7 +18,7 @@ A transparent block, basically empty space. It is usually left behind after digg Air=Air Blocks=Blocs Building another block at this block will place it inside and replace it.=Construire un autre bloc sur ce bloc le placera à l'intérieur et le remplacera. -Building this block is completely silent.=Construire ce bloc est complètement silentieux +Building this block is completely silent.=Construire ce bloc est complètement silencieux Collidable: @1=Percutable : @1 Description: @1=Description : @1 Falling blocks can go through this block; they destroy it when doing so.=Les blocs en chute peuvent traverser ce bloc; ils le détruisent en faisant cela. @@ -42,9 +42,9 @@ No=Non Pointable: No=Pointable : Non Pointable: Only by special items=Pointable : Seulement avec des objets spéciaux Pointable: Yes=Pointable : Oui -Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec ce bloc ne fonctionnent pas de la manière usuelle ; le combat au corps à corps et le minage ne sont soit pas possible ou fonctionnent différemment. -Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec cet objet ne fonctionnent pas de la manière usuelle ; le combat au corps à corps et le minage ne sont soit pas possible ou fonctionnent différemment. -Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec cet outil ne fonctionnent pas de la manière usuelle ; le combat au corps à corps et le minage ne sont soit pas possible ou fonctionnent différemment. +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec ce bloc ne fonctionnent pas de la manière habituelle ; le combat au corps à corps et le minage ne sont soit pas possibles ou fonctionnent différemment. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec cet objet ne fonctionnent pas de la manière habituelle ; le combat au corps à corps et le minage ne sont soit pas possibles ou fonctionnent différemment. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Les frappes avec cet outil ne fonctionnent pas de la manière habituelle ; le combat au corps à corps et le minage ne sont soit pas possibles ou fonctionnent différemment. Range: @1=Portée : @1 # Range: () Range: @1 (@2)=Portée : @1 (@2) @@ -53,47 +53,47 @@ Range: 4=Portée : 4 Rating @1=Note @1 # @1 is minimal rating, @2 is maximum rating Rating @1-@2=Note @1-@2 -The fall damage on this block is increased by @1%.=Les domages de chute sur ce bloc sont augmentés de @1%. -The fall damage on this block is reduced by @1%.=Les domages de chute sur ce bloc sont réduits de @1%. +The fall damage on this block is increased by @1%.=Les dommages de chute sur ce bloc sont augmentés de @1%. +The fall damage on this block is reduced by @1%.=Les dommages de chute sur ce bloc sont réduits de @1%. This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Ce bloc laisse passer la lumière avec une petite perte de luminosité, et la lumière du soleil peut la traverser sans perte. This block allows light to propagate with a small loss of brightness.=Ce bloc laisse passer la lumière avec une petite perte de luminosité. This block allows sunlight to propagate without loss in brightness.=The bloc laisse passer la lumière du soleil sans perte de luminosité. This block belongs to the @1 group.=Ce bloc appartient au groupe @1. This block belongs to these groups: @1.=Ce bloc appartient aux groupes : @1. This block can be climbed.=Ce bloc peut être escaladé. -This block can be destroyed by any mining tool immediately.=Ce bloc peut être détruit pas n'importe quel outil de minage instantanément. -This block can be destroyed by any mining tool in half a second.=Ce bloc peut être détruit pas n'importe quel outil de minage en une demi-seconde. +This block can be destroyed by any mining tool immediately.=Ce bloc peut être détruit par n'importe quel outil de minage instantanément. +This block can be destroyed by any mining tool in half a second.=Ce bloc peut être détruit par n'importe quel outil de minage en une demi-seconde. This block can be mined by any mining tool immediately.=Ce bloc peut être miné avec n'importe quel outil de minage instantanément. This block can be mined by any mining tool in half a second.=Ce bloc peut être miné avec n'importe quel outil de minage en une demi-seconde. This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Ce bloc peut être miné avec les outils de minages qui ont les notes de minage et les niveaux de robustesse suivants : This block can not be destroyed by ordinary mining tools.=Ce bloc ne peut pas être détruit avec les outils de minage ordinaires. This block can not be mined by ordinary mining tools.=Ce bloc ne peut pas être miné avec les outils de minage ordinaires. This block can serve as a smelting fuel with a burning time of @1.=Ce bloc peut servir de combustible pendant @1. -This block causes a damage of @1 hit point per second.=Ce bloc cause des domages de @1 point de vie par seconde. -This block causes a damage of @1 hit points per second.=Ce bloc cause des domages de @1 points de vie par seconde. +This block causes a damage of @1 hit point per second.=Ce bloc cause des dommages de @1 point de vie par seconde. +This block causes a damage of @1 hit points per second.=Ce bloc cause des dommages de @1 points de vie par seconde. This block connects to blocks of the @1 group.=Ce bloc se connecte aux blocs du groupe @1. This block connects to blocks of the following groups: @1.=Ce bloc se connecte aux blocs des groupes suivants : @1 This block connects to these blocks: @1.=Ce bloc se connecte à ces blocs : @1 This block connects to this block: @1.=Ce bloc se connecte à ce bloc : @1. -This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Ce bloc réduit votre souffle et cause des domages de noyade de @1 point de vie toutes les 2 secondes. -This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Ce bloc réduit votre souffle et cause des domages de noyade de @1 points de vie toutes les 2 secondes. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Ce bloc réduit votre souffle et cause des dommages de noyade de @1 point de vie toutes les 2 secondes. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Ce bloc réduit votre souffle et cause des dommages de noyade de @1 points de vie toutes les 2 secondes. This block is a light source with a light level of @1.=Ce bloc est une source de lumière de niveau @1. -This block glows faintly with a light level of @1.=Ce bloc brille xxx avec une lumière de niveau @1. -This block is a building block for creating various buildings.=Ce bloc est un bloc de construction pour créer différentes bâtisses. +This block glows faintly with a light level of @1.=Ce bloc brille faiblement avec une lumière de niveau @1. +This block is a building block for creating various buildings.=Ce bloc est un bloc de construction pour créer différents bâtiments. This block is a liquid with these properties:=Ce bloc est un liquide aux proprités suivantes : This block is affected by gravity and can fall.=Ce bloc est affecté par la gravité et peut tomber. This block is completely silent when mined or built.=Ce bloc ne fait pas de bruit lorsque l'on le mine ou le construit. This block is completely silent when walked on, mined or built.=Ce bloc ne fait pas de bruit lorsque l'on marche dessus, le mine ou le construit. This block is destroyed when a falling block ends up inside it.=Ce bloc est détruit lorsqu'un autre bloc tombe dessus. -This block negates all fall damage.=Ce bloc annule tous les domages de chute. +This block negates all fall damage.=Ce bloc annule tous les dommages de chute. This block points to liquids.=Ce bloc peut pointer les liquides. -This block will drop as an item when a falling block ends up inside it.=Ce bloc se transformera en objet lorsqu'un autre bloc tombe dessus. +This block will drop as an item when a falling block ends up inside it.=Ce bloc se transformera en objet lorsqu'un autre bloc lui tombe dessus. This block will drop as an item when it is not attached to a surrounding block.=Ce bloc se transformera en objet lorsqu'il n'est plus rattaché à un bloc alentour. This block will drop as an item when no collidable block is below it.=Ce bloc se transformera en objet lorsqu'il n'y aura plus de bloc percutable en dessous. -This block will drop the following items when mined: @1.=Ce bloc donnera les objets suivant lorsque miné : @1. -This block will drop the following when mined: @1×@2.=Ce bloc donnera les objets suivant lorsque miné : @1×@2. -This block will drop the following when mined: @1.=Ce bloc donnera les objets suivant lorsque miné : @1. -This block will drop the following when mined: @1.=Ce bloc donnera les objets suivant lorsque miné : @1. +This block will drop the following items when mined: @1.=Ce bloc donnera les objets suivants lorsque miné : @1. +This block will drop the following when mined: @1×@2.=Ce bloc donnera les objets suivants lorsque miné : @1×@2. +This block will drop the following when mined: @1.=Ce bloc donnera les objets suivants lorsque miné : @1. +This block will drop the following when mined: @1.=Ce bloc donnera les objets suivants lorsque miné : @1. This block will make you bounce off with an elasticity of @1%.=Ce bloc vous fera rebondir avec une élasticité de @1%. This block will randomly drop one of the following when mined: @1.=Ce bloc laissera tomber de manière aléatoire un des éléments suivants lorsque miné : @1. This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=Ce bloc laissera tomber de manière aléatoire jusqu'à @1 des éléments suivants lorque miné : diff --git a/mods/HELP/doc/doc_items/locale/doc_items.ru.tr b/mods/HELP/doc/doc_items/locale/doc_items.ru.tr index 08d038592..dc78f27aa 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.ru.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.ru.tr @@ -14,111 +14,111 @@ Using it as fuel turns it into: @1.=Использование в качеств # Final list separator (e.g. “One, two and three”) and = и 1 second=1 секунда -A transparent block, basically empty space. It is usually left behind after digging something.=Один прозрачный блок, основное пустое пространство. Обычно оно остаётся, если выкопать что-то. +A transparent block, basically empty space. It is usually left behind after digging something.=Прозрачный блок, проще говоря, пустое пространство. Обычно оно остаётся, если выкопать что-то. Air=Воздух Blocks=Блоки Building another block at this block will place it inside and replace it.=Возведение другого блока на этом блоке поместит его внутрь и заменит. -Building this block is completely silent.=Строительство этого блока абсолютно бесшумное. +Building this block is completely silent.=Строительство этого блока не издает звука. Collidable: @1=Непроходимый: @1 Description: @1=Описание: @1 Falling blocks can go through this block; they destroy it when doing so.=Падающие блоки могут пройти сквозь этот блок; при этом они уничтожат его. Full punch interval: @1 s=Интервал полного удара: @1 с Hand=Рука -Hold it in your hand, then leftclick to eat it.=Возьмите это в руку и кликните левой, чтобы съесть. -Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Возьмите это в руку и кликните левой, чтобы съесть. Но вам правда этого хочется? +Hold it in your hand, then leftclick to eat it.=Возьмите это в руку и кликните левой кнопкой мыши, чтобы съесть. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Возьмите это в руку и кликните левой кнопкой мыши, чтобы съесть. Но зачем вы хотите это сделать? Item reference of all wieldable tools and weapons=Справка по всем носимым инструментам и оружию Item reference of blocks and other things which are capable of occupying space=Справка по всем блокам и другим вещам, способным занимать место -Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Справка по остальным предметам (не блокам, не инструментам и не оружию) +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Справка по остальным предметам - не блокам, не инструментам и не оружию (так называемые материалы для крафта) Liquids can flow into this block and destroy it.=Жидкости могут затекать в этот блок, уничтожая его. Maximum stack size: @1=Максимальный размер стека: @1 -Mining level: @1=Уровень добываемости: @1 -Mining ratings:=Рейтинг добываемости: +Mining level: @1=Уровень добывания: @1 +Mining ratings:=Рейтинг добывания: • @1, rating @2: @3 s - @4 s=• @1, рейтинг @2: @3 с - @4 с • @1, rating @2: @3 s=• @1, рейтинг @2: @3 с Mining times:=Время добывания: -Mining this block is completely silent.=Добывание этого блока происходит абсолютно бесшумно. +Mining this block is completely silent.=Добывание этого блока не издает звука. Miscellaneous items=Дополнительные предметы No=Нет -Pointable: No=Ориентируемый: Нет -Pointable: Only by special items=Ориентируемый: Только специальными предметами -Pointable: Yes=Ориентируемый: Да -Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Удар этого блока не работает так, как это обычно бывает; рукопашный бой и майнинг либо невозможны, либо работают по-другому. -Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Удар этого предмета не работает так, как это обычно бывает; рукопашный бой и майнинг либо невозможны, либо работают по-другому. -Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Удар этого инструмента не работает так, как это обычно бывает; рукопашный бой и майнинг либо невозможны, либо работают по-другому. +Pointable: No=Поворачиваемый: Нет +Pointable: Only by special items=Поворачиваемый: Только специальными предметами +Pointable: Yes=Поворачиваемый: Да +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим блоком работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим предметом работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим инструментом работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. Range: @1=Дальность: @1 # Range: () Range: @1 (@2)=Дальность: @1 (@2) Range: 4=Дальность: 4 # Rating used for digging times -Rating @1=Скорость копания @1 +Rating @1=Скорость добывания @1 # @1 is minimal rating, @2 is maximum rating -Rating @1-@2=Скорость копания @1-@2= -The fall damage on this block is increased by @1%.=Повреждение при падении на этот блок увеличивается на @1%. -The fall damage on this block is reduced by @1%.=Повреждение при падении на этот блок уменьшается на @1%. +Rating @1-@2=Скорость добывания @1-@2= +The fall damage on this block is increased by @1%.=При падении на этот блок получаемый урон увеличивается на @1%. +The fall damage on this block is reduced by @1%.=При падении на этот блок получаемый урон уменьшается на @1%. This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Этот блок позволяет свету распространяться с небольшой потерей яркости, а солнечный свет может проходить без потерь. This block allows light to propagate with a small loss of brightness.=Этот блок позволяет свету распространяться с небольшой потерей яркости. This block allows sunlight to propagate without loss in brightness.=Этот блок позволяет солнечному свету распространяться без потери яркости. This block belongs to the @1 group.=Этот блок принадлежит группе @1. This block belongs to these groups: @1.=Этот блок принадлежит группам: @1. -This block can be climbed.=На этот блок можно залезть. +This block can be climbed.=По этому блоку можно карабкаться. This block can be destroyed by any mining tool immediately.=Этот блок можно мгновенно уничтожить любым добывающим инструментом. This block can be destroyed by any mining tool in half a second.=Этот блок можно уничтожить любым добывающим инструментом за полсекунды. This block can be mined by any mining tool immediately.=Этот блок можно мгновенно добыть любым добывающим инструментом. This block can be mined by any mining tool in half a second.=Этот блок можно добыть любым добывающим инструментом за полсекунды. -This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Этот блок можно добыть любым инструментами добычи, соответствующим одному из следующих рейтингов и уровней жёсткости. -This block can not be destroyed by ordinary mining tools.=Этот блок нельзя уничтожить обычным инструментом добычи. -This block can not be mined by ordinary mining tools.=Этот блок нельзя добыть обычным инструментом добычи. -This block can serve as a smelting fuel with a burning time of @1.=Этот блок может служить плавящимся топливом с временем горения @1. -This block causes a damage of @1 hit point per second.=Этот блок вызывает повреждение на @1 HP в секунду. -This block causes a damage of @1 hit points per second.=Этот блок вызывает повреждения на @1 HP в секунду. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Этот блок можно добыть любым добывающим инструментом, соответствующим одному из следующих рейтингов и его уровню твёрдости. +This block can not be destroyed by ordinary mining tools.=Этот блок нельзя уничтожить добывающим инструментом. +This block can not be mined by ordinary mining tools.=Этот блок нельзя добыть обычным добывающим инструментом. +This block can serve as a smelting fuel with a burning time of @1.=Этот блок можно использовать как топливо со временем горения @1. +This block causes a damage of @1 hit point per second.=Этот блок наносит урон в @1 единицу здоровья в секунду. +This block causes a damage of @1 hit points per second.=Этот блок наносит урон в @1 единиц здоровья в секунду. This block connects to blocks of the @1 group.=Этот блок соединяется с блоками группы @1. This block connects to blocks of the following groups: @1.=Этот блок соединяется с блоками групп: @1. This block connects to these blocks: @1.=Этот блок соединяется со следующими блоками: @1. This block connects to this block: @1.=Этот блок соединяется с этим блоком: @1. -This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Этот блок уменьшает ваш кислород и вызывает повреждение от погружения на @1 HP каждые 2 секунды. -This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Этот блок уменьшает ваш кислород и вызывает повреждения от погружения на @1 HP каждые 2 секунды. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Этот блок уменьшает ваш запас кислорода и наносит урон от утопления в @1 единицу здоровья каждые 2 секунды. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Этот блок уменьшает ваш запас кислорода и наносит урон от утопления в @1 единиц здоровья каждые 2 секунды. This block is a light source with a light level of @1.=Этот блок является источником света уровня @1. This block glows faintly with a light level of @1.=Этот блок мерцает с уровнем света: @1. -This block is a building block for creating various buildings.=Это строительный блок для создания разных конструкций и зданий. -This block is a liquid with these properties:=Это жидкий блок с такими свойствами: +This block is a building block for creating various buildings.=Это строительный блок для создания разных конструкций. +This block is a liquid with these properties:=Это жидкий блок со следующими свойствами: This block is affected by gravity and can fall.=На этот блок действует гравитация, он может падать. -This block is completely silent when mined or built.=Этот блок абсолютно бесшумно добывается и устанавливается при строительстве. -This block is completely silent when walked on, mined or built.=Этот блок абсолютно тихий, он не шумит, если вы идёте по нему, добываете его или строите что-либо из него. +This block is completely silent when mined or built.=Этот блок не издает звуков когда добывается и устанавливается при строительстве. +This block is completely silent when walked on, mined or built.=Этот блок не издает звуков когда вы идёте по нему, добываете его или строите из него. This block is destroyed when a falling block ends up inside it.=Этот блок уничтожается, когда падающий блок попадает в него. This block negates all fall damage.=Этот блок отменяет весь урон от падения. This block points to liquids.=Этот блок указывает на жидкости. This block will drop as an item when a falling block ends up inside it.=Этот блок выпадет как предмет, когда падающий блок попадёт в него. This block will drop as an item when it is not attached to a surrounding block.=Этот блок выпадет как предмет, если он не прикреплён к окружающим блокам. This block will drop as an item when no collidable block is below it.=Этот блок выпадет как предмет, если нет непроходимого блока прямо под ним. -This block will drop the following items when mined: @1.=Этот блок будет выдавать следующие предметы при его добыче: @1. -This block will drop the following when mined: @1×@2.=Этот блок будет выдавать при его добыче: @1×@2. -This block will drop the following when mined: @1.=Этот блок будет выдавать при его добыче: @1. -This block will drop the following when mined: @1.=Этот блок будет выдавать при его добыче: @1. +This block will drop the following items when mined: @1.=При добыче из этого блока выпадут следующие предметы: @1. +This block will drop the following when mined: @1×@2.=При добыче из этого блока выпадет следующее: @1×@2. +This block will drop the following when mined: @1.=При добыче из этого блока выпадет следующее: @1. +This block will drop the following when mined: @1.=При добыче из этого блока выпадет следующее: @1. This block will make you bounce off with an elasticity of @1%.=Этот блок заставит вас отскакивать с упругостью @1%. -This block will randomly drop one of the following when mined: @1.=При добыче этот блок случайным образом выдаёт что-то из списка: @1. -This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=Этот блок случайным образом выдаст до @1 из следующих возможных выдач при добыче: @2. -This block won't drop anything when mined.=Этот блок ничего не выдаст при его добыче. +This block will randomly drop one of the following when mined: @1.=При добыче из этого блока случайным образом выпадает что-то одно из списка: @1. +This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=При добыче из этого блока случайным образом выпадает до @1 из следующих возможных выдач: @2. +This block won't drop anything when mined.=При добыче из этого блока не выпадет ничего. This is a decorational block.=Это декоративный блок. This is a melee weapon which deals damage by punching.=Это орудие ближнего боя, наносящее урон при ударе. Maximum damage per hit:=Максимальный урон за один удар: This item belongs to the @1 group.=Этот предмет относится к группе @1. This item belongs to these groups: @1.=Этот предмет относится к группам: @1. -This item can serve as a smelting fuel with a burning time of @1.=Этот предмет может служить плавящимся топливом с временем горения @1. -This item is primarily used for crafting other items.=Этот предмет в основном используется для создания других предметов. +This item can serve as a smelting fuel with a burning time of @1.=Этот предмет можно использовать как топливо со временем горения @1. +This item is primarily used for crafting other items.=Этот предмет в основном используется для крафта других предметов. This item points to liquids.=Этот предмет указывает на жидкости. This tool belongs to the @1 group.=Этот инструмент относится к группе @1. This tool belongs to these groups: @1.=Этот инструмент относится к группам: @1. -This tool can serve as a smelting fuel with a burning time of @1.=Этот инструмент может служить плавящимся топливом с временем горения @1. +This tool can serve as a smelting fuel with a burning time of @1.=Этот инструмент можно использовать как топливо со временем горения @1. This tool is capable of mining.=Этот инструмент используется для добычи. -Maximum toughness levels:=Максимальный уровень жёсткости: +Maximum toughness levels:=Максимальный уровень твёрдости: This tool points to liquids.=Этот инструмент указывает на жидкости. Tools and weapons=Инструменты и оружие -Unknown Node=Неизвестный узел -Usage help: @1=Использование помощи: @1 -Walking on this block is completely silent.=Хождение по этому блоку абсолютно бесшумное. +Unknown Node=Неизвестный блок +Usage help: @1=Помощь по использованию: @1 +Walking on this block is completely silent.=Хождение по этому блоку не издает звуков. Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Даже если вы не держите никакого предмета, ваша рука - сама по себе инструмент, обладающий определёнными свойствами. Когда в вашей руке предмет, не являющийся инструментом добычи или оружием, он будет иметь свойства вашей пустой руки. Yes=Да -You can not jump while standing on this block.=Вы не можете прыгать, стоя на этом блоке. +You can not jump while standing on this block.=Вы не можете прыгать, пока стоите на этом блоке. any level=любой уровень level 0=уровень 0 level 0-@1=уровень 0-@1 @@ -132,12 +132,12 @@ Unknown item (@1)=Неизвестный предмет (@1) • Not renewable=• Необновляемое • Renewable=• Обновляемое • Viscosity: @1=• Вязкость: @1 -Itemstring: "@1"=Айтемстринг: "@1" -Durability: @1 uses=Долговечность: @1 раз(а) -Durability: @1=Долговечность: @1 -Mining durability:=Долговечность при майнинге: +Itemstring: "@1"=Техническое название: "@1" +Durability: @1 uses=Прочность: @1 использований +Durability: @1=Прочность: @1 +Mining durability:=Долговечность при добыче: • @1, level @2: @3 uses=• @1, уровень @2: @3 раз(а) • @1, level @2: Unlimited=• @1, уровень @2: Неограниченно -This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.=Вращение этого блока зависит от способа размещения: положите его на пол или потолок для вертикальной ориентации; поместите на стену для горизонтальной ориентации. Удерживайте [Красться] при размещении для перпендикулярной ориентации. -Toughness level: @1=Уровень жёсткости: @1 +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.=Поворот этого блока зависит от того как вы его ставите: поставьте его на пол или потолок для вертикальной ориентации; поместите на стену для горизонтальной ориентации. Удерживайте [Красться] при размещении для перпендикулярной ориентации. +Toughness level: @1=Уровень твёрдости: @1 This block is slippery.=Этот блок скользкий. diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 3bc7b705a..f75ab07f7 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -1,5 +1,7 @@ mcl_craftguide = {} +local awaiting_connection_player_names = {} + local M = minetest local player_data = {} @@ -1075,12 +1077,14 @@ if progressive_mode then for i = 1, #players do local player = players[i] local name = player:get_player_name() - local data = player_data[name] - local inv_items = get_inv_items(player) - local diff = table_diff(inv_items, data.inv_items) + if not awaiting_connection_player_names[name] then + local data = player_data[name] + local inv_items = get_inv_items(player) + local diff = table_diff(inv_items, data.inv_items) - if #diff > 0 then - data.inv_items = table_merge(diff, data.inv_items) + if #diff > 0 then + data.inv_items = table_merge(diff, data.inv_items) + end end end @@ -1093,8 +1097,14 @@ if progressive_mode then mcl_craftguide.add_recipe_filter("Default progressive filter", progressive_filter) + M.register_on_authplayer(function(name, ip, is_success) + if not is_success then return end + awaiting_connection_player_names[name] = true + end) + M.register_on_joinplayer(function(player) local name = player:get_player_name() + awaiting_connection_player_names[name] = nil init_data(name) local meta = player:get_meta() local data = player_data[name] @@ -1126,7 +1136,9 @@ if progressive_mode then local players = M.get_connected_players() for i = 1, #players do local player = players[i] - save_meta(player) + if not awaiting_connection_player_names[player:get_player_name()] then + save_meta(player) + end end end) else diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr index ae2f28a9c..036c571eb 100644 --- a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr @@ -6,7 +6,7 @@ Any wood=Любое дерево Any sand=Любой песок Any normal sandstone=Любой обычный песчаник Any red sandstone=Любой красный песчаник -Any carpet=Любое покрытие +Any carpet=Любой ковёр Any dye=Любой краситель Any water bucket=Любое ведро воды Any flower=Любой цветок @@ -15,16 +15,16 @@ Any wooden slab=Любая деревянная плита Any wooden stairs=Любые деревянные ступеньки Any coal=Любой уголь Any kind of quartz block=Любой кварцевый блок -Any kind of purpur block=Любой фиолетовый блок -Any stone bricks=Любые каменные блоки +Any kind of purpur block=Любой пурпурный блок +Any stone bricks=Любые каменные кирпичи Any stick=Любая палка -Any item belonging to the @1 group=Любой предмет, относящийся к группе @1 -Any item belonging to the groups: @1=Любой предмет, относящийся к группам: @1 +Any item belonging to the @1 group=Любой предмет из группы @1 +Any item belonging to the groups: @1=Любой предмет из группам: @1 Search=Поиск Reset=Сброс Previous page=Предыдущая страница Next page=Следующая страница -Usage @1 of @2=Использование @1 из @2 +Usage @1 of @2=Использование @1 из @2 Recipe @1 of @2=Рецепт @1 из @2 Burning time: @1=Время горения: @1 Cooking time: @1=Время приготовления: @1 @@ -34,4 +34,4 @@ Cooking=Приготовление Increase window size=Увеличить окно Decrease window size=Уменьшить окно No item to show=Нет элемента для показа -Collect items to reveal more recipes=Для рецептов нужны предметы +Collect items to reveal more recipes=Собирайте предметы чтобы открыть больше рецептов diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr b/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr index 90e0c9b0e..13a0de2b3 100644 --- a/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr +++ b/mods/HELP/mcl_doc/locale/mcl_doc.fr.tr @@ -2,14 +2,14 @@ Water can flow into this block and cause it to drop as an item.=L'eau peut s'écouler dans ce bloc et provoquer sa chute en tant qu'élément. This block can be turned into dirt with a hoe.=Ce bloc peut être transformé en terre avec une houe. This block can be turned into farmland with a hoe.=Ce bloc peut être transformé en terres agricoles avec une houe. -This block acts as a soil for all saplings.=Ce bloc agit comme un sol pour tous les pousses arbres. -This block acts as a soil for some saplings.=Ce bloc agit comme un sol pour certains pousses arbres. +This block acts as a soil for all saplings.=Ce bloc agit comme un sol pour toutes les pousses d'arbres. +This block acts as a soil for some saplings.=Ce bloc agit comme un sol pour certaines pousses d'arbres. Sugar canes will grow on this block.=Les cannes à sucre pousseront sur ce bloc. Nether wart will grow on this block.=La verrue du Néant se développera sur ce bloc. This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Ce bloc se désintègre rapidement lorsqu'il n'y a aucun bloc de bois de n'importe quel espèce à une distance de @1. En décomposition, il disparaît et peut lâcher un des ses objets habituels. Le bloc ne se désintègre pas lorsque le bloc a été placé par un joueur. This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Ce bloc se désintègre rapidement et disparaît lorsqu'il n'y a aucun bloc de bois de n'importe quel espèce à une distance de @1. Le bloc ne se désintègre pas lorsque le bloc a été placé par un joueur. -This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Cette plante ne peut pousser que sur des blocs d'herbe et de terre. Pour survivre, il doit avoir une vue dégagée sur le ciel au-dessus ou être exposé à un niveau de lumière de 8 ou plus. -This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Cette plante peut pousser sur des blocs d'herbe, du podzol, de la terre et de la terre grossière. Pour survivre, il doit avoir une vue dégagée sur le ciel au-dessus ou être exposé à un niveau de lumière de 8 ou plus. +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Cette plante ne peut pousser que sur des blocs d'herbe et de terre. Pour survivre, elle doit avoir une vue dégagée sur le ciel au-dessus ou être exposée à un niveau de lumière de 8 ou plus. +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Cette plante peut pousser sur des blocs d'herbe, du podzol, de la terre et de la terre grossière. Pour survivre, elle doit avoir une vue dégagée sur le ciel au-dessus ou être exposée à un niveau de lumière de 8 ou plus. This block is flammable.=Ce bloc est inflammable. This block destroys any item it touches.=Ce bloc détruit tout élément qu'il touche. To eat it, wield it, then rightclick.=Pour le manger, maniez-le, puis faites un clic droit. @@ -48,9 +48,9 @@ This block can be mined by:=Ce bloc peut être miné par: Hardness: ∞=Dureté: ∞ Hardness: @1=Dureté: @1 This block will not be destroyed by TNT explosions.=Ce bloc ne sera pas détruit par les explosions de TNT. -This block drops itself when mined by shears.=Ce bloc se laisse tomber lorsqu'il est exploité par cisaille. +This block drops itself when mined by shears.=Ce bloc se laisse tomber lorsqu'il est miné avec une cisaille. @1×@2=@1×@2 -This blocks drops the following when mined by shears: @1=Ce bloc laisse tomber les choses suivantes lorsqu'il est exploité par cisaille: +This blocks drops the following when mined by shears: @1=Ce bloc laisse tomber les choses suivantes lorsqu'il est miné avec une cisaille: , =, • Shears=• Cisailles • Sword=• Epées @@ -58,7 +58,7 @@ This blocks drops the following when mined by shears: @1=Ce bloc laisse tomber l This is a melee weapon which deals damage by punching.=Il s'agit d'une arme de mêlée qui inflige des dégâts en frappant. Maximum damage: @1 HP=Dégâts maximum: @1 Full punch interval: @1 s=Interval de coup: @1 s -This tool is capable of mining.=Cet outil est capable d'exploiter. +This tool is capable of mining.=Cet outil est capable de miner. Mining speed: @1=Vitesse de minage: @1 Painfully slow=Péniblement lent Very slow=Très lent diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr b/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr index 2deeb8e73..b34ad043f 100644 --- a/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr +++ b/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr @@ -1,33 +1,33 @@ # textdomain: mcl_doc Water can flow into this block and cause it to drop as an item.=Вода может затечь в этот блок и вызвать его выпадение в качестве предмета. -This block can be turned into dirt with a hoe.=Этот блок можно превратить в грязь с помощью мотыги. +This block can be turned into dirt with a hoe.=Этот блок можно превратить в землю с помощью мотыги. This block can be turned into farmland with a hoe.=Этот блок можно превратить в грядку с помощью мотыги. This block acts as a soil for all saplings.=Этот блок служит почвой для всех саженцев. This block acts as a soil for some saplings.=Этот блок служит почвой для некоторых саженцев. Sugar canes will grow on this block.=На этом блоке будет расти сахарный тростник. -Nether wart will grow on this block.=Адский нарост будет расти на этом блоке. -This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Этот блок быстро разрушается, когда на расстоянии @1 нет древесных блоков любого вида. При распаде он исчезает и может уронить одну из своих обычных капель. Блок не разрушается, если он размещен игроком. -This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Этот блок быстро распадается и исчезает, если на расстоянии @1 нет древесных блоков любого типа. Блок не разрушается, если он размещен игроком. -This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти только на блоках травы и грязи. Чтобы выжить, ему нужно иметь беспрепятственный обзор неба или подвергаться воздействию света уровня 8 или выше. -This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти на блоках травы, подзола и твёрдой грязи. Чтобы выжить, ему нужно иметь беспрепятственный обзор неба или подвергаться воздействию света уровня 8 или выше. +Nether wart will grow on this block.=На этом блоке будет расти адский нарост. +This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Этот блок быстро саморазрушается, если на дистанции @1 метров отсутствуют блоки дерева любого типа. При разрушении может выпасть его обычный дроп. Блок не саморазрушается если он был поставлен игроком. +This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Этот блок быстро саморазрушается и исчезает, если на дистанции @1 метров отсутствуют блоки дерева любого типа. Блок не саморазрушается если он был поставлен игроком. +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти только на блоках дёрна и грязи. Для жизни ему нужно иметь беспрепятственный обзор на небо сверху, либо уровень света 8 и выше. +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти только на блоках дёрна, грязи, подзола и твёрдой земли. Для жизни ему нужно иметь беспрепятственный обзор на небо сверху, либо уровень света 8 и выше. This block is flammable.=Этот блок легковоспламеним. -This block destroys any item it touches.=Этот блок уничтожает всё, к чему прикасается. -To eat it, wield it, then rightclick.=Чтобы съесть это, возьмите в руки и кликните правой клавишей. +This block destroys any item it touches.=Этот блок уничтожает любой предмет, который его касается. +To eat it, wield it, then rightclick.=Чтобы съесть это, возьмите в руки и кликните правой кнопкой мыши. You can eat this even when your hunger bar is full.=Вы можете есть это, даже когда ваша полоска голода заполнена. You cannot eat this when your hunger bar is full.=Вы не можете есть это, когда ваша полоска голода заполнена. -To drink it, wield it, then rightclick.=Чтобы выпить это, возьмите его в руки и кликните правой клавишей мыши. +To drink it, wield it, then rightclick.=Чтобы выпить это, возьмите его в руки и кликните правой кнопкой мыши. You cannot drink this when your hunger bar is full.=Вы не можете пить это, когда ваша полоска голода заполнена. -To consume it, wield it, then rightclick.=Чтобы употребить это, возьмите в руки и кликните правой клавишей мыши. +To consume it, wield it, then rightclick.=Чтобы употребить это, возьмите в руки и кликните правой кнопкой мыши. You cannot consume this when your hunger bar is full.=Вы не можете употребить это, когда ваша полоска голода заполнена. You have to wait for about 2 seconds before you can eat or drink again.=Вам нужно подождать 2 секунды, прежде чем снова пить или есть. -Hunger points restored: @1=Восстановлено единиц голода: @1 -Saturation points restored: @1%.1f=Восстановлено единиц сытости: @1 +Hunger points restored: @1=Восстанавливает очков голода: @1 +Saturation points restored: @1%.1f=Восстанавливает очков насыщения: @1 This item can be repaired at an anvil with: @1.=Этот предмет можно починить на наковальне при помощи: @1. This item can be repaired at an anvil with any wooden planks.=Этот предмет можно починить на наковальне с помощью любых деревянных досок. This item can be repaired at an anvil with any item in the “@1” group.=Этот предмет можно починить на наковальне с помощью любого предмета из группы “@1”. -This item cannot be renamed at an anvil.=Этот предмет нельзя починить в наковальне. -This block crushes any block it falls into.=Этот блок сокрушает любой блок, на который падает. -When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.=Когда этот блок падает 1 блока, то наносит урон задеваемому игроку. Повреждение составляет B×2–2 единиц удара, где B @= количество упавших блоков. Урон не может превышать 40 HP. +This item cannot be renamed at an anvil.=Этот предмет нельзя переименовать на наковальне. +This block crushes any block it falls into.=Этот блок ломает любой блок, на который падает. +When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.=Когда этот блок падает вниз на 1 блок, он наносит урон игроку, который заденет этот блок. Урон рассчитывается как Z×2–2 единиц здоровья, где Z это высота полета в блоках. Урон не может превышать 40 единиц здоровья. Diamond Pickaxe=Алмазная кирка Iron Pickaxe=Железная кирка Stone Pickaxe=Каменная кирка @@ -47,10 +47,10 @@ This block can be mined by any tool instantly.=Этот блок можно мг This block can be mined by:=Этот блок можно добыть при помощи: Hardness: ∞=Твердость: ∞ Hardness: @1=Твердость: @1 -This block will not be destroyed by TNT explosions.=Этот блок не уничтожат взрывы тротила. -This block drops itself when mined by shears.=Этот блок сбрасывается сам при добыче ножницами. +This block will not be destroyed by TNT explosions.=Этот блок не будет уничтожен при взрыве ТНТ. +This block drops itself when mined by shears.=При добыче этого блока ножницами выпадает этот же блок. @1×@2=@1×@2 -This blocks drops the following when mined by shears: @1=Этот блок при добыче ножницами выбрасывает следующее: @1 +This blocks drops the following when mined by shears: @1=При добыче этого блока ножницами выпадает следующее: @1 , = , • Shears=• Ножницы • Sword=• Меч @@ -60,20 +60,20 @@ Maximum damage: @1 HP=Максимальный урон: @1 HP Full punch interval: @1 s=Интервал полного удара: @1 с This tool is capable of mining.=Этим инструментом можно добывать Mining speed: @1=Скорость добычи: @1 -Painfully slow=Мучительно медленно +Painfully slow=Крайне медленно Very slow=Очень медленно Slow=Медленно Fast=Быстро Very fast=Очень быстро -Extremely fast=Ужасно быстро +Extremely fast=Экстремально быстро Instantaneous=Мгновенно -@1 uses=@1 раз(а) +@1 uses=@1 использований Unlimited uses=не ограничено -Block breaking strength: @1=Прочность блока на разрыв: @1 +Block breaking strength: @1=Сила для ломания блока: @1 Mining durability: @1=Долговечность при добыче: @1 -Armor points: @1=Эффективность защиты: @1 -Armor durability: @1=Долговечность защиты: @1 +Armor points: @1=Эффективность брони: @1 +Armor durability: @1=Долговечность брони: @1 It can be worn on the head.=Это можно носить на голове. -It can be worn on the torso.=Это можно носить на теле. +It can be worn on the torso.=Это можно носить на торсе. It can be worn on the legs.=Это можно носить на ногах. It can be worn on the feet.=Это можно носить на ступнях. diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr index 92e5e8f63..8630ab4ab 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.fr.tr @@ -29,10 +29,10 @@ How to play:=Comment jouer: • Craft a wooden pickaxe so you can dig stone=• Fabriquez une pioche en bois pour creuser la pierre • Different tools break different kinds of blocks. Try them out!=• Différents outils cassent différents types de blocs. Essayez-les! • Read entries in this help to learn the rest=• Lisez les entrées de cette aide pour apprendre le reste -• Continue playing as you wish. There's no goal. Have fun!=• Continuez à jouer comme vous le souhaitez. Il n'y a aucun but. Amuser vous! +• Continue playing as you wish. There's no goal. Have fun!=• Continuez à jouer comme vous le souhaitez. Il n'y a aucun but. Amusez vous! Minetest=Minetest Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest est un moteur de jeu logiciel gratuit pour les jeux basés sur le gameplay voxel, inspiré d'InfiniMiner, Minecraft, etc. Minetest a été créé à l'origine par Perttu Ahola (alias «celeron55»). -The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Le joueur est jeté dans un monde immense fait de cubes ou de blocs. Ces cubes font généralement le paysage qu'ils blocs peuvent être enlevés et placés presque entièrement librement. En utilisant les objets collectés, de nouveaux outils et autres objets peuvent être fabriqués. Les jeux dans Minetest peuvent cependant être beaucoup plus complexes que cela. +The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Le joueur est envoyé dans un monde immense fait de cubes ou de blocs. Ces cubes forment généralement le paysage. Ces blocs peuvent être enlevés et placés presque entièrement librement. En utilisant les objets collectés, de nouveaux outils et autres objets peuvent être fabriqués. Les jeux dans Minetest peuvent cependant être beaucoup plus complexes que cela. A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Une caractéristique essentielle de Minetest est la capacité de modding intégrée. Les mods modifient le gameplay existant. Ils peuvent être aussi simples que l'ajout de quelques blocs décoratifs ou être très complexes par ex. introduisant des concepts de gameplay complètement nouveaux, générant un type de monde complètement différent, et bien d'autres choses. Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=Minetest peut être joué seul ou en ligne avec plusieurs joueurs. Le jeu en ligne fonctionnera immédiatement avec tous les mods, sans avoir besoin de logiciels supplémentaires car ils sont entièrement fournis par le serveur. Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest est généralement fourni avec un jeu par défaut simple, nommé «Minetest Game» (illustré dans les images 1 et 2). Vous l'avez probablement déjà. D'autres jeux pour Minetest peuvent être téléchargés à partir des forums officiels Minetest . @@ -173,7 +173,7 @@ Blocks can have a wide range of different properties which determine mining time Mining=Exploitation minière Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=L'exploitation minière (ou creuser) est le processus de rupture des blocs pour les retirer. Pour extraire un bloc, pointez-le et maintenez enfoncé le bouton gauche de la souris jusqu'à ce qu'il se casse. Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Les blocs nécessitent un outil de minage pour être minés. Différents blocs sont extraits par différents outils d'exploration de données, et certains blocs ne peuvent être extraits par aucun outil. Les blocs varient en dureté et les outils varient en résistance. Les outils miniers s'useront avec le temps. Le temps d'extraction et l'usure de l'outil dépendent du bloc et de l'outil d'extraction. Le moyen le plus rapide de découvrir l'efficacité de vos outils d'exploration est simplement de les essayer sur différents blocs. Tous les objets que vous récupérez par extraction tomberont au sol, prêts à être récupérés. -After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=Après l'extraction, un bloc peut laisser une «goutte» derrière. Il s'agit d'un certain nombre d'objets que vous obtenez après l'extraction. Le plus souvent, vous obtiendrez le bloc lui-même. Il existe d'autres possibilités de suppression qui dépendent du type de bloc. Les baisses suivantes sont possibles: +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=Après l'extraction, un bloc peut laisser un "drop" derrière. Il s'agit d'un certain nombre d'objets que vous obtenez après l'extraction. Le plus souvent, vous obtiendrez le bloc lui-même. Il existe d'autres possibilités de suppression qui dépendent du type de bloc. Les baisses suivantes sont possibles: • Always drops itself (the usual case)=• Se laisse toujours tomber (le cas habituel) • Always drops the same items=• Dépose toujours les mêmes articles • Drops items based on probability=• Supprime les éléments en fonction de la probabilité diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr index c40178f99..4d852ae6b 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr @@ -4,46 +4,46 @@ Everything you need to know to get started with playing=Всё, что вам н Advanced usage=Продвинутое использование Advanced information which may be nice to know, but is not crucial to gameplay=Дополнительная информация, которую хорошо было бы знать, но не критично для хода игры Quick start=Быстрый старт -This is a very brief introduction to the basic gameplay:=Это максимально сжатое введение в основы игрового процесса +This is a very brief introduction to the basic gameplay:=Это краткое введение в основы игрового процесса Basic controls:=Основное управление: • Move mouse to look=• Мышь - осматриваться • [W], [A], [S] and [D] to move=• [W], [A], [S] и [D] - идти • [E] to sprint=• [E] - бежать -• [Space] to jump or move upwards=• [Пробел] - прыгнуть или двигаться вверх -• [Shift] to sneak or move downwards=• [Shift] - красться или двигаться вниз -• Mouse wheel or [1]-[9] to select item=• Колёсико или [1]-[9] - выбор предмета -• Left-click to mine blocks or attack=• Левый клик - добывать блок или атаковать -• Recover from swings to deal full damage=• Бейте без колебаний, чтобы нанести максимальный урон +• [Space] to jump or move upwards=• [Пробел] - прыгнуть или карабкаться вверх +• [Shift] to sneak or move downwards=• [Shift] - красться или карабкаться вниз +• Mouse wheel or [1]-[9] to select item=• Колёсико мыши или [1]-[9] - выбор предмета +• Left-click to mine blocks or attack=• Левый кнопка мыши - добывать блок или атаковать +• Recover from swings to deal full damage=• Чтобы нанести максимальный урон, делайте небольшой интервал между ударами • Right-click to build blocks and use things=• Правый клик - строить блоки и использовать вещи • [I] for the inventory=• [I] - открыть инвентарь -• First items in inventory appear in hotbar below=• Первые предметы в инвентаре появляются на панели быстрого доступа внизу -• Lowest row in inventory appears in hotbar below=• Нижний ряд в инвентаре появляется на панели быстрого доступа внизу +• First items in inventory appear in hotbar below=• Первые поднятые предметы появляются в хотбаре(9 ячеек инвентаря) внизу экрана +• Lowest row in inventory appears in hotbar below=• Нижний ряд инвентаря это и есть хотбар • [Esc] to close this window=• [Esc] - закрыть это окно How to play:=Как играть: -• Punch a tree trunk until it breaks and collect wood=• Бейте дерево по стволу, пока оно не сломается, и собирайте древесину -• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Поместите кусок дерева в решётку 2×2 (вашу личную “крафт-сетку”) в меню инвентаря и скрафтите из него 4 доски +• Punch a tree trunk until it breaks and collect wood=• Бейте дерево по стволу пока оно не сломается и соберите выпавшую древесину +• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Поместите древесину в решётку 2×2 (вашу “сетку крафте”) в меню инвентаря и скрафтите из него 4 доски • Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Разместите их в виде квадрата 2×2 в крафт-сетке, чтобы сделать верстак • Place the crafting table on the ground=• Поставьте верстак на землю -• Rightclick it for a 3×3 crafting grid=• Кликните правой по верстаку для работы с крафт-сеткой 3×3 -• Use the crafting guide (book icon) to learn all the possible crafting recipes=Используйте крафт-гид (значок книги) рецептов для изучения всех доступных рецептов -• Craft a wooden pickaxe so you can dig stone=• Создайте деревянную кирку, чтобы добыть камни +• Rightclick it for a 3×3 crafting grid=• Кликните правой кнопкой мыши по верстаку для работы с сеткой крафта 3×3 +• Use the crafting guide (book icon) to learn all the possible crafting recipes=Используйте книгу рецептов для изучения всех доступных рецептов +• Craft a wooden pickaxe so you can dig stone=• Создайте деревянную кирку, чтобы добыть камень • Different tools break different kinds of blocks. Try them out!=• Разные инструменты могут ломать разные виды блоков. Опробуйте их! -• Read entries in this help to learn the rest=Читайте записи в этой справке, чтобы узнать всё -• Continue playing as you wish. There's no goal. Have fun!=Продолжайте играть, как вам нравится. Игра не имеет конечной цели. Наслаждайтесь! -Minetest=Майнтест -Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Майнтест - бесплатный программный движок для игр, основанных на воксельных мирах, источником вдохновения послужили игры InfiniMiner, Minecraft и подобные. Майнтест изначально создан Пертту Ахолой (под псевдонимом “celeron55”). -The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Игрок попадает в огромный мир из кубиков-блоков. Из этих кубиков состоит ландшафт, их можно убирать и снова размещать практически свободно. Используя собранные предметы, вы можете создать («скрафтить») новые инструменты и предметы. Игры для Майнтеста могут быть и гораздо сложнее. -A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Основной особенностью Майнтеста является встроенная возможность моддинга. Моды изменяют привычный игровой процесс. Они могут быть очень простыми, например, добавлять нескольких декоративных блоков, или очень сложными - полностью изменяющими игровой процесс, генерирующими новые виды миров и т. д. -Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=В Майнтест можно играть в одиночку или онлайн вместе с несколькими игроками. Онлайн-игра будет работать «из коробки» с любыми модами без необходимости установки дополнительного программного обеспечения, так как всё необходимое предоставляется сервером. -Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Обычно Майнтест поставляется в комплекте с простой игрой по умолчанию, которая называется «Игра Майнтест» (показана на рисунках 1 и 2). У вас она, вероятно, есть. Другие игры для Майнтеста можно скачать с официального форума . -Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.=Как Майнтест, так и «Игра Майнтест» в данный момент еще не завершены, поэтому, пожалуйста, простите, если что-то не заработает идеально. +• Read entries in this help to learn the rest=Читайте записи в этой справке, чтобы узнать всё остальное +• Continue playing as you wish. There's no goal. Have fun!=Продолжайте играть, как вам захочется. Эта игра не имеет конечной цели. Наслаждайтесь! +Minetest=Minetest +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest - свободный игровой движок для воксельных игр, вдохновлённый играми InfiniMiner, Minecraft и подобным. Minetest изначально создан Пертту Ахолой (под псевдонимом “celeron55”). +The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Игрок попадает в огромный мир из кубиков-блоков. Из этих кубиков состоит ландшафт, их можно убирать и снова размещать как угодно. Используя собранные предметы, вы можете создать(скрафтить) новые инструменты и предметы. Игры для Minetest могут быть и гораздо сложнее и комплекснее чем эта. +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Основной особенностью Minetest является встроенная возможность моддинга. Моды изменяют привычный игровой процесс. Они могут быть очень простыми, например, добавлять нескольких декоративных блоков, или очень сложными - полностью изменяющими игровой процесс, генерирующими новые виды миров и т. д. +Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=В Minetest можно играть в одиночку или онлайн вместе с другими игроками. Онлайн-игра будет работать «из коробки» с любыми модами без необходимости установки дополнительного программного обеспечения, так как всё необходимое предоставляется сервером. +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Обычно Minetest поставляется в комплекте с простой игрой по умолчанию, которая называется “Minetest Game” ( рис. 1 и 2). У вас она, вероятно, есть. Другие игры для Minetest можно скачать с официального форума . +Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.=Minetest и “Minetest Game” в данный момент еще не завершены, поэтому, пожалуйста, простите, если что-то работает неидеально. Sneaking=Подкрадывание Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Подкрадывание замедляет ход и предотвращает падение с края блока. To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!=Чтобы красться, удерживайте нажатой клавишу [Красться] (по умолчанию: [Shift]). Когда вы отпускаете её, то перестаете красться. Будьте осторожны: если отпустить клавишу, стоя на краю выступа, то можете оттуда упасть! • Sneak: [Shift]=• Красться: [Shift] Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.=Подкрадывание работает только когда вы стоите на твердой земле, не находитесь в жидкости и не карабкаетесь. If you jump while holding the sneak key, you also jump slightly higher than usual.=Если вы прыгаете, удерживая нажатой клавишу [Красться], вы также прыгаете немного выше, чем обычно. -Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Подкрадывание может быть отключено модами. В этом случае вы все равно идете медленнее, крадясь, но вас больше ничто не останавливает на выступах. +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Подкрадывание может быть отключено модами. В этом случае, крадясь вы все равно идете медленнее, но вас больше ничто не останавливает на выступах. Controls=Управление These are the default controls:=Вот стандартное управление: Basic movement:=Основное движение: @@ -60,22 +60,22 @@ While on a ladder, swimming in a liquid or fly mode is active=Стоя на ле • Space: Move up=• Пробел: двигаться вверх • Shift: Move down=• Shift: двигаться вниз Extended movement (requires privileges):=Расширенное движение (требуются привилегии): -• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: включает/выключает быстрый режим для бега/полёта (требуется привилегия “fast”) +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: включает/выключает быстрый бег/полёт (требуется привилегия “fast”) • K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• K: включает/выключает режим полёта, позволяющий свободно перемещаться во всех направлениях (требуется привилегия “fly”) -• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: включает/выключает режим отсутствия препятствий, позволяющий проходить сквозь стены в режиме полёта (требуется привилегия “noclip”) -• E: Move even faster when in fast mode=• E: двигаться даже быстрее, чем в быстром режиме -• E: Walk fast in fast mode=• E: идти быстро в быстром режиме +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: включает/выключает режим, позволяющий проходить сквозь стены в режиме полёта (требуется привилегия “noclip”) +• E: Move even faster when in fast mode=• E: нажатие еще раз, когда вы в быстром режиме, ускорит вас еще сильнее +• E: Walk fast in fast mode=• E: идти быстрее в быстром режиме World interaction:=Взаимодействие с миром: • Left mouse button: Punch / mine blocks / take items=• Левая кнопка мыши: Бить / добывать блоки / брать предметы • Left mouse button: Punch / mine blocks=• Левая кнопка мыши: Бить / добывать блоки -• Right mouse button: Build or use pointed block=• Правая кнопка мыши: Строить или использовать указанный блок -• Shift+Right mouse button: Build=• Shift+Правая кнопка мыши: Строить -• Roll mouse wheel: Select next/previous item in hotbar=• Вращение колёсика мыши: Выбор следующего/предыдущего предмета на панели быстрого доступа -• Roll mouse wheel / B / N: Select next/previous item in hotbar=• Вращение колёсика мыши / B / N: Выбор следующего/предыдущего предмета на панели быстрого доступа -• 1-9: Select item in hotbar directly=• 1-9: Быстрый и прямой выбор предмета на панели быстрого доступа +• Right mouse button: Build or use pointed block=• Правая кнопка мыши: Построить или использовать выбранный блок +• Shift+Right mouse button: Build=• Shift+Правая кнопка мыши: Построить +• Roll mouse wheel: Select next/previous item in hotbar=• Вращение колёсика мыши: выбор следующего/предыдущего предмета на хотбаре +• Roll mouse wheel / B / N: Select next/previous item in hotbar=• Вращение колёсика мыши / B / N: выбор следующего/предыдущего предмета в хотбаре +• 1-9: Select item in hotbar directly=• 1-9: Выбор предмета в хотбаре • Q: Drop item stack=• Q: выбросить всю стопку предметов • Shift+Q: Drop 1 item=• Shift+Q: выбросить только 1 предмет -• I: Show/hide inventory menu=• I: Показать/скрыть меню вашего инвентаря +• I: Show/hide inventory menu=• I: Показать/скрыть ваш инвентарь Inventory interaction:=Взаимодействие с инвентарём: See the entry “Basics > Inventory”.=Смотрите запись “Основы > Инвентарь”. Camera:=Камера: @@ -83,7 +83,7 @@ Camera:=Камера: • F7: Toggle camera mode=• F7: Смена режима камеры • F8: Toggle cinematic mode=• F8: Кинематографический режим Interface:=Интерфейс: -• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: Открыть/закрыть меню (пауза в режиме одиночной игры) +• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: Открыть/закрыть меню (ставит на паузу в одиночной игры) • F1: Show/hide HUD=• F1: Показать/убрать игровой интерфейс (HUD) • F2: Show/hide chat=• F2: Показать/убрать чат • F9: Toggle minimap=• F9: Включить/выключить миникарту @@ -91,47 +91,47 @@ Interface:=Интерфейс: • F10: Open/close console/chat log=• F10: Открыть/закрыть консоль/историю чата • F12: Take a screenshot=• F12: Сделать снимок экрана Server interaction:=Взаимодействие с сервером: -• T: Open chat window (chat requires the “shout” privilege)=• T: Открыть окно чата (чат требует привилегию “shout”) +• T: Open chat window (chat requires the “shout” privilege)=• T: Открыть окно чата (чтобы писать нужна привилегия “shout”) • /: Start issuing a server command=• /: Начать ввод серверной команды Technical:=Технические: • R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• R: Включить/выключить дальний обзор (отключает туман и позволяет смотреть очень далеко, может замедлять игру) -• +: Increase minimal viewing distance=• +: Увеличить минимальное расстояние просмотра -• -: Decrease minimal viewing distance=• -: Уменьшить минимальное расстояние просмотра +• +: Increase minimal viewing distance=• +: Увеличить минимальную дистанцию видимости +• -: Decrease minimal viewing distance=• -: Уменьшить минимальную дистанцию видимости • F3: Enable/disable fog=• F3: Включить/отключить туман • F5: Enable/disable debug screen which also shows your coordinates=• F5: Включить/отключить экран отладки, который также показывает ваши координаты • F6: Only useful for developers. Enables/disables profiler=• F6: Полезно только для разработчиков. Включает/отключает профайлер • P: Only useful for developers. Writes current stack traces=• P: Полезно только для разработчиков. Записывает текущие трассировки стека Players=Игроки -Players (actually: “player characters”) are the characters which users control.=Игроки (на самом деле «персонажи игроков») - персонажи, которыми управляют пользователи. +Players (actually: “player characters”) are the characters which users control.=Игроки (на самом деле «игровые персонажи») - персонажи, которыми управляют пользователи. Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).=Игроки это живые существа. Они появляются с определённым количеством очков здоровья (HP) и дыхания (BP). Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Игроки могут ходить, красться, прыгать, карабкаться, плавать, нырять, добывать, строить, сражаться и использовать инструменты и блоки. Players can take damage for a variety of reasons, here are some:=Игроки могут получить урон по разным причинам, вот некоторые: • Taking fall damage=• Получение урона от падения -• Touching a block which causes direct damage=• Прикосновение к блоку, который наносит прямой ущерб +• Touching a block which causes direct damage=• Прикосновение к блоку, который наносит урон • Drowning=• Утопление -• Being attacked by another player=• Быть атакованным другим игроком -• Being attacked by a computer enemy=• Быть атакованным компьютерным врагом -At a health of 0, the player dies. The player can just respawn in the world.=На отметке здоровья HP@=0 игрок умирает. Но он может возродиться в этом же мире. -Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.=Другие последствия смерти зависят от игры. Игрок может потерять все предметы или проиграть в соревновательной игре. -Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Некоторые блоки не допускают дыхания. При нахождении с головой в блоке, который вызывает утопление, точки дыхания уменьшаются на 1 каждые 2 секунды. Когда все очки дыхания уходят, игрок начинает получать урон утопающего. Очки дыхания быстро восстановятся в любом другом блоке. -Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Урон можно отключить в любом мире. Без повреждений игроки бессмертны, а здоровье и дыхание неважны. +• Being attacked by another player=• Нападение другого игрока +• Being attacked by a computer enemy=• Нападение компьютерного врага +At a health of 0, the player dies. The player can just respawn in the world.=Когда здоровье достигает нуля, игрок умирает. Но он может возродиться в этом же мире. +Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.=Другие последствия смерти зависят от игры-мода. Игрок может потерять все предметы или проиграть в соревновании. +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Некоторые блоки уменьшают дыхание. При нахождении с головой в блоке, который вызывает утопление, очки дыхания уменьшаются на 1 каждые 2 секунды. Когда все очки дыхания пропадают, игрок начинает получать урон от утопления. Очки дыхания быстро восстанавливаются в любом другом блоке. +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Урон можно отключить в любом мире. Без включенного урона игроки бессмертны, и здоровье и дыхание для них неважны. In multi-player mode, the name of other players is written above their head.=В многопользовательском режиме имена других игроков написаны над их головами. Items=Предметы -Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Предметы - это вещи, которые вы можете носить с собой и хранить в инвентаре. Их можно использовать для крафтинга (создания чего-либо), плавки, строительства, добычи и многого другого. Типы предметов: блоки, инструменты, оружие, а также предметы, используемые только для крафтинга. +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Предметы - это вещи, которые вы можете носить с собой и хранить в инвентаре. Их можно использовать для крафтинга, переплавки, строительства, добычи и многого другого. Предметы включают в себя блоки, инструменты, оружие, а также предметы, используемые только для крафта. An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Стопка предметов - это набор предметов одного типа, который помещается в один слот. Стопки предметов можно выбрасывать на землю полностью. Предметы, попавшие в одни и те же координаты, образуют стопку. Dropped item stacks will be collected automatically when you stand close to them.=Стопки брошенных предметов подбираются автоматически, если вы стоите рядом с ними. Items have several properties, including the following:=Предметы имеют несколько свойств, в том числе следующие: • Maximum stack size: Number of items which fit on 1 item stack=• Максимальный размер стопки: количество, которое помещается в 1 стопку предметов • Pointing range: How close things must be to be pointed while wielding this item=• Дальность прицела: насколько близко должна находиться цель, чтобы можно было навести на неё этот предмет и использовать • Group memberships: See “Basics > Groups”=• Членство в группах: См. “Основы > Группы” -• May be used for crafting or cooking=• Может быть использовано для крафтинга или приготовления пищи +• May be used for crafting or cooking=• Может быть использовано для крафта или приготовления пищи Tools=Инструменты -Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Некоторые предметы могут служить вам в качестве инструментов. Любой предмет, которым вы можете напрямую воспользоваться, чтобы сделать какое-то особое действие, считается инструментом. -A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Распространенной разновидностью инструментов являются инструменты майнинга. Они позволяют ломать все виды блоков. Оружие - тоже своего рода инструмент. Есть и много других инструментов. Особое действие инструмента обычно выполняются по нажатию левой или правой кнопки мыши. +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Некоторые предметы могут служить вам в качестве инструментов. Любой предмет, который имеет своё специальное назначение и используется напрямую владельцем, считается инструментом. +A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Распространенной разновидностью инструментов являются инструменты для добычи блоков. Они позволяют ломать все виды блоков. Оружие - тоже своего рода инструмент. Есть и много других инструментов. Особое действие инструмента обычно выполняются по нажатию левой или правой кнопки мыши. When nothing is wielded, players use their hand which may act as tool and weapon.=Когда у вас в руке нет никакого предмета, инструментом, либо даже оружием, выступает сама рука. -Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.=Инструменты добычи позволяют ломать все виды блоков. Оружие - тоже своеобразный инструмент, хотя есть и другие, более специализированные. Особое действие инструментов обычно включается правой клавишей мыши. -When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.=При отсутствии предметов игроки используют свою руку, которая может выступать в качестве инструмента и оружия. Рука способна ударять и даже наносить небольшой урон. -Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Многие инструменты изнашиваются при использовании и со временем могут разрушиться. Износ отображается в строке повреждений под значком инструмента. Если полоса повреждений не отображается, значит инструмент находится в отличном состоянии. Инструменты могут быть восстановлены путем крафтинга, см. “Основы > Крафтинг”. +Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.=Инструменты добычи позволяют ломать все виды блоков. Оружие - тоже своеобразный инструмент, хотя есть и другие, более специализированные. Особое действие инструментов обычно используется правой кнопкой мыши. +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.=Когда никакой предмет не держится в руках, игроки используют саму руку, которая может выступать в качестве инструмента и оружия. Рукой также можно ломать блоки и даже наносить небольшой урон. +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Многие инструменты изнашиваются при использовании и со временем могут разрушиться. Прочность отображается полоской под иконкой инструмента. Если полоска повреждений не отображается, значит инструмент находится в первоначальном состоянии. Инструменты могут быть восстановлены путем крафтинга, см. “Основы > Крафтинг”. Weapons=Оружие Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.=Некоторые предметы можно использовать в качестве оружия ближнего боя. Оружие сохраняет большинство свойств инструментов. Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:=Оружие ближнего боя наносит урон при ударе по игрокам и другим живым объектам. Есть два способа атаковать: @@ -140,11 +140,11 @@ Melee weapons deal damage by punching players and other animate objects. There a There are two core attributes of melee weapons:=Есть два основных атрибута оружия ближнего боя: • Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered=• Максимальный урон: урон, который наносится после удара, когда оружие полностью восстановлено • Full punch interval: Time it takes for fully recovering from a punch=• Интервал полного удара: время, необходимое для полного восстановления после удара -A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Оружие наносит полный урон только тогда, когда оно полностью восстановилось после предыдущего удара. В противном случае оружие будет наносить меньший урон. Это означает, что быстрый удар очень быстр, но наносит довольно низкий урон. Обратите внимание, что интервал полного удара не ограничивает скорость атаки. +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Оружие наносит полный урон только тогда, когда оно полностью восстановилось после предыдущего удара. В противном случае оружие будет наносить меньший урон. Это означает, что быстрые удары наносят довольно низкий урон. Обратите внимание, что интервал полного удара не ограничивает скорость атаки. There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=Есть правило, иногда делающее атаки невозможными: игроки, живые объекты и оружие принадлежат к некоторым к группам повреждений. Оружие наносит урон только тем, кто имеет хотя бы одну общую группу с ним. Так что, если вы используете «неправильное» оружие, то можете не нанести совсем никакого урона. Pointing=Прицел -“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.=“Прицел” означает, что вы смотрите на цель через область с крестиком. Прицелиться нужно для таких вещей, как добыча, удар, использование и так далее. Нацеливаемыми вещами являются блоки, игроки, компьютерные враги и объекты. -To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Чтобы прицелиться на что-то, это должно быть в пределах расстояния прицела (по-простому: «дальности») предмета, который вы держите в руках. Существует дальность по умолчанию, когда вы ничего не держите. Вещь под прицелом будет очерчена или подсвечена (в зависимости от настроек). Наведение невозможно выполнить с помощью фронтальной камеры 3-го лица. +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.=“Прицел” означает, что вы смотрите на цель через область с крестиком. Прицеливание нужно для таких вещей, как добыча, удар, использование и так далее. Нацеливаемыми вещами являются блоки, игроки, компьютерные враги и объекты. +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Чтобы прицелиться на что-то, это должно быть в пределах расстояния прицела предмета, который вы держите в руках. Существует дальность по умолчанию, когда вы ничего не держите. Вещь под прицелом будет очерчена или подсвечена (в зависимости от настроек). Наведение невозможно выполнить с помощью фронтальной камеры 3-го лица. A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=На некоторые вещи нельзя нацелиться. Большинство блоков нацеливаемые, но некоторые, например, воздух, - нет. На блоки вроде жидкостей можно нацелиться только специальными предметами. Camera=Камера There are 3 different views which determine the way you see the world. The modes are:=Есть 3 различных способа видеть мир: @@ -152,7 +152,7 @@ There are 3 different views which determine the way you see the world. The modes • 2: Third-person view from behind=• 2: вид от третьего лица сзади; • 3: Third-person view from the front=• 3: вид от третьего лица спереди. You can change the camera mode by pressing [F7].=Вы можете изменить режим камеры, нажав клавишу [F7]. -You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.=Вероятно, вы сможете увеличить масштаб вида в перекрестии с помощью [Z]. Это позволит вам смотреть дальше. +You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.=Вы можете увеличить масштаб в перекрестии с помощью [Z]. Это позволит вам смотреть дальше. Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.=Масштабирование-это функция геймплея, которая может быть включена или отключена игрой. По умолчанию масштабирование включено в творческом режиме, но отключено в обычном. There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.=Существует также кинематографический режим, который можно переключить с помощью [F8]. При включенном кинематографическом режиме движения камеры становятся более плавными. Некоторым игрокам это не нравится, это дело вкуса. By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.=Удерживая нажатой клавишу [Z], вы можете увеличить изображение в перекрестии прицела. Для этого вам нужна привилегия “zoom”. @@ -160,34 +160,34 @@ By holding down [Z], you can zoom the view at your crosshair. You need the “zo • Toggle Cinematic Mode: [F8]=• Переключение кинематографического режима: [F8]; • Zoom: [Z]=• Масштабирование: [Z]. Blocks=Блоки -The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир MineClone 2 полностью состоит из блоков (вокселей, если быть точными). Блоки могут быть добавлены или удалены с помощью правильно подобранных инструментов. -The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир целиком состоит из блоков (точнее, вокселей). Блоки могут быть добавлены или удалены с помощью правильно подобранных инструментов. +The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир MineClone 2 полностью состоит из блоков (вокселей, если быть точнее). Блоки могут быть добавлены или удалены с помощью правильных инструментов. +The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир целиком состоит из блоков (вокселей, если быть точнее). Блоки могут быть добавлены или удалены с помощью правильных инструментов. Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=Блоки могут иметь широкий спектр различных свойств, которые определяют время добычи, поведение, внешний вид, форму и многое другое. Их свойства включают в себя: • Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Непроходимые: непроходимые блоки не могут быть пройдены насквозь; игроки могут ходить по ним. Проходимые блоки могут свободно пропускать вас сквозь себя • Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Нацеливаемые: нацеливаемые блоки демонстрируют свой контур или ореол, когда вы на них нацеливаетесь. Но через ненацеливаемые блоки ваш прицел просто пройдёт насквозь. Жидкости обычно не подлежат нацеливанию, но в них всё-таки можно целиться с помощью некоторых специальных инструментов -• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Майнинговые свойства: с помощью каких инструментов можно добывать эти блоки и как быстро инструмент при этом изнашивается -• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Карабкательные: пока вы находитесь на блоке, по которому можно карабкаться, вы падаете и можете перемещаться вверх и вниз клавишами [Прыжок] и [Красться] +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Свойства добычи: с помощью каких инструментов можно добывать эти блоки и как быстро инструмент при этом изнашивается +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Карабкательные: пока вы находитесь на блоке, по которому можно карабкаться, вы не упадете и можете перемещаться вверх и вниз клавишами [Прыжок] и [Красться] • Drowning damage: See the entry “Basics > Player”=• Наносящие урон как при утоплении: Смотрите запись “Основы > игрок” • Liquids: See the entry “Basics > Liquids”=• Жидкости: Смотрите запись “Основы > Жидкости” -• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Членство в группах: Членство в группах используется для определения майнинговых и крафтинговых свойств, взаимодействий между блоками и другого -Mining=Майнинг (добывание) -Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Добывание (или копание) - это процесс разрушения блоков для их убирания. Чтобы добыть блок, нацельтесь на него указателем и удерживайте левую кнопку мыши, пока он не сломается. -Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Для добычи блоков требуется инструмент майнинга. Разные блоки добываются разными инструментами майнинга, а некоторые блоки не могут быть добыты никаким инструментом. Блоки различаются по твердости, а инструменты - по прочности. Майнинговые инструменты со временем изнашиваются. Время добывания и износ зависят и от блока, и от инструмента майнинга. Самый быстрый способ узнать, насколько эффективны ваши инструменты для майнинга, - это просто попробовать их на различных блоках. Любые предметы, которые вы извлечёте из блоков в качестве добычи, упадут на землю, готовые к сбору. -After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=При добыче (майнинге) блок может оставить после себя ”кусочек“. Это предметы, которые вы получаете в результате майнинга. Чаще всего вы получаете сам блок, но в зависимости от его типа блока, может быть следующие варианты: +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Членство в группах: Членство в группах используется для определения свойств крафта и добычи, взаимодействий между блоками и многое другое +Mining=Добывание +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Добывание (или копание) - это процесс разрушения блоков. Чтобы добыть блок, нацельтесь на него указателем и удерживайте левую кнопку мыши, пока он не сломается. +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Для добычи блоков требуется инструмент для добычи. Разные блоки добываются разными инструментами, а некоторые блоки не могут быть добыты никаким инструментом. Блоки различаются по твёрдости, а инструменты - по силе добычи. Инструменты добычи со временем изнашиваются. Время добывания и износ зависят и от блока, и от инструмента. Самый быстрый способ узнать, насколько эффективны ваши инструменты, - это просто попробовать их на различных блоках. Любые предметы, которые вы извлечёте из блоков в качестве добычи, выпадут на землю и их можно будет забрать. +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=После добычи блок может оставить после себя ”дроп“. Это предметы, которые вы получаете в результате добычи. Чаще всего вы получаете сам блок, но в зависимости от его типа блока, может быть следующие варианты: • Always drops itself (the usual case)=• Всегда выпадает сам блок (обычный случай) • Always drops the same items=• Всегда выпадают одни и те же предметы -• Drops items based on probability=• Выпадающие предметы зависят от вероятности +• Drops items based on probability=• Выпадающие с некоторой вероятностью предметы • Drops nothing=• Ничего не выпадает Building=Строительство -Almost all blocks can be built (or placed). Building is very simple and has no delay.=Почти все блоки можно использовать для строительства (размещая их где-то). Это очень просто и происходит без задержек. -To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Чтобы установить блок, который вы держите в руке, нацельтесь на блок в мире и щелкните правой кнопкой мыши. Если это невозможно из-за того, что указательный блок имеет специальное действие щелчка правой кнопкой мыши, то зажмите клавишу [Красться] перед щелчком правой кнопки. +Almost all blocks can be built (or placed). Building is very simple and has no delay.=Почти все блоки можно использовать для строительства. Блоки строятся очень просто и без задержки. +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Чтобы построить блок, который вы держите в руке, нацельтесь на блок в мире и щелкните правой кнопкой мыши. Если это невозможно из-за того, что нацеленный блок имеет специальное действие по щелчку правой кнопкой мыши, то зажмите клавишу [Красться] перед щелчком правой кнопки. Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.=Блоки почти всегда могут быть построены на нацеливаемых блоках. Исключение составляют блоки, прикрепляемые к полу - они могут быть установлены только на полу. -Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Обычно блоки строятся прямо перед блоком, в который вы целитесь, прямо перед стороной, на которую вы целитесь. Но несколько блоков ведут себя иначе: когда вы пытаетесь строить на них, они заменяются вашими новыми блоками. +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Обычно блоки строятся прямо перед блоком, в который вы целитесь, на той стороне, на которую вы целитесь. Но несколько блоков ведут себя иначе: когда вы пытаетесь строить на них, они заменяются вашими новыми блоками. Liquids=Жидкости -Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=Жидкости - это специальные динамические блоки. Жидкости любят распространяться и стекать по окружающим их блокам. Игроки могут плавать и тонуть в них. +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=Жидкости это специальные динамические блоки. Жидкости распространяются и стекают по окружающим их блокам. Игроки могут плавать и тонуть в них. Liquids usually come in two forms: In source form (S) and in flowing form (F).=Жидкости могут быть двух видов: источник (S) и течение (F). -Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.=Источники жидкостей имеют форму полного куба. Источник генерирует течение жидкости вокруг себя время от времени, и, если жидкость является возобновляемой, он также генерирует новые источники. Жидкий источник может поддерживать себя сам. Пока вы не трогаете источник, он, как правило, остаётся на месте и никуда не утекает. -Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=Текущие жидкости принимают наклонную форму. Они распространяются по всему миру, пока не пересохнут. Текучая жидкость не может поддерживать себя и всегда поступает из источника жидкости, прямо или непрямо. Без источника течение в конце концов высыхает и исчезает. +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.=Источники жидкостей имеют форму полного куба. Источник генерирует течение жидкости вокруг себя время от времени, и, если жидкость является возобновляемой, он также генерирует новые источники. Жидкий источник может поддерживать себя сам. Пока вы не трогаете источник, он, как правило, остаётся на месте и никуда сам не утекает. +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=Текущие жидкости принимают наклонную форму. Они распространяются по всему миру, пока не пересохнут. Текучая жидкость не может поддерживать себя и всегда поступает из источника. Без источника течение в конце концов высыхает и исчезает. All liquids share the following properties:=Все жидкости обладают следующими свойствами: • All properties of blocks (including drowning damage)=• Все свойства блоков (включая урон от утопления) • Renewability: Renewable liquids can create new sources=• Возобновляемость: возобновляемые жидкости могут создавать новые источники @@ -201,36 +201,36 @@ When those criteria are met, the open space is filled with a new liquid source o Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.=Плавать в жидкости довольно просто: обычные клавиши направления для основного движения, клавиша прыжка для подъема и клавиша подкрадывания для погружения. The physics for swimming and diving in a liquid are:=Физика плавания и погружения в жидкость такова: • The higher the viscosity, the slower you move=• Чем выше вязкость, тем медленнее вы двигаетесь -• If you rest, you'll slowly sink=• Если вы отдыхаете, то постепенно тонете -• There is no fall damage for falling into a liquid as such=Падение в жидкость не причиняет вам повреждений напрямую -• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Если вы упадете в жидкость, вы будете замедлены перед ударом (но не остановлены мгновенно). Итоговая сила удара определяется вашей скоростью и вязкостью жидкости. Для безопасного высокого падения в жидкость убедитесь, что над землей достаточно жидкости, иначе вы можете удариться о землю и получить урон от падения +• If you rest, you'll slowly sink=• Если вы ничего не делаете, то постепенно начнёте тонуть +• There is no fall damage for falling into a liquid as such=Падение в жидкость не наносит урон от самого падения +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Если вы упадете в жидкость, вы будете замедлены перед ударом (но не остановлены мгновенно). Итоговая сила удара определяется вашей скоростью и вязкостью жидкости. Для безопасного падения в жидкость убедитесь, что над землей достаточно жидкости, иначе вы можете удариться о землю и всё-таки получить урон от падения Liquids are often not pointable. But some special items are able to point all liquids.=Жидкости часто ненацеливаемы. Но некоторые специальные предметы способны указывать на все жидкости. -Crafting=Крафтинг -Crafting is the task of combining several items to form a new item.=Крафтинг это комбинирование нескольких предметов для формирования нового предмета. -To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Чтобы скрафтить что-либо, вам понадобятся исходные предметы, крафтинговая решётка (С) и рецепт. Решётка это как будто бы инвентарь, который можно использовать для крафтинга. Предметы должны быть помещены в решётку в определенном порядке. Результат появится сразу, как только вы правильно разместите предметы. Это ещё не сам предмет, а всего лишь предварительный просмотр. Решётки крафтинга могут быть разных размеров, размер ограничивает рецепты, которые вы можете использовать. -To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Чтобы завершить крафтинг, возьмите результирующий предмет из выходного отсека. Он будет при этом создан, а предметы из решётки будут использованы для его производства. Выходной отсек предназначен только для извлечения предметов, складывать предметы в него нельзя. -A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).=Описания того, как создавать предметы, называются “рецептами”. Вам понадобятся эти знания для крафтинга различных предметов. Есть много способов узнавать рецепты. Один из них это использование встроенной книги рецептов, доступных вам с теми предметами, которые вы успели собрать. Некоторые игры предоставляют собственные руководства по крафтингу. Существуют моды, скачав и установив которые, вы получите дополнительные руководства. И, наконец, можно узнавать рецепты из онлайн-руководства к игре (если таковое имеется). -Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Рецепты состоят, как минимум, из одного входного элемента и стопки выходных элементов. При выполнении единичного крафтинга будет употреблён ровно один предмет из каждой стопки в отсеках крафтинговой решётки, если только рецепт не предполагает замены. +Crafting=Крафт +Crafting is the task of combining several items to form a new item.=Крафт это комбинирование нескольких предметов для создания нового предмета. +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Чтобы скрафтить что-либо, вам понадобятся исходные предметы, сетка крафта и рецепт. Сетка крафта действует как инвентарь, который можно использовать для крафта. Предметы должны быть помещены в сетку крафта в определенном порядке. Результат появится сразу, как только вы правильно разместите предметы. Это ещё не сам предмет, а всего лишь предварительный просмотр. Сетки крафта могут быть разных размеров, размер ограничивает рецепты, которые вы можете использовать. +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Чтобы завершить крафт, возьмите получившийся предмет из выходного слота. Предмет будет при этом создан, а предметы из сетки будут использованы для его производства. Выходной слот предназначен только для извлечения предметов, складывать предметы в него нельзя. +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).=Описание того, как создавать предметы, называются “рецептами”. Вам понадобятся эти знания для крафта различных предметов. Есть много способов узнавать рецепты. Один из них это использование встроенной книги рецептов, доступных вам с теми предметами, которые вы успели собрать. Некоторые игры предоставляют собственные руководства по крафту. Существуют моды, скачав и установив которые, вы получите дополнительные руководства. И, наконец, можно узнавать рецепты из онлайн-руководства к игре (если таковое имеется). +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Рецепты состоят, как минимум, из одного входного элемента и стопки выходных элементов. При выполнении единичного крафта будет употреблён ровно один предмет из каждой стопки в слотах сетки крафта, если только рецепт не предполагает замены. There are multiple types of crafting recipes:=Существует несколько типов рецептов: -• Shaped (image 2): Items need to be placed in a particular shape=• Фигурные (рис. 2): предметы должны быть выложены в виде определенной фигуры -• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Простые (изображения 3 и 4): предметы помещаются в произвольных отсеках на входе (оба изображения показывают один и тот же рецепт) +• Shaped (image 2): Items need to be placed in a particular shape=• Форменные (рис. 2): предметы должны быть выложены определенной формой +• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Бесформенные (изображения 3 и 4): предметы помещаются в произвольных слотах сетки крафта (оба изображения показывают один и тот же рецепт) • Cooking: Explained in “Basics > Cooking”=• Приготовление пищи: описано в разделе “Основы > Приготовление пищи” -• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Ремонт (рис. 5): Два поврежденных инструмента помещаются в произвольные отсеки крафт-решётки, и на выходе получается инструмент, отремонтированный на 5% +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Ремонт (рис. 5): Два поврежденных инструмента помещаются в произвольные слоты сетки крафта, и на выходе получается инструмент, отремонтированный на 5% In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.=В некоторых рецептах некоторые предметы должны быть не какими-то конкретными, а просто принадлежать нужной группе предметов (см. “Основы > Группы”). Такие рецепты предлагают немного больше свободы в выборе входных предметов. На рисунках 6-8 показан один и тот же групповой рецепт. Здесь требуется 8 предметов из группы “Камни“, к которой относятся все показанные предметы. -Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=В редких случаях в рецептах содержатся замены. Это означает, что при каждом крафтинге некоторые предметы из крафтинговой решётки не будут расходоваться, но будут заменяться другими предметами. +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=В редких случаях в рецептах содержатся замены. Это означает, что при каждом крафтинге некоторые предметы из сетки крафта не будут расходоваться, а будут заменяться другими предметами. Cooking=Приготовление еды -Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=Приготовление еды (или плавление) это вид крафтинга, для которой не требуется крафтинговая решётка. Приготовление пищи осуществляется с помощью специального блока (например, печи), приготавливаемого предмета, топливного предмета и времени, которое требуется для получения нового предмета. -Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Каждый топливный предмет имеет своё время горения. В течение этого времени печь будет работать. +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=Приготовление еды (или переплавка) это вид крафта, для которой не требуется сетка крафта. Приготовление пищи осуществляется с помощью специального блока (например, печи), ингредиента, топлива и времени, которое требуется для получения нового предмета. +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Каждое топливо имеет своё время горения. В течение этого времени печь будет работать. Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.=Процесс готовки требует времени. Это время зависит от типа предмета, и продукт должен быть “на огне” в течение всего времени приготовления, чтобы вы получили желаемый результат. -Hotbar=Панель быстрого доступа -At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=В нижней части экрана вы видите несколько квадратов. Это так называемая “Панель быстрого доступа“. Она позволяет быстро получать доступ к первым предметам вашего игрового инвентаря. +Hotbar=Хотбар +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=В нижней части экрана вы видите несколько квадратов. Это так называемая “Панель быстрого доступа“ или “Хотбар“. Она позволяет быстро получать доступ к первым предметам вашего инвентаря. You can change the selected item with the mouse wheel or the keyboard.=Вы можете выбирать предмет при помощи колесика мыши или при помощи клавиатуры. -• Select previous item in hotbar: [Mouse wheel up] or [B]=• Выбор предыдущего предмета панели: [Колёсико вверх] или [B] -• Select next item in hotbar: [Mouse wheel down] or [N]=• Выбор следующего предмета панели: [Колёсико вниз] или [N] -• Select item in hotbar directly: [1]-[9]=• Прямой выбор предмета панели: [1] - [9] -The selected item is also your wielded item.=Выбранный предмет на панели быстрого доступа также является вашим носимым предметом, который вы держите в руке. +• Select previous item in hotbar: [Mouse wheel up] or [B]=• Выбор предыдущего предмета хотбара: [Колёсико вверх] или [B] +• Select next item in hotbar: [Mouse wheel down] or [N]=• Выбор следующего предмета хотбара: [Колёсико вниз] или [N] +• Select item in hotbar directly: [1]-[9]=• Прямой выбор предмета хотбара: [1] - [9] +The selected item is also your wielded item.=Выбранный предмет в хотбаре также является вашим носимым предметом, который вы держите в руке. Minimap=Миникарта -If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть карта (это такой предмет) в любом отсеке панели быстрого доступа, то вы можете пользоваться миникартой. +If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть предмет-карта в любом слоте хотбара, то вы можете пользоваться миникартой. Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Нажмите [F9], чтобы в правом верхнем углу появилась миникарта. Она поможет вам найти свой путь по всему миру. Нажмите его еще раз, чтобы выбирать различные режимы мини-карты и уровни масштабирования. Миникарта также показывает позиции других игроков. There are 2 minimap modes and 3 zoom levels.=Миникарта имеет 2 режима и 3 уровня масштабирования. Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.=Режим поверхности (рис. 1) это вид на мир сверху с приблизительным воспроизведением цветов блоков из которых этот мир состоит. В этом режиме видны только самые верхние блоки, а всё, что ниже, скрыто, как на спутниковой фотографии. Режим поверхности полезен, если вы заблудились. @@ -238,27 +238,27 @@ Radar mode (image 2) is more complicated. It displays the “denseness” of the There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.=Существует также два различных режима вращения. В “квадратном режиме” вращение миникарты фиксируется. Если вы нажмете [Shift]+[F9], чтобы переключиться в “режим круга”, миникарта будет вращаться в соответствии с вашим направлением взгляда, поэтому “вверх” всегда будет вашим направлением взгляда. In some games, the minimap may be disabled.=В некоторых играх миникарта может быть отключена. • Toggle minimap mode: [F9]=• Переключение режима миникарты: [F9] -• Toggle minimap rotation mode: [Shift]+[F9]=• Переключение режима вращения миникарты: [Shift]+[F9] +• Toggle minimap rotation mode: [Shift]+[F9]=• Переключение вращения миникарты: [Shift]+[F9] Inventory=Инвентарь -Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Инвентари используются для хранения стопок предметов. Есть и другое их применение, например, крафтинг. Инвентарь состоит из прямоугольной решётки отсеков для предметов. Каждый отсек может быть либо пустым, либо содержать одну стопку предметов. Стопки предметов можно свободно перемещать между большей частью отсеков. -You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=У вас есть ваш собственный инвентарь, который называется “инвентарь игрока”, вы можете открыть его нажатием клавиши инвентаря (по умолчанию это [I]). Первый ряд отсеков вашего инвентаря будут отображаться на панели быстрого доступа. +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Инвентари используются для хранения стопок предметов. Есть и другое их применение, например, крафт. Инвентарь состоит из прямоугольной решётки слотов для предметов. Каждый слот может быть либо пустым, либо содержать одну стопку предметов. Стопки предметов можно свободно перемещать между большей частью слотов. +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=У вас есть ваш собственный инвентарь, который называется “инвентарь игрока”, вы можете открыть его нажатием клавиши инвентаря (по умолчанию это [I]). Первый ряд слотов вашего инвентаря будут отображаться в хотбаре. Blocks can also have their own inventory, e.g. chests and furnaces.=Блоки также могут иметь свой собственный инвентарь, например сундуки и печи. Inventory controls:=Управление инвентарём: -Taking: You can take items from an occupied slot if the cursor holds nothing.=Взятие: вы можете брать предметы из занятого отсека, если не держите предмет курсором в этот момент. -• Left click: take entire item stack=• Клик левой: взятие всей стопки предметов -• Right click: take half from the item stack (rounded up)=• Клик правой: взятие половины стопки предметов (округлённо) -• Middle click: take 10 items from the item stack=• Клик средней: взятие 10 предметов из стопки предметов -• Mouse wheel down: take 1 item from the item stack=• Колесо вниз: взятие 1 предмета из стопки предметов -Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Выкладывание: вы можете помещать предметы в отсек, если ваш курсор удерживает 1 или более предмет, а отсек пуст, либо содержит стопку таких же предметов. -• Left click: put entire item stack=• Клик левой: положить всю стопку предметов -• Right click: put 1 item of the item stack=• Клик правой: положить только 1 предмет из всей удерживаемой курсором стопки -• Right click or mouse wheel up: put 1 item of the item stack=• Клик правой или колёсико вверх: положить 1 предмет из удерживаемой курсором стопки -• Middle click: put 10 items of the item stack=• Клик средней: положить 10 предметов из удерживаемой курсором стопки -Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.=Обмен: Вы можете обменять предметы, если курсор удерживает 1 или более предметов, а целевой отсек занят другими предметами. -• Click: exchange item stacks=• Клик: обмен стопок предметов -Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Выбрасывание: если вы, держа на курсоре стопку предметов, кликнете ей за пределами меню, то вся стопка выбрасывается в окружающую среду. +Taking: You can take items from an occupied slot if the cursor holds nothing.=Взятие: вы можете брать предметы из слота, если не держите предмет курсором в этот момент. +• Left click: take entire item stack=• Клик левой кнопкой мыши: взять всю стопку предметов +• Right click: take half from the item stack (rounded up)=• Клик правой кнопкой мыши: взять половину стопки предметов (округляется вверх) +• Middle click: take 10 items from the item stack=• Клик средней кнопкой мыши: взять 10 предметов из стопки предметов +• Mouse wheel down: take 1 item from the item stack=• Колёсико вниз: взять 1 предмет из стопки предметов +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Выкладывание: вы можете помещать предметы в слот, если ваш курсор удерживает 1 или более предмет, а слот пуст, либо содержит стопку таких же предметов. +• Left click: put entire item stack=• Клик левой кнопкой мыши: положить всю стопку предметов +• Right click: put 1 item of the item stack=• Клик правой кнопкой мыши: положить только 1 предмет из всей удерживаемой курсором стопки +• Right click or mouse wheel up: put 1 item of the item stack=• Клик правой кнопкой мыши или колёсико вверх: положить 1 предмет из удерживаемой курсором стопки +• Middle click: put 10 items of the item stack=• Клик средней кнопкой мыши: положить 10 предметов из удерживаемой курсором стопки +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.=Обмен: Вы можете обменять предметы, если курсор удерживает 1 или более предметов, а целевой слот занят другими предметами. +• Click: exchange item stacks=• Клик мышью: обменять стопки предметов +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Выбрасывание: если вы возьмете стопку предметов и кликнете ей за пределами меню, то вся стопка выбрасывается в окружающую среду. Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Быстрая передача: вы можете быстро передавать стопки предметов между вашим личным инвентарём и инвентарём другого предмета (печи, сундука или любого другого, имеющего инвентарный отсек) во время доступа к эту предмету. Обычно это используется для загрузки/выгрузки нужных предметов. -• Sneak+Left click: Automatically transfer item stack=• [Красться]+Клик левой: автоматическая передача стопки предметов +• Sneak+Left click: Automatically transfer item stack=• [Красться]+Клик левой кнопкой мыши: автоматическая передача стопки предметов Online help=Онлайн-помощь You may want to check out these online resources related to MineClone 2.=Возможно, вы захотите ознакомиться с этими онлайн-ресурсами, связанными с MineClone 2. MineClone 2 download and forum discussion: =Официальный форум MineClone 2: @@ -268,18 +268,18 @@ Report bugs here.=С помощью баг-трекера можно сообщ Minetest links:=Ссылки Minetest: You may want to check out these online resources related to Minetest:=Возможно, вы захотите посетить эти онлайн-ресурсы, связанные с Minetest: Official homepage of Minetest: =Официальная домашняя страница Minetest: -The main place to find the most recent version of Minetest, the engine used by MineClone 2.=Это основное место для скачивания свежих версий Minetest (Minetest это «движок», используемый MineClone 2). +The main place to find the most recent version of Minetest, the engine used by MineClone 2.=Это основное место для скачивания свежих версий Minetest, движка, используемого MineClone 2. The main place to find the most recent version of Minetest.=Это основное место для скачивания свежих версий Minetest. Community wiki: =Wiki сообщества: -A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Веб-сайт документации сообщества. Любой, у кого есть учетная запись, может её редактировать! Там много документации по игре Minetest. +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Веб-сайт документации сообщества. Любой, у кого есть учетная запись, может её редактировать! Там много документации по Minetest Game. Minetest forums: =Форумы Minetest: -A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Интернет-форумы, где вы можете обсудить все, что связано с Minetest. Это также место, где публикуются и обсуждаются игры и моды, сделанные игроками. Дискуссии ведутся в основном на английском языке, но есть также место для дискуссий и на других языках. +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Интернет-форумы, где вы можете обсудить все, что связано с Minetest. Это также место, где публикуются и обсуждаются игры и моды, сделанные игроками. Дискуссии ведутся в основном на английском языке, но есть также раздел для дискуссий и на других языках. Chat: =Чат: A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.=Универсальный IRC-чат-канал для всего, связанного с Minetest, где люди могут встретиться для общения в режиме реального времени. Если вы не разбираетесь в IRC, обратитесь за помощью к Wiki. Groups=Группы -Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Предметы, игроки и объекты (одушевленные и неодушевленные) могут быть членами любого количества групп. Группы выполняют несколько задач: -• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Рецепты: один из входных отсеков решётки крафтинга может занять не строго определённый предмет, а один из предметов, принадлежащих одной или нескольким группам -• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Время выкапывания: Копаемые блоки принадлежат группам, имеющим определённое время копания. Инструментами майнинга можно добывать блоки, принадлежащие определенным группам +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Предметы, игроки и объекты (живые и нет) могут быть членами любого количества групп. Группы выполняют несколько задач: +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Рецепты: один из входных слотов сетки крафта может занять не строго определённый предмет, а один из предметов, принадлежащих одной или нескольким группам +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Время добывания: Копаемые блоки принадлежат группам, имеющим определённое время добычи. Инструментами добычи можно добывать блоки, принадлежащие определенным группам • Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group=• Поведение блоков: блоки могут вести себя необычным образом и взаимодействовать с другими блоками, если принадлежат определенной группе • Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”=• Урон и защита: у объектов и игроков есть группы защиты, а у оружия - группы причиняемого урона. Эти группы позволяют определить урон. Смотри также: “Основы > Оружие” • Other uses=• И прочее @@ -287,69 +287,69 @@ In the item help, many important groups are usually mentioned and explained.=В Glossary=Глоссарий This is a list of commonly used terms:=Это список часто используемых терминов: Controls:=Управление: -• Wielding: Holding an item in hand=• Wielding (Владеть/Держать/Нести/Удерживать): держать предмет в руке -• Pointing: Looking with the crosshair at something in range=• Pointing (Наведение/Нацеливание/Прицел/Взгляд): смотреть через прицел в виде крестика на что-либо в пределах вашей досягаемости -• Dropping: Throwing an item or item stack to the ground=• Dropping (Выпадание): бросание предмета или стопки предметов на землю -• Punching: Attacking with left-click, is also used on blocks=• Punching (Удар/Стуканье): атака с помощью щелчка левой кнопкой мыши, применяется и к блокам -• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Sneaking (Красться/Подкрадывание): идти медленно, избегая опасности падения с края блока -• Climbing: Moving up or down a climbable block=• Climbing (Карабкаться/Скалолазание): перемещение вверх или вниз по блоку, позволяющему по нему карабкаться +• Wielding: Holding an item in hand=• Владеть/Держать/Нести/Удерживать: держать предмет в руке +• Pointing: Looking with the crosshair at something in range=• Наведение/Нацеливание/Прицел/Взгляд: смотреть через прицел в виде крестика на что-либо в пределах вашей досягаемости +• Dropping: Throwing an item or item stack to the ground=• Выпадание/Дроп: бросание предмета или стопки предметов на землю +• Punching: Attacking with left-click, is also used on blocks=• Punching Удар: атака с помощью щелчка левой кнопкой мыши, применяется и к блокам +• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Подкрадывание: идти медленно, избегая опасности падения с края блока +• Climbing: Moving up or down a climbable block=• Карабкаться: перемещение вверх или вниз по блоку, позволяющему по нему карабкаться Blocks:=Блоки: • Block: Cubes that the worlds are made of=• Блоки: кубики, из которых состоят миры -• Mining/digging: Using a mining tool to break a block=• Майнинг/копание/добывание: использование инструмента майнинга для разрушения блока -• Building/placing: Putting a block somewhere=• Строительство/размещение/установка/укладывание: установка блока где-либо в мире +• Mining/digging: Using a mining tool to break a block=• Добывание/майнинг/копание: использование добывающего инструмента для разрушения блока +• Building/placing: Putting a block somewhere=• Строительство/размещение/установка/укладывание: постройка блока где-либо в мире • Drop: Items you get after mining a block=• Выбрасывание/Выпадание: появление предметов в результате добывания блоков • Using a block: Right-clicking a block to access its special function=• Использование блока: клик правой по блоку для доступа к его специальной функции Items:=Предметы: -• Item: A single thing that players can possess=• Предмет: единственная вещь, которой могут обладать игроки +• Item: A single thing that players can possess=• Предмет: вещь, которой могут обладать игроки • Item stack: A collection of items of the same kind=• Стопка предметов: набор одинаковых предметов • Maximum stack size: Maximum amount of items in an item stack=• Максимальный размер стопки: максимальное количество предметов в стопке -• Slot / inventory slot: Can hold one item stack=• Отсек / отсек инвентаря: может вместить одну стопку предметов +• Slot / inventory slot: Can hold one item stack=• Слот инвентаря: может вместить одну стопку предметов • Inventory: Provides several inventory slots for storage=• Инвентарь: содержит несколько отсеков инвентаря для хранения • Player inventory: The main inventory of a player=• Инвентарь игрока: основной инвентарь игрока, который находится непосредственно при нём • Tool: An item which you can use to do special things with when wielding=• Инструмент: предмет, держа который в руке, можно совершать какие-либо специальные действия с блоками • Range: How far away things can be to be pointed by an item=• Диапазон: как далеко могут находиться вещи, на которые нацелен предмет -• Mining tool: A tool which allows to break blocks=• Инструмент майнинга: инструмент, который позволяет разбивать блоки -• Craftitem: An item which is (primarily or only) used for crafting=• Ингредиент: предмет, который преимущественно используется для крафтинга (создания) новых предметов +• Mining tool: A tool which allows to break blocks=• Добывающий инструмент: инструмент, который позволяет разбивать блоки +• Craftitem: An item which is (primarily or only) used for crafting=• Материал: предмет, который преимущественно используется для крафта (создания) новых предметов Gameplay:=Игровой процесс: -• “heart”: A single health symbol, indicates 2 HP=• “сердечко”: часть индикатора здоровья, обозначает 2 HP -• “bubble”: A single breath symbol, indicates 1 BP=• “пузырёк“: часть индикатора дыхания, обозначает 1 BP -• HP: Hit point (equals half 1 “heart”)=• HP: Hit point (половинка сердечка, переводится как “единица удара”) -• BP: Breath point, indicates breath when diving=• BP: Breath point (целый пузырёк, переводится как “единица дыхания”) отображает состояние дыхания при погружении +• “heart”: A single health symbol, indicates 2 HP=• “сердечко”: часть индикатора здоровья, обозначает 2 очка здоровья (HP) +• “bubble”: A single breath symbol, indicates 1 BP=• “пузырёк“: часть индикатора дыхания, обозначает 1 очко дыхания (BP) +• HP: Hit point (equals half 1 “heart”)=• HP: очко здоровья (половинка сердечка) +• BP: Breath point, indicates breath when diving=• BP: очко дыхания, отображает состояние дыхания при погружении • Mob: Computer-controlled enemy=• Моб: управляемый компьютером враг -• Crafting: Combining multiple items to create new ones=• Крафтинг: комбинирование нескольких предметов для создания новых +• Crafting: Combining multiple items to create new ones=• Крафт: комбинирование нескольких предметов для создания новых • Crafting guide: A helper which shows available crafting recipes=• Книга рецептов: помощник, который показывает доступные рецепты -• Spawning: Appearing in the world=• Спаунинг: появление в мире -• Respawning: Appearing again in the world after death=• Возрождение (респаунинг): появление снова в мире после смерти +• Spawning: Appearing in the world=• Спавнинг/спаунинг: появление в мире +• Respawning: Appearing again in the world after death=• Возрождение (респавн): появление снова в мире после смерти • Group: Puts similar things together, often affects gameplay=• Группа: объединяет похожие вещи, часто влияет на игровой процесс • noclip: Allows to fly through walls=• noclip (ноуклип): позволяет летать сквозь стены Interface=Интерфейс -• Hotbar: Inventory slots at the bottom=• Панель быстрого доступа: отсеки для инвентаря внизу +• Hotbar: Inventory slots at the bottom=• Панель быстрого доступа/хотбар: слоты инвентаря внизу • Statbar: Indicator made out of half-symbols, used for health and breath=• Панель состояния: индикатор, сделанный из полусимволов, используемый для здоровья и дыхания • Minimap: The map or radar at the top right=• Миникарта: карта или радар в правом верхнем углу • Crosshair: Seen in the middle, used to point at things=• Перекрестие: видно посередине, используется для нацеливания на предметы Online multiplayer:=Сетевая многопользовательская игра: • PvP: Player vs Player. If active, players can deal damage to each other=• PvP: игрок против игрока. Если включено, игроки могут наносить урон друг другу • Griefing: Destroying the buildings of other players against their will=• Грифинг: разрушение зданий других игроков против их воли -• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Защита: механизм присваивания себе некоторых областей мира, позволяющий владельцам запретить изменять блоки внутри этих областей всем, кроме себя, либо ограниченного списка друзей +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Защита/приват: механизм присваивания себе некоторых областей мира, позволяющий владельцам запретить изменять блоки внутри этих областей всем, кроме себя, либо ограниченного списка друзей Technical terms:=Технические условия: • Minetest: This game engine=• Minetest: движок этой игры • MineClone 2: What you play right now=• MineClone 2: то, во что вы играете прямо сейчас • Minetest Game: A game for Minetest by the Minetest developers=• Minetest Game: игра для Minetest от разработчиков Minetest • Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar=• Игра: весь игровой процесс, принятый в Minetest; например, обычная игра, или песочница, или подобное -• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them=• Мод: отдельная подсистема, которая добавляет или изменяет функциональность; является основным способом конструирования игр и может быть использована для дальнейшего улучшения или изменения их +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them=• Мод: отдельная подсистема, которая добавляет или изменяет функциональность; является основным способом конструирования игр и может быть использована для их дальнейшего улучшения или изменения • Privilege: Allows a player to do something=• Привилегия: позволяет игроку что-то делать -• Node: Other word for “block”=• Узел: другое слово для обозначения “блока” +• Node: Other word for “block”=• Узел/нода: другое слово для обозначения “блока” Settings=Настройки There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.=Существует много разнообразных настроек Minetest. Почти каждый аспект игры может быть изменён. These are a few of the most important gameplay settings:=Вот некоторые наиболее важные настройки: • Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal=• Урон (enable_damage): включает здоровье и дыхание для всех игроков. Если он выключен, то все игроки бессмертны • Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.=• Творческий режим (creative_mode): позволяет играть в стиле песочницы, сосредоточившись на творчестве, а не на сложном игровом процессе. Смысл зависит от конкретной игры. Основные черты: ускоренное время копания, мгновенный доступ почти ко всем предметам, отсутствует износ инструментов и пр. -• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• PvP (enable_pvp): “Игрок против игрока”. Если этот режим включён, игроки могут наносить урон друг другу +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• PvP (enable_pvp): “игрок против игрока”. Если этот режим включён, игроки могут наносить урон друг другу For a full list of all available settings, use the “All Settings” dialog in the main menu.=Для получения полного списка настроек вы можете перейти в ”Настройки - Все настройки“ в главном меню Minetest. Movement modes=Режимы передвижения You can enable some special movement modes that change how you move.=Вы можете включать специальные режимы вашего перемещения. -Pitch movement mode:=Движение под уклоном -• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Описание: при активации этого режима клавиши будут перемещать вас в соответствии с вашим текущим углом обзора, если вы находитесь в жидкости или в режиме полёта. +Pitch movement mode:=Режим движения по направлению взгляда +• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Описание: при активации этого режима клавиши будут перемещать вас относительно направления взгляда игрока когда вы находитесь в жидкости или в режиме полёта. • Default key: [L]=• Клавиша по умолчанию: [L] • No privilege required=• Никаких привилегий не требуется Fast mode:=Быстрый режим @@ -357,7 +357,7 @@ Fast mode:=Быстрый режим • Default key: [J]=• Клавиша по умолчанию: [J] • Required privilege: fast=• Требуемые привилегии: fast Fly mode:=Режим полёта: -• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Описание: гравитация не влияет на вас, и вы можете свободно перемещаться во всех направлениях. клавишу прыжка, чтобы подниматься, и клавишу [Красться], чтобы опускаться. +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Описание: гравитация не влияет на вас, и вы можете свободно перемещаться во всех направлениях. [Прыжок] чтобы взлететь выше, и клавишу [Красться], чтобы опуститься. • Default key: [K]=• Клавиша по умолчанию: [K] • Required privilege: fly=• Требуемые привилегии: fly Noclip mode:=Режим прохождения сквозь стены (Noclip): @@ -369,7 +369,7 @@ With [F10] you can open and close the console. The main use of the console is to Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.=Использование чата или клавиши для отправки команд также открывает консоль, но меньшего размера, и будет закрываться сразу после отправки сообщения. Use the chat to communicate with other players. This requires you to have the “shout” privilege.=Используйте чат для общения с другими игроками. Для этого требуется привилегия ”shout“. Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.=Просто введите сообщение и нажмите [Enter]. Сообщения чата не могут начинаться с “/“. -You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Вы можете отправлять приватные сообщения: скажите “/msg <игрок> <сообщение>” в чате, чтобы отправить “<сообщение>”, который сможет увидеть только <игрок>. +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Вы можете отправлять приватные сообщения: напишите “/msg <игрок> <сообщение>” в чате, чтобы отправить “<сообщение>”, который сможет увидеть только <игрок>. There are some special controls for the console:=Клавиши специального управления консолью: • [F10] Open/close console=• [F10] открыть/закрыть консоль • [Enter]: Send message or command=• [Enter]: Отправить сообщение или команду @@ -401,12 +401,12 @@ In the command reference, you see some placeholders which you need to replace wi Here are some examples to illustrate the command syntax:=Вот несколько примеров, иллюстрирующих синтаксис команды: • /mods: No parameters. Just enter “/mods”=• /mods: Нет параметров. Просто введите “/mods” • /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”=• /me <действие>: 1 параметр. Вы должны ввести “/me“, а затем любой текст, например “/me orders pizza” -• /give : Two parameters. Example: “/give Player default:apple”=• /give <имя> <Айтемстринг>: два параметра. Пример: “/give Player mcl_core:apple” +• /give : Two parameters. Example: “/give Player default:apple”=• /give <имя> <ТехническоеНазвание>: два параметра. Пример: “/give Player mcl_core:apple” • /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”=• /help [all|privs|<команда>]: допустимыми командами будут являться: “/help”, “/help all”, “/help privs” или “/help ” и имя команды, например: “/help time” • /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”=• /spawnentity <ИмяСущности> [<Х>,<У>,]: допустимыми командами будут являться: “/spawnentity mcl_boats:boat” и “/spawnentity mcl_boats:boat 0,0,0” Some final remarks:=Некоторые заключительные замечания: -• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=• Для /give и /giveme вам понадобится значение «Айтемстринг» (ItemString). Это уникальный идентификатор предмета для внутреннего использования, его можно найти в справке по предмету, если у вас есть привилегия “give” (давать) или “debug” (отлаживать) -• For /spawnentity you need an entity name, which is another identifier=• Для /spawnentity вам нужно имя сущности, которое является другим идентификатором +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=• Для /give и /giveme вам понадобится “техническое название” (ItemString). Это уникальный идентификатор предмета для внутреннего использования, его можно найти в справке по предмету, если у вас есть привилегия “give” или “debug” +• For /spawnentity you need an entity name, which is another identifier=• Для /spawnentity вам нужно имя сущности, которое также является идентификатором Privileges=Привилегии Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.=Каждый игрок имеет набор привилегий, который отличается от сервера к серверу. Ваши привилегии определяют, что вы можете и чего не можете делать. Привилегии могут быть предоставлены и отозваны у других игроков любым игроком, имеющим привилегию под названием “privs”. On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.=На многопользовательском сервере с конфигурацией по умолчанию новые игроки начинают с привилегиями “interact” (взаимодействовать) и “shout” (кричать). Привилегия “interact” необходима для основных действий игрового процесса, таких как строительство, добыча , использование и т. д. Привилегия “shout” позволяет общаться в чате. @@ -414,14 +414,14 @@ There is a small set of core privileges which you'll find on every server, other To view your own privileges, issue the server command “/privs”.=Чтобы просмотреть свои собственные привилегии, выполните команду сервера “/privs”. Here are a few basic privilege-related commands:=Вот несколько основных команд, связанных с привилегиями: • /privs: Lists your privileges=• /privs: список ваших привилегий -• /privs : Lists the privileges of =• /privs <игрок>: список привилегий игрока с именем <игрок> +• /privs : Lists the privileges of =• /privs <игрок>: список привилегий <игрока> • /help privs: Shows a list and description about all privileges=• /help privs: показывает список и описание всех привилегий Players with the “privs” privilege can modify privileges at will:=Игроки с привилегией “privs” могут предоставлять игрокам привилегии, а также лишать их, по своему усмотрению: • /grant : Grant to =• /grant <игрок> <привилегия>: предоставить <привилегию> <игроку> • /revoke : Revoke from =• /revoke <игрок> <привилегия>: отменить <привилегию> для <игрока> In single-player mode, you can use “/grantme all” to unlock all abilities.=В однопользовательском режиме вы можете использовать “/grantme all“, чтобы сразу разблокировать себе все возможности. Light=Свет -As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Весть мир полностью основан на блоках, и точно так же устроен свет. Каждый блок имеет свою собственную яркость. Яркость блока выражается в “уровне свечения“, который колеблется от 0 (полная темнота) до 15 (такой же яркий, как солнце). +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Весь мир полностью основан на блоках, и точно так же устроен свет. Каждый блок имеет свою собственную яркость. Яркость блока выражается в “уровне свечения“, который колеблется от 0 (полная темнота) до 15 (такой же яркий, как солнце). There are two types of light: Sunlight and artificial light.=Существует два вида света: солнечный и искусственный. Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.=Искусственный свет излучается светящимися блоками. Искусственный свет имеет уровень яркости от 1 до 14. Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.=Солнечный свет самый яркий и всегда идет совершенно прямо с неба в любое время дня. Ночью свет превращается в лунный, и он тоже даёт небольшое количество света. Уровень яркости солнечного света равен 15. @@ -461,7 +461,7 @@ Enabling Creative Mode in MineClone 2 applies the following changes:=При вк Damage is not affected by Creative Mode, it needs to be disabled separately.=На урон творческий режим не влияет, его нужно отключать отдельно. Mobs=Мобы Mobs are the living beings in the world. This includes animals and monsters.=Мобы - это живые существа в мире. Они включают в себя животных и монстров. -Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Мобы появляются случайным образом по всему миру. Это называется “спаунинг” (“spawning” – появление, рождение, нерест). Каждый вид мобов появляется на определенных типах блоков при заданном уровне освещенности. Высота тоже играет свою роль. Мирные мобы, как правило, появляются при дневном свете, в то время как враждебные предпочитают темноту. Большинство мобов могут появляться на любом твердом блоке, но некоторые мобы появляются только на определённых блоках (например, травяных). +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Мобы появляются случайным образом по всему миру. Это называется “спавнинг”. Каждый вид мобов появляется на определенных типах блоков при заданном уровне освещенности. Высота тоже играет свою роль. Мирные мобы, как правило, появляются при дневном свете, в то время как враждебные предпочитают темноту. Большинство мобов могут появляться на любом твердом блоке, но некоторые мобы появляются только на определённых блоках (например, травяных). Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.=Как и игроки, мобы имеют очки здоровья, а иногда и очки защиты (что означает, что вам понадобится оружие получше, чтобы нанести им хоть какой-то урон). Так же, как и игроки, враждебные мобы могут атаковать вплотную или с расстояния. Мобы могут выбрасывать случайные предметы, когда умирают. Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.=Большинство животных бесцельно бродят по миру, в то время как большинство враждебных мобов охотятся на игроков. Животных можно кормить, приручать и разводить. Animals=Животные @@ -485,21 +485,21 @@ Core hunger rules:=Основные правила голода: • Actions like combat, jumping, sprinting, etc. decrease hunger points=• Такие действия, такие как бой, прыжки, бег и тому подобные, уменьшают очки голода • Food restores hunger points=• Еда восстанавливает очки голода • If your hunger bar decreases, you're hungry=• Если ваша индикатор голода уменьшается, вы голодны -• At 18-20 hunger points, you regenerate 1 HP every 4 seconds=• При 18-20 очках голода ваше здоровье восстанавливается со скоростью 1 HP каждые 4 секунды +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds=• При 18-20 очках голода ваше здоровье восстанавливается со скоростью 1 очко каждые 4 секунды • At 6 hunger points or less, you can't sprint=• При 6 очках голода и менее меньше вы не можете бежать -• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)=• При 0 очках голода вы теряете 1 HP 4 секунды (до уровня 1 HP) -• Poisonous food decreases your health=• Ядовитая пища ухудшает ваше здоровье. +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)=• При 0 очках голода вы теряете 1 очко здоровья 4 секунды (до тех пор пока здоровье не понизится до 1 HP) +• Poisonous food decreases your health=• Ядовитая пища умешьшает ваше здоровье. Details:=Подробности: -You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.=У вас есть 0-20 очков голода, обозначенных 20 куриными ножками над панелью быстрого доступа. У вас также есть невидимый атрибут: сытость. -Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.=Очки голода отражают, насколько вы сыты, а невидимые очки сытости – через какое время вы снова проголодаетесь. -Each food item increases both your hunger level as well your saturation.=Каждый продукт питания увеличивает как очки голода, так и невидимые очки сытости. +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.=У вас есть 0-20 очков голода, обозначенных 20 куриными ножками над хотбаром. У вас также есть невидимый атрибут: насыщение. +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.=Очки голода отражают, насколько вы сыты, а невидимые очки насыщения – через какое время вы снова проголодаетесь. +Each food item increases both your hunger level as well your saturation.=Каждый продукт питания увеличивает как очки голода, так и невидимые очки насыщения. Food with a high saturation boost has the advantage that it will take longer until you get hungry again.=Таким образом, еда с высоком насыщаемостью имеет преимущество, которое заключается в том, что пройдёт больше времени, прежде чем вы снова проголодаетесь. -A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.=Некоторые продукты питания иногда могут вызвать отравление. Когда вы отравлены, символы здоровья и голода становятся болезненно зелёными. Пищевое отравление истощает здоровье на 1 HP в секунду, до уровня 1 HP. Пищевое отравление также уменьшает невидимые очки сытости. Отравление проходит через некоторое время либо при выпивании молока. -You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.=Вы начинаете с 5 очками сытости. Максимальная сытость равна вашему текущему уровню голода. Таким образом, с 20 очками голода ваша максимальная сытость 20. Это означает, что продукты питания, которые восстанавливают много очков сытости, тем эффективнее, чем больше у вас очков голода. При низком уровне голода большая часть сытости будет потеряна. -If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.=Если ваши невидимые очки сытости достигают 0, вы начинаете испытывать голод постепенно терять очки голода. Если вы видите, что индикатор голода уменьшается, значит, настало время поесть. -Saturation decreases by doing things which exhaust you (highest exhaustion first):=Сытость уменьшается, если вы делаете вещи, которые истощают вас (от высокого к низкому истощению): -• Regenerating 1 HP=• Восстановление 1 HP (единицы здоровья/удара) -• Suffering food poisoning=• Страдание пищевым отравлением +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.=Некоторая пища иногда может вызвать отравление. Когда вы отравлены, символы здоровья и голода становятся болезненно зелёными. Пищевое отравление истощает здоровье на 1 HP в секунду, до уровня 1 HP. Пищевое отравление также уменьшает невидимые очки насыщения. Отравление проходит через некоторое время либо при выпивании молока. +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.=Вы начинаете с 5 очками насыщения. Максимальное насыщение равно вашему текущему уровню голода. Таким образом, с 20 очками голода ваше максимальное насыщение равно 20. Это означает, что пища, которая восстанавливает много очков насыщения, тем эффективнее, чем больше у вас очков голода. При низком уровне голода большая часть насыщения будет потеряна. +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.=Если ваши невидимые очки насыщения достигает 0, вы начинаете постепенно терять очки голода. Если вы видите, что индикатор голода уменьшается, значит, настало время поесть. +Saturation decreases by doing things which exhaust you (highest exhaustion first):=Насыщение уменьшается, если вы делаете вещи, которые истощают вас (от большего к меньшему): +• Regenerating 1 HP=• Восстановление 1 единицы здоровья +• Suffering food poisoning=• Страдание от пищевого отравления • Sprint-jumping=• Прыжки во время бега • Sprinting=• Бег • Attacking=• Атака @@ -508,4 +508,4 @@ Saturation decreases by doing things which exhaust you (highest exhaustion first • Jumping=• Прыжки • Mining a block=• Добывание блоков Other actions, like walking, do not exaust you.=Другие действия, такие как ходьба, не истощают вас. -If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть карта в любом отсеке на панели быстрого доступа, вы можете использовать миникарту. +If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть карта в любом слоте хотбара, вы можете использовать миникарту. diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.fr.tr b/mods/HELP/mcl_tt/locale/mcl_tt.fr.tr index a66311448..ca4c6d292 100644 --- a/mods/HELP/mcl_tt/locale/mcl_tt.fr.tr +++ b/mods/HELP/mcl_tt/locale/mcl_tt.fr.tr @@ -36,7 +36,7 @@ Fall damage: +@1%=Dégâts de chute: +@1% No fall damage=Pas de dégâts de chute Mining speed: @1=Vitesse de minage: @1 Very fast=Très rapide -Extremely fast=Extremement rapide +Extremely fast=Extrèmement rapide Fast=Rapide Slow=Lent Very slow=Très lent @@ -45,3 +45,4 @@ Mining durability: @1=Durabilité de minage: @1 Block breaking strength: @1=Résistance à la rupture: @1 @1 uses=@1 utilisations Unlimited uses=Utilisations illimitées +Durability: @1=Durabilité : @1 \ No newline at end of file diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr b/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr index 349b6a5fb..5f1b7c875 100644 --- a/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr +++ b/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr @@ -1,33 +1,34 @@ # textdomain: mcl_tt -Head armor=Зашита головы -Torso armor=Защита тела -Legs armor=Защита ног -Feet armor=Защита ступней -Armor points: @1=Эффективность защиты: @1 -Armor durability: @1=Долговечность защиты: @1 +Head armor=Броня для головы +Torso armor=Броня для торса +Legs armor=Броня для ног +Feet armor=Броня для ступней +Armor points: @1=Эффективность брони: @1 +Armor durability: @1=Прочность брони: @1 Protection: @1%=Уровень защиты: @1% Hunger points: +@1=Очки голода: +@1 -Saturation points: +@1=Очки сытости: +@1 +Saturation points: +@1=Очки насыщения: +@1 Deals damage when falling=Наносит урон при падении -Grows on grass blocks or dirt=Растёт на блоках травы или грязи -Grows on grass blocks, podzol, dirt or coarse dirt=Растёт на блоках травы, подзола, грязи и твёрдой грязи +Grows on grass blocks or dirt=Растёт на дёрне или земле +Grows on grass blocks, podzol, dirt or coarse dirt=Растёт на дёрне, земле, подзоле, каменистой земли Flammable=Легковоспламенимо Zombie view range: -50%=Дальность зрения зомби: -50% Skeleton view range: -50%=Дальность зрения скелета: -50% Creeper view range: -50%=Дальность зрения крипера: -50% Damage: @1=Урон: @1 Damage (@1): @2=Урон (@1): @2 +Durability: @1=Прочность: @1 Healing: @1=Исцеление: @1 Healing (@1): @2=Исцеление (@1): @2 Full punch interval: @1s=Интервал полного удара: @1 с -Contact damage: @1 per second=Урон при контакте: @1 в секунду -Contact healing: @1 per second=Исцеление при контакте: @1 в секунду -Drowning damage: @1=Урон при падении: @1 +Contact damage: @1 per second=Урон при попадении: @1 в секунду +Contact healing: @1 per second=Исцеление при попадении: @1 в секунду +Drowning damage: @1=Урон при утоплении: @1 Bouncy (@1%)=Упругость (@1%) Luminance: @1=Свечение: @1 -Slippery=Скользкость +Slippery=Скользкий блок Climbable=Можно карабкаться -Climbable (only downwards)=Можно спускаться +Climbable (only downwards)=Можно спускаться вниз No jumping=Нельзя прыгать No swimming upwards=Нельзя плыть вверх No rising=Нельзя подниматься @@ -35,13 +36,13 @@ Fall damage: @1%=Урон при падении: @1% Fall damage: +@1%=Урон при падении: +@1% No fall damage=Нет урона при падении Mining speed: @1=Скорость добычи: @1 -Very fast=очень высокая -Extremely fast=ужасно высокая -Fast=высокая -Slow=низкая -Very slow=очень низкая -Painfully slow=мучительно низкая -Mining durability: @1=Долговечность добычи: @1 -Block breaking strength: @1=Сила разбиения блоков: @1 -@1 uses=@1 раз(а) +Very fast=Очень высокая +Extremely fast=Экстремально высокая +Fast=Высокая +Slow=Низкая +Very slow=Очень низкая +Painfully slow=Крайне низкая +Mining durability: @1=Прочность добывания: @1 +Block breaking strength: @1=Сила добычи блока: @1 +@1 uses=@1 использований Unlimited uses=не ограничено diff --git a/mods/HELP/mcl_tt/locale/template.txt b/mods/HELP/mcl_tt/locale/template.txt index 6fb735b13..c8cf2908a 100644 --- a/mods/HELP/mcl_tt/locale/template.txt +++ b/mods/HELP/mcl_tt/locale/template.txt @@ -17,6 +17,7 @@ Skeleton view range: -50%= Creeper view range: -50%= Damage: @1= Damage (@1): @2= +Durability: @1 Healing: @1= Healing (@1): @2= Full punch interval: @1s= diff --git a/mods/HUD/awards/locale/awards.fr.tr b/mods/HUD/awards/locale/awards.fr.tr index c227a9c07..2f2a78b68 100644 --- a/mods/HUD/awards/locale/awards.fr.tr +++ b/mods/HUD/awards/locale/awards.fr.tr @@ -11,15 +11,15 @@ (Secret Award)=(Récompense Secrètte) = = -A Cat in a Pop-Tart?!=A Cat in a Pop-Tart?! +A Cat in a Pop-Tart?!=Un chat beurré ?! Achievement gotten!=Succès obtenu ! Achievement gotten:=Succès obtenu : Achievement gotten: @1=Succès obtenu : @1 Achievement not found.=Succès inconnu All your awards and statistics have been cleared. You can now start again.=Toutes vos récompenses et statistiques ont été effacées. Vous pouvez maintenant recommencer. Awards=Récompenses -Craft: @1×@2=Frabrication: @1×@2 -Craft: @1=Frabrication: @1 +Craft: @1×@2=Fabrication: @1×@2 +Craft: @1=Fabrication: @1 Die @1 times.=Mort @1 fois. Die.=Mort. Get the achievements statistics for the given player or yourself=Obtenez les statistiques de succès pour le joueur donné ou vous-même @@ -59,3 +59,6 @@ Invalid action.=Action invalide. Player is not online.=Le joueur n'est pas en ligne. Done.=Terminé. Achievement “@1” does not exist.=Le succès «@1» n'existe pas. +@1 has made the achievement @2=@1 a obtenu le succès @2 +Mine a block: @1= Miner un bloc : @1 +Mine blocks: @1×@2= Miner des blocs : @1×@2 \ No newline at end of file diff --git a/mods/HUD/awards/locale/awards.ru.tr b/mods/HUD/awards/locale/awards.ru.tr index 8495c270f..885512a20 100644 --- a/mods/HUD/awards/locale/awards.ru.tr +++ b/mods/HUD/awards/locale/awards.ru.tr @@ -11,52 +11,52 @@ (Secret Award)=(Секретная награда) =<идентификатор достижения> =<имя> -A Cat in a Pop-Tart?!=Кот в печеньке?! +A Cat in a Pop-Tart?!=Кот в печеньке!? Achievement gotten!=Получено достижение! Achievement gotten:=Получено достижение: Achievement gotten: @1=Получено достижение: @1 Achievement not found.=Достижение не найдено. -All your awards and statistics have been cleared. You can now start again.=Ваши награды удалены вместе со всей статистикой. Теперь можно начать всё сначала. +All your awards and statistics have been cleared. You can now start again.=Ваша статистика и все награды очищены. Теперь вы можете начать всё сначала. Awards=Награды Craft: @1×@2=Скрафчено: @1×@2 Craft: @1=Скрафчено: @1 -Die @1 times.=Умер(ла) @1 раз(а). -Die.=Умер(ла). -Get the achievements statistics for the given player or yourself=Получение статистики достижений для заданного игрока или для себя -Join the game @1 times.=Присоединился(ась) к игре @1 раз(а). -Join the game.=Присоединился(ась) к игре. -List awards in chat (deprecated)=Вывести список наград в чат (устарело). +Die @1 times.=Умер(ла) @1 раз. +Die.=Погибните. +Get the achievements statistics for the given player or yourself=Получение статистики и достижений для заданного игрока или для себя +Join the game @1 times.=Присоединился(ась) к игре @1 раз. +Join the game.=Присоединитесь к игре. +List awards in chat (deprecated)=Вывести список наград в чат (устаревшее). Place a block: @1=Разметил(а) блок: @1 -Place blocks: @1×@2=Разместил(а) блоки: @1×@2 +Place blocks: @1×@2=Разместил(а) блоков: @1×@2 Secret Achievement gotten!=Секретное достижение получено! Secret Achievement gotten:=Секретное достижение получено: Secret Achievement gotten: @1=Секретное достижение получено: @1 Show details of an achievement=Показать подробности достижения Show, clear, disable or enable your achievements=Отобразить, очистить, запретить или разрешить ваши достижения Get this achievement to find out what it is.=Получите это достижение, чтобы узнать, что это. -Write @1 chat messages.=Написано @1 сообщений(е,я) в чате. -Write something in chat.=Написал(а) что-то в чате. -You have disabled your achievements.=Вы запретили ваши достижения. -You have enabled your achievements.=Вы разрешили ваши достижения. +Write @1 chat messages.=Написано @1 сообщений в чате. +Write something in chat.=Напишите что-нибудь в чате. +You have disabled your achievements.=Вы отключили ваши достижения. +You have enabled your achievements.=Вы включили ваши достижения. You have not gotten any awards.=Вы пока не получали наград. -You've disabled awards. Type /awards enable to reenable.=Вы запретили награды. Выполните /awards enable, чтобы разрешить их обратно. -[c|clear|disable|enable]=[c|clear - очистить|disable - запретить|enable - разрешить] -OK=О'кей -Error: No awards available.=Ошибка: Награды недоступны +You've disabled awards. Type /awards enable to reenable.=Вы отключили награды. Выполните /awards enable, чтобы включить их обратно. +[c|clear|disable|enable]=[c|clear - очистить|disable - отключить|enable - включить] +OK=Окей +Error: No awards available.=Ошибка: нет доступных наград Eat: @1×@2=Съедено: @1×@2 Eat: @1=Съедено: @1 @1/@2 eaten=@1/@2 съедено -Place @1 block(s).=Поместил(а) @1 блок(а,ов). -Dig @1 block(s).=Выкопал(а) @1 блок(а,ов). -Eat @1 item(s).=Съел(а) @1 предмет(а,ов). -Craft @1 item(s).=Скрафтил(а) @1 предмет(а,ов). +Place @1 block(s).=Поместил(а) @1 блоков. +Dig @1 block(s).=Выкопал(а) @1 блоков. +Eat @1 item(s).=Съел(а) @1 предметов. +Craft @1 item(s).=Скрафтил(а) @1 предметов. Can give achievements to any player=Может выдавать достижения любому игроку (grant ( | all)) | list=(grant <игрок> (<достижение> | all - всем)) | список Give achievement to player or list all achievements=Выдать достижение игроку или отобразить все достижения @1 (@2)=@1 (@2) Invalid syntax.=Неверный синтаксис. -Invalid action.=Непредусмотренное действие. -Player is not online.=Игрок не подключён. -Done.=Сделано. +Invalid action.=Неверное действие. +Player is not online.=Игрок не в сети. +Done.=Готово. Achievement “@1” does not exist.=Достижения “@1” не существует. -@1 has made the achievement @2=@1 получил(а) достижение @2 +@1 has made the achievement @2=@1 получил достижение @2 diff --git a/mods/HUD/hudbars/init.lua b/mods/HUD/hudbars/init.lua index 505ff403b..ae4dd1713 100644 --- a/mods/HUD/hudbars/init.lua +++ b/mods/HUD/hudbars/init.lua @@ -52,11 +52,11 @@ end -- Load default settings dofile(modpath.."/default_settings.lua") -if minetest.get_modpath("mcl_experience") and not minetest.is_creative_enabled("") then +--if minetest.get_modpath("mcl_experience") and not minetest.is_creative_enabled("") then -- reserve some space for experience bar: hb.settings.start_offset_left.y = hb.settings.start_offset_left.y - 20 hb.settings.start_offset_right.y = hb.settings.start_offset_right.y - 20 -end +--end local function player_exists(player) return player ~= nil and player:is_player() diff --git a/mods/HUD/hudbars/locale/hudbars.fr.tr b/mods/HUD/hudbars/locale/hudbars.fr.tr index b31b7b0c1..b207e50dd 100644 --- a/mods/HUD/hudbars/locale/hudbars.fr.tr +++ b/mods/HUD/hudbars/locale/hudbars.fr.tr @@ -1,6 +1,6 @@ # textdomain: hudbars Health=Santé -Breath=Breath +Breath=Respiration # Default format string for progress bar-style HUD bars, e.g. “Health 5/20” @1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/hudbars/locale/hudbars.ru.tr b/mods/HUD/hudbars/locale/hudbars.ru.tr index 2d278e339..b76ecc155 100644 --- a/mods/HUD/hudbars/locale/hudbars.ru.tr +++ b/mods/HUD/hudbars/locale/hudbars.ru.tr @@ -1,4 +1,4 @@ # textdomain: hudbars -Health=HP -Breath=дыхание +Health=Здоровье +Breath=Дыхание @1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr index ae4941d2e..0896bcf36 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr @@ -16,7 +16,7 @@ Eat a cooked rabbit.=Mangez du lapin cuit. Get really desperate and eat rotten flesh.=Soyez vraiment désespéré et mangez de la chair pourrie. Getting Wood=Obtenir du bois Getting an Upgrade=Obtenir une augmentaton de niveau -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Frappez un squelette, wither squelette ou stray à l'arc et à la flèche à une distance d'au moins 20 mètres. +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Frappez un squelette, wither squelette ou vagabond à l'arc et à la flèche à une distance d'au moins 20 mètres. Hot Topic=Sujet brûlant Into Fire=Dans le feu Into the Nether=Dans le Nether diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr index 0db2ae99d..0c3f50ca5 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr @@ -1,49 +1,55 @@ # textdomain:mcl_achievements -Aquire Hardware=Куй Железо -Bake Bread=Хлеб всему голова -Benchmarking=Верстак -Cow Tipper=Кожа да кости -Craft a bookshelf.=Создание книжной полки -Craft a cake using wheat, sugar, milk and an egg.=Создание торта из пшеницы, сахара, молока и яйца. -Craft a crafting table from 4 wooden planks.=Создание верстака из 4 досок. -Craft a stone pickaxe using sticks and cobblestone.=Создание каменного топора из палок и булыжников. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Изготовление деревянного меча из досок и палок на верстаке. +Aquire Hardware=Куй железо... +Bake Bread=Хлеб насущный +Benchmarking=Рабочий стол +Cow Tipper=Мясник +Craft a bookshelf.=Скрафтите книжную полку. +Craft a cake using wheat, sugar, milk and an egg.=Скрафтите торт из пшеницы, сахара, молока и яйца. +Craft a crafting table from 4 wooden planks.=Скрафтите верстак из 4 досок. +Craft a stone pickaxe using sticks and cobblestone.=Скрафтите каменную кирку из палок и булыжников. +Craft a wooden sword using wooden planks and sticks on a crafting table.=Скрафтите на верстаке деревянный меч из досок и палок. DIAMONDS!=АЛМАЗЫ! -Delicious Fish=Вкусная Рыба -Dispense With This=Раздавай Это -Eat a cooked porkchop.=Употребление в пищу приготовленной свиной отбивной. -Eat a cooked rabbit.=Употребление в пищу приготовленного кролика. -Get really desperate and eat rotten flesh.=Отчаянное и необдуманное употребление в пищу гнилого мяса -Getting Wood=Рубка Леса -Getting an Upgrade=Модернизация -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Удар по скелету, скелету-иссушителю либо уклонение от стрелы на расстоянии не менее 20 метров. -Hot Topic=Автор Жжёт -Into Fire=В Огне -Into the Nether=В Аду -Iron Belly=Железный Живот +Delicious Fish=Вкусная рыбка +Dispense With This=Раздайте с этим +Eat a cooked porkchop.=Съешьте приготовленную свинину. +Eat a cooked rabbit.=Съешьте приготовленную крольчатину. +Get really desperate and eat rotten flesh.=Отчайтесь и съешьте гнилое мясо. +Getting Wood=Нарубить древесины +Getting an Upgrade=Обновка! +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Попадите по скелету, скелету-иссушителю или страннику стрелой из лука на расстоянии не менее 20 метров. +Hot Topic=Жаркая тема +Into Fire=Огненные недра +Into the Nether=В самое пекло +Iron Belly=Железный живот Librarian=Библиотекарь -Mine emerald ore.=Добыча изумрудной руды. -On A Rail=На Рельсах -Pick up a blaze rod from the floor.=Поднятие огненного стержня с пола. -Pick up a diamond from the floor.=Поднятие алмаза с пола. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Поднятие дерева с земли.@nПодсказка: Бейте по стволу, пока он не упадёт на землю, превратившись в предмет. -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Поднятие кожи с пола.@nПодсказка: Коровы и некоторые другие животные могут оставлять кожу, если их убивать. -Place a dispenser.=Установка диспенсера. -Place a flower pot.=Установка цветочного горшка. -Pork Chop=Свиная Отбивная -Pot Planter=Сажатель Горшков -Rabbit Season=Кроличий Сезон -Sniper Duel=Снайперская Дуэль -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Приготовление рыбы в печи.@nПодсказка: Ловите рыбу удочкой и готовьте её в печи. -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Получение слитка железа из печи.@nПодсказка: чтобы переплавить железную руду, нужно положить её в печь и туда же поместить топливо (уголь или другое). -The Haggler=Хагглер -The Lie=Тортик +Mine emerald ore.=Добудьте изумрудную руду. +On A Rail=Стук колёс +Pick up a blaze rod from the floor.=Поднимите огненный стержень. +Pick up a diamond from the floor.=Поднимите алмаз. +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Поднимите бревно с земли.@nПодсказка: Бейте по стволу, пока он не выпадёт на землю, превратившись в предмет. +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Поднимите кожу.@nПодсказка: Коровы и некоторые другие животные могут оставлять кожу, если их убить. +Place a dispenser.=Поставьте раздатчик. +Place a flower pot.=Поставьте цветочный горшок. +Pork Chop=Свиная отбивная +Pot Planter=Садовод +Rabbit Season=Сезон кроликов +Sniper Duel=Снайперская дуэль +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Приготовьте рыбу в печи.@nПодсказка: Поймайте рыбу удочкой и приготовьте её в печи. +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Получите слиток железа из печи.@nПодсказка: чтобы переплавить железную руду, нужно положить в печь руду и топливо (например, уголь). +The Haggler=Торгаш +The Lie=Тортик это ложь Time to Farm!=Время фермерства! -Time to Mine!=Время добывать! -Time to Strike!=Время сражаться! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Поездка на вагонетке минимум на 1000 метров от стартовой точки за один раз. -Use 8 cobblestones to craft a furnace.=Создание печи из 8 булыжников. -Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Создание деревянной мотыги из досок и палок на верстаке. -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Создание деревянной кирки из досок и палок на верстаке. -Use obsidian and a fire starter to construct a Nether portal.=Создание Адского портала при помощи обсидиана и огнива. -Use wheat to craft a bread.=Использование пшеницы для приготовления хлеба. +Time to Mine!=Пора в шахту! +Time to Strike!=К бою готов! +Travel by minecart for at least 1000 meters from your starting point in a single ride.=Прокатитесь на вагонетке минимум на 1000 метров от стартовой точки за один раз. +Use 8 cobblestones to craft a furnace.=Скрафтите печь из 8 булыжников. +Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Скрафтите на верстаке деревянную мотыгу из досок и палок. +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Скрафтите на верстаке деревянную кирку из досок и палок. +Use obsidian and a fire starter to construct a Nether portal.=Создайте портала в Нижний мир при помощи обсидиана и огнива. +Use wheat to craft a bread.=Скрафтите хлеб из пшеницы. +Stone Age=Каменный век +Mine a stone with new pickaxe.=Добудьте камень новой киркой. +Hot Stuff=Горячая штучка +Put lava in a bucket.=Наберите ведро лавы. +Ice Bucket Challenge=Две стихии +Obtain an obsidian block.=Получите блок обсидиана. diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt index ecdba2672..eccec5225 100644 --- a/mods/HUD/mcl_achievements/locale/template.txt +++ b/mods/HUD/mcl_achievements/locale/template.txt @@ -47,3 +47,9 @@ Use a crafting table to craft a wooden hoe from wooden planks and sticks.= Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.= Use obsidian and a fire starter to construct a Nether portal.= Use wheat to craft a bread.= +Stone Age= +Mine a stone with new pickaxe.= +Hot Stuff= +Put lava in a bucket.= +Ice Bucket Challenge= +Obtain an obsidian block.= diff --git a/mods/HUD/mcl_bossbars/init.lua b/mods/HUD/mcl_bossbars/init.lua index f1d99e013..be2ed2a2a 100644 --- a/mods/HUD/mcl_bossbars/init.lua +++ b/mods/HUD/mcl_bossbars/init.lua @@ -102,8 +102,8 @@ function mcl_bossbars.update_boss(object, name, color) end end -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() +minetest.register_on_authplayer(function(name, ip, is_success) + if not is_success then return end mcl_bossbars.huds[name] = {} mcl_bossbars.bars[name] = {} end) diff --git a/mods/HUD/mcl_credits/CONTRUBUTOR_LIST.txt b/mods/HUD/mcl_credits/CONTRUBUTOR_LIST.txt new file mode 100644 index 000000000..561952adc --- /dev/null +++ b/mods/HUD/mcl_credits/CONTRUBUTOR_LIST.txt @@ -0,0 +1,86 @@ +1798643961 +3raven +AFCMS +aldum +Alexander Minges +aligator +ArTee3 +Artem Arbatsky +basxto +Benjamin Schötz +Blue Blancmange +Booglejr +Brandon +Bu-Gee +bzoss +chmodsayshello +Code-Sploit +cora +Daniel Cassidy +davedevils +Dave Devil's +David McMackins II +dBeans +debiankaios +Dieter44 +Doloment +Elias Åström +Elias Fleckenstein +Emily +Emojigit +epCode +erlehmann +FinishedFragment +Glaucos Ginez +Gustavo Ramos Rehermann +Guy Liner +GuyLiner +HimbeerserverDE +iliekprogrammar +j1233 +Jared Moody +jordan4ibanez +kabou +kay27 +Laurent Rocher +Li0n +marcin-serwin +Marcin Serwin +Mental-Inferno +Midgard +MysticTempest +Nicholas Niro +nickolas360 +Nicu +nikolaus-albinger +Nils Dagsson Moskopp +NO11 +NO411 +Oil_boi +pitchum +PrairieAstronomer +PrairieWind +Rocher Laurent +rootyjr +Rootyjr +rudzik8 +Sab Pyrope +Saku Laesvuori +sfan5 +SmallJoker +superfloh247 +Sven792 +Sydney Gems +talamh +TechDudie +Thinking +Tianyang Zhang +U.N.Owen +Wouters Dorian +wuniversales +Wuzzy +Yukitty +yutyo +ZedekThePD +ZeDique la Ruleta +ztianyang diff --git a/mods/HUD/mcl_credits/README.md b/mods/HUD/mcl_credits/README.md new file mode 100644 index 000000000..3d76497d0 --- /dev/null +++ b/mods/HUD/mcl_credits/README.md @@ -0,0 +1,9 @@ +Please run the following command to update contributor list: + +```bash +# git log --pretty="%an" | sort | uniq >CONTRUBUTOR_LIST.txt +``` + +Please check that there is no error on execution, and `CONTRUBUTOR_LIST.txt` is updated. + +There should be contributor names, line by line. diff --git a/mods/HUD/mcl_credits/init.lua b/mods/HUD/mcl_credits/init.lua index db3ac8436..357a7fdde 100644 --- a/mods/HUD/mcl_credits/init.lua +++ b/mods/HUD/mcl_credits/init.lua @@ -1,10 +1,40 @@ local modname = minetest.get_current_modname() local S = minetest.get_translator(modname) +local contributors_file_name = minetest.get_modpath(modname) .. "/CONTRUBUTOR_LIST.txt" + +local file = io.open(contributors_file_name) +local contributors = {} +if not file then + minetest.log("error", "[" .. modname .. "] Can't read contributors from " .. contributors_file_name) +else + local contributor_list = file:read("*a") + file:close() + for contributor in contributor_list:gmatch("[^\r\n]+") do + table.insert(contributors, contributor) + end +end + mcl_credits = { players = {}, description = S("A faithful Open Source clone of Minecraft"), - people = dofile(minetest.get_modpath(modname) .. "/people.lua"), + people = { + {S("Creator of MineClone"), 0x0A9400, { + "davedevils", + }}, + {S("Creator of MineClone 2"), 0xFBF837, { + "Wuzzy", + }}, + {S("Creators of MineClone 5"), 0x52FF00, + contributors + }, + {S("Special thanks"), 0x00E9FF, { + "celeron55 for creating Minetest", + "Jordach for the jukebox music compilation from Big Freaking Dig", + "The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game", + "Notch and Jeb for being the major forces behind Minecraft", + }} + } } local function add_hud_element(def, huds, y) diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr index a8886286e..39c816b16 100644 --- a/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr +++ b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr @@ -1,14 +1,14 @@ # textdomain: mcl_credits -3D Models= -A faithful Open Source clone of Minecraft= -Contributors= -Creator of MineClone= -Creator of MineClone2= -Developers= -Jump to speed up (additionally sprint)= -Maintainers= -MineClone5= -Original Mod Authors= -Sneak to skip= -Textures= -Translations= \ No newline at end of file +3D Models=3D модели +A faithful Open Source clone of Minecraft=Преданный клон Minecraft с открытым исходным кодом +Contributors=Контрибуторы +Creator of MineClone=Создатель MineClone +Creator of MineClone2=Создатель MineClone2 +Developers=Разработчики +Jump to speed up (additionally sprint)=[Прыжок] или [Спринт] для перемотки +Maintainers=Сопровождающие проекта +MineClone5=MineClone5 +Original Mod Authors=Оригинальные авторы модов +Sneak to skip=[Красться] чтобы пропустить +Textures=Текстуры +Translations=Переводчики \ No newline at end of file diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua deleted file mode 100644 index babd64bcc..000000000 --- a/mods/HUD/mcl_credits/people.lua +++ /dev/null @@ -1,145 +0,0 @@ -local modname = minetest.get_current_modname() -local S = minetest.get_translator(modname) - -return { - {S("Creator of MineClone"), 0x0A9400, { - "davedevils", - }}, - {S("Creator of MineClone2"), 0xFBF837, { - "Wuzzy", - }}, - {S("Creator of MineClone5"), 0xFF51D5, { - S("The Community"), - }}, - {S("Developers"), 0xF84355, { - "Fleckenstein", - "kay27", - "oilboi", - "bzoss", - "AFCMS", - "epCode", - "ryvnf", - "iliekprogrammar", - "MysticTempest", - "Rootyjr", - "Nicu", - "aligator", - "Code-Sploit", - "NO11", - "cora", - }}, - {S("Contributors"), 0x52FF00, { - "Laurent Rocher", - "HimbeerserverDE", - "TechDudie", - "Alexander Minges", - "ArTee3", - "ZeDique la Ruleta", - "pitchum", - "wuniversales", - "Bu-Gee", - "David McMackins II", - "Nicholas Niro", - "Wouters Dorian", - "Blue Blancmange", - "Jared Moody", - "Li0n", - "Midgard", - "Saku Laesvuori", - "Yukitty", - "ZedekThePD", - "aldum", - "dBeans", - "nickolas360", - "yutyo", - "ztianyang", - "j45", - "Marcin Serwin", - "erlehmann", - "E", - "Benjamin Schötz", - "Doloment", - "Sydney Gems", - "talamh", - "Emily2255", - "Emojigit", - "FinishedFragment", - "sfan5", - "Blue Blancmange", - "Jared Moody", - "SmallJoker", - "Sven792", - "aldum", - }}, - {S("MineClone5"), 0xA60014, { - "kay27", - "Debiankaios", - "epCode", - "NO11", - "j45", - }}, - {S("Original Mod Authors"), 0x343434, { - "Wuzzy", - "Fleckenstein", - "BlockMen", - "TenPlus1", - "PilzAdam", - "ryvnf", - "stujones11", - "Arcelmi", - "celeron55", - "maikerumine", - "GunshipPenguin", - "Qwertymine3", - "Rochambeau", - "rubenwardy", - "stu", - "4aiman", - "Kahrl", - "Krock", - "UgnilJoZ", - "lordfingle", - "22i", - "bzoss", - "kilbith", - "xeranas", - "kddekadenz", - "sofar", - "4Evergreen4", - "jordan4ibanez", - "paramat", - }}, - {S("3D Models"), 0x0019FF, { - "22i", - "tobyplowy", - "epCode", - }}, - {S("Textures"), 0xFF9705, { - "XSSheep", - "Wuzzy", - "kingoscargames", - "leorockway", - "xMrVizzy", - "yutyo", - "NO11", - "kay27", - }}, - {S("Translations"), 0x00FF60, { - "Wuzzy", - "Rocher Laurent", - "wuniversales", - "kay27", - "pitchum", - "todoporlalibertad", - "Marcin Serwin", - }}, - {S("Funders"), 0xF7FF00, { - "40W", - }}, - {S("Special thanks"), 0x00E9FF, { - "celeron55 for creating Minetest", - "Jordach for the jukebox music compilation from Big Freaking Dig", - "The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game", - "Notch and Jeb for being the major forces behind Minecraft", - }}, -} diff --git a/mods/HUD/mcl_credits/textures/mineclone2_logo.png b/mods/HUD/mcl_credits/textures/mineclone2_logo.png index 11435df51..f95e425b9 100644 Binary files a/mods/HUD/mcl_credits/textures/mineclone2_logo.png and b/mods/HUD/mcl_credits/textures/mineclone2_logo.png differ diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.fr.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.fr.tr index 05cf99976..8c83238e7 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.fr.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.fr.tr @@ -56,4 +56,4 @@ A ghast scared @1 to death.=Un ghast a éffrayé @1 à mort. @1 was killed by a baby husk.=@1 a été tué par un bébé zombie momie. @1 was killed by a zombie pigman.=@1 a été tué par un zombie-couchon. @1 was killed by a baby zombie pigman.=@1 a été tué par un bébé zombie-couchon -@1 was slain by @2.= +@1 was slain by @2.=@1 a été tué par @2 diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr index d5b6ec396..21e1bc642 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr @@ -1,59 +1,55 @@ # textdomain: mcl_death_messages -@1 was fatally hit by an arrow.=@1 застрелил лучник. -@1 has been killed with an arrow.=@1 убило стрелой из лука. -@1 was shot by an arrow from @2.=@1 убило стрелой @2. -@1 was shot by an arrow from a skeleton.=@1 был(а) убит(а) стрелой скелета. -@1 was shot by an arrow from a stray.=@1 был(а) убит(а) стрелой странника. -@1 was shot by an arrow from an illusioner.=@1 был(а) убит(а) стрелой иллюзора. -@1 was shot by an arrow.=@1 был(а) убит(а) стрелой. -@1 forgot to breathe.=@1 забыл(а) подышать. -@1 drowned.=@1 утонул(а). -@1 ran out of oxygen.=У @1 закончился кислород. -@1 was killed by @2.=@1 был(а) убит(а) @2. -@1 was killed.=@1 был(а) убит(а). -@1 was killed by a mob.=@1 был(а) убит(а) мобом. -@1 was burned to death by a blaze's fireball.=@1 до смерти прожарило файерболом ифрита. -@1 was killed by a fireball from a blaze.=@1 был(а) убит(а) файерболом ифрита. -@1 was burned by a fire charge.=@1 сожгло огненным разрядом. -A ghast scared @1 to death.=Гаст напугал @1 до смерти. -@1 has been fireballed by a ghast.=@1 настиг файербол Гаста. -@1 fell from a high cliff.=@1 свалился(ась) с высокого утёса. -@1 took fatal fall damage.=@1 получил(а) смертельный урон от падения. -@1 fell victim to gravity.=@1 стал(а) жертвой гравитации. -@1 died.=@1 умер(ла). -@1 was killed by a zombie.=@1 был(а) убит(а) зомби. -@1 was killed by a baby zombie.=@1 был(а) убит(а) малышом-зомби. -@1 was killed by a blaze.=@1 был(а) убит(а) ифритом. -@1 was killed by a slime.=@1 был(а) убит(а) слизняком. -@1 was killed by a witch.=@1 был(а) убит(а) ведьмой. -@1 was killed by a magma cube.=@1 был(а) убит(а) лавовым кубом. -@1 was killed by a wolf.=@1 был(а) убит(а) волком. -@1 was killed by a cat.=@1 был(а) убит(а) кошкой. -@1 was killed by an ocelot.=@1 был(а) убит(а) оцелотом. -@1 was killed by an ender dragon.=@1 был(а) убит(а) драконом предела. -@1 was killed by a wither.=@1 был(а) убит(а) иссушителем. -@1 was killed by an enderman.=@1 был(а) убит(а) эндерменом. -@1 was killed by an endermite.=@1 был(а) убит(а) эндермитом. -@1 was killed by a ghast.=@1 был(а) убит(а) гастом. -@1 was killed by an elder guardian.=@1 был(а) убит(а) древним стражем. -@1 was killed by a guardian.=@1 был(а) убит(а) стражем. -@1 was killed by an iron golem.=@1 был(а) убит(а) железным големом. -@1 was killed by a polar_bear.=@1 был(а) убит(а) полярным медведем. -@1 was killed by a killer bunny.=@1 был(а) убит(а) кроликом-убийцей. -@1 was killed by a shulker.=@1 был(а) убит(а) шалкером. -@1 was killed by a silverfish.=@1 был(а) убит(а) чешуйницей. -@1 was killed by a skeleton.=@1 был(а) убит(а) скелетом. -@1 was killed by a stray.=@1 был(а) убит(а) странником. -@1 was killed by a slime.=@1 был(а) убит(а) слизняком. -@1 was killed by a spider.=@1 был(а) убит(а) пауком. -@1 was killed by a cave spider.=@1 был(а) убит(а) пещерным пауком. -@1 was killed by a vex.=@1 был(а) убит(а) досаждателем. -@1 was killed by an evoker.=@1 был(а) убит(а) магом. -@1 was killed by an illusioner.=@1 был(а) убит(а) иллюзором. -@1 was killed by a vindicator.=@1 был(а) убит(а) поборником. -@1 was killed by a zombie villager.=@1 был(а) убит(а) зомби-жителем. -@1 was killed by a husk.=@1 был(а) убит(а) кадавром. -@1 was killed by a baby husk.=@1 был(а) убит(а) машылом-кадавром. -@1 was killed by a zombie pigman.=@1 был(а) убит(а) зомби-свиночеловеком. -@1 was killed by a baby zombie pigman.=@1 был(а) убит(а) малышом-зомби-свиночеловеком. -@1 was slain by @2.= +@1 went up in flames=@1 сгорел(а) в языках пламени +@1 walked into fire whilst fighting @2=@1 прошёлся(лась) по огню, сражаясь с @2 +@1 was struck by lightning=@1 был(а) убит(а) молнией +@1 was struck by lightning whilst fighting @2=@1 был(а) убит(а) молнией, сражаясь с @2 +@1 burned to death=@1 сгорел(а) заживо +@1 was burnt to a crisp whilst fighting @2=@1 обгорел(а) до углей, сражаясь с @2 +@1 tried to swim in lava=@1 попытался(ась) поплавать в лаве +@1 tried to swim in lava to escape @2=@1 попытался(ась) переплыть лаву, убегая от @2 +@1 discovered the floor was lava=@1 узнал(а) что пол это лава +@1 walked into danger zone due to @2=@1 прогулялся(лась) в опасной зоне, благодаря @2 +@1 suffocated in a wall=@1 задохнулся(ась) в стене +@1 suffocated in a wall whilst fighting @2=@1 задохнулся(ась) в стене, сражаясь с @2 +@1 drowned=@1 утонул(а) +@1 drowned whilst trying to escape @2=@1 утонул(а), убегая от @2 +@1 starved to death=@1 умер(ла) от голода +@1 starved to death whilst fighting @2=@1 умер(ла) от голода, сражаясь с @2 +@1 was pricked to death=@1 был(а) заколот(а) до смерти +@1 walked into a cactus whilst trying to escape @2=@1 задел(а) кактус, убегая от @2 +@1 hit the ground too hard=@1 слишком сильно ударился(ась) об землю +@1 hit the ground too hard whilst trying to escape @2=@1 слишком сильно ударился(ась) об землю, убегая от @2 +@1 experienced kinetic energy=@1 испытал(а) на себе кинетическую энергию +@1 experienced kinetic energy whilst trying to escape @2=@1 испытал(а) на себе кинетическую энергию, убегая от @2 +@1 fell out of the world=@1 выпал(а) из мира +@1 didn't want to live in the same world as @2=@1 не захотел(а) жить в том же мире, что и @2 +@1 died=@1 погиб(ла) +@1 died because of @2=@1 погиб(ла) из-за @2 +@1 was killed by magic=@1 был(а) убит(а) магией +@1 was killed by magic whilst trying to escape @2=@1 был(а) убит(а) магией, убегая от @2 +@1 was killed by @2 using magic=@1 был(а) убит(а) @2 с помощью магии +@1 was killed by @2 using @3=@1 был(а) убит(а) @2 с помощью @3 +@1 was roasted in dragon breath=@1 поджарился(ась) в драконьем дыхании +@1 was roasted in dragon breath by @2=@1 поджарился(ась) в драконьем дыхании, благодаря @2 +@1 withered away=@1 иссох(ла) +@1 withered away whilst fighting @2=@1 иссох(ла), сражаясь с @2 +@1 was shot by a skull from @2=@1 был(а) застрелен(а) @2 +@1 was squashed by a falling anvil=@1 раздавлен(а) падающей наковальней +@1 was squashed by a falling anvil whilst fighting @2=@1 раздавлен(а) падающей наковальней, сражаясь с @2 +@1 was squashed by a falling block=@1 раздавлен(а) падающим блоком +@1 was squashed by a falling block whilst fighting @2=@1 раздавлен(а) падающим блоком, сражаясь с @2 +@1 was slain by @2=@1 погиб(ла) от @2 +@1 was slain by @2 using @3=@2 убил(а) @1 с помощью своего @3 +@1 was shot by @2=@1 был(а) застрелен @2 +@1 was shot by @2 using @3=@2 застрелил(а) @1 с помощью своего @3 +@1 was fireballed by @2=@1 получил(а) файерболом от @2 +@1 was fireballed by @2 using @3=@1 получил(а) файерболом от @2 из @3 +@1 was killed trying to hurt @2=@1 погиб(ла), пытаясь навредить @2 +@1 was killed by @3 trying to hurt @2=@1 убит(а) @3, пытаясь навредить @2 +@1 blew up=@1 взорвался(ась) +@1 was blown up by @2=@1 был(а) взорван(а) @2 +@1 was blown up by @2 using @3=@1 был(а) взорван(а) @2 с помощью @3 +@1 was squished too much=@1 был(а) слишком сильно сдавлен(а) +@1 was squashed by @2=@1 был(а) слишком сильно сдавлен(а), благодаря @2 +@1 went off with a bang=@1 попал(а) в мир иной под звуки салюта +@1 went off with a bang due to a firework fired from @3 by @2=@1 попал(а) в мир иной под звуки салюта, выпущенного из @3 игроком @2 \ No newline at end of file diff --git a/mods/HUD/mcl_experience/bottle.lua b/mods/HUD/mcl_experience/bottle.lua index 10e42a57d..992b7247c 100644 --- a/mods/HUD/mcl_experience/bottle.lua +++ b/mods/HUD/mcl_experience/bottle.lua @@ -45,7 +45,7 @@ local function throw_xp_bottle(pos, dir, velocity) end minetest.register_craftitem("mcl_experience:bottle", { - description = "Bottle o' Enchanting", + description = S("Bottle o' Enchanting"), inventory_image = "mcl_experience_bottle.png", wield_image = "mcl_experience_bottle.png", stack_max = 64, diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index aea805fa2..65f456f81 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -156,13 +156,38 @@ function mcl_experience.throw_xp(pos, total_xp) end end +local function init_hudbars(player) + if not minetest.is_creative_enabled(player:get_player_name()) then + hud_bars[player] = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 1}, + offset = {x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5)}, + scale = {x = 2.8, y = 3.0}, + alignment = {x = 1, y = 1}, + z_index = 11, + }) + + hud_levels[player] = player:hud_add({ + hud_elem_type = "text", + position = {x = 0.5, y = 1}, + number = 0x80FF20, + offset = {x = 0, y = -(48 + 24 + 24)}, + z_index = 12, + }) + end +end + function mcl_experience.update(player) + if not mcl_util or not mcl_util.is_player(player) then return end local xp = mcl_experience.get_xp(player) local cache = caches[player] cache.level = xp_to_level(xp) if not minetest.is_creative_enabled(player:get_player_name()) then + if not hud_bars[player] then + init_hudbars(player) + end player:hud_change(hud_bars[player], "text", "mcl_experience_bar_background.png^[lowpart:" .. math.floor(math.floor(xp_to_bar(xp, cache.level) * 18) / 18 * 100) .. ":mcl_experience_bar.png^[transformR270" @@ -186,26 +211,7 @@ minetest.register_on_joinplayer(function(player) caches[player] = { last_time = get_time(), } - - if not minetest.is_creative_enabled(player:get_player_name()) then - hud_bars[player] = player:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 1}, - offset = {x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5)}, - scale = {x = 2.8, y = 3.0}, - alignment = {x = 1, y = 1}, - z_index = 11, - }) - - hud_levels[player] = player:hud_add({ - hud_elem_type = "text", - position = {x = 0.5, y = 1}, - number = 0x80FF20, - offset = {x = 0, y = -(48 + 24 + 24)}, - z_index = 12, - }) - end - + init_hudbars(player) mcl_experience.update(player) end) diff --git a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr index a87840aff..cc95a7f42 100644 --- a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr +++ b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr @@ -1,7 +1,8 @@ # textdomain: mcl_experience [[] ]=[[<игрок>] ] -Gives a player some XP=Даёт игроку XP +Gives a player some XP=Выдать игроку XP Error: Too many parameters!=Ошибка: слишком много параметров! Error: Incorrect value of XP=Ошибка: Недопустимое значение XP Error: Player not found=Ошибка: Игрок не найден -Added @1 XP to @2, total: @3, experience level: @4=Добавляем @1 XP игроку @2, итого: @3, уровень опыта: @4 +Added @1 XP to @2, total: @3, experience level: @4=Добавлено @1 XP игроку @2, итого: @3, уровень опыта: @4 +Bottle o' Enchanting=Пузырёк опыта \ No newline at end of file diff --git a/mods/HUD/mcl_experience/locale/template.txt b/mods/HUD/mcl_experience/locale/template.txt index a355cbbac..b2a4c04d2 100644 --- a/mods/HUD/mcl_experience/locale/template.txt +++ b/mods/HUD/mcl_experience/locale/template.txt @@ -5,3 +5,4 @@ Error: Too many parameters!= Error: Incorrect value of XP= Error: Player not found= Added @1 XP to @2, total: @3, experience level: @4= +Bottle o' Enchanting= diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.de.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.de.tr similarity index 100% rename from mods/HUD/mcl_hbarmor/locale/hbarmor.de.tr rename to mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.de.tr diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.es.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.es.tr similarity index 100% rename from mods/HUD/mcl_hbarmor/locale/hbarmor.es.tr rename to mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.es.tr diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.fr.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.fr.tr similarity index 100% rename from mods/HUD/mcl_hbarmor/locale/hbarmor.fr.tr rename to mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.fr.tr diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.it.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.it.tr similarity index 100% rename from mods/HUD/mcl_hbarmor/locale/hbarmor.it.tr rename to mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.it.tr diff --git a/mods/HUD/mcl_hbarmor/locale/hbarmor.ru.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.ru.tr similarity index 52% rename from mods/HUD/mcl_hbarmor/locale/hbarmor.ru.tr rename to mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.ru.tr index 0b938a594..7d082acc3 100644 --- a/mods/HUD/mcl_hbarmor/locale/hbarmor.ru.tr +++ b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.ru.tr @@ -1,2 +1,2 @@ # textdomain:hbarmor -Armor=Защита +Armor=Броня diff --git a/mods/HUD/mcl_info/init.lua b/mods/HUD/mcl_info/init.lua new file mode 100644 index 000000000..02af53fbc --- /dev/null +++ b/mods/HUD/mcl_info/init.lua @@ -0,0 +1,105 @@ +local refresh_interval = .63 +local huds = {} +local default_debug = 3 +local after = minetest.after +local get_connected_players = minetest.get_connected_players +local get_biome_name = minetest.get_biome_name +local get_biome_data = minetest.get_biome_data +local format = string.format + +local min1, min2, min3 = mcl_mapgen.overworld.min, mcl_mapgen.end_.min, mcl_mapgen.nether.min +local max1, max2, max3 = mcl_mapgen.overworld.max, mcl_mapgen.end_.max, mcl_mapgen.nether.max + 128 + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local S = minetest.get_translator(modname) +local storage = minetest.get_mod_storage() +local player_dbg = minetest.deserialize(storage:get_string("player_dbg") or "return {}") or {} + +local function get_text(pos, bits) + local bits = bits + if bits == 0 then return "" end + local y = pos.y + if y >= min1 then + y = y - min1 + elseif y >= min3 and y <= max3 then + y = y - min3 + elseif y >= min2 and y <= max2 then + y = y - min2 + end + local biome_data = get_biome_data(pos) + local biome_name = biome_data and get_biome_name(biome_data.biome) or "No biome" + local text + if bits == 1 then + text = biome_name + elseif bits == 2 then + text = format("x:%.1f y:%.1f z:%.1f", pos.x, y, pos.z) + elseif bits == 3 then + text = format("%s x:%.1f y:%.1f z:%.1f", biome_name, pos.x, y, pos.z) + end + return text +end + +local function info() + for _, player in pairs(get_connected_players()) do + local name = player:get_player_name() + local pos = player:get_pos() + local text = get_text(pos, player_dbg[name] or default_debug) + local hud = huds[name] + if not hud then + local def = { + hud_elem_type = "text", + alignment = {x = 1, y = -1}, + scale = {x = 100, y = 100}, + position = {x = 0.0073, y = 0.989}, + text = text, + style = 5, + ["number"] = 0xcccac0, + z_index = 0, + } + local def_bg = table.copy(def) + def_bg.offset = {x = 2, y = 1} + def_bg["number"] = 0 + def_bg.z_index = -1 + huds[name] = { + player:hud_add(def), + player:hud_add(def_bg), + text, + } + elseif text ~= hud[3] then + hud[3] = text + player:hud_change(huds[name][1], "text", text) + player:hud_change(huds[name][2], "text", text) + end + end + after(refresh_interval, info) +end + +minetest.register_on_authplayer(function(name, ip, is_success) + if is_success then + huds[name] = nil + end +end) + +minetest.register_chatcommand("debug",{ + description = S("Set debug bit mask: 0 = disable, 1 = biome name, 2 = coordinates, 3 = all"), + func = function(name, params) + local dbg = math.floor(tonumber(params) or default_debug) + if dbg < 0 or dbg > 3 then + minetest.chat_send_player(name, S("Error! Possible values are integer numbers from @1 to @2", 0, 3)) + return + end + if dbg == default_dbg then + player_dbg[name] = nil + else + player_dbg[name] = dbg + end + minetest.chat_send_player(name, S("Debug bit mask set to @1", dbg)) + end +}) + +minetest.register_on_shutdown(function() + storage:set_string("player_dbg", minetest.serialize(player_dbg)) +end) + +info() diff --git a/mods/HUD/mcl_info/locale/mcl_info.ru.tr b/mods/HUD/mcl_info/locale/mcl_info.ru.tr new file mode 100644 index 000000000..7f5b79fe1 --- /dev/null +++ b/mods/HUD/mcl_info/locale/mcl_info.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_info +Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all=Установка отладочной битовой маски: 0 @= отключить, 1 @= биом, 2 @= координаты, 3 @= всё +Error! Possible values are integer numbers from @1 to @2=Ошибка! Допустимые значения - целые числа от @1 до @2 +Debug bit mask set to @1=Отладочной битовой маске присвоено значение @1 diff --git a/mods/HUD/mcl_info/locale/template.txt b/mods/HUD/mcl_info/locale/template.txt new file mode 100644 index 000000000..1a0b70ebc --- /dev/null +++ b/mods/HUD/mcl_info/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_info +Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all= +Error! Possible values are integer numbers from @1 to @2= +Debug bit mask set to @1= diff --git a/mods/HUD/mcl_info/mod.conf b/mods/HUD/mcl_info/mod.conf new file mode 100644 index 000000000..da3e10fff --- /dev/null +++ b/mods/HUD/mcl_info/mod.conf @@ -0,0 +1,3 @@ +name = mcl_info +description = Prints biome name and player position +optional_depends = mcl_mapgen diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index f5a9574eb..f2bd8076a 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -117,7 +117,7 @@ local function filter_item(name, description, lang, filter) else desc = string.lower(minetest.get_translated_string(lang, description)) end - return string.find(name, filter) or string.find(desc, filter) + return string.find(name, filter, nil, true) or string.find(desc, filter, nil, true) end local function set_inv_search(filter, player) @@ -362,6 +362,10 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, if inv:get_stack("armor", 5):is_empty() then armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" end + + if inv:get_stack("offhand", 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[1.5,2.025;1,1;mcl_inventory_empty_armor_slot_shield.png]" + end local stack_size = get_stack_size(player) @@ -377,9 +381,13 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. mcl_formspec.get_itemslot_bg(5.5,2.75,1,1).. + "list[current_player;offhand;1.5,2.025;1,1]".. + mcl_formspec.get_itemslot_bg(1.5,2.025,1,1).. + armor_slot_imgs.. -- player preview player_preview.. + -- crafting guide button "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index c197bfdd9..0a8b9a7bc 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -8,7 +8,7 @@ mcl_inventory = {} -- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left function return_item(itemstack, dropper, pos, inv) - if dropper:is_player() then + if mcl_util and mcl_util.is_player(dropper) then -- Return to main inventory if inv:room_for_item("main", itemstack) then inv:add_item("main", itemstack) @@ -47,6 +47,7 @@ function return_fields(player, name) end local function set_inventory(player, armor_change_only) + if not mcl_util or not mcl_util.is_player(player) then return end if minetest.is_creative_enabled(player:get_player_name()) then if armor_change_only then -- Stay on survival inventory plage if only the armor has been changed @@ -76,6 +77,10 @@ local function set_inventory(player, armor_change_only) end end + if inv:get_stack("offhand", 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[3,2;1,1;mcl_inventory_empty_armor_slot_shield.png]" + end + local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]".. player_preview.. @@ -88,6 +93,8 @@ local function set_inventory(player, armor_change_only) mcl_formspec.get_itemslot_bg(0,1,1,1).. mcl_formspec.get_itemslot_bg(0,2,1,1).. mcl_formspec.get_itemslot_bg(0,3,1,1).. + "list[current_player;offhand;3,2;1,1]".. + mcl_formspec.get_itemslot_bg(3,2,1,1).. armor_slot_imgs.. -- craft and inventory "label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. @@ -112,6 +119,7 @@ local function set_inventory(player, armor_change_only) -- achievements button "image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. + -- for shortcuts "listring[current_player;main]".. "listring[current_player;armor]".. @@ -123,6 +131,7 @@ end -- Drop items in craft grid and reset inventory on closing minetest.register_on_player_receive_fields(function(player, formname, fields) + if not mcl_util or not mcl_util.is_player(player) then return end if fields.quit then return_fields(player,"craft") return_fields(player,"enchanting_lapis") @@ -135,6 +144,7 @@ end) if not minetest.is_creative_enabled("") then function mcl_inventory.update_inventory_formspec(player) + if not mcl_util or not mcl_util.is_player(player) then return end set_inventory(player) end end @@ -148,8 +158,11 @@ end) minetest.register_on_joinplayer(function(player) --init inventory - player:get_inventory():set_width("main", 9) - player:get_inventory():set_size("main", 36) + local inv = player:get_inventory() + inv:set_width("main", 9) + inv:set_size("main", 36) + inv:set_size("offhand", 1) + --set hotbar size player:hud_set_hotbar_itemcount(9) @@ -177,7 +190,5 @@ minetest.register_on_joinplayer(function(player) return_fields(player, "enchanting_lapis") end) -if minetest.is_creative_enabled("") then - dofile(minetest.get_modpath(minetest.get_current_modname()).."/creative.lua") -end +dofile(minetest.get_modpath(minetest.get_current_modname()).."/creative.lua") diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr index d378e168b..6d7ec458f 100644 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr @@ -3,19 +3,20 @@ Recipe book=Книга рецептов Help=Помощь Select player skin=Выбор скина Achievements=Достижения +Switch stack size=Изменить размер стопки Building Blocks=Строительные блоки Decoration Blocks=Декоративные блоки -Redstone=Редстоун (красный камень) +Redstone=Редстоун Transportation=Транспорт -Brewing=Зелья -Miscellaneous=Прочее -Search Items=Искать предметы -Foodstuffs=Продовольствие +Brewing=Зельеварение +Miscellaneous=Разное +Search Items=Поиск предметов +Foodstuffs=Пища Tools=Инструменты -Combat=Битва +Combat=Оружие и доспехи Mobs=Мобы Materials=Материалы Survival Inventory=Инвентарь выживания -Crafting=Крафтинг (изготовление) +Crafting=Крафтинг Inventory=Инвентарь @1/@2=@1/@2 diff --git a/mods/HUD/mcl_inventory/locale/template.txt b/mods/HUD/mcl_inventory/locale/template.txt index 7f1c9769d..e5ba11e40 100644 --- a/mods/HUD/mcl_inventory/locale/template.txt +++ b/mods/HUD/mcl_inventory/locale/template.txt @@ -3,6 +3,7 @@ Recipe book= Help= Select player skin= Achievements= +Switch stack size= Building Blocks= Decoration Blocks= Redstone= diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index 10e669265..1a23698b0 100644 --- a/mods/HUD/mcl_inventory/mod.conf +++ b/mods/HUD/mcl_inventory/mod.conf @@ -1,5 +1,5 @@ name = mcl_inventory author = BlockMen description = Adds the player inventory and creative inventory. -depends = mcl_init, mcl_formspec, mcl_enchanting +depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_commands optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player diff --git a/mods/HUD/mcl_offhand/init.lua b/mods/HUD/mcl_offhand/init.lua new file mode 100644 index 000000000..af495b886 --- /dev/null +++ b/mods/HUD/mcl_offhand/init.lua @@ -0,0 +1,171 @@ +local minetest, math = minetest, math +mcl_offhand = {} + +local max_offhand_px = 128 +-- only supports up to 128px textures + +function mcl_offhand.get_offhand(player) + return player:get_inventory():get_stack("offhand", 1) +end + +local function offhand_get_wear(player) + return mcl_offhand.get_offhand(player):get_wear() +end + +local function offhand_get_count(player) + return mcl_offhand.get_offhand(player):get_count() +end + +minetest.register_on_joinplayer(function(player, last_login) + mcl_offhand[player] = { + hud = {}, + last_wear = offhand_get_wear(player), + last_count = offhand_get_count(player), + } +end) + +local function remove_hud(player, hud) + local offhand_hud = mcl_offhand[player].hud[hud] + if offhand_hud then + player:hud_remove(offhand_hud) + mcl_offhand[player].hud[hud] = nil + end +end + +function rgb_to_hex(r, g, b) + return string.format("%02x%02x%02x", r, g, b) +end + +local function update_wear_bar(player, itemstack) + local wear_bar_percent = (65535 - offhand_get_wear(player)) / 65535 + + local color = {255, 255, 255} + local wear = itemstack:get_wear() / 65535; + local wear_i = math.min(math.floor(wear * 600), 511); + wear_i = math.min(wear_i + 10, 511); + if wear_i <= 255 then + color = {wear_i, 255, 0} + else + color = {255, 511 - wear_i, 0} + end + local wear_bar = mcl_offhand[player].hud.wear_bar + player:hud_change(wear_bar, "text", "mcl_wear_bar.png^[colorize:#" .. rgb_to_hex(color[1], color[2], color[3])) + player:hud_change(wear_bar, "scale", {x = 40 * wear_bar_percent, y = 3}) + player:hud_change(wear_bar, "offset", {x = -320 - (20 - player:hud_get(wear_bar).scale.x / 2), y = -13}) +end + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do if mcl_util and mcl_util.is_player(player:get_player_name()) then + local itemstack = mcl_offhand.get_offhand(player) + local offhand_item = itemstack:get_name() + local offhand_hud = mcl_offhand[player].hud + if offhand_item ~= "" then + local item_texture = minetest.registered_items[offhand_item].inventory_image .. "^[resize:" .. max_offhand_px .. "x" .. max_offhand_px + local position = {x = 0.5, y = 1} + local offset = {x = -320, y = -32} + + if not offhand_hud.slot then + offhand_hud.slot = player:hud_add({ + hud_elem_type = "image", + position = position, + offset = offset, + scale = {x = 2.75, y = 2.75}, + text = "mcl_offhand_slot.png", + z_index = 0, + }) + end + if not offhand_hud.item then + offhand_hud.item = player:hud_add({ + hud_elem_type = "image", + position = position, + offset = offset, + scale = {x = 0.4, y = 0.4}, + text = item_texture, + z_index = 1, + }) + else + player:hud_change(offhand_hud.item, "text", item_texture) + end + if not offhand_hud.wear_bar_bg and minetest.registered_tools[offhand_item] then + if offhand_get_wear(player) > 0 then + local texture = "mcl_wear_bar.png^[colorize:#000000" + offhand_hud.wear_bar_bg = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 1}, + offset = {x = -320, y = -13}, + scale = {x = 40, y = 3}, + text = texture, + z_index = 2, + }) + offhand_hud.wear_bar = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 1}, + offset = {x = -320, y = -13}, + scale = {x = 10, y = 3}, + text = texture, + z_index = 3, + }) + update_wear_bar(player, itemstack) + end + end + + if not offhand_hud.item_count and offhand_get_count(player) > 1 then + offhand_hud.item_count = player:hud_add({ + hud_elem_type = "text", + position = {x = 0.5, y = 1}, + offset = {x = -298, y = -18}, + scale = {x = 1, y = 1}, + alignment = {x = -1, y = 0}, + text = offhand_get_count(player), + z_index = 4, + number = 0xFFFFFF, + }) + end + + if offhand_hud.wear_bar then + if offhand_hud.last_wear ~= offhand_get_wear(player) then + update_wear_bar(player, itemstack) + offhand_hud.last_wear = offhand_get_wear(player) + end + if offhand_get_wear(player) <= 0 or not minetest.registered_tools[offhand_item] then + remove_hud(player, "wear_bar_bg") + remove_hud(player, "wear_bar") + end + end + + if offhand_hud.item_count then + if offhand_hud.last_count ~= offhand_get_count(player) then + player:hud_change(offhand_hud.item_count, "text", offhand_get_count(player)) + offhand_hud.last_count = offhand_get_count(player) + end + if offhand_get_count(player) <= 1 then + remove_hud(player, "item_count") + end + end + + elseif offhand_hud.slot then + for index, _ in pairs(mcl_offhand[player].hud) do + remove_hud(player, index) + end + end + end end +end) + +minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + if action == "move" and inventory_info.to_list == "offhand" then + local itemstack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + if not (minetest.get_item_group(itemstack:get_name(), "offhand_item") > 0) then + return 0 + else + return itemstack:get_stack_max() + end + end +end) + +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + local from_offhand = inventory_info.from_list == "offhand" + local to_offhand = inventory_info.to_list == "offhand" + if action == "move" and from_offhand or to_offhand then + mcl_inventory.update_inventory_formspec(player) + end +end) diff --git a/mods/HUD/mcl_offhand/mod.conf b/mods/HUD/mcl_offhand/mod.conf new file mode 100644 index 000000000..f0260f35c --- /dev/null +++ b/mods/HUD/mcl_offhand/mod.conf @@ -0,0 +1,3 @@ +name = mcl_offhand +author = NO11 +depends = mcl_inventory diff --git a/mods/HUD/mcl_offhand/textures/mcl_offhand_slot.png b/mods/HUD/mcl_offhand/textures/mcl_offhand_slot.png new file mode 100644 index 000000000..69ceb5973 Binary files /dev/null and b/mods/HUD/mcl_offhand/textures/mcl_offhand_slot.png differ diff --git a/mods/HUD/mcl_offhand/textures/mcl_wear_bar.png b/mods/HUD/mcl_offhand/textures/mcl_wear_bar.png new file mode 100644 index 000000000..6fee6bba6 Binary files /dev/null and b/mods/HUD/mcl_offhand/textures/mcl_wear_bar.png differ diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 2ea1571c8..905707be4 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -157,13 +157,14 @@ function mcl_title.set(player, type, data) end function mcl_title.remove(player, type) - if player then + if player and mcl_util and mcl_util.is_player(player) then player:hud_change(huds_idx[type][player], "text", "") --player:hud_change(huds_idx[type][player], "style", 0) --no styling end end function mcl_title.clear(player) + if not mcl_util or not mcl_util.is_player(player) then return end mcl_title.remove(player, "title") mcl_title.remove(player, "subtitle") mcl_title.remove(player, "actionbar") diff --git a/mods/ITEMS/REDSTONE/mcl_bells/README.md b/mods/ITEMS/REDSTONE/mcl_bells/README.md new file mode 100644 index 000000000..9f0b1d118 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_bells/README.md @@ -0,0 +1,4 @@ + * sounds/bell_stroke.ogg + * created by edsward + * modified by sorcerykid + * obtained from https://freesound.org/people/edsward/sounds/341866/ diff --git a/mods/ITEMS/REDSTONE/mcl_bells/init.lua b/mods/ITEMS/REDSTONE/mcl_bells/init.lua new file mode 100644 index 000000000..9a69e4353 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_bells/init.lua @@ -0,0 +1,24 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +mcl_bells = {} + +local has_mcl_wip = minetest.get_modpath("mcl_wip") + +minetest.register_node("mcl_bells:bell", { + description = S("Bell"), + inventory_image = "bell.png", + drawtype = "plantlike", + tiles = {"bell.png"}, + stack_max = 64, + selection_box = { + type = "fixed", + fixed = { + -4/16, -6/16, -4/16, + 4/16, 7/16, 4/16, + }, + }, +}) + +if has_mcl_wip then + mcl_wip.register_wip_item("mcl_bells:bell") +end diff --git a/mods/ITEMS/REDSTONE/mcl_bells/locale/template.txt b/mods/ITEMS/REDSTONE/mcl_bells/locale/template.txt new file mode 100644 index 000000000..2f554c2a0 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_bells/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: mcl_observers +Bell= diff --git a/mods/ITEMS/REDSTONE/mcl_bells/mod.conf b/mods/ITEMS/REDSTONE/mcl_bells/mod.conf new file mode 100644 index 000000000..1685462fc --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_bells/mod.conf @@ -0,0 +1,3 @@ +name = mcl_bells +depends = mesecons +optional_depends = mcl_wip diff --git a/mods/ITEMS/REDSTONE/mcl_bells/sounds/bell_stroke.ogg b/mods/ITEMS/REDSTONE/mcl_bells/sounds/bell_stroke.ogg new file mode 100755 index 000000000..023d1f946 Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_bells/sounds/bell_stroke.ogg differ diff --git a/mods/ITEMS/REDSTONE/mcl_bells/textures/bell.png b/mods/ITEMS/REDSTONE/mcl_bells/textures/bell.png new file mode 100644 index 000000000..34140288c Binary files /dev/null and b/mods/ITEMS/REDSTONE/mcl_bells/textures/bell.png differ diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index 3517e09cb..b596f26ff 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -43,7 +43,9 @@ end local function comparator_activate(pos, node) local def = minetest.registered_nodes[node.name] - minetest.swap_node(pos, { name = def.comparator_onstate, param2 = node.param2 }) + local on_state = def.comparator_onstate + if not on_state then return end + minetest.swap_node(pos, { name = on_state, param2 = node.param2 }) minetest.after(0.1, comparator_turnon , {pos = pos, node = node}) end diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr index 39a845d6e..352526ed6 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr @@ -1,12 +1,12 @@ # textdomain: mcl_comparators -Redstone comparators are multi-purpose redstone components.=Компаратор это многофункциональный элемент редстоуна. -They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Он может передавать сигнал редстоуна, определять, содержит ли блок какой-либо предмет, и сравнивать сигналы. +Redstone comparators are multi-purpose redstone components.=Компаратор это многофункциональный компонент редстоуна. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Он может передавать сигнал редстоуна, определять, хранит ли блок предмет, и сравнивать сигналы. A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.=Компаратор имеет 1 основной вход, 2 боковых входа и 1 выход. Выход расположен по направлению стрелки, основной вход в противоположном направлении. Оставшиеся 2 стороны это боковые входы. -The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=Основной вход можно подключать 2 способами: 1) напрямую к энергии редстоуна, как и любой другой компонент; 2) перед компаратором можно установить контейнер (например, сундук), тогда сигнал будет поступать, если в нём содержится хотя бы один предмет. -The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=К боковым входам можно подводить только обычную энергию редстоуна. Компаратор может работать в двух режимах: ПЕРЕДАЧА и ВЫЧИТАНИЕ. Он изначально находится в режиме передачи; режим меняется при [Использовании] данного блока. -Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Режим ПЕРЕДАЧИ:@nПередний индикатор погашен. На выходе появляется энергия редстоуна, только если она подаётся на основной вход. Состояние боковых входов при этом игнорируются. +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=Основной вход можно подключать 2 способами: 1) напрямую от сигнала редстоуна, как и любой другой компонент; 2) перед компаратором можно установить контейнер (например, сундук), тогда сигнал будет поступать, если в нём содержится хотя бы один предмет. +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=К боковым входам можно подводить только сигнал редстоуна. Компаратор может работать в двух режимах: передача и вычитание. Он изначально находится в режиме передачи; режим меняется при использовании данного блока. +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Режим передачи:@nПередний индикатор погашен. На выходе появляется сигнал редстоуна, только если он подаётся на основной вход. Состояние боковых входов при этом игнорируются. Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.=Режим ВЫЧИТАНИЯ:@nПередний индикатор светится. На выходе есть сигнал только в том случае, если сигнал есть на основной входе, но при этом его нет ни на одном из боковых входов. Redstone Comparator=Компаратор -Redstone Comparator (Subtract)=Компаратор (ВЫЧИТАНИЕ) -Redstone Comparator (Powered)=Компаратор (ВКЛЮЧЁН) -Redstone Comparator (Subtract, Powered)=Компаратор (ВЫЧИТАНИЕ, ВКЛЮЧЁН) +Redstone Comparator (Subtract)=Компаратор (вычитание) +Redstone Comparator (Powered)=Компаратор (подключён) +Redstone Comparator (Subtract, Powered)=Компаратор (вычитание, подключён) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 0cd0608c4..705466a38 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -260,9 +260,22 @@ local dispenserdef = { end else -- Drop item otherwise - minetest.add_item(droppos, dropitem) - stack:take_item() - inv:set_stack("main", stack_id, stack) + -- Drop item normally + local dropitemobj = minetest.add_item(droppos, dropitem) + stack:take_item() + inv:set_stack("main", stack_id, stack) + + -- Set item velocity (overrides the default random drop direction) + local shoot_force = 1.3 + + local newv = minetest.facedir_to_dir(node.param2) + newv = { + x = newv.x * shoot_force, + y = newv.y * shoot_force, + z = newv.z * shoot_force + } + + dropitemobj:set_velocity(newv) end end diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr index af4d856ec..4a4d5b4fa 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr @@ -1,25 +1,25 @@ # textdomain: mcl_dispensers -Dispenser=Диспенсер -A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Диспенсер это элемент редстоуна, который при подаче энергии редстоуна выбрасывает предмет. В нём есть контейнер из 9 отсеков инвентаря. -Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Направьте диспенсер в одном из 6 возможных направлений. Предметы будут вылетать из отверстия. [Используйте] диспенсер для доступа к его инвентарю. Загрузите туда предметы, которые должны из него выбрасываться. Подайте однократно на диспенсер энергию редстоуна, чтобы выпал случайный предмет. -The dispenser will do different things, depending on the dispensed item:=Диспенсер будет делать разные вещи, в зависимости от выдаваемых предметов: +Dispenser=Раздатчик +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Раздатчик это компонент редстоуна, который при подаче сигнала редстоуна выбрасывает предмет. В нём есть контейнер из 9 слотов инвентаря. +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Направьте раздатчик в одном из 6 возможных направлений. Предметы будут вылетать из отверстия. Используйте раздатчик для доступа к его инвентарю. Загрузите туда предметы, которые должны из него выбрасываться. Подайте однократно на раздатчик сигнал редстоуна, чтобы он раздал случайный предмет. +The dispenser will do different things, depending on the dispensed item:=Раздатчик будет делать разные вещи, в зависимости от выдаваемых предметов: • Arrows: Are launched=• Стрелы: выстреливают -• Eggs and snowballs: Are thrown=• Яйца и снежки: происходит бросок +• Eggs and snowballs: Are thrown=• Яйца и снежки: бросаются • Fire charges: Are fired in a straight line=• Огненные шары: стреляют по прямой линии -• Armor: Will be equipped to players and armor stands=• Защита: экипирует игроков или стенд защиты +• Armor: Will be equipped to players and armor stands=• Броня: экипирует игроков или стойку для брони • Boats: Are placed on water or are dropped=• Лодки: спускаются на воду -• Minecart: Are placed on rails or are dropped=• Вагонетка: помещается на рельсы -• Bone meal: Is applied on the block it is facing=• Костная мука: применяется к блоку перед диспенсером +• Minecart: Are placed on rails or are dropped=• Вагонетки: помещаются на рельсы +• Bone meal: Is applied on the block it is facing=• Костная мука: применяется к блоку перед раздатчиком • Empty buckets: Are used to collect a liquid source=• Пустые вёдра: используются для набора источника жидкости • Filled buckets: Are used to place a liquid source=• Полные вёдра: используются для размещения источника жидкости -• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Головы, тыквы: экипирует игроков, или стенд защиты, или устанавливаются как блоки +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Головы, тыквы: экипирует игроков, стойку для брони, или устанавливаются как блоки • Shulker boxes: Are placed as a block=• Ящик шалкера: устанавливается как блок -• TNT: Is placed and ignited=• Тротил: устанавливается и поджигается -• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Огниво: используется для зажигания огня в воздухе и для подрыва тротила -• Spawn eggs: Will summon the mob they contain=• Порождающие яйца: будут вызывать мобов, содержащихся в них -• Other items: Are simply dropped=• Другие предметы: просто выдаются -Downwards-Facing Dispenser=• Диспенсер, направленный вниз -Upwards-Facing Dispenser=• Диспенсер, направленный вверх +• TNT: Is placed and ignited=• ТНТ: устанавливается и поджигается +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Огниво: используется для зажигания огня в воздухе и для подрыва ТНТ +• Spawn eggs: Will summon the mob they contain=• Яйца спавна: будут вызывать мобов, содержащихся в них +• Other items: Are simply dropped=• Другие предметы: просто выбрасываются +Downwards-Facing Dispenser=• Раздатчик, направленный вниз +Upwards-Facing Dispenser=• Раздатчик, направленный вверх Inventory=Инвентарь -9 inventory slots=9 отсеков инвентаря -Launches item when powered by redstone power=Выбрасывает предметы при подаче энергии редстоуна +9 inventory slots=9 слотов инвентаря +Launches item when powered by redstone power=Выдаёт предметы при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index abb351091..c707bf42e 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -134,9 +134,21 @@ local dropperdef = { -- No container? if not dropped and not dropnodedef.groups.container then -- Drop item normally - minetest.add_item(droppos, dropitem) + local dropitemobj = minetest.add_item(droppos, dropitem) stack:take_item() inv:set_stack("main", stack_id, stack) + + -- Set item velocity (overrides the default random drop direction) + local shoot_force = 1.3 + + local newv = minetest.facedir_to_dir(node.param2) + newv = { + x = -newv.x * shoot_force, + y = -newv.y * shoot_force, + z = -newv.z * shoot_force + } + + dropitemobj:set_velocity(newv) end end end, diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr index 22358678a..c4520caf2 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr @@ -1,9 +1,9 @@ # textdomain: mcl_droppers Dropper=Выбрасыватель -A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Выбрасыватель это элемент редстоуна и контейнер с 9 отсеками инвентаря, срабатывающий по сигналу редстоуна и выбрасывающий предмет, либо выталкивающий его в контейнер, стоящий перед ним. -Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Выбрасыватель может быть установлен в 6 возможных направлениях, предметы будут выбрасываться в соответствующем направлении из отверстия. [Используйте] выбрасыватель для доступа к его инвентарю. Подайте на него энергию редстоуна однократно, чтобы заставить его выбросить либо предать один случайный предмет. +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Выбрасыватель это компонент редстоуна и контейнер с 9 слотами инвентаря, срабатывающий по сигналу редстоуна и выбрасывающий предмет, либо выталкивающий его в контейнер, стоящий перед ним. +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Выбрасыватель может быть установлен в 6 возможных направлениях, предметы будут выбрасываться в соответствующем направлении из отверстия. Используйте выбрасыватель для доступа к его инвентарю. Подайте на него сигнал редстоуна однократно, чтобы заставить его выбросить либо передать один случайный предмет. Downwards-Facing Dropper=Выбрасыватель, смотрящий вниз Upwards-Facing Dropper=Выбрасыватель, смотрящий вверх Inventory=Инвентарь -9 inventory slots=9 отсеков инвентаря -Drops item when powered by redstone power=Выбрасывает предмет при подаче энергии редстоуна +9 inventory slots=9 слотов инвентаря +Drops item when powered by redstone power=Выбрасывает предмет при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr index ac8c658c3..1ae2dd10e 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_observers Observer=Наблюдатель -An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Наблюдатель это элемент редстоуна, который следит за блоком перед собой и посылает короткий импульс редстоуна, если этот блок меняется. -Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Поместите наблюдателя прямо перед блоком, за которым хотите наблюдать, так, чтобы “лицо” смотрело на этот блок. Стрелка показывает выходную сторону, находящуюся на противоположной стороне от “лица”. Вы можете разместить там пыль редстоуна или любой другой компонент. -Emits redstone pulse when block in front changes=Генерирует импульс редстоуна при смене блока, находящегося перед ним +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Наблюдатель это компонент редстоуна, который следит за блоком перед собой и посылает короткий сигнал редстоуна, если этот блок меняется. +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Поместите наблюдателя прямо перед блоком, за которым хотите наблюдать, так, чтобы “лицо” смотрело на этот блок. Стрелка показывает выход, находящийся на противоположной стороне от “лица”. Вы можете разместить там редстоун или любой другой компонент. +Emits redstone pulse when block in front changes=Генерирует сигнал редстоуна при изменении блока, находящегося перед ним diff --git a/mods/ITEMS/REDSTONE/mesecons/util.lua b/mods/ITEMS/REDSTONE/mesecons/util.lua index b6602526a..498c446cb 100644 --- a/mods/ITEMS/REDSTONE/mesecons/util.lua +++ b/mods/ITEMS/REDSTONE/mesecons/util.lua @@ -346,8 +346,16 @@ function mesecon.vm_abort() vm_cache = nil end +local function is_player_close(pos) + for k,p in pairs(minetest.get_connected_players()) do + local d=vector.distance(pos,p:get_pos()) + if d < 40 then return true end + end +end + -- Gets the cache entry covering a position, populating it if necessary. local function vm_get_or_create_entry(pos) + if not is_player_close(pos) then return end local hash = hash_blockpos(pos) local tbl = vm_cache[hash] if not tbl then @@ -364,6 +372,7 @@ end -- transaction. function mesecon.vm_get_node(pos) local tbl = vm_get_or_create_entry(pos) + if not tbl then return end local index = tbl.va:indexp(pos) local node_value = tbl.data[index] if node_value == minetest.CONTENT_IGNORE then @@ -380,6 +389,7 @@ end -- Existing param1, param2, and metadata are left alone. function mesecon.vm_swap_node(pos, name) local tbl = vm_get_or_create_entry(pos) + if not tbl then return end local index = tbl.va:indexp(pos) tbl.data[index] = minetest.get_content_id(name) tbl.dirty = true @@ -393,6 +403,7 @@ end -- -- Inside a VM transaction, the transaction’s VM cache is used. function mesecon.get_node_force(pos) + if not is_player_close(pos) then return end if vm_cache then return mesecon.vm_get_node(pos) else @@ -424,6 +435,7 @@ function mesecon.swap_node_force(pos, name) -- This serves to both ensure the mapblock is loaded and also hand us -- the old node table so we can preserve param2. local node = mesecon.get_node_force(pos) + if not node then return end node.name = name minetest.swap_node(pos, node) end diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr index a89c8098a..df651acda 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr @@ -1,14 +1,14 @@ # textdomain: mesecons_button -Use the button to push it.=[Используйте] кнопку, чтобы нажать её. +Use the button to push it.=Используйте кнопку, чтобы нажать её. Stone Button=Каменная кнопка -A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Каменная кнопка это элемент редстоуна, сделанный из камня, её можно нажать, чтобы получить энергию редстоуна. При нажатии она включает соседние элементы редстоуна на 1 секунду. +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Каменная кнопка это компонент редстоуна, сделанный из камня, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на 1 секунду. Oak Button=Дубовая кнопка Acacia Button=Акациевая кнопка Birch Button=Берёзовая кнопка Dark Oak Button=Кнопка из тёмного дуба Spruce Button=Еловая кнопка -Jungle Button=Кнопка из дерева джунглей -A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Деревянная кнопка это элемент редстоуна, сделанный из дерева, её можно нажать, чтобы получить энергию редстоуна. При нажатии она включает соседние элементы редстоуна на полторы секунды. Деревянные кнопки можно также активировать стрелами. -Provides redstone power when pushed=Выдаёт энергию редстоуна при нажатии +Jungle Button=Кнопка из тропического дерева +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Деревянная кнопка это компонент редстоуна, сделанный из дерева, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на 1.5 секунды. Деревянные кнопки нажимаются от попадания стрелы. +Provides redstone power when pushed=Выдаёт сигнал редстоуна при нажатии Push duration: @1s=Длительность нажатия: @1с Pushable by arrow=Нажимается стрелами diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr index 85bed4b95..bbd0a262e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr @@ -1,30 +1,30 @@ # textdomain: mesecons_commandblock -Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для поучения списка доступных команд. -Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для поучения списка доступных команд. Подсказка: Попробуйте убрать ведущий слэш. +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для получения списка доступных команд. +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для получения списка доступных команд. Подсказка: Попробуйте убрать ведущий слэш. Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Ошибка: Вы не имеете привилегий для использования команды “@1” (отсутствует привилегия: @2)! Командный блок не был изменён. Error: No commander! Block must be replaced.=Ошибка: Нет командующего! Блок следует заменить. Commander: @1=Командующий: @1 -Submit=Отправить +Submit=Принять No commands.=Нет команд. Commands:=Команды: Help=Помощь Placement denied. You need the “maphack” privilege to place command blocks.=Установка запрещена. Для установки командных блоков нужно иметь привилегию “maphack”. Command Block=Командный блок -Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Командные блоки это мощнейшие компоненты редстоуна, способные изменять реальность сами по себе. Другими словами, они могут заставлять сервер выполнять серверные команды, если подать на них энергию редстоуна. -Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Каждый может активировать командный блок и увидеть его команды, но не все могут редактировать и устанавливать его. -To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Чтобы увидеть команды в командном блоке, [используйте] его. Чтобы активировать блок, просто подайте на него энергию редстоуна. При этом команды выполнятся однократно. Чтобы выполнить их вновь, выключите и снова включите энергию редстоуна. -To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced usage > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Чтобы иметь возможность устанавливать командные блоки и изменять их команды, вы должны находиться в творческом режиме и иметь привилегию “maphack”. Новый командный блок не содержит команд и ничего не делает. [Используйте] командный блок (в творческом режиме!) для редактирования его команд. Изучите справочную запись “Продвинутое использование > Серверные команды”, чтобы понять, как они работают. Каждая строка содержит одну команду. Вы вводите их так, как вводили бы в консоли, но без ведущих символов слэш. Команды выполняются сверху вниз. +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Командные блоки это мощнейшие компоненты редстоуна, способные изменять саму реальность. Другими словами, они могут заставлять сервер выполнять серверные команды, если подать на них сигнал редстоуна. +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Каждый может активировать командный блок и увидеть его команды, но не все могут ставить и редактировать его. +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Чтобы просмотреть команды в командном блоке, используйте его. Чтобы активировать блок, просто подайте на него сигнал редстоуна. При этом команды выполнятся однократно. Чтобы выполнить их вновь, выключите и снова включите сигнал редстоуна. +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced usage > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Чтобы иметь возможность устанавливать командные блоки и изменять их команды, вы должны находиться в творческом режиме и иметь привилегию “maphack”. Новый командный блок не содержит команд и ничего не делает. Используйте командный блок (в творческом режиме!) для редактирования его команд. Изучите справочную запись “Продвинутое использование > Серверные команды”, чтобы понять, как они работают. Каждая строка содержит одну команду. Вы вводите их так, как вводили бы в консоли, но без ведущих символов слэш. Команды выполняются сверху вниз. All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Все команды будут выполняться от имени игрока, разместившего командный блок, как будто если бы игрок сам их набирал. Этот игрок является так называемым “командиром” блока. -Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Командные блоки поддерживаю шаблоны, вставляйте один из них - и они будут заменены на нужный вам текст: +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Командные блоки поддерживают шаблоны, вставляйте один из них - и они будут заменены на нужный вам текст: • “@@c”: commander of this command block=• “@@c”: командир данного командного блока • “@@n” or “@@p”: nearest player from the command block=• “@@n” или “@@p”: игрок, находящийся ближе всего к данному командному блоку • “@@f” farthest player from the command block=• “@@f” игрок, находящийся дальше всего от данного командного блока • “@@r”: random player currently in the world=• “@@r”: случайный игрок, в данный момент присутствующий в мире • “@@@@”: literal “@@” sign=• “@@@@”: если нужно использовать символ “@@” сам по себе -Example 1:@n time 12000@nSets the game clock to 12:00=Пример 1:@n time 12000@nУстанавливает игровые часы на 12:00 +Example 1:@n time 12000@nSets the game clock to 12:00=Пример 1:@n time 12000@nУстанавливает игровое время на 12:00 Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples=Пример 2:@n give @@n mcl_core:apple 5@nДаёт ближайшему игроку 5 яблок Access denied. You need the “maphack” privilege to edit command blocks.=Доступ запрещён. Вам нужно иметь привилегию “maphack”, чтобы редактировать командные блоки. -Editing the command block has failed! You can only change the command block in Creative Mode!=Попытка редактирования командного блока потерпела неудачу. Вы можете изменять командные блоки только в творческом режиме! -Editing the command block has failed! The command block is gone.=Попытка редактирования командного блока потерпела неудачу. Командный блок исчез. -Executes server commands when powered by redstone power=При подаче энергии редстоуна выполняет серверные команды -Command blocks are not enabled on this server= +Editing the command block has failed! You can only change the command block in Creative Mode!=Попытка редактирования командного блока неудалась. Вы можете изменять командные блоки только в творческом режиме! +Editing the command block has failed! The command block is gone.=Попытка редактирования командного блока неудалась. Командный блок исчез. +Executes server commands when powered by redstone power=При подаче сигнала редстоуна выполняет серверные команды +Command blocks are not enabled on this server=Командные блоки отключены на этом сервере diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr index f95d3ee8e..bc23ed33a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr @@ -1,11 +1,11 @@ # textdomain: mesecons_delayer Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.=Повторители это универсальные компоненты, выполняющие много задач: 1. Разрешают сигналам проходить только в одном направлении. 2. Задерживают сигнал. 3. Опционально они могут зафиксировать свой выходной сигнал в одном состоянии. -To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Чтобы подключить повторитель, подайте сигнал в направлении “стрелки” (на вход). Сигнал выйдет с противоположной стороны (с выхода) с задержкой. Чтобы изменить задержку, [используйте] повторитель. Время задержки лежит между 0.1 и 0.4 секунды и может изменяться с шагом 0.1 секунды. Его отражает положение передвигающегося факела редстоуна. +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Чтобы подключить повторитель, подайте сигнал на вход в направлении “стрелки”. Сигнал выйдет с противоположной стороны с задержкой. Чтобы изменить задержку, используйте повторитель. Время задержки изменяется от 0.1 до 0.4 секунды и может изменяться с шагом 0.1 секунды. Время задержки отражает положение передвигающегося факела редстоуна. To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.=Чтобы зафиксировать повторитель, подайте сигнал от соседнего повторителя на одну из его сторон. При фиксации передвижной факел редстоуна исчезает, выходной сигнал не меняется, а входной сигнал игнорируется. Redstone Repeater=Повторитель Redstone Repeater (Powered)=Повторитель (подключённый) -Redstone Repeater (Locked)=Повторитель (зафиксированный) -Redstone Repeater (Locked, Powered)=Повторитель (зафиксированный, подключённый) +Redstone Repeater (Locked)=Повторитель (фиксированный) +Redstone Repeater (Locked, Powered)=Повторитель (фиксированный, подключённый) Redstone Repeater (Delay @1)=Повторитель (задержка @1) Redstone Repeater (Delay @1, Powered)=Повторитель (задержка @1, подключённый) Transmits redstone power only in one direction=Передаёт энергию редстоуна только в одном направлении diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr index cd1592a28..451d6d40e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr @@ -1,4 +1,4 @@ # textdomain: mesecons_lightstone -Redstone Lamp=Лампа редстоуна -Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Лампа редстоуна это простой компонент редстоуна, который ярко светится (уровень света @1) при подаче на него энергии редстоуна. -Glows when powered by redstone power=Светит при подаче энергии редстоуна +Redstone Lamp=Лампа +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Лампа это простой компонент редстоуна, который ярко светится (уровень света @1) при подаче на него сигнала редстоуна. +Glows when powered by redstone power=Светит при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index fedb8fa5d..c7c3151f7 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -4,7 +4,6 @@ local table = table mesecon.mvps_stoppers = {} mesecon.mvps_unsticky = {} -mesecon.mvps_droppers = {} mesecon.on_mvps_move = {} mesecon.mvps_unmov = {} @@ -17,24 +16,6 @@ function mesecon.is_mvps_unmov(objectname) return mesecon.mvps_unmov[objectname] end -function mesecon.is_mvps_dropper(node, pushdir, stack, stackid) - local get_dropper = mesecon.mvps_droppers[node.name] - if type (get_dropper) == "function" then - get_dropper = get_dropper(node, pushdir, stack, stackid) - end - if not get_dropper then - get_dropper = minetest.get_item_group(node.name, "dig_by_piston") == 1 - end - return get_dropper -end - -function mesecon.register_mvps_dropper(nodename, get_dropper) - if get_dropper == nil then - get_dropper = true - end - mesecon.mvps_droppers[nodename] = get_dropper -end - -- Nodes that cannot be pushed / pulled by movestones, pistons function mesecon.is_mvps_stopper(node) -- unknown nodes are always stoppers @@ -151,7 +132,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) -- add connected nodes to frontiers, connected is a vector list -- the vectors must be absolute positions local connected = {} - local has_loop + local has_loop if minetest.registered_nodes[nn.name] and minetest.registered_nodes[nn.name].mvps_sticky then connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) @@ -220,19 +201,13 @@ end function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, piston_pos) local nodes, has_loop = mesecon.mvps_get_stack(pos, movedir, maximum, piston_pos) - if has_loop then - return false - end - - if not nodes then return end + if has_loop or not nodes then return end local newpos={} -- check node availability to push/pull into, and fill newpos[i] for i in ipairs(nodes) do newpos[i] = vector.add(nodes[i].pos, movedir) - if (newpos[i].x == piston_pos.x) and (newpos[i].y == piston_pos.y) and (newpos[i].z == piston_pos.z) then - return - end + if (newpos[i].x == piston_pos.x) and (newpos[i].y == piston_pos.y) and (newpos[i].z == piston_pos.z) then return end if not is_available(newpos[i]) then local available = false for j in ipairs(nodes) do @@ -243,23 +218,18 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end end end - if not available then - return - end + if not available then return end end end - if are_protected(nodes, player_name) then - return - end + if are_protected(nodes, player_name) then return end local first_dropper = nil -- remove all nodes for id, n in ipairs(nodes) do n.meta = minetest.get_meta(n.pos):to_table() - local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, nodes, id) + local is_dropper = minetest.get_item_group(n.node.name, "dig_by_piston") == 1 if is_dropper then - --local drops = minetest.get_node_drops(n.node.name, "") minetest.dig_node(n.pos) else minetest.remove_node(n.pos) diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr index fbac4366f..e4ae47316 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr @@ -1,22 +1,22 @@ # textdomain: mesecons_noteblock Note Block=Нотный блок -A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Нотный блок это музыкальный блок, который при ударе, а также при подаче энергии редстоуна проигрывает одну из множества музыкальных нот различными инструментами. -Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=[Используйте] нотный блок, чтобы выбрать следующую ноту (всего предусмотрено 25 полутонов или 2 октавы). Проигрываемый инструмент зависит от материала, который находится непосредственно под нотным блоком. +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Нотный блок это музыкальный блок, который при ударе или при подаче энергии редстоуна проигрывает одну из множества музыкальных нот различными инструментами. +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=Используйте нотный блок, чтобы выбрать следующую ноту (всего предусмотрено 25 полутонов или 2 октавы). Проигрываемый инструмент зависит от материала, который находится непосредственно под нотным блоком. • Glass: Sticks=• Стекло: палочки • Wood: Bass guitar=• Дерево: бас-гитара • Stone: Bass drum=• Камень: бочка • Sand or gravel: Snare drum=• Песок или гравий: барабан • Anything else: Piano=• Что-либо другое: фортепиано • Block of Gold: Bell=• Золотой блок: колокол -• Clay: Flute=• Глина: флейта -• Packed Ice: Chime=• Упакованный лёд: звон +• Clay: Flute=• Блок глины: флейта +• Packed Ice: Chime=• Плотный лёд: звон • Wool: Guitar=• Шерсть: гитара • Bone Block: Xylophne=• Костный блок: ксилофон -• Block of Iron: Iron xylophne=• Железный блок: металлофон +• Block of Iron: Iron xylophne=• Железный блок: металлический ксилофон • Soul Sand: Cow bell=• Песок душ: колокольчик • Pumpkin: Didgeridoo=• Тыква: диджериду • Block of Emerald: Square wave=• Изумрудный блок: прямоугольный сигнал • Hay Bale: Banjo=• Стог сена: банджо -• Glowstone: Electric piano=• Электронное фортепиано -The note block will only play a note when it is below air, otherwise, it stays silent.=Нотный блок проигрывает ноту только когда над ним имеется воздух, в противном случае он остаётся тихим. -Plays a musical note when powered by redstone power=Проигрывает ноту при подключении энергии редстоуна +• Glowstone: Electric piano=• электронное фортепиано +The note block will only play a note when it is below air, otherwise, it stays silent.=Нотный блок проигрывает ноту только когда над ним имеется воздух, в противном случае он звука не издает. +Plays a musical note when powered by redstone power=Проигрывает ноту от сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index 93b8df96d..e6dde3f99 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -138,8 +138,6 @@ local function piston_off(pos, node) end local function piston_orientate(pos, placer) - mesecon.mvps_set_owner(pos, placer) - -- not placed by player if not placer then return end @@ -153,6 +151,7 @@ local function piston_orientate(pos, placer) elseif pitch < -55 then minetest.add_node(pos, {name=pistonspec.piston_down}) end + mesecon.mvps_set_owner(pos, placer) end diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr index d69542e79..2f108ac3e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr @@ -1,8 +1,8 @@ # textdomain: mesecons_pistons -This block can have one of 6 possible orientations.=Этот блок быть ориентирован в одном из 6 возможных направлений. +This block can have one of 6 possible orientations.=Этот блок быть повёрнут в одном из 6 возможных направлений. Piston=Поршень -A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Поршень это компонент редстоуна с толкателем, который толкает блок или блоки перед собой при подаче энергии редстоуна. Следует отметить, что не все блоки могут быть сдвинуты. +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Поршень это компонент редстоуна с толкателем, который толкает блок или блоки перед собой при подаче сигнала редстоуна. Следует отметить, что не все блоки могут быть сдвинуты. Sticky Piston=Липкий поршень -A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Липкий поршень представляет собой компонент редстоуна с липким толкателем, который можно удлинять и втягивать обратно. Он расширяется, когда на него подается энергия красного камня. Когда толкатель выдвигается, он толкает блок или блоки перед собой. Когда он втягивается, он возвращает обратно один блок перед собой. Следует отметить, что не все блоки могут быть сдвинуты. или втянуты. -Pushes block when powered by redstone power=Толкает блок при подаче энергии редстоуна -Pushes or pulls block when powered by redstone power=Толкает или тянет блок при подаче энергии редстоуна +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Липкий поршень представляет собой компонент редстоуна с липким толкателем, который можно выдвигать и втягивать обратно. Он выдвигается, когда на него подается сигнал красного камня. Когда толкатель выдвигается, он толкает блок или блоки перед собой. Когда он втягивается, он возвращает обратно один блок перед собой. Следует отметить, что не все блоки могут быть сдвинуты или втянуты. +Pushes block when powered by redstone power=Толкает блок при подаче сигнала редстоуна +Pushes or pulls block when powered by redstone power=Толкает или втягивает блок при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index c0894224c..d040c8666 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua @@ -201,4 +201,15 @@ mesecon.register_pressure_plate( { player = true, mob = true }, S("A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.")) - +mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_gold", + S("Light-Weighted Pressure Plate"), + {"default_gold_block.png"}, + {"default_gold_block.png"}, + "default_gold_block.png", + nil, + {{"mcl_core:gold_ingot", "mcl_core:gold_ingot"}}, + mcl_sounds.node_sound_metal_defaults(), + {pickaxey=1}, + { player = true, mob = true }, + S("A light-weighted pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.")) diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr index fcd81f451..6742ed560 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr @@ -1,15 +1,15 @@ # textdomain: mesecons_pressureplates -A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Нажимаемая панель это компонент редстоуна, который начинает снабжать энергией редстоуна окружающие его блоки, когда кто-то или что-то находится прямо на нём. -Oak Pressure Plate=Дубовая нажимная панель -Acacia Pressure Plate=Акациевая нажимная панель -Birch Pressure Plate=Берёзовая нажимная панель -Dark Oak Pressure Plate=Нажимная панель из тёмного дуба -Spruce Pressure Plate=Еловая нажимная панель -Jungle Pressure Plate=Нажимная панель из дерева джунглей -A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Деревянная нажимная панель это компонент редстоуна, который начинает снабжать энергией редстоуна окружающие его блоки, когда любой движущийся объект (включая брошенные предметы, игроков и мобов) находится прямо на нём. -Stone Pressure Plate=Каменная нажимная панель -A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Каменная нажимная панель это компонент редстоуна, который начинает снабжать энергией редстоуна окружающие его блоки, когда игрок или моб находится прямо на нём. От чего-то другого он не сработает. -Provides redstone power when pushed=Производит энергию редстоуна при нажимании +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Нажимная плита это компонент редстоуна, который выдает сигнал редстоуна окружающим его блокам, когда кто-то или что-то находится прямо на нём. +Oak Pressure Plate=Дубовая нажимная плита +Acacia Pressure Plate=Акациевая нажимная плита +Birch Pressure Plate=Берёзовая нажимная плита +Dark Oak Pressure Plate=Нажимная плита из тёмного дуба +Spruce Pressure Plate=Еловая нажимная плита +Jungle Pressure Plate=Нажимная плита из тропического дерева +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Деревянная нажимная плита это компонент редстоуна, который начинает снабжать энергией редстоуна окружающие его блоки, когда любой движущийся объект (включая брошенные предметы, игроков и мобов) находится прямо на нём. +Stone Pressure Plate=Каменная нажимная плита +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Каменная нажимная плита это компонент редстоуна, который выдает сигнал редстоуна окружающим его блокам, когда игрок или моб находится прямо на нём. От чего-то другого он не сработает. +Provides redstone power when pushed=Производит сигнал редстоуна при нажатии Pushable by players, mobs and objects=Нажимается игроками, мобами и объектами Pushable by players and mobs=Нажимается игроками и мобами Pushable by players=Нажимается игроками diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index 1c89293cc..05fed31a3 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -207,7 +207,7 @@ minetest.register_abm({ local light = minetest.get_node_light(pos, nil) local time = minetest.get_us_time() - if light < 14 and time > 18000 then + if light < 14 and time > 18000 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_on", param2=node.param2}) mesecon.receptor_on(pos, mesecon.rules.pplate) end diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr index 108cb9f75..99859bb89 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr @@ -1,8 +1,8 @@ # textdomain: mesecons_solarpanel Daylight Sensor=Датчик дневного света -Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Датчик дневного света это компонент редстоуна, который производит энергию редстоуна при нахождении в солнечном свете и не производит в противном случае. Он также может быть инвертирован. -Use the daylight sensor to toggle its state.=[Используйте] датчик дневного света для смены его состояния +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Датчик дневного света это компонент редстоуна, который производит сигнал редстоуна при солнечном свете и не производит в противном случае. Он также может быть инвертирован. +Use the daylight sensor to toggle its state.=Используйте датчик дневного света для смены его состояния Inverted Daylight Sensor=Инвертированный датчик дневного света -In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=В инвертированном состоянии он производит энергию редстоуна, когда на него не попадает солнечны свет, а когда попадает - перестаёт производить. -Provides redstone power when in sunlight=Генерирует энергию редстоуна в солнечном свете +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=В инвертированном состоянии он производит сигнал редстоуна, когда на него не попадает солнечный свет, а когда попадает - перестаёт производить. +Provides redstone power when in sunlight=Генерирует сигнал редстоуна от солнечного света Can be inverted=Может быть инвертирован diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr index 45d0d7667..4ff4a1273 100644 --- a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr @@ -1,10 +1,10 @@ # textdomain: mesecons_torch Redstone Torch=Факел редстоуна -Redstone Torch (off)=Факел редстоуна (выкл) -Redstone Torch (overheated)=Факел редстоуна (перегрелся) -A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Факел редстоуна это компонент, способный инвертировать сигнал редстоуна. Он обеспечивает энергией редстоуна окружающие блоки, за исключением того блока, к которому он присоединён. Факел редстоуна обычно горит, но он также может быть выключен путём подведения энергии редстоуна к тому блоку, к которому он присоединён. Когда он не горит, то не снабжает энергией окружающие блоки. -Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Факелы редстоуна могут быть установлены по краям и на верхней части любого целого плотного твёрдого блока. +Redstone Torch (off)=Красный факел (выкл) +Redstone Torch (overheated)=Красный факел (перегорел) +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Красный факел это компонент, способный инвертировать сигнал редстоуна. Он подает сигнал редстоуна на окружающие блоки, за исключением того блока, к которому он присоединён. Красный факел обычно горит, но он также может быть выключен путём подведения энергии редстоуна к тому блоку, к которому он присоединён. Когда он не горит, то не снабжает сигналом окружающие блоки. +Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Красный факел может быть установлен по краям и сверху любого целого твёрдого непрозрачного блока. Block of Redstone=Блок редстоуна -A block of redstone permanently supplies redstone power to its surrounding blocks.=Блок редстоуна напрямую снабжает энергией окружающие блоки -Provides redstone power when it's not powered itself=Снабжает энергией редстоуна, если не подключён сам -Provides redstone power=Снабжает энергией редстоуна +A block of redstone permanently supplies redstone power to its surrounding blocks.=Блок редстоуна напрямую снабжает сигналом редстоуна окружающие блоки +Provides redstone power when it's not powered itself=Снабжает сигналом редстоуна, если не подключён сам +Provides redstone power=Снабжает сигналом редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr index 27a3bb55f..880219396 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.de.tr @@ -1,4 +1,4 @@ -# textdomain: mesecons_wallever +# textdomain: mesecons_walllever Lever=Hebel A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Ein Hebel ist eine Redstonekomponente, die ein- und ausgeschaltet werden kann. Er versorgt seine benachbarten Blöcke mit Redstoneenergie, solange er sich im eingeschalteten Zustand befindet. Use the lever to flip it on or off.=Benutzen Sie den Hebel, um ihn ein- oder auszuschalten. diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.es.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.es.tr index e0e55298e..9b83bf6db 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.es.tr +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.es.tr @@ -1,4 +1,4 @@ -# textdomain: mesecons_wallever +# textdomain: mesecons_walllever Lever=Palanca A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=EUna palanca es un componente de redstone que se puede activar y desactivar. Suministra energía redstone a bloques adyacentes mientras está en el estado "encendido". Use the lever to flip it on or off.=Use la palanca para encenderlo o apagarlo. diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.fr.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.fr.tr index 3d5d23c81..c3dc63aa9 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.fr.tr +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.fr.tr @@ -1,4 +1,4 @@ -# textdomain: mesecons_wallever +# textdomain: mesecons_walllever Lever=Levier A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Un levier est un composant de redstone qui peut être activé et désactivé. Il fournit de l'énergie redstone aux blocs adjacents pendant qu'il est à l'état "activé". Use the lever to flip it on or off.=Utilisez le levier pour l'activer ou le désactiver. diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pl.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pl.tr index 924fe3dd0..9bfed99db 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pl.tr +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pl.tr @@ -1,4 +1,4 @@ -# textdomain: mesecons_wallever +# textdomain: mesecons_walllever Lever=Dźwignia A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Dźwignia jest czerwienitowym elementem, który można przełączać między stanem włączonym i wyłączonym. Wysyła ona czerwienitową energię gdy jest w stanie włączonym. Use the lever to flip it on or off.=Użyj dźwigni by przełączyć ją między stanami. diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr index 6ed05b387..03a7ff481 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr @@ -1,5 +1,5 @@ -# textdomain: mesecons_wallever +# textdomain: mesecons_walllever Lever=Рычаг -A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Рычаг это компонент редстоуна, который можно включать и выключать. Он подаёт энергию редстоуна на соседние блоки, пока он находится во «включённом» состоянии. -Use the lever to flip it on or off.=[Используйте] рычаг, чтобы перещёлкнуть его во включённое или выключенное положение . -Provides redstone power while it's turned on=Снабжает энергией редстоуна, когда включён +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Рычаг это компонент редстоуна, который можно включать и выключать. Он подаёт сигнал редстоуна на соседние блоки, пока он находится во включённом состоянии. +Use the lever to flip it on or off.=Используйте рычаг, чтобы перещёлкнуть его во включённое или выключенное положение. +Provides redstone power while it's turned on=Снабжает сигналом редстоуна, когда включён. diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt index 0187e6d28..198ad9f9a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/template.txt @@ -1,4 +1,4 @@ -# textdomain: mesecons_wallever +# textdomain: mesecons_walllever Lever= A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.= Use the lever to flip it on or off.= diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr index 4316613b0..aea2bca60 100644 --- a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr @@ -1,11 +1,11 @@ # textdomain: mesecons_wires -Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Редстоун является универсальным проводящим минералом, который передает энергию красного камня. Он может размещаться на поверхности как дорожка. -A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Дорожка редстоуна может быть в двух состояниях: включена или выключена. Включённая дорожка редстоуна будет снабжать (а значит, активировать) смежные компоненты редстоуна. -Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=Энергию редстоуна можно получать от различных компонентов редстоуна, таких как блок редстоуна или кнопка. Эта энергия используется для активации многочисленных механизмов, таких как лампы редстоуна или поршни. -Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.=Поместите редстоун на землю, чтобы создать из него дорожку. Фрагменты дорожек будут соединяться между собой автоматически и могут даже проходить по холмам. Простой способ подать энергию редстоуна к дорожке редстоуна это установка факела редстоуна. +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Редстоун является универсальным проводящим минералом, который передает сигнал красного камня. Он может размещаться на поверхности как дорожка. +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Дорожка редстоуна может быть в двух состояниях: подключенная или отключенная. Подключенная дорожка редстоуна будет снабжать (а значит, активировать) рядом стоящие компоненты редстоуна. +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=Сигнал редстоуна можно получать от различных компонентов редстоуна, таких как блок редстоуна или кнопка. Эта энергия используется для активации многочисленных механизмов, таких как лампы или поршни. +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.=Поместите редстоун на землю, чтобы создать из него дорожку. Фрагменты дорожек будут соединяться между собой автоматически и могут даже проходить по холмам. Простой способ подать энергию редстоуна к дорожке редстоуна это установка красного факела. Read the help entries on the other redstone components to learn how redstone components interact.=Смотрите справочные записи к остальным компонентам редстоуна, чтобы узнать больше об их взаимодействии. Redstone=Редстоун -Powered Redstone Spot (@1)=Подключённое пятно редстоуна (@1) +Powered Redstone Spot (@1)=Подключенное пятно редстоуна (@1) Redstone Trail (@1)=Дорожка редстоуна (@1) -Powered Redstone Trail (@1)=Подключённая дорожка редстоуна (@1) -Transmits redstone power, powers mechanisms=Передаёт энергию редстоуна, подключает механизмы +Powered Redstone Trail (@1)=Подключенная дорожка редстоуна (@1) +Transmits redstone power, powers mechanisms=Передаёт сигнал редстоуна, питает механизмы diff --git a/mods/ITEMS/mcl_amethyst/geode.lua b/mods/ITEMS/mcl_amethyst/geode.lua new file mode 100644 index 000000000..cefcfbb8a --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/geode.lua @@ -0,0 +1,93 @@ +local radius_min = 3 +local radius_max = mcl_mapgen.HALF_BS +local layers = { + { + [8] = "mcl_blackstone:basalt_polished", + [92] = "mcl_deepslate:deepslate", + }, + { + [100] = "mcl_amethyst:calcite", + }, + { + [85] = "mcl_amethyst:amethyst_block", + [15] = "mcl_amethyst:budding_amethyst_block", + }, + { + [98] = "mcl_amethyst:amethyst_block", + [2] = "mcl_amethyst:budding_amethyst_block", + }, + { + [100] = "air", + } +} + +local function round(v) + if v < 0 then + return math.ceil(v - 0.5) + end + return math.floor(v + 0.5) +end + +local function place(pos, rotation, pr) + local radius1 = vector.new( + -pr:next(radius_min, radius_max), + -pr:next(radius_min, radius_max), + -pr:next(radius_min, radius_max) + ) + local radius2 = vector.new( + pr:next(radius_min, radius_max), + pr:next(radius_min, radius_max), + pr:next(radius_min, radius_max) + ) + local layer_radius = pr:next(radius_min, radius_max) + local radius1_normalized = vector.normalize(radius1) + local radius2_normalized = vector.normalize(radius2) + local pos = vector.subtract(pos, radius1) + for x = radius1.x, radius2.x do + local max_x = (x < 0) and radius1.x or radius2.x + for y = radius1.y, radius2.y do + local max_y = (y < 0) and radius1.y or radius2.y + for z = radius1.z, radius2.z do + local max_z = (z < 0) and radius1.z or radius2.z + local normal_abs = vector.new(x / max_x, y / max_y, z / max_z) + local inverted_layer = round(vector.length(normal_abs) * layer_radius) + if inverted_layer <= layer_radius then + local layer = math.min(math.max(1, layer_radius - inverted_layer + 1), #layers) + local offset = vector.new(x, y, z) + local node_pos = pos + offset + local node_candidates = layers[layer] + local node_name + local chance_index = pr:next(1, 100) + local current_weight = 0 + for chance, node_name_iterated in pairs(node_candidates) do + if chance_index <= current_weight + chance then + node_name = node_name_iterated + break + end + current_weight = current_weight + chance + end + minetest.swap_node(node_pos, {name = node_name}) + end + end + end + end +end + +mcl_structures.register_structure({ + name = "amethyst_geode", + place_function = place, +}) + +local decrease_scan_area = 1 +local mapblock_opacity_placement_threshold = 0.98 +local threshold = math.floor(((mcl_mapgen.BS - 2 * decrease_scan_area)^3) * mapblock_opacity_placement_threshold) +local upper_than = mcl_mapgen.overworld.bedrock_max +mcl_mapgen.register_mapgen_block(function(minp, maxp, blockseed) + local y = minp.y + if y <= upper_than then return end + local pr = PseudoRandom(blockseed + 143) + if pr:next(1, 120) ~= 54 then return end + local opacity_counter = #minetest.find_nodes_in_area(vector.add(minp, decrease_scan_area), vector.subtract(maxp, decrease_scan_area), "group:opaque") + if opacity_counter < threshold then return end + place(minp, nil, pr) +end) diff --git a/mods/ITEMS/mcl_amethyst/grow.lua b/mods/ITEMS/mcl_amethyst/grow.lua new file mode 100644 index 000000000..3dfd5386f --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/grow.lua @@ -0,0 +1,54 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local interval = 10 +local chance = 5 + +local function grow(pos, node) + local def = minetest.registered_nodes[node.name] + local next_gen = def._mcl_amethyst_next_grade + if not next_gen then return end + + local dir = minetest.wallmounted_to_dir(node.param2) + local ba_pos = vector.add(pos, dir) + local ba_node = minetest.get_node(ba_pos) + if ba_node.name ~= "mcl_amethyst:budding_amethyst_block" then return end + + local swap_result = table.copy(node) + swap_result.name = next_gen + minetest.swap_node(pos, swap_result) +end + +minetest.register_abm({ + label = "Amethyst Bud Growth", + nodenames = {"group:amethyst_buds"}, + neighbors = {"mcl_amethyst:budding_amethyst_block"}, + interval = interval, + chance = chance, + action = grow, +}) + +local all_directions = { + vector.new(1,0,0), + vector.new(0,1,0), + vector.new(0,0,1), + vector.new(-1,0,0), + vector.new(0,-1,0), + vector.new(0,0,-1), +} + +minetest.register_abm({ + label = "Spawn Amethyst Bud", + nodenames = {"mcl_amethyst:budding_amethyst_block"}, + neighbors = {"air", "group:water"}, + interval = 20, + chance = 2, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + if check_node_name ~= "air" and minetest.get_item_group(check_node_name, "water") == 0 then return end + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node = {name = "mcl_amethyst:small_amethyst_bud", param2 = param2} + minetest.swap_node(check_pos, new_node) + end, +}) diff --git a/mods/ITEMS/mcl_amethyst/init.lua b/mods/ITEMS/mcl_amethyst/init.lua new file mode 100644 index 000000000..49b454e53 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/init.lua @@ -0,0 +1,238 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +mcl_amethyst = {} + +local sounds = mcl_sounds.node_sound_glass_defaults({ + footstep = {name="amethyst_walk", gain=0.4}, + dug = {name="amethyst_break", gain=0.44}, +}) + +-- Amethyst block +minetest.register_node("mcl_amethyst:amethyst_block",{ + description = S("Block of Amethyst"), + tiles = {"amethyst_block.png"}, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + groups = { + pickaxey = 1, + building_block = 1, + }, + sounds = sounds, + is_ground_content = true, + stack_max = 64, + _doc_items_longdesc = S("The Block of Amethyst is a decoration block crafted from amethyst shards."), +}) + +-- Budding Amethyst block +minetest.register_node("mcl_amethyst:budding_amethyst_block",{ + description = S("Budding Amethyst"), + tiles = {"budding_amethyst.png"}, + drop = "", + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + groups = { + pickaxey = 1, + building_block = 1, + dig_by_piston = 1, + }, + sounds = sounds, + is_ground_content = true, + stack_max = 64, + _doc_items_longdesc = S("The Budding Amethyst can grow amethyst"), +}) + +-- Amethyst Shard +minetest.register_craftitem("mcl_amethyst:amethyst_shard",{ + description = S("Amethyst Shard"), + inventory_image = "amethyst_shard.png", + stack_max = 64, + groups = { + craftitem = 1, + }, + _doc_items_longdesc = S("An amethyst shard is a crystalline mineral."), +}) + +-- Calcite +minetest.register_node("mcl_amethyst:calcite",{ + description = S("Calcite"), + tiles = {"calcite.png"}, + _mcl_hardness = 0.75, + _mcl_blast_resistance = 0.75, + groups = { + pickaxey = 1, + building_block = 1, + }, + sounds = mcl_sounds.node_sound_stone_defaults(), + is_ground_content = true, + stack_max = 64, + _doc_items_longdesc = S("Calcite can be found as part of amethyst geodes."), +}) + +-- Tinied Glass +minetest.register_node("mcl_amethyst:tinted_glass",{ + description = S("Tinted Glass"), + tiles = {"tinted_glass.png"}, + _mcl_hardness = 0.3, + _mcl_blast_resistance = 0.3, + drawtype = "glasslike", + use_texture_alpha = "clip", + sunlight_propagates = false, + groups = { + handy = 1, + building_block = 1, + deco_block = 1, + }, + sounds = mcl_sounds.node_sound_glass_defaults(), + is_ground_content = false, + stack_max = 64, + _doc_items_longdesc = S("Tinted Glass is a type of glass which blocks lights while it is visually transparent."), +}) + +-- Amethyst Cluster +local bud_def = { + { + size = "small", + description = S("Small Amethyst Bud"), + long_desc = S("Small Amethyst Bud is the first growth of amethyst bud."), + light_source = 3, + next_stage = "mcl_amethyst:medium_amethyst_bud", + selection_box = { -4/16, -7/16, -4/16, 4/16, -3/16, 4/16 }, + }, + { + size = "medium", + description = S("Medium Amethyst Bud"), + long_desc = S("Medium Amethyst Bud is the second growth of amethyst bud."), + light_source = 4, + next_stage = "mcl_amethyst:large_amethyst_bud", + selection_box = { -4.5/16, -8/16, -4.5/16, 4.5/16, -2/16, 4.5/16 }, + }, + { + size = "large", + description = S("Large Amethyst Bud"), + long_desc = S("Large Amethyst Bud is the third growth of amethyst bud."), + light_source = 5, + next_stage = "mcl_amethyst:amethyst_cluster", + selection_box = { -4.5/16, -8/16, -4.5/16, 4.5/16, -1/16, 4.5/16 }, + }, +} +for _, def in pairs(bud_def) do + local size = def.size + local name = "mcl_amethyst:" .. size .. "_amethyst_bud" + local tile = size .. "_amethyst_bud.png" + local inventory_image = size .. "_amethyst_bud.png" + minetest.register_node(name, { + description = def.description, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + drop = "", + tiles = {tile}, + inventory_image = inventory_image, + paramtype1 = "light", + paramtype2 = "wallmounted", + drawtype = "plantlike", + use_texture_alpha = "clip", + sunlight_propagates = true, + walkable = false, + light_source = def.light_source, + groups = { + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + pickaxey = 1, + deco_block = 1, + amethyst_buds = 1, + attached_node = 1, + }, + sounds = sounds, + selection_box = { + type = "fixed", + fixed = def.selection_box + }, + _mcl_silk_touch_drop = true, + _mcl_amethyst_next_grade = def.next_stage, + _doc_items_longdesc = def.longdesc, + }) +end + +minetest.register_node("mcl_amethyst:amethyst_cluster",{ + description = S("Amethyst Cluster"), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + _doc_items_longdesc = S("Amethyst Cluster is the final growth of amethyst bud."), + drop = { + max_items = 1, + items = { + { + tools = {"~mcl_tools:pick_"}, + items = {"mcl_amethyst:amethyst_shard 4"}, + }, + { + items = {"mcl_amethyst:amethyst_shard 2"}, + }, + } + }, + tiles = {"amethyst_cluster.png",}, + inventory_image = "amethyst_cluster.png", + paramtype2 = "wallmounted", + drawtype = "plantlike", + paramtype1 = "light", + use_texture_alpha = "clip", + sunlight_propagates = true, + walkable = false, + light_source = 7, + groups = { + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + pickaxey = 1, + deco_block = 1, + attached_node = 1, + }, + sounds = sounds, + selection_box = { + type = "fixed", + fixed = { -4.8/16, -8/16, -4.8/16, 4.8/16, 3.9/16, 4.8/16 }, + }, + _mcl_silk_touch_drop = true, +}) + +-- Register Crafts +minetest.register_craft({ + output = "mcl_amethyst:amethyst_block", + recipe = { + {"mcl_amethyst:amethyst_shard","mcl_amethyst:amethyst_shard",}, + {"mcl_amethyst:amethyst_shard","mcl_amethyst:amethyst_shard",}, + }, +}) + +minetest.register_craft({ + output = "mcl_amethyst:tinted_glass 2", + recipe = { + {"","mcl_amethyst:amethyst_shard",""}, + {"mcl_amethyst:amethyst_shard","mcl_core:glass","mcl_amethyst:amethyst_shard",}, + {"","mcl_amethyst:amethyst_shard",""}, + }, +}) + +if minetest.get_modpath("mcl_spyglass") then + minetest.clear_craft({output = "mcl_spyglass:spyglass",}) + local function craft_spyglass(ingot) + minetest.register_craft({ + output = "mcl_spyglass:spyglass", + recipe = { + {"mcl_amethyst:amethyst_shard"}, + {ingot}, + {ingot}, + } + }) + end + if minetest.get_modpath("mcl_copper") then + craft_spyglass("mcl_copper:copper_ingot") + else + craft_spyglass("mcl_core:iron_ingot") + end +end + +dofile(modpath .. "/grow.lua") +dofile(modpath .. "/geode.lua") diff --git a/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.fr.tr b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.fr.tr new file mode 100644 index 000000000..a6d8c5510 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.fr.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_amethyst +Amethyst Cluster= Agrégat d'améthyste +Amethyst Cluster is the final growth of amethyst bud.= L'agrégat d'améthyste est le stade final de la croissance du bourgeon d'améthyste. +Amethyst Shard= Eclat d'améthyste +An amethyst shard is a crystalline mineral.= Un éclat d'améthyste est un minéral cristallin. +Block of Amethyst= Bloc d'améthyste +Budding Amethyst= Améthyste bourgeonante +Calcite= Calcite +Calcite can be found as part of amethyst geodes.= La calcite peut être trouvée dans les géodes d'améthyste. +Large Amethyst Bud= Grand bourgeon d'améthyste +Large Amethyst Bud is the third growth of amethyst bud.= Le grand bourgeon d'améthyste est le troisième stade de la croissance du bourgeon d'améthyste. +Medium Amethyst Bud= Bourgeon d'améthyste moyen +Medium Amethyst Bud is the second growth of amethyst bud.= Le bourgeon d'améthyste moyen est le deuxième stade de la croissance du bourgeon d'améthyste. +Small Amethyst Bud= Petit bourgeon d'améthyste +Small Amethyst Bud is the first growth of amethyst bud.= Le petit bourgeon d'améthyste est le premier stade de la croissance du bourgeon d'améthyste. +The Block of Amethyst is a decoration block crafted from amethyst shards.= Le bloc d'améthyste est un bloc décoratif fabriqué à partir d'éclats d'améthyste. +The Budding Amethyst can grow amethyst= L'améthyste bourgeonante peut faire croître de l'améthyste. +Tinted Glass= Verre teinté +Tinted Glass is a type of glass which blocks lights while it is visually transparent.= Le verre teinté est un type de verre qui bloque la lumière tout en étant visuellement transparent. diff --git a/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr new file mode 100644 index 000000000..9f1d0f572 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_amethyst +Amethyst Cluster=Аметистовая друза +Amethyst Cluster is the final growth of amethyst bud.=Аметистовая друза - это последняя 4-я стадия роста аметистового бутона. +Amethyst Shard=Осколок аметиста +An amethyst shard is a crystalline mineral.=Осколок аметиста - это кристаллический минерал, получаемый в результате разрушения кластеров аметиста. +Block of Amethyst=Аметистовый блок +Budding Amethyst=Растущий аметист +Calcite=Кальцит +Calcite can be found as part of amethyst geodes.=Кальцит можно найти в составе аметистовых жеод. +Large Amethyst Bud=Большой росток аметиста +Large Amethyst Bud is the third growth of amethyst bud.=Большой росток - третья стадия роста аметиста. +Medium Amethyst Bud=Средний росток аметиста +Medium Amethyst Bud is the second growth of amethyst bud.=Средний росток - вторая стадия роста аметиста. +Small Amethyst Bud=Маленький росток аметиста +Small Amethyst Bud is the first growth of amethyst bud.=Маленький росток - первая стадия роста аметиста. +The Block of Amethyst is a decoration block crafted from amethyst shards.=Блок аметиста - декоративный блок, скрафченный из осколков аметиста. +The Budding Amethyst can grow amethyst=Растущий аметист может вырастить аметист +Tinted Glass=Тонированное стекло +Tinted Glass is a type of glass which blocks lights while it is visually transparent.=Тонированное стекло блокирует свет, но визуально прозрачно. diff --git a/mods/ITEMS/mcl_amethyst/locale/template.txt b/mods/ITEMS/mcl_amethyst/locale/template.txt new file mode 100644 index 000000000..7f23e9965 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/locale/template.txt @@ -0,0 +1,19 @@ +# textdomain: mcl_amethyst +Amethyst Cluster= +Amethyst Cluster is the final growth of amethyst bud.= +Amethyst Shard= +An amethyst shard is a crystalline mineral.= +Block of Amethyst= +Budding Amethyst= +Calcite= +Calcite can be found as part of amethyst geodes.= +Large Amethyst Bud= +Large Amethyst Bud is the third growth of amethyst bud.= +Medium Amethyst Bud= +Medium Amethyst Bud is the second growth of amethyst bud.= +Small Amethyst Bud= +Small Amethyst Bud is the first growth of amethyst bud.= +The Block of Amethyst is a decoration block crafted from amethyst shards.= +The Budding Amethyst can grow amethyst= +Tinted Glass= +Tinted Glass is a type of glass which blocks lights while it is visually transparent.= diff --git a/mods/ITEMS/mcl_amethyst/mod.conf b/mods/ITEMS/mcl_amethyst/mod.conf new file mode 100644 index 000000000..2ebc1cc13 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/mod.conf @@ -0,0 +1,5 @@ +name = mcl_amethyst +author = Emojiminetest, kay27 +description = Amethyst related stuff for MCL5 +depends = mcl_init, mcl_core, mcl_wip, mcl_mapgen, mcl_structures, mcl_blackstone, mcl_deepslate +optional_depends = mcl_spyglass, mcl_copper diff --git a/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.1.ogg b/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.1.ogg new file mode 100644 index 000000000..a2208012c Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.1.ogg differ diff --git a/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.2.ogg b/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.2.ogg new file mode 100644 index 000000000..a3903550c Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.2.ogg differ diff --git a/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.3.ogg b/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.3.ogg new file mode 100644 index 000000000..9cc81e20f Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/sounds/amethyst_break.3.ogg differ diff --git a/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.1.ogg b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.1.ogg new file mode 100644 index 000000000..8165edd5f Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.1.ogg differ diff --git a/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.2.ogg b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.2.ogg new file mode 100644 index 000000000..5bb5c4657 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.2.ogg differ diff --git a/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.3.ogg b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.3.ogg new file mode 100644 index 000000000..781668514 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.3.ogg differ diff --git a/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.4.ogg b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.4.ogg new file mode 100644 index 000000000..14299f50c Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/sounds/amethyst_walk.4.ogg differ diff --git a/mods/ITEMS/mcl_amethyst/textures/LICENSE.txt b/mods/ITEMS/mcl_amethyst/textures/LICENSE.txt new file mode 100644 index 000000000..f0993b6ce --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/textures/LICENSE.txt @@ -0,0 +1 @@ +Nova_Wostra Creative Commons Attribution-Share Alike 4.0 International License https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_block.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_block.png new file mode 100644 index 000000000..bc172f2a0 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_block.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster.png new file mode 100644 index 000000000..1097d97b1 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster_block.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster_block.png new file mode 100644 index 000000000..7ea932bf8 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster_block.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_shard.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_shard.png new file mode 100644 index 000000000..0d718c47a Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_shard.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/budding_amethyst.png b/mods/ITEMS/mcl_amethyst/textures/budding_amethyst.png new file mode 100644 index 000000000..6dee8ee9b Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/budding_amethyst.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/calcite.png b/mods/ITEMS/mcl_amethyst/textures/calcite.png new file mode 100644 index 000000000..48e3ce5d9 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/calcite.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/large_amethyst_bud.png b/mods/ITEMS/mcl_amethyst/textures/large_amethyst_bud.png new file mode 100644 index 000000000..5c7309434 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/large_amethyst_bud.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/medium_amethyst_bud.png b/mods/ITEMS/mcl_amethyst/textures/medium_amethyst_bud.png new file mode 100644 index 000000000..5a54f63dc Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/medium_amethyst_bud.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/small_amethyst_bud.png b/mods/ITEMS/mcl_amethyst/textures/small_amethyst_bud.png new file mode 100644 index 000000000..7a414235b Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/small_amethyst_bud.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/tinted_glass.png b/mods/ITEMS/mcl_amethyst/textures/tinted_glass.png new file mode 100644 index 000000000..18e797789 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/tinted_glass.png differ diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.fr.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.fr.tr index 1f03de8e5..6109e6d7f 100644 --- a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.fr.tr +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.fr.tr @@ -1,16 +1,16 @@ # textdomain: mcl_anvils -Set Name=Définir le Nom +Set Name=Nommer Repair and Name=Réparation et Nomme Inventory=Inventaire Anvil=Enclume -The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=L'enclume vous permet de réparer des outils et des armures, et de donner des noms à des objets. Il a cependant une durabilité limitée. Ne la laissez pas tomber sur la tête, cela pourrait être assez douloureux! -To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Pour utiliser une enclume, faites un clic droit dessus. Une enclume a 2 emplacements d'entrée (à gauche) et un emplacement de sortie. -To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Pour renommer des objets, placez une pile d'objets dans l'un des emplacements d'objets tout en laissant l'autre emplacement d'entrée vide. Tapez un nom, appuyez sur Entrée ou sur «Définir le nom», puis prenez l'élément renommé dans l'emplacement de sortie. +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=L'enclume vous permet de réparer des outils et des armures, et de donner des noms à des objets. Elle a cependant une durée de vie limitée. Ne la laissez pas tomber sur la tête, cela pourrait être assez douloureux! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Pour utiliser une enclume, faites un clic droit dessus. Une enclume a deux emplacements d'entrée (à gauche) et un emplacement de sortie. +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Pour renommer des objets, placez une pile d'objets dans l'un des emplacements d'objets tout en laissant l'autre emplacement d'entrée vide. Tapez un nom, appuyez sur Entrée ou sur «Nommer», puis prenez l'élément renommé dans l'emplacement de sortie. There are two possibilities to repair tools (and armor):=Il existe deux possibilités pour réparer les outils (et les armures): • Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Outil + Outil: Placez deux outils du même type dans les emplacements d'entrée. La "santé" de l'outil réparé est la somme de la "santé" des deux outils d'entrée, plus un bonus de 12%. • Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Outil + Matériel: Certains outils peuvent également être réparés en les combinant avec un élément dont il est fait. Par exemple, les pioches de fer peuvent être réparées avec des lingots de fer. Cela répare l'outil de 25%. Armor counts as a tool. It is possible to repair and rename a tool in a single step.=L'armure compte comme un outil. Il est possible de réparer et de renommer un outil en une seule étape. -The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=L'enclume a une durabilité limitée et 3 niveaux de dommages: en bon état, légèrement endommagé et très endommagé. Chaque fois que vous réparez ou renommez quelque chose, il y a 12% de chances que l'enclume soit endommagée. Les enclumes ont également une chance d'être endommagées lorsqu'elles tombent de plus d'un bloc. Si une enclume très endommagée est à nouveau endommagée, elle est détruite. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=L'enclume a une durée de vie limitée et 3 niveaux de dommages: en bon état, légèrement endommagée et très endommagée. Chaque fois que vous réparez ou renommez quelque chose, il y a 12% de chances que l'enclume soit endommagée. Les enclumes ont également une chance d'être endommagées lorsqu'elles tombent de plus d'un bloc. Si une enclume très endommagée est à nouveau endommagée, elle est détruite. Slightly Damaged Anvil=Enclume Légèrement Endommagée Very Damaged Anvil=Enclume Très Endommagée Repair and rename items=Réparer et renommer des objets diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr index 20281bd6b..ad5aa0e7a 100644 --- a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr @@ -1,16 +1,16 @@ # textdomain: mcl_anvils Set Name=Дать имя -Repair and Name=Починить и дать имя +Repair and Name=Починить и переименовать Inventory=Инвентарь Anvil=Наковальня -The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Наковальня позволяет ремонтировать инструменты и защиту, а также давать имена предметам. Но она имеет ограниченный срок службы. Не дайте ей упасть вам на голову, это может быть больно! -To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Чтобы воспользоваться наковальней, кликните по ней правой кнопкой. Наковальня имеет два входных отсека (слева) и один выходной. +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Наковальня позволяет ремонтировать инструменты и броню, а также переименовывать предметам. Но она имеет ограниченную прочность. Не дайте ей упасть вам на голову, это может быть больно! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Чтобы воспользоваться наковальней, кликните по ней правой кнопкой. Наковальня имеет два входных слота слева и один выходной. To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Для переименования положите стопку предметов в один отсек, второй оставьте пустым. Наберите имя, нажмите [Enter] или “Дать имя” и заберите переименованные предметы из выходного отсека. -There are two possibilities to repair tools (and armor):=Есть два способа отремонтировать инструменты (и защиту): -• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Инструмент + Инструмент: Положите два инструмента одного типа во входные отсеки. “Здоровье” отремонтированного инструмента будет равно сумме “здоровья” каждого из них, плюс 12% бонус. -• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Инструмент + Материал: Некоторые инструменты можно также ремонтировать, добавляя к ним предмет, из которого они сделаны. Например, железные кирки ремонтируются добавлением слитков железа. Таким способом инструмент восстанавливается на 25%. -Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Защиты считается за инструмент. Можно ремонтировать и переименовывать за одно действие. -The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Наковальня имеет ограниченный срок службы и 3 уровня износа: новая, немного изношенная, сильно повреждённая. Каждый раз, ремонтируя или переименовывая что-либо, вы имеете 12-процентный шанс повредить наковальню. Наковальни также могут повреждаться, когда они падают с высоте более 1 блока. Если повреждённая наковальня повреждается снова, то она уничтожается. -Slightly Damaged Anvil=Немного изношенная наковальня +There are two possibilities to repair tools (and armor):=Есть два способа отремонтировать инструменты и броню: +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Инструмент + Инструмент: положите два инструмента одного типа во входные слоты. Прочность отремонтированного инструмента будет равна сумме прочностей каждого из них, плюс еще 12%. +• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Инструмент + Материал: некоторые инструменты можно также ремонтировать, добавляя к ним предмет, из которого они сделаны. Например, железные кирки ремонтируются добавлением слитков железа. Таким способом инструмент восстанавливается на 25%. +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Броня считается за инструмент. Можно ремонтировать и переименовывать за одно действие. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Наковальня имеет ограниченный срок службы и 3 уровня износа: новая, повреждённая, сильно повреждённая. Каждый раз, ремонтируя или переименовывая что-либо, вы имеете 12-процентный шанс повредить наковальню. Наковальни также могут повреждаться, когда они падают с высоте более 1 блока. Если сильно повреждённая наковальня повреждается снова, то она уничтожается. +Slightly Damaged Anvil=Повреждённая наковальня Very Damaged Anvil=Сильно повреждённая наковальня Repair and rename items=Ремонтирует и переименовывает предметы diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr index 77ed83d10..9255238bc 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr @@ -1,23 +1,28 @@ # textdomain: mcl_armor -This is a piece of equippable armor which reduces the amount of damage you receive.=Это часть экипирующей брони, уменьшающая получаемый вами урон. -To equip it, put it on the corresponding armor slot in your inventory menu.=Чтобы надеть, поместите её в соответствующий отсек брони в меню вашего инвентаря. -Leather Cap=Кожаная фуражка +This is a piece of equippable armor which reduces the amount of damage you receive.=Это часть экипируемой брони, уменьшающая получаемый вами урон. +To equip it, put it on the corresponding armor slot in your inventory menu.=Чтобы надеть, поместите её в соответствующий слот брони в меню вашего инвентаря. +Leather Cap=Кожаный шлем Iron Helmet=Железный шлем Golden Helmet=Золотой шлем Diamond Helmet=Алмазный шлем -Chain Helmet=Кольчужный капюшон -Leather Tunic=Кожаная туника -Iron Chestplate=Железные латы -Golden Chestplate=Золотые латы -Diamond Chestplate=Алмазные латы +Chain Helmet=Кольчужный шлем +Netherite Helmet=Незеритовый шлем +Leather Tunic=Кожаная броня +Iron Chestplate=Железный нагрудник +Golden Chestplate=Золотой нагрудник +Diamond Chestplate=Алмазный нагрудник Chain Chestplate=Кольчуга +Netherite Chestplate=Незеритовый нагрудник Leather Pants=Кожаные штаны -Iron Leggings=Железные штаны -Golden Leggings=Золотые штаны -Diamond Leggings=Алмазные штаны -Chain Leggings=Кольчужные штаны +Iron Leggings=Железные поножи +Golden Leggings=Золотые поножи +Diamond Leggings=Алмазные поножи +Chain Leggings=Кольчужные поножи +Netherite Leggings=Незеритовые поножи Leather Boots=Кожаные ботинки Iron Boots=Железные ботинки Golden Boots=Золотые ботинки Diamond Boots=Алмазные ботинки Chain Boots=Кольчужные ботинки +Netherite Boots=Незеритовые ботинки +Elytra=Элитра diff --git a/mods/ITEMS/mcl_armor/locale/template.txt b/mods/ITEMS/mcl_armor/locale/template.txt index 8a95fca02..1500587ec 100644 --- a/mods/ITEMS/mcl_armor/locale/template.txt +++ b/mods/ITEMS/mcl_armor/locale/template.txt @@ -21,3 +21,4 @@ Iron Boots= Golden Boots= Diamond Boots= Chain Boots= +Elytra= diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr index 867b3f043..9eb026510 100644 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr @@ -1,5 +1,5 @@ # textdomain: mcl_armor_stand Armor Stand=Support d'armure -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Un support d'armure est un objet décoratif qui peut afficher différentes pièces d'armure. Tout ce que les joueurs peuvent porter comme armure peut également être placé sur un support d'armure. +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Un support d'armure est un objet décoratif qui sert à exposer différentes pièces d'armure. Tout ce que les joueurs peuvent porter comme armure peut également être placé sur un support d'armure. Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Placez simplement un objet d'armure sur le support d'armure. Pour prendre la pièce d'armure du support d'armure, sélectionnez votre main et utilisez la touche "Placer" sur le support d'armure. -Displays pieces of armor=Displays pieces of armor +Displays pieces of armor=Expose des pièces d'armure diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr index 6d05d20fc..ebc08b65a 100644 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_armor_stand -Armor Stand=Стенд защиты -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Стенд защиты - декоративный объект, демонстрирующий различные части защиты. Всё, что игрок может носить на себе в качестве защиты, может быть также помещено на данный стенд. -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Просто поместите элемент защиты на защитный стенд. Чтобы взять верхнюю часть защиты со стенда, выберите вашу руку и используйте клавишу размещения. -Displays pieces of armor=Демонстрирует части защиты +Armor Stand=Стойки для брони +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Стойки для брони - декоративный объект, который может показывать различные части брони. Всё, что игрок может носить на себе в качестве брони, может быть также помещено на стойку. +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Просто поместите предмет брони на стойку для брони. Чтобы забрать верхнюю часть брони со стойки щелкните по стойке пустой рукой. +Displays pieces of armor=Демонстрирует элементы брони diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index a396caf7d..0be8610f0 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -88,6 +88,10 @@ for k,v in pairs(mcl_banners.colors) do colors_reverse["mcl_banners:banner_item_"..v[1]] = k end +function mcl_banners.color_reverse(itemname) + return colors_reverse[itemname] +end + -- Add pattern/emblazoning crafting recipes dofile(modpath.."/patterncraft.lua") @@ -149,7 +153,7 @@ local function on_destruct_hanging_banner(pos) return on_destruct_banner(pos, true) end -local function make_banner_texture(base_color, layers) +function mcl_banners.make_banner_texture(base_color, layers) local colorize if mcl_banners.colors[base_color] then colorize = mcl_banners.colors[base_color][4] @@ -171,11 +175,11 @@ local function make_banner_texture(base_color, layers) finished_banner = finished_banner .. "^" .. layer end - return { finished_banner } + return finished_banner end - return { base } + return base else - return { "mcl_banners_banner_base.png" } + return "mcl_banners_banner_base.png" end end @@ -192,7 +196,7 @@ local function spawn_banner_entity(pos, hanging, itemstack) local imeta = itemstack:get_meta() local layers_raw = imeta:get_string("layers") local layers = minetest.deserialize(layers_raw) - local colorid = colors_reverse[itemstack:get_name()] + local colorid = mcl_banners.color_reverse(itemstack:get_name()) banner:get_luaentity():_set_textures(colorid, layers) local mname = imeta:get_string("name") if mname and mname ~= "" then @@ -604,7 +608,7 @@ local entity_standing = { visual = "mesh", mesh = "amc_banner.b3d", visual_size = { x=2.499, y=2.499 }, - textures = make_banner_texture(), + textures = {mcl_banners.make_banner_texture()}, pointable = false, _base_color = nil, -- base color of banner @@ -614,6 +618,7 @@ local entity_standing = { -- pattern: name of pattern (see list above) get_staticdata = function(self) + if not self then return end local out = { _base_color = self._base_color, _layers = self._layers, _name = self._name } return minetest.serialize(out) end, @@ -624,7 +629,7 @@ local entity_standing = { self._layers = inp._layers self._name = inp._name self.object:set_properties({ - textures = make_banner_texture(self._base_color, self._layers), + textures = {mcl_banners.make_banner_texture(self._base_color, self._layers)}, }) end -- Make banner slowly swing @@ -635,7 +640,7 @@ local entity_standing = { -- Set the banner textures. This function can be used by external mods. -- Meaning of parameters: -- * self: Lua entity reference to entity. - -- * other parameters: Same meaning as in make_banner_texture + -- * other parameters: Same meaning as in mcl_banners.make_banner_texture _set_textures = function(self, base_color, layers) if base_color then self._base_color = base_color @@ -643,7 +648,7 @@ local entity_standing = { if layers then self._layers = layers end - self.object:set_properties({textures = make_banner_texture(self._base_color, self._layers)}) + self.object:set_properties({textures = {mcl_banners.make_banner_texture(self._base_color, self._layers)}}) end, } minetest.register_entity("mcl_banners:standing_banner", entity_standing) diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr index cadf37c37..fbfd935a5 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr @@ -5,7 +5,7 @@ Grey Banner=Bannière Grise Grey=Gris Light Grey Banner=Bannière Gris Clair Light Grey=Gris Clair -Black Banner=Bannière Noir +Black Banner=Bannière Noire Black=Noir Red Banner=Bannière Rouge Red=Rouge @@ -29,10 +29,10 @@ Pink Banner=Bannière Rose Pink=Rose Lime Banner=Bannière Vert Clair Lime=Vert Clair -Light Blue Banner=Bannière Bleue Clair +Light Blue Banner=Bannière Bleu Clair Light Blue=Bleu Clair -Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Les bannières sont de grands blocs décoratifs colorés. Ils peuvent être placés au sol et aux murs. Les bannières peuvent arborées une variété de motifs en utilisant beaucoup de colorant dans l'artisanat. -Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Utilisez l'artisanat pour dessiner un motif sur le dessus de la bannière. Les bannières blasonnées peuvent être à nouveau blasonnées pour combiner différents motifs. Vous pouvez dessiner jusqu'à 12 couches sur une bannière de cette façon. Si la bannière comprend un dégradé, seulement 3 couches sont possibles. +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Les bannières sont de grands blocs décoratifs colorés. Elles peuvent être placées au sol et aux murs. Les bannières peuvent arborer une variété de motifs en utilisant beaucoup de colorant dans leur fabrication. +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Utilisez l'établi pour dessiner un motif sur le dessus de la bannière. Les bannières blasonnées peuvent être à nouveau blasonnées pour combiner différents motifs. Vous pouvez dessiner jusqu'à 12 couches sur une bannière de cette façon. Si la bannière comprend un dégradé, seulement 3 couches sont possibles. You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Vous pouvez copier le motif d'une bannière en plaçant deux bannières de la même couleur dans la grille de fabrication: l'une doit être décorée, l'autre doit être propre. Enfin, vous pouvez utiliser une bannière sur un chaudron avec de l'eau pour laver sa couche la plus haute. @1 Bordure=Bordure (@1) @1 Bricks=Blocs (@1) @@ -40,11 +40,11 @@ You can copy the pattern of a banner by placing two banners of the same color in @1 Creeper Charge=Face de Creeper (@1) @1 Saltire=Saltire (@1) @1 Bordure Indented=Bordure en retrait (@1) -@1 Per Bend Inverted=Division inclinée inversé (@1) -@1 Per Bend Sinister Inverted=Division oblique inversé (@1) +@1 Per Bend Inverted=Division inclinée inversée (@1) +@1 Per Bend Sinister Inverted=Division oblique inversée (@1) @1 Per Bend=Division inclinée (@1) @1 Per Bend Sinister=Division oblique (@1) -@1 Flower Charge=Figure Fleur (@1) +@1 Flower Charge=Figure de Fleur (@1) @1 Gradient=Dégradé (@1) @1 Base Gradient=Dégradé de couleurs (@1) @1 Per Fess Inverted=Division inverse (@1) diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr index a6cee5a67..f3ae1e90e 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr @@ -13,65 +13,66 @@ Yellow Banner=Жёлтый флаг Yellow=Жёлтый Green Banner=Зелёный флаг Green=Зелёный -Cyan Banner=Голубой флаг +Cyan Banner=Бирюзовый флаг Cyan=Голубой Blue Banner=Синий флаг Blue=Синий -Magenta Banner=Фиолетовый флаг -Magenta=Фиолетовый +Magenta Banner=Сиреневый флаг +Magenta=Сиреневый Orange Banner=Оранжевый флаг Orange=Оранжевый -Purple Banner=Пурпурный флаг -Violet=Пурпурный +Purple Banner=Фиолетовый флаг +Violet=Фиолетовый Brown Banner=Коричневый флаг Brown=Коричневый Pink Banner=Розовый флаг Pink=Розовый -Lime Banner=Зелёный лаймовый флаг +Lime Banner=Лаймовый флаг Lime=Зелёный лаймовый -Light Blue Banner=Светло-голубой флаг -Light Blue=Светло-голубой -Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Баннеры - высокие цветные декоративные блоки. Их можно размещать на полу и на стенах. Флаги можно украшать разнообразными узорами при помощью красителей во время создания. -Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Используйте крафтинг, чтобы нарисовать узор поверх флага. Украшенные флаги можно украсить повторно, чтобы сочетать разные узоры. Таким способом вы можете нарисовать до 12 слоев на одном флаге. Если флаг содержит градиент, возможно только 3 слоя. -You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Вы можете скопировать рисунок флага, поместив два флага одного цвета в крафтинговую решётку - один должен быть украшенный, другой - чистый. Наконец, вы можете [использовать] флаг на котле с водой для смывания верхнего слоя. -@1 Bordure=@1 Кайма -@1 Bricks=@1 Кирпичи -@1 Roundel=@1 Рондо -@1 Creeper Charge=@1 Атака крипера -@1 Saltire=@1 Андреевский крест -@1 Bordure Indented=@1 Кайма с отступом -@1 Per Bend Inverted=@1 Повторяющийся изгиб поворотом -@1 Per Bend Sinister Inverted=@1 Повторяющийся зловещий изгиб с поворотом -@1 Per Bend=@1 Повторяющийся изгиб -@1 Per Bend Sinister=@1 Зловещий изгиб -@1 Flower Charge=@1 Забота о цветке -@1 Gradient=@1 Градиент -@1 Base Gradient=@1 Основной градиент -@1 Per Fess Inverted=@1 Обратное деление щита -@1 Per Fess=@1 Деление щита -@1 Per Pale=@1 Вертикальное деление щита -@1 Per Pale Inverted=@1 Вертикальное обратное деление -@1 Thing Charge=@1 Атака существа -@1 Lozenge=@1 Ромб -@1 Skull Charge=@1 Атака черепа -@1 Paly=@1 Бледный -@1 Base Dexter Canton=@1 Основной правый кант -@1 Base Sinister Canton=@1 Основной зловещий кант -@1 Chief Dexter Canton=@1 Главный правый кант -@1 Chief Sinister Canton=@1 Главный зловещий кант -@1 Cross=@1 Крест -@1 Base=@1 Основа -@1 Pale=@1 Черта -@1 Bend Sinister=@1 Зловещий изгиб -@1 Bend=@1 Изгиб -@1 Pale Dexter=@1 Черты справа +Light Blue Banner=Голубой флаг +Light Blue=Голубой +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Флаги - высокие цветные декоративные блоки. Их можно размещать на полу и на стенах. Флаги можно украшать разнообразными узорами при помощью красителей во время создания. +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Используйте сетку крафта, чтобы нарисовать узор поверх флага. Украшенные флаги можно украсить повторно, чтобы сочетать разные узоры. Таким способом вы можете нарисовать до 12 слоев на одном флаге. Если флаг содержит градиент, возможно только 3 слоя. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Вы можете скопировать рисунок флага, поместив два флага одного цвета в сетку крафта - один должен быть украшенный, другой - чистый. Вы можете использовать флаг на котле с водой чтобы смыть верхний слой. +@1 Bordure=@1 простая кайма +@1 Bricks=@1 кирпичный фон +@1 Roundel=@1 круг в центре +@1 Creeper Charge=@1 лицо крипера +@1 Saltire=@1 диагональный крест +@1 Bordure Indented=@1 рельефная кайма +@1 Per Bend Inverted=@1 нижняя левая половина +@1 Per Bend Sinister Inverted=@1 нижняя правая половина +@1 Per Bend=@1 верхняя правая половина +@1 Per Bend Sinister=@1 верхняя левая половина +@1 Flower Charge=@1 цветок +@1 Gradient=@1 верхний градиент +@1 Base Gradient=@1 нижний градиент +@1 Per Fess Inverted=@1 нижняя половина +@1 Per Fess=@1 верхняя половина +@1 Per Pale=@1 левая половина +@1 Per Pale Inverted=@1 правая половина +@1 Thing Charge=@1 нечто +@1 Lozenge=@1 Ромб в центре +@1 Skull Charge=@1 Весёлый Роджер +@1 Paly=@1 продольные полосы +@1 Base Dexter Canton=@1 нижний левый угол +@1 Base Sinister Canton=@1 нижний правый угол +@1 Chief Dexter Canton=@1 верхний левый угол +@1 Chief Sinister Canton=@1 верхний правый угол +@1 Cross=@1 крест +@1 Base=@1 треть снизу +@1 Pale=@1 вертикальная центральная линия +@1 Bend Sinister=@1 диагональная линия сверху справа +@1 Bend=@1 диагональная линия сверху слева +@1 Pale Dexter=@1 треть слева @1 Fess=@1 Разделение -@1 Pale Sinister=@1 Бледный зловещий -@1 Chief=@1 Главный -@1 Chevron=@1 Шеврон -@1 Chevron Inverted=@1 Инвертированный шеврон -@1 Base Indented=@1 Инвертированный основной -@1 Chief Indented=@1 Инвертированный главный -And one additional layer=И один индивидуальный слой -And @1 additional layers=И @1 дополнительныйх слойёв -Paintable decoration=Художественное украшение +@1 Pale Sinister=@1 треть справа +@1 Chief=@1 треть сверху +@1 Chevron=@1 треугольник снизу +@1 Chevron Inverted=@1 треугольник сверху +@1 Base Indented=@1 гребешки снизу +@1 Chief Indented=@1 гребешки сверху +And one additional layer=И один дополнительный слой +And @1 additional layers=И @1 дополнительных слоёв +Paintable decoration=Раскрашиваемая декорация +Preview Banner=Предпросмотр баннера \ No newline at end of file diff --git a/mods/ITEMS/mcl_banners/locale/template.txt b/mods/ITEMS/mcl_banners/locale/template.txt index cb8ec0b0c..315e8c783 100644 --- a/mods/ITEMS/mcl_banners/locale/template.txt +++ b/mods/ITEMS/mcl_banners/locale/template.txt @@ -75,3 +75,4 @@ You can copy the pattern of a banner by placing two banners of the same color in And one additional layer= And @1 additional layers= Paintable decoration= +Preview Banner= diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 85873f3c6..dc4527c78 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -248,7 +248,7 @@ function mcl_beds.register_bed(name, def) paramtype2 = "facedir", is_ground_content = false, -- FIXME: Should be bouncy=66, but this would be a higher bounciness than slime blocks! - groups = {handy = 1, flammable = 3, bed = 2, dig_by_piston=1, bouncy=33, fall_damage_add_percent=-50, not_in_creative_inventory = 1}, + groups = {handy = 1, flammable = -1, bed = 2, dig_by_piston=1, bouncy=33, fall_damage_add_percent=-50, not_in_creative_inventory = 1}, _mcl_hardness = 0.2, _mcl_blast_resistance = 1, sounds = def.sounds or default_sounds, @@ -275,5 +275,3 @@ function mcl_beds.register_bed(name, def) doc.add_entry_alias("nodes", name.."_bottom", "nodes", name.."_top") end - - diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr index 8093e95fb..85e582cd4 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr @@ -1,28 +1,28 @@ # textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=На кровати можно спать по ночам и заставлять ночи проходить быстрее. -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Чтобы использовать кровать, встаньте рядом и кликните по ней правой кнопкой. Вы сможете уснуть, только если солнце в закате, либо уже наступила ночь, либо идёт гроза. Кровать при этом должна в месте, свободном от любых опасностей. +Beds allow you to sleep at night and make the time pass faster.=На кровати можно спать по ночам и заставлять ночь проходить быстрее. +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Чтобы использовать кровать, встаньте рядом и кликните по ней правой кнопкой. Вы сможете уснуть, только если солнце в закате, либо уже наступила ночь, либо идёт гроза. Кровать при этом должна в безопасном месте. You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Вы слышали о других мирах, где кровать становится стартовой точкой для вашей следующей жизни. Но этот мир не такой. By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Воспользовавшись кроватью, вы устанавливаете стартовую точку для вашей следующей жизни. Если вы умрёте, ваша новая жизнь начнётся в этой кровати, если она не уничтожена и не загромождена. -In this world, going to bed won't skip the night, but it will skip thunderstorms.=В этом мире использование кровати не заставит ночь пройти скорее, но может сократить время грозового шторма. -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Сон позволяет вам пропустить ночь. Если все игроки в этом мире лягут спать, ночь будет пропущена. Она закончится буквально через несколько секунд. Таким же способом можно пропускать грозы. +In this world, going to bed won't skip the night, but it will skip thunderstorms.=В этом мире использование кровати не заставит ночь пройти быстрее, но может сократить время грозового шторма. +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Сон позволяет вам пропустить ночь. Если все игроки в этом мире лягут спать, ночь будет пропущена. Она пропустится через несколько секунд после сна. Таким же способом можно пропускать грозу. Bed=Кровать Red Bed=Красная кровать Blue Bed=Синяя кровать -Cyan Bed=Голубая кровать +Cyan Bed=Бирюзовая кровать Grey Bed=Серая кровать Light Grey Bed=Светло-серая кровать Black Bed=Чёрная кровать Yellow Bed=Жёлтая кровать Green Bed=Зелёная кровать -Magenta Bed=Фиолетовая кровать +Magenta Bed=Сиреневая кровать Orange Bed=Оранжевая кровать -Purple Bed=Пурпурная кровать +Purple Bed=Фиолетовая кровать Brown Bed=Коричневая кровать Pink Bed=Розовая кровать -Lime Bed=Зелёная лаймовая кровать -Light Blue Bed=Светло-голубая кровать +Lime Bed=Лаймовая кровать +Light Blue Bed=Голубая кровать White Bed=Белая кровать -You can't sleep, the bed's too far away!=Не удаётся лечь, кровать слишком далеко! +You can't sleep, the bed's too far away!=Вы не можете спать, кровать слишком далеко! This bed is already occupied!=Эта кровать уже занята! You have to stop moving before going to bed!=Вам нужно перестать двигаться, чтобы лечь! You can't sleep now, monsters are nearby!=Вы не можете спать, монстры слишком близко! @@ -31,10 +31,10 @@ It's too dangerous to sleep here!=Спать здесь слишком опас New respawn position set! But you can only sleep at night or during a thunderstorm.=Новая точка возрождения успешно задана! Но спать вы можете только ночью или во время грозы. You can only sleep at night or during a thunderstorm.=Вы можете спать только ночью или во время грозы. New respawn position set!=Задана новая точка возрождения! -Leave bed=Покинуть кровать -Abort sleep=Прервать сон +Leave bed=Встать с кровати +Abort sleep=Проснуться Players in bed: @1/@2=Игроков в кроватях: @1/@2 -Note: Night skip is disabled.=Предупреждение: Пропускание ночи отключено. +Note: Night skip is disabled.=Предупреждение: Пропуск ночи отключен. You're sleeping.=Вы спите... You will fall asleep when all players are in bed.=Вы уснёте, когда лягут все игроки. You're in bed.=Вы в кровати. diff --git a/mods/ITEMS/mcl_blackstone/depends.txt b/mods/ITEMS/mcl_blackstone/depends.txt deleted file mode 100644 index c1ada2d4e..000000000 --- a/mods/ITEMS/mcl_blackstone/depends.txt +++ /dev/null @@ -1,7 +0,0 @@ -mcl_core -screwdriver -mcl_stairs -mclx_stairs -mcl_walls -mclx_fences -mcl_torches diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index 510726dda..e1592d72c 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -544,6 +544,16 @@ for s=1, #specialstones do clust_size = 3, y_min = mcl_vars.mg_nether_min, y_max = mcl_vars.mg_nether_max, + noise_params = { + offset = 0, + scale = 1, + spread = {x=250, y=250, z=250}, + seed = 12345, + octaves = 3, + persist = 0.6, + lacunarity = 2, + flags = "defaults", + }, }) minetest.register_ore({ ore_type = "blob", @@ -554,6 +564,16 @@ for s=1, #specialstones do clust_size = 5, y_min = mcl_vars.mg_nether_min, y_max = mcl_vars.mg_nether_max, + noise_params = { + offset = 0, + scale = 1, + spread = {x=250, y=250, z=250}, + seed = 12345, + octaves = 3, + persist = 0.6, + lacunarity = 2, + flags = "defaults", + }, }) end @@ -803,46 +823,4 @@ minetest.register_craft({ { "mcl_nether:soul_sand" }, { "mcl_core:stick" }, } -}) - -minetest.register_node("mcl_blackstone:soul_lantern", { - tiles = { - "lantern_top.png", - "lantern_bottom.png", - "lantern.png", - "lantern.png", - "lantern.png", - "lantern.png", - }, - groups = {pickaxey=3}, - inventory_image = "lantern.png", - light_source = 10, - description = S("Soul Lantern"), - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - _mcl_hardness = 1, - node_box = { - type = "fixed", - fixed = { - {-0.1875, -0.5000, -0.1875, 0.1875, -0.06250, 0.1875}, - {-0.1250, -0.06250, -0.1250, 0.1250, 0.06250, 0.1250}, - {-0.06250, 0.1250, -0.006250, 0.06250, 0.1875, 0.006250}, - {-0.06250, 0.06250, -0.006250, -0.03125, 0.1250, 0.006250}, - {0.03125, 0.06250, -0.006250, 0.06250, 0.1250, 0.006250}, - } - }, - stack_max = 64, -}) - - - -minetest.register_craft({ - type = "shaped", - output = "mcl_blackstone:soul_lantern", - recipe = { - {"mcl_core:iron_nugget", "mcl_core:iron_nugget","mcl_core:iron_nugget"}, - {"mcl_core:iron_nugget", "mcl_blackstone:soul_torch", "mcl_core:iron_nugget"}, - {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"} - } -}) +}) \ No newline at end of file diff --git a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr index dee9cd15e..9766a07d5 100644 --- a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr +++ b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr @@ -1,7 +1,7 @@ # textdomain: mcl_blackstone Blackstone=Schwarzstein Polished Blackstone=Polierter Schwarzstein -Chieseled Polished Blackstone=Gemeißelter polierter Schwarzstein +Chiseled Polished Blackstone=Gemeißelter polierter Schwarzstein Polished Blackstone Bricks=Polierter Schwarzsteinziegel Basalt=Basalt Polished Basalt=Polierter Basalt diff --git a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.fr.tr b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.fr.tr new file mode 100644 index 000000000..2f70e45c8 --- /dev/null +++ b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.fr.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_blackstone +Blackstone=Roche noire +Polished Blackstone=Pierre noire +Chieseled Polished Blackstone=Pierre noire sculptée +Polished Blackstone Bricks=Briques de pierre noire +Basalt=Basalte +Polished Basalt=Basalte taillé +Blackstone Slab=Dalle de roche noire +Polished Blackstone Slab=Dalle de pierre noire +Chieseled Polished Blackstone Slab=Dalle de pierre noire sculptée +Polished Blackstone Brick Slab=Dalle de briques de pierre noire +Blackstone Stairs=Escalier de roche noire +Polished Blackstone Stairs=Escalier de pierre noire +Chieseled Polished Blackstone Stairs=Escalier de pierre noire sculptée +Polished Blackstone Brick Stairs=Escalier de briques de pierre noire +Quartz Bricks=Briques de quartz +Soul Torch=Torche des âmes +Soul Lantern=Lanterne des âmes +Soul Soil=Terre des âmes +Eternal Soul Fire=Feux éternel des âmes +Gilded Blackstone=Roche noire dorée +Nether Gold Ore=Minerai d'or du Nether +Smooth Basalt=Basalte lisse diff --git a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.ru.tr b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.ru.tr new file mode 100644 index 000000000..6975b6562 --- /dev/null +++ b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.ru.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_blackstone +Blackstone=Чернокамень +Polished Blackstone=Полированный чернокамень +Chiseled Polished Blackstone=Резной полированный чернокамень +Polished Blackstone Bricks=Полированные чернокаменные кирпичи +Basalt=Базальт +Polished Basalt=Полированный базальт +Blackstone Slab=Чернокаменная плита +Polished Blackstone Slab=Полированная чернокаменная плита +Chieseled Polished Blackstone Slab=Плита из резного полированного чернокамня +Polished Blackstone Brick Slab=Плита из полированных чернокаменных кирпичей +Blackstone Stairs=Чернокаменные ступени +Polished Blackstone Stairs=Полированные чернокаменные ступени +Chieseled Polished Blackstone Stairs=Резные полированные чернокаменные ступени +Polished Blackstone Brick Stairs=Ступени из полированных чернокаменных кирпичей +Quartz Bricks=Кварцевые кирпичи +Soul Torch=Факел душ +Soul Lantern=Лампа душ +Soul Soil=Песок душ +Eternal Soul Fire=Вечный огонь душ +Gilded Blackstone=Позолоченный чернокамень +Nether Gold Ore=Золотая руда Нижнего мира +Smooth Basalt=Гладкий базальт +Blackstone Wall=Стена из чернокамня \ No newline at end of file diff --git a/mods/ITEMS/mcl_blackstone/locale/template.txt b/mods/ITEMS/mcl_blackstone/locale/template.txt index 0af51d7d3..ec7e561ba 100644 --- a/mods/ITEMS/mcl_blackstone/locale/template.txt +++ b/mods/ITEMS/mcl_blackstone/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mcl_blackstone Blackstone= Polished Blackstone= -Chieseled Polished Blackstone= +Chiseled Polished Blackstone= Polished Blackstone Bricks= Basalt= Polished Basalt= @@ -21,3 +21,4 @@ Eternal Soul Fire= Gilded Blackstone= Nether Gold Ore= Smooth Basalt= +Blackstone Wall= diff --git a/mods/ITEMS/mcl_blackstone/mod.conf b/mods/ITEMS/mcl_blackstone/mod.conf index 42c279a0c..99c247024 100644 --- a/mods/ITEMS/mcl_blackstone/mod.conf +++ b/mods/ITEMS/mcl_blackstone/mod.conf @@ -1 +1,2 @@ name = mcl_blackstone +depends = mcl_core,screwdriver,mcl_stairs,mclx_stairs,mcl_walls,mclx_fences,mcl_torches \ No newline at end of file diff --git a/mods/ITEMS/mcl_blackstone/textures/lantern.png b/mods/ITEMS/mcl_blackstone/textures/lantern.png deleted file mode 100644 index a0cec3cbf..000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/lantern.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/lantern_bottom.png b/mods/ITEMS/mcl_blackstone/textures/lantern_bottom.png deleted file mode 100644 index b424385a2..000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/lantern_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/lantern_top.png b/mods/ITEMS/mcl_blackstone/textures/lantern_top.png deleted file mode 100644 index 60e85591a..000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/lantern_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr b/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr index 7024cf5d0..0840f9645 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr @@ -1,6 +1,6 @@ # textdomain: mcl_books Book=Livre -Books are used to make bookshelves and book and quills.=Les livres sont utilisés pour fabriquer des étagères et des livres et des plumes. +Books are used to make bookshelves and book and quills.=Les livres sont utilisés pour fabriquer des étagères et des livres avec une plumes. “@1”="@1" Copy of “@1”=Copie de "@1" Copy of Copy of “@1”=Copie de Copie de "@1" @@ -24,5 +24,5 @@ Hold it in your hand, then rightclick to read the book.=Tenez-le dans votre main To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Pour copier le texte du livre écrit, placez-le dans la grille d'artisanat avec un livre et une plume (ou plusieurs de ceux-ci) et de l'artisanat. Le livre écrit ne sera pas consommé. Les copies de copies ne peuvent pas être copiées. Bookshelf=Bibliothèque Bookshelves are used for decoration.=Les bibliothèques sont utilisées pour la décoration. -Book and Quill=Livre et Plume -Write down some notes=Notez quelques notes +Book and Quill=Livre avec une Plume +Write down some notes=Prenez quelques notes diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr b/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr index a4cc9804c..6aac7c8d3 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr @@ -10,7 +10,7 @@ by @1=игрока @1 Sign=Подписать Done=Готово This item can be used to write down some notes.=Этот предмет можно использовать для записи заметок. -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Удерживая его в руке, кликните правой, чтобы прочитать текущие записи и отредактировать. Вы можете редактировать текст, сколько захотите. Вы также можете подписать книгу, что превратит её в подписанную книгу, её можно будет уложить в стопку с другими такими же, но больше нельзя будет редактировать. +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Удерживая книгу в руке, кликните правой кнопкой мыши, чтобы прочитать текущие записи и отредактировать их. Вы можете редактировать текст сколько угодно. Вы также можете подписать книгу, что превратит её в подписанную книгу, её можно будет уложить в стопку с другими такими же, но больше нельзя будет редактировать. A book can hold up to 4500 characters. The title length is limited to 64 characters.=Книга может содержать до 4500 символов. Длина названия ограничена 64 символами. Enter book title:=Введите название книги by @1=игрока @1 @@ -20,9 +20,9 @@ Cancel=Отмена Nameless Book=Безымянная книга Written Book=Подписанная книга Written books contain some text written by someone. They can be read and copied, but not edited.=Подписанная книга содержит текст, написанный кем-то. Она может быть прочитана и скопирована, но её нельзя редактировать. -Hold it in your hand, then rightclick to read the book.=Удерживая в руке, кликните правой, чтобы прочитать книгу. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Чтобы скопировать текст подписанной книги, поместите её в крафтинговую решётку вместе с книгой с пером (или сразу несколькими) и скрафтите. Подписанная книга не израсходуется. Не могут быть скопированы копии копий. +Hold it in your hand, then rightclick to read the book.=Удерживая в руке, кликните правой кнопкой мыши, чтобы прочитать книгу. +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Чтобы скопировать текст подписанной книги, поместите её в сетку крафта вместе с книгой с пером (или сразу несколькими) и скрафтите. Подписанная книга не израсходуется. Копии копий нельзя скопировать. Bookshelf=Книжная полка -Bookshelves are used for decoration.=Книжные полки используют в качестве украшений +Bookshelves are used for decoration.=Книжные полки используют в качестве декораций Book and Quill=Книга с пером Write down some notes=Сделайте какие-нибудь записи diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index e8efa6662..5cbafce62 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -73,7 +73,8 @@ local ARROW_ENTITY={ _stuckin=nil, --Position of node in which arow is stuck. _shooter=nil, -- ObjectRef of player or mob who shot it _is_arrow = true, - + _in_player = false, + _blocked = false, _viscosity=0, -- Viscosity of node the arrow is currently in _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession } @@ -82,7 +83,7 @@ local ARROW_ENTITY={ local function spawn_item(self, pos) if not minetest.is_creative_enabled("") then local item = minetest.add_item(pos, "mcl_bows:arrow") - item:set_velocity({x=0, y=0, z=0}) + item:set_velocity(vector.new(0, 0, 0)) item:set_yaw(self.object:get_yaw()) end mcl_burning.extinguish(self.object) @@ -94,12 +95,10 @@ local function damage_particles(pos, is_critical) minetest.add_particlespawner({ amount = 15, time = 0.1, - minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5}, - maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5}, - minvel = {x=-0.1, y=-0.1, z=-0.1}, - maxvel = {x=0.1, y=0.1, z=0.1}, - minacc = {x=0, y=0, z=0}, - maxacc = {x=0, y=0, z=0}, + minpos = vector.offset(pos, -0.5, -0.5, -0.5), + maxpos = vector.offset(pos, 0.5, 0.5, 0.5), + minvel = vector.new(-0.1, -0.1, -0.1), + maxvel = vector.new(0.1, 0.1, 0.1), minexptime = 1, maxexptime = 2, minsize = 1.5, @@ -146,7 +145,7 @@ function ARROW_ENTITY.on_step(self, dtime) -- Pickup arrow if player is nearby (not in Creative Mode) local objects = minetest.get_objects_inside_radius(pos, 1) for _,obj in ipairs(objects) do - if obj:is_player() then + if mcl_util and mcl_util.is_player(obj) then if self._collectable and not minetest.is_creative_enabled(obj:get_player_name()) then if obj:get_inventory():room_for_item("main", "mcl_bows:arrow") then obj:get_inventory():add_item("main", "mcl_bows:arrow") @@ -200,7 +199,7 @@ function ARROW_ENTITY.on_step(self, dtime) for k, obj in pairs(objs) do local ok = false -- Arrows can only damage players and mobs - if obj:is_player() then + if mcl_util and mcl_util.is_player(obj) then ok = true elseif obj:get_luaentity() then if (obj:get_luaentity()._cmi_is_mob or obj:get_luaentity()._hittable_by_projectile) then @@ -224,7 +223,7 @@ function ARROW_ENTITY.on_step(self, dtime) if closest_object then local obj = closest_object - local is_player = obj:is_player() + local is_player = mcl_util and mcl_util.is_player(obj) local lua = obj:get_luaentity() if obj == self._shooter and self._time_in_air > 1.02 or obj ~= self._shooter and (is_player or (lua and (lua._cmi_is_mob or lua._hittable_by_projectile))) then if obj:get_hp() > 0 then @@ -248,50 +247,59 @@ function ARROW_ENTITY.on_step(self, dtime) -- Punch target object but avoid hurting enderman. if not lua or lua.name ~= "mobs_mc:enderman" then - if self._in_player == false then + if not self._in_player then damage_particles(self.object:get_pos(), self._is_critical) end if mcl_burning.is_burning(self.object) then mcl_burning.set_on_fire(obj, 5) end - if self._in_player == false then + if not self._in_player and not self._blocked then obj:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups={fleshy=self._damage}, }, self.object:get_velocity()) - if obj:is_player() then - local placement - self._placement = math.random(1, 2) - if self._placement == 1 then - placement = "front" + if mcl_util and mcl_util.is_player(obj) then + if not mcl_shields.is_blocking(obj) then + local placement + self._placement = math.random(1, 2) + if self._placement == 1 then + placement = "front" + else + placement = "back" + end + self._in_player = true + if self._placement == 2 then + self._rotation_station = 90 + else + self._rotation_station = -90 + end + self._y_position = random_arrow_positions("y", placement) + self._x_position = random_arrow_positions("x", placement) + if self._y_position > 6 and self._x_position < 2 and self._x_position > -2 then + self._attach_parent = "Head" + self._y_position = self._y_position - 6 + elseif self._x_position > 2 then + self._attach_parent = "Arm_Right" + self._y_position = self._y_position - 3 + self._x_position = self._x_position - 2 + elseif self._x_position < -2 then + self._attach_parent = "Arm_Left" + self._y_position = self._y_position - 3 + self._x_position = self._x_position + 2 + else + self._attach_parent = "Body" + end + self._z_rotation = math.random(-30, 30) + self._y_rotation = math.random( -30, 30) + self.object:set_attach( + obj, self._attach_parent, + vector.new(self._x_position, self._y_position, random_arrow_positions("z", placement)), + vector.new(0, self._rotation_station + self._y_rotation, self._z_rotation) + ) else - placement = "back" + self._blocked = true + self.object:set_velocity(vector.multiply(self.object:get_velocity(), -0.25)) end - self._in_player = true - if self._placement == 2 then - self._rotation_station = 90 - else - self._rotation_station = -90 - end - self._y_position = random_arrow_positions("y", placement) - self._x_position = random_arrow_positions("x", placement) - if self._y_position > 6 and self._x_position < 2 and self._x_position > -2 then - self._attach_parent = "Head" - self._y_position = self._y_position - 6 - elseif self._x_position > 2 then - self._attach_parent = "Arm_Right" - self._y_position = self._y_position - 3 - self._x_position = self._x_position - 2 - elseif self._x_position < -2 then - self._attach_parent = "Arm_Left" - self._y_position = self._y_position - 3 - self._x_position = self._x_position + 2 - else - self._attach_parent = "Body" - end - self._z_rotation = math.random(-30, 30) - self._y_rotation = math.random( -30, 30) - self.object:set_attach(obj, self._attach_parent, {x=self._x_position,y=self._y_position,z=random_arrow_positions("z", placement)}, {x=0,y=self._rotation_station + self._y_rotation,z=self._z_rotation}) minetest.after(150, function() self.object:remove() end) @@ -301,7 +309,7 @@ function ARROW_ENTITY.on_step(self, dtime) if is_player then - if self._shooter and self._shooter:is_player() and self._in_player == false then + if self._shooter and (mcl_util and mcl_util.is_player(self._shooter)) and not self._in_player and not self._blocked then -- “Ding” sound for hitting another player minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter:get_player_name()}, true) end @@ -312,17 +320,18 @@ function ARROW_ENTITY.on_step(self, dtime) -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> -- TODO: This achievement should be given for the kill, not just a hit - if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then + if self._shooter and (mcl_util and mcl_util.is_player(self._shooter)) and vector.distance(pos, self._startpos) >= 20 then if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") end end end - if self._in_player == false then + if not self._in_player and not self._blocked then + minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) end end - if not obj:is_player() then + if not mcl_util or not mcl_util.is_player(obj) then mcl_burning.extinguish(self.object) if self._piercing == 0 then self.object:remove() @@ -344,9 +353,9 @@ function ARROW_ENTITY.on_step(self, dtime) local dir if math.abs(vel.y) < 0.00001 then if self._lastpos.y < pos.y then - dir = {x=0, y=1, z=0} + dir = vector.new(0, 1, 0) else - dir = {x=0, y=-1, z=0} + dir = vector.new(0, -1, 0) end else dir = minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(self.object:get_yaw()-YAW_OFFSET))) @@ -374,8 +383,8 @@ function ARROW_ENTITY.on_step(self, dtime) self._stucktimer = 0 self._stuckrechecktimer = 0 - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=0, z=0}) + self.object:set_velocity(vector.new(0, 0, 0)) + self.object:set_acceleration(vector.new(0, 0, 0)) minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) @@ -419,12 +428,8 @@ function ARROW_ENTITY.on_step(self, dtime) self.object:set_rotation({ x = 0, y = yaw, z = pitch }) end - if self._in_player and not self.object:get_attach() then - self.object:remove() - end - -- Update internal variable - self._lastpos={x=pos.x, y=pos.y, z=pos.z} + self._lastpos = pos end -- Force recheck of stuck arrows when punched. @@ -436,6 +441,7 @@ function ARROW_ENTITY.on_punch(self) end function ARROW_ENTITY.get_staticdata(self) + if not self then return end local out = { lastpos = self._lastpos, startpos = self._startpos, @@ -443,6 +449,7 @@ function ARROW_ENTITY.get_staticdata(self) is_critical = self._is_critical, stuck = self._stuck, stuckin = self._stuckin, + stuckin_player = self._in_player, } if self._stuck then -- If _stucktimer is missing for some reason, assume the maximum @@ -451,7 +458,7 @@ function ARROW_ENTITY.get_staticdata(self) end out.stuckstarttime = minetest.get_gametime() - self._stucktimer end - if self._shooter and self._shooter:is_player() then + if self._shooter and mcl_util and mcl_util.is_player(self._shooter) then out.shootername = self._shooter:get_player_name() end return minetest.serialize(out) @@ -459,7 +466,6 @@ end function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) self._time_in_air = 1.0 - self._in_player = false local data = minetest.deserialize(staticdata) if data then self._stuck = data.stuck @@ -488,14 +494,27 @@ function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) self._is_critical = data.is_critical if data.shootername then local shooter = minetest.get_player_by_name(data.shootername) - if shooter and shooter:is_player() then + if shooter and mcl_util and mcl_util.is_player(shooter) then self._shooter = shooter end end + + if data.stuckin_player then + self.object:remove() + end end self.object:set_armor_groups({ immortal = 1 }) end +minetest.register_on_respawnplayer(function(player) + for _, obj in pairs(player:get_children()) do + local ent = obj:get_luaentity() + if ent and ent.name and string.find(ent.name, "mcl_bows:arrow_entity") then + obj:remove() + end + end +end) + minetest.register_entity("mcl_bows:arrow_entity", ARROW_ENTITY) if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua index 3c92a4c92..49a434c5b 100644 --- a/mods/ITEMS/mcl_bows/crossbow.lua +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -116,7 +116,7 @@ end -- Bow item, uncharged state minetest.register_tool("mcl_bows:crossbow", { - description = S("Corssbow"), + description = S("Crossbow"), _tt_help = S("Launches arrows"), _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes.").."\n".. S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), @@ -151,11 +151,11 @@ S("The speed and damage of the arrow increases the longer you charge. The regula }) minetest.register_tool("mcl_bows:crossbow_loaded", { - description = S("Corssbow"), + description = S("Crossbow"), _tt_help = S("Launches arrows"), - _doc_items_longdesc = S("Corssbow are ranged weapons to shoot arrows at your foes.").."\n".. + _doc_items_longdesc = S("Crossbow is a ranged weapon to shoot arrows at your foes.").."\n".. S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), - _doc_items_usagehelp = S("To use the corssbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse."), + _doc_items_usagehelp = S("To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse."), _doc_items_durability = BOW_DURABILITY, inventory_image = "mcl_bows_crossbow_3.png", wield_scale = mcl_vars.tool_wield_scale, diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr index 313081e48..6cbe098f5 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr @@ -2,12 +2,12 @@ Arrow=Flèche Arrows are ammunition for bows and dispensers.=Les flèches sont des munitions pour les arcs et les distributeurs. An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Une flèche tirée d'un arc a des dégâts réguliers de 1 à 9. À pleine charge, il y a 20% de chances qu'un coup critique inflige 10 dégâts à la place. Une flèche tirée depuis un distributeur inflige toujours 3 dégâts. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Les flèches peuvent se coincer sur des blocs solides et peuvent être récupérées à nouveau. Ils sont également capables de pousser des boutons en bois. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Pour utiliser des flèches comme munitions pour un arc, il suffit de les placer n'importe où dans votre inventaire, elles seront utilisées automatiquement. Pour utiliser des flèches comme munitions pour un distributeur, placez-les dans l'inventaire du distributeur. Pour récupérer une flèche qui colle dans un bloc, il vous suffit de vous en approcher. +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Les flèches peuvent se coincer sur des blocs solides et peuvent être récupérées à nouveau. Elles sont également capables de pousser des boutons en bois. +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Pour utiliser des flèches comme munitions pour un arc, il suffit de les placer n'importe où dans votre inventaire, elles seront utilisées automatiquement. Pour utiliser des flèches comme munitions pour un distributeur, placez-les dans l'inventaire du distributeur. Pour récupérer une flèche qui accrochée à un bloc, il vous suffit de vous en approcher. Bow=Arc Bows are ranged weapons to shoot arrows at your foes.=Les arcs sont des armes à distance pour tirer des flèches sur vos ennemis. -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=La vitesse et les dégâts de la flèche augmentent plus vous chargez. Les dégâts réguliers de la flèche sont compris entre 1 et 9. À pleine charge, il y a également 20% d'un coup critique, infligeant 10 dégâts à la place. -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Pour utiliser l'arc, vous devez d'abord avoir au moins une flèche n'importe où dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour tirer. +The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=La vitesse et les dégâts de la flèche augmentent plus vous chargez. Les dégâts réguliers de la flèche sont compris entre 1 et 9. À pleine charge, il y a également 20% de chances de faire un coup critique, infligeant 10 dégâts à la place. +To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Pour utiliser l'arc, vous devez d'abord avoir au moins une flèche quelque part dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour tirer. Bow=Arc Ammunition=Munition Damage from bow: 1-10=Dégâts de l'arc: 1-10 diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr index 6a1b7ed31..ef6136239 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr @@ -1,15 +1,18 @@ # textdomain: mcl_bows Arrow=Стрела -Arrows are ammunition for bows and dispensers.=Стрелы - это боеприпасы для луков и диспенсеров. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Стрела, выпущенная из лука, обычно наносит урон 1-9. При полном натяжении есть 20-процентный шанс критического удара с уроном 10. Стрела из диспенсера всегда наносит урон уровня 3. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Стрелы могут застревать в твёрдых блоках, их можно подбирать для повторного использования. Они также способны нажимать деревянные кнопки. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Чтобы использовать стрелы в качестве боеприпасов для лука, просто положите их в любую ячейку вашего инвентаря, и они будут использоваться автоматически. Чтобы использовать стрелы в качестве боеприпасов для диспенсера, поместите их в инвентарь диспенсера. Чтобы взять стрелу, застрявшую в блоке, просто пройдите рядом с ней. +Arrows are ammunition for bows and dispensers.=Стрелы - это боеприпасы для луков и раздатчиков. +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Стрела, выпущенная из лука, обычно наносит урон 1-9. При полном натяжении есть шанс в 20% для критического удара с уроном 10. Стрела из раздатчика всегда наносит урон 3. +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Стрелы могут застревать в твёрдых блоках, тогда их можно снова подобрать. Стрелы также способны нажимать деревянные кнопки. +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Чтобы использовать стрелы в качестве боеприпасов для лука, просто положите их в любую ячейку вашего инвентаря, и они будут использоваться автоматически. Чтобы использовать стрелы в качестве боеприпасов для раздатчика, поместите их в инвентарь раздатчика. Чтобы взять стрелу, застрявшую в блоке, просто пройдите рядом с ней. Bow=Лук -Bows are ranged weapons to shoot arrows at your foes.=Лук - это оружие дальнего боя, чтобы стрелять стрелами по вашим врагам. +Bows are ranged weapons to shoot arrows at your foes.=Лук - это оружие дальнего боя, позволяющее стрелять стрелами в ваших врагов. The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=Скорость и урон стрелы увеличиваются, пока вы её натягиваете. Обычный урон стрелы находится между 1 и 9. При полном натяжении есть 20-процентный шанс критического удара с уроном 10. To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Чтобы использовать лук, нужно иметь хотя бы одну стрелу в вашем инвентаре (за исключением творческого режима). Удерживайте правую клавишу мыши, чтобы натягивать тетиву, затем отпустите, чтобы выстрелить. Bow=Лук Ammunition=Боеприпасы Damage from bow: 1-10=Урон от лука: 1-10 -Damage from dispenser: 3=Урон от диспенсера: 3 -Launches arrows=Пускает стрелы +Damage from dispenser: 3=Урон от раздатчика: 3 +Launches arrows=Выпускает стрелы +Crossbow=Арбалет +Crossbow is a ranged weapon to shoot arrows at your foes.=Арбалет - это оружие дальнего боя, позволяющее стрелять стрелами в ваших врагов. +To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse.=Чтобы использовать арбалет, нужно иметь хотя бы одну стрелу в вашем инвентаре (за исключением творческого режима). Удерживайте правую клавишу мыши, чтобы зарядить стрелу, затем нажмите левую кнопку мыши, чтобы выстрелить. diff --git a/mods/ITEMS/mcl_bows/locale/template.txt b/mods/ITEMS/mcl_bows/locale/template.txt index 228b61709..49afe3551 100644 --- a/mods/ITEMS/mcl_bows/locale/template.txt +++ b/mods/ITEMS/mcl_bows/locale/template.txt @@ -13,3 +13,6 @@ Ammunition= Damage from bow: 1-10= Damage from dispenser: 3= Launches arrows= +Crossbow= +Crossbow is a ranged weapon to shoot arrows at your foes.= +To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse.= diff --git a/mods/ITEMS/mcl_bows/mod.conf b/mods/ITEMS/mcl_bows/mod.conf index 79ae42436..a23eb72ab 100644 --- a/mods/ITEMS/mcl_bows/mod.conf +++ b/mods/ITEMS/mcl_bows/mod.conf @@ -1,6 +1,6 @@ name = mcl_bows author = Arcelmi description = This mod adds bows and arrows for MineClone 2. -depends = controls, mcl_particles, mcl_enchanting, mcl_init +depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_shields optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button diff --git a/mods/ITEMS/mcl_bows/rocket.lua b/mods/ITEMS/mcl_bows/rocket.lua index 678aba4d4..cac466376 100644 --- a/mods/ITEMS/mcl_bows/rocket.lua +++ b/mods/ITEMS/mcl_bows/rocket.lua @@ -38,11 +38,14 @@ local function damage_explosion(self, damagemulitplier) for _,obj in pairs(objects) do if obj:is_player() then mcl_util.deal_damage(obj, damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos()), {type = "explosion"}) - elseif obj:get_luaentity()._cmi_is_mob then - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos())}, - }, self.object:get_velocity()) + else + local entity = obj:get_luaentity() + if entity and entity._cmi_is_mob then + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos())}, + }, self.object:get_velocity()) + end end end end @@ -627,6 +630,7 @@ function ARROW_ENTITY.on_punch(self) end function ARROW_ENTITY.get_staticdata(self) + if not self then return end local out = { lastpos = self._lastpos, startpos = self._startpos, diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.fr.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.fr.tr index 232026fba..64dcd8d6e 100644 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.fr.tr +++ b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.fr.tr @@ -3,8 +3,8 @@ Brewing Stand=Alambic Inventory=Inventaire To use a brewing stand, rightclick it.=Pour utiliser un alambic, faites un clic droit dessus. To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Pour distiller, vous avez besoin de poudre de blaze comme carburant, d'un ingrédient à distiller et d'au moins 1 bouteille en verre remplie d'un liquide. -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Placez la poudre de blaze dans l'emplacement de gauche, l'ingrédient à distiller dans l'emplacement du milieu et 1 à 3 bouteilles dans les emplacements restantes. +Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Placez la poudre de blaze dans l'emplacement de gauche, l'ingrédient à distiller dans l'emplacement du milieu et 1 à 3 bouteilles dans les emplacements restants. When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Lorsque vous avez trouvé une bonne combinaison, la distillation commencera automatiquement et de la vapeur commencera à apparaître, consommant le carburant et l'ingrédient à distiller. Les potions seront bientôt prêtes. Different combinations of brewing materials and liquids will give different results. Try to experiment!=Différentes combinaisons d'ingrédients et de liquides donneront des résultats différents. Essayez d'expérimenter! The stand allows you to brew potions!=L'alambic permet de produire des potions! -Brew Potions=Potions +Brew Potions=Prépare des potions diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr index 37b96819d..170cb4133 100644 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr +++ b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr @@ -1,10 +1,10 @@ # textdomain: mcl_brewing -Brewing Stand=Варочный стенд +Brewing Stand=Варочная стойка Inventory=Инвентарь -To use a brewing stand, rightclick it.=Кликните правой, чтобы использовать варочный стенд. -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Для приготовления зелья вам понадобится огненный порошок в качестве топлива, исходный материал и как минимум 1 стеклянная бутылка, наполненная жидкостью. -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Поместите огненный порошок в левый отсек, исходный материал в средний отсек и 1-3 бутылки в оставшиеся отсеки. -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Когда вы подберёте хорошее сочетание, приготовление зелья начнётся автоматически — появится пар и начнётся расход топлива и исходного материала. Зелья вскоре будут готовы. +To use a brewing stand, rightclick it.=Кликните правой кнопкой мыши, чтобы использовать варочный стенд. +To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Для приготовления зелья вам понадобится огненный порошок в качестве топлива, варочный материал и как минимум 1 стеклянный пузырёк, наполненная жидкостью. +Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Поместите огненный порошок в левый слот, варочный материал в средний слот и 1-3 пузырька в оставшиеся слоты. +When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Когда вы подберёте хорошую комбинацию, варка зелья начнётся автоматически — появится пар и начнётся расход топлива и материала. Зелья вскоре будут готовы. Different combinations of brewing materials and liquids will give different results. Try to experiment!=Разные сочетания варочных материалов и жидкостей будут давать разные результаты. Поэкспериментируйте! -The stand allows you to brew potions!=Стенд позволяет вам варить зелья! +The stand allows you to brew potions!=Стойка позволяет вам варить зелья! Brew Potions=Зельеварение diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 931214b95..61efc02e4 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -186,8 +186,12 @@ function mcl_buckets.register_liquid(def) local undernode = get_node(pointed_thing.under) local abovenode = get_node(pointed_thing.above) - local buildable1 = minetest.registered_nodes[undernode.name] and minetest.registered_nodes[undernode.name].buildable_to - local buildable2 = minetest.registered_nodes[abovenode.name] and minetest.registered_nodes[abovenode.name].buildable_to + local name1, name2 = undernode.name, abovenode.name + local regnode1, regnode2 = minetest.registered_nodes[name1], minetest.registered_nodes[name2] + + local buildable1 = regnode1 and (regnode1.buildable_to or regnode1.groups.cauldron == 1) + local buildable2 = regnode2 and (regnode2.buildable_to or regnode2.groups.cauldron == 1) + if not buildable1 and not buildable2 then return itemstack end --if both nodes aren't buildable_to, skip if buildable1 then diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr index 9c8cd0539..87a283cc8 100644 --- a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr @@ -1,16 +1,16 @@ # textdomain: mcl_buckets Empty Bucket=Пустое ведро A bucket can be used to collect and release liquids.=Ведро может быть использовано для набора и выливания жидкостей. -Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Ударьте источник жидкости, чтобы зачерпнуть его. После этого вы можете в ведре перенести жидкость в другое место. +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Ударьте ведром источник жидкости, чтобы зачерпнуть его. После этого вы можете в ведре перенести жидкость в другое место. Lava Bucket=Ведро лавы A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=Ведро может быть использовано для набора и выливания жидкостей. Это ведро наполнено лавой, которая безопасно хранится внутри. Используйте с осторожностью. -Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Стоя на безопасном расстоянии, поместите ведро в пустоту, чтобы создать источник лавы на этом участке. +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Стоя на безопасном расстоянии, используйте ведро на пустом месте, чтобы создать источник лавы на этом участке. Water Bucket=Ведро воды A bucket can be used to collect and release liquids. This one is filled with water.=Ведро может быть использовано для набора и выливания жидкостей. Это ведро наполнено водой. -Place it to empty the bucket and create a water source.=Поместите ведро на пустой участок для создания водного источника. +Place it to empty the bucket and create a water source.=Используйте ведро на пустом месте для создания источника воды. River Water Bucket=Ведро речной воды A bucket can be used to collect and release liquids. This one is filled with river water.=Ведро может быть использовано для набора и выливания жидкостей. Это ведро наполнено речной водой. -Place it to empty the bucket and create a river water source.=Поместите ведро на пустой участок для создания источника речной воды. +Place it to empty the bucket and create a river water source.=Используйте ведро на пустом месте для создания источника речной воды. Collects liquids=Набирает жидкости Places a lava source=Переносит источник лавы Places a water source=Переносит источник воды diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index 104071064..6a7c1f6ca 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -1,149 +1,149 @@ ---[[ -#!#!#!#Cake mod created by Jordan4ibanez#!#!# -#!#!#!#Released under CC Attribution-ShareAlike 3.0 Unported #!#!# -]]-- - -local CAKE_HUNGER_POINTS = 2 - -local S = minetest.get_translator(minetest.get_current_modname()) - -local cake_texture = {"cake_top.png","cake_bottom.png","cake_inner.png","cake_side.png","cake_side.png","cake_side.png"} -local slice_1 = { -7/16, -8/16, -7/16, -5/16, 0/16, 7/16} -local slice_2 = { -7/16, -8/16, -7/16, -3/16, 0/16, 7/16} -local slice_3 = { -7/16, -8/16, -7/16, -1/16, 0/16, 7/16} -local slice_4 = { -7/16, -8/16, -7/16, 1/16, 0/16, 7/16} -local slice_5 = { -7/16, -8/16, -7/16, 3/16, 0/16, 7/16} -local slice_6 = { -7/16, -8/16, -7/16, 5/16, 0/16, 7/16} - -local full_cake = { -7/16, -8/16, -7/16, 7/16, 0/16, 7/16} - -minetest.register_craft({ - output = "mcl_cake:cake", - recipe = { - {"mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket"}, - {"mcl_core:sugar", "mcl_throwing:egg", "mcl_core:sugar"}, - {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, - }, - replacements = { - {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, - {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, - {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, - }, -}) - -minetest.register_node("mcl_cake:cake", { - description = S("Cake"), - _tt_help = S("With 7 tasty slices!").."\n"..S("Hunger points: +@1 per slice", CAKE_HUNGER_POINTS), - _doc_items_longdesc = S("Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken."), - _doc_items_usagehelp = S("Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full."), - tiles = {"cake_top.png","cake_bottom.png","cake_side.png","cake_side.png","cake_side.png","cake_side.png"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - inventory_image = "cake.png", - wield_image = "cake.png", - paramtype = "light", - is_ground_content = false, - drawtype = "nodebox", - selection_box = { - type = "fixed", - fixed = full_cake - }, - node_box = { - type = "fixed", - fixed = full_cake - }, - stack_max = 1, - groups = {handy=1, cake=7, food=2,no_eat_delay=1, attached_node=1, dig_by_piston=1, comparator_signal=14}, - drop = "", - on_rightclick = function(pos, node, clicker, itemstack) - -- Cake is subject to protection - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - local newcake = minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"}) - -- Check if we were allowed to eat - if newcake:get_name() ~= "mcl_cake:cake" or minetest.is_creative_enabled(clicker:get_player_name()) then - minetest.add_node(pos,{type="node",name="mcl_cake:cake_6",param2=0}) - end - end, - sounds = mcl_sounds.node_sound_leaves_defaults(), - - _food_particles = false, - _mcl_saturation = 0.4, - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.5, -}) - -local register_slice = function(level, nodebox, desc) - local this = "mcl_cake:cake_"..level - local after_eat = "mcl_cake:cake_"..(level-1) - local on_rightclick - if level > 1 then - on_rightclick = function(pos, node, clicker, itemstack) - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) - -- Check if we were allowed to eat - if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then - minetest.add_node(pos,{type="node",name=after_eat,param2=0}) - end - end - else - -- Last slice - on_rightclick = function(pos, node, clicker, itemstack) - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack("mcl:cake:cake 0"), ItemStack("mcl_cake:cake_1"), clicker, {type="nothing"}) - -- Check if we were allowed to eat - if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then - minetest.remove_node(pos) - minetest.check_for_falling(pos) - end - end - end - - minetest.register_node(this, { - description = desc, - _doc_items_create_entry = false, - tiles = cake_texture, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - is_ground_content = false, - drawtype = "nodebox", - selection_box = { - type = "fixed", - fixed = nodebox, - }, - node_box = { - type = "fixed", - fixed = nodebox, - }, - groups = {handy=1, cake=level, food=2,no_eat_delay=1,attached_node=1,not_in_creative_inventory=1,dig_by_piston=1,comparator_signal=level*2}, - drop = "", - on_rightclick = on_rightclick, - sounds = mcl_sounds.node_sound_leaves_defaults(), - - _food_particles = false, - _mcl_saturation = 0.4, - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.5, - }) - - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_cake:cake", "nodes", "mcl_cake:cake_"..level) - end -end - -register_slice(6, slice_6, S("Cake (6 Slices Left)")) -register_slice(5, slice_5, S("Cake (5 Slices Left)")) -register_slice(4, slice_4, S("Cake (4 Slices Left)")) -register_slice(3, slice_3, S("Cake (3 Slices Left)")) -register_slice(2, slice_2, S("Cake (2 Slices Left)")) -register_slice(1, slice_1, S("Cake (1 Slice Left)")) +--[[ +#!#!#!#Cake mod created by Jordan4ibanez#!#!# +#!#!#!#Released under CC Attribution-ShareAlike 3.0 Unported #!#!# +]]-- + +local CAKE_HUNGER_POINTS = 2 + +local S = minetest.get_translator(minetest.get_current_modname()) + +local cake_texture = {"cake_top.png","cake_bottom.png","cake_inner.png","cake_side.png","cake_side.png","cake_side.png"} +local slice_1 = { -7/16, -8/16, -7/16, -5/16, 0/16, 7/16} +local slice_2 = { -7/16, -8/16, -7/16, -3/16, 0/16, 7/16} +local slice_3 = { -7/16, -8/16, -7/16, -1/16, 0/16, 7/16} +local slice_4 = { -7/16, -8/16, -7/16, 1/16, 0/16, 7/16} +local slice_5 = { -7/16, -8/16, -7/16, 3/16, 0/16, 7/16} +local slice_6 = { -7/16, -8/16, -7/16, 5/16, 0/16, 7/16} + +local full_cake = { -7/16, -8/16, -7/16, 7/16, 0/16, 7/16} + +minetest.register_craft({ + output = "mcl_cake:cake", + recipe = { + {"mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket"}, + {"mcl_core:sugar", "mcl_throwing:egg", "mcl_core:sugar"}, + {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, + }, + replacements = { + {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, + {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, + {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, + }, +}) + +minetest.register_node("mcl_cake:cake", { + description = S("Cake"), + _tt_help = S("With 7 tasty slices!").."\n"..S("Hunger points: +@1 per slice", CAKE_HUNGER_POINTS), + _doc_items_longdesc = S("Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken."), + _doc_items_usagehelp = S("Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full."), + tiles = {"cake_top.png","cake_bottom.png","cake_side.png","cake_side.png","cake_side.png","cake_side.png"}, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + inventory_image = "cake.png", + wield_image = "cake.png", + paramtype = "light", + is_ground_content = false, + drawtype = "nodebox", + selection_box = { + type = "fixed", + fixed = full_cake + }, + node_box = { + type = "fixed", + fixed = full_cake + }, + stack_max = 1, + groups = {handy=1, cake=7, food=2, no_eat_delay=1, compostability=100, attached_node=1, dig_by_piston=1, comparator_signal=14}, + drop = "", + on_rightclick = function(pos, node, clicker, itemstack) + -- Cake is subject to protection + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + local newcake = minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"}) + -- Check if we were allowed to eat + if newcake:get_name() ~= "mcl_cake:cake" or minetest.is_creative_enabled(clicker:get_player_name()) then + minetest.add_node(pos,{type="node",name="mcl_cake:cake_6",param2=0}) + end + end, + sounds = mcl_sounds.node_sound_leaves_defaults(), + + _food_particles = false, + _mcl_saturation = 0.4, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +local register_slice = function(level, nodebox, desc) + local this = "mcl_cake:cake_"..level + local after_eat = "mcl_cake:cake_"..(level-1) + local on_rightclick + if level > 1 then + on_rightclick = function(pos, node, clicker, itemstack) + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) + -- Check if we were allowed to eat + if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then + minetest.add_node(pos,{type="node",name=after_eat,param2=0}) + end + end + else + -- Last slice + on_rightclick = function(pos, node, clicker, itemstack) + local name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack("mcl:cake:cake 0"), ItemStack("mcl_cake:cake_1"), clicker, {type="nothing"}) + -- Check if we were allowed to eat + if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then + minetest.remove_node(pos) + minetest.check_for_falling(pos) + end + end + end + + minetest.register_node(this, { + description = desc, + _doc_items_create_entry = false, + tiles = cake_texture, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + paramtype = "light", + is_ground_content = false, + drawtype = "nodebox", + selection_box = { + type = "fixed", + fixed = nodebox, + }, + node_box = { + type = "fixed", + fixed = nodebox, + }, + groups = {handy=1, cake=level, food=2, no_eat_delay=1, compostability=100, attached_node=1, not_in_creative_inventory=1, dig_by_piston=1, comparator_signal=level*2}, + drop = "", + on_rightclick = on_rightclick, + sounds = mcl_sounds.node_sound_leaves_defaults(), + + _food_particles = false, + _mcl_saturation = 0.4, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + }) + + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_cake:cake", "nodes", "mcl_cake:cake_"..level) + end +end + +register_slice(6, slice_6, S("Cake (6 Slices Left)")) +register_slice(5, slice_5, S("Cake (5 Slices Left)")) +register_slice(4, slice_4, S("Cake (4 Slices Left)")) +register_slice(3, slice_3, S("Cake (3 Slices Left)")) +register_slice(2, slice_2, S("Cake (2 Slices Left)")) +register_slice(1, slice_1, S("Cake (1 Slice Left)")) diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr index 50a5b34c1..9cb85d84c 100644 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr @@ -1,12 +1,12 @@ # textdomain: mcl_cake Cake=Торт -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Торты можно есть, восстанавливая очки голода, а также размещать на других блоках. Торт состоит из 7 кусочков. Каждый кусочек восстанавливает 2 очка голода и 0.4 очка сытости. Торты уничтожаются при выкапывании или разрушении нижестоящего блока. -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Поместите торт куда-нибудь, затем кликните правой, чтобы съесть кусочек. +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Торты можно разместить на блоке и съесть, чтобы восстановить очки голода. Торт состоит из 7 кусочков. Каждый кусочек восстанавливает 2 очка голода и 0.4 очка насыщения. Торты уничтожаются при выкапывании или разрушении нижестоящего блока. +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Поместите торт куда-нибудь, затем кликните правой кнопкой мыши, чтобы съесть кусочек. Cake (6 Slices Left)=Торт (осталось 6 кусочков) Cake (5 Slices Left)=Торт (осталось 5 кусочков) Cake (4 Slices Left)=Торт (осталось 4 кусочка) Cake (3 Slices Left)=Торт (осталось 3 кусочка) Cake (2 Slices Left)=Торт (осталось 2 кусочка) Cake (1 Slice Left)=Торт (остался 1 кусочек) -With 7 tasty slices!=Из 7 вкусных кусочков -Hunger points: +@1 per slice=Очки голода: +@1 с каждым куском +With 7 tasty slices!=Из 7 вкусных кусочков! +Hunger points: +@1 per slice=Очки голода: +@1 на каждый кусочек diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr index fe1d9aa81..fa2ae6874 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr @@ -1,4 +1,4 @@ -# textdomain: mcl_cauldron +# textdomain: mcl_cauldrons Cauldron=Kessel Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Kessel werden benutzt, um Wasser zu lagern, im Regen werden sie langsam aufgefüllt. Kessel können auch verwendet werden, um Banner abzuwaschen. Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Platzieren Sie einen Wassereinmer in den Kessel, um ihn mit Wasser zu füllen. Platzieren Sie einen leeren Eimer auf einen vollen Kessel, um das Wasser aufzusammeln. Platzieren Sie eine Wasserflasche in den Kessel, um ihn zu einem Drittel mit Wasser zu füllen. Benutzen Sie ein bemaltes Banner auf den Kessel, um die oberste Schicht abzuwaschen. diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr index 9748e61b4..16af1a5c9 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr @@ -1,4 +1,4 @@ -# textdomain: mcl_cauldron +# textdomain: mcl_cauldrons Cauldron=Caldera Cauldrons are used to store water and slowly fill up under rain.=Los calderos se usan para almacenar agua y llenarse lentamente bajo la lluvia. Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water.=Coloque un cubo de agua en el caldero para llenarlo con agua. Coloque un cubo vacío en un caldero lleno para recuperar el agua. Coloque una botella de agua en el caldero para llenar el caldero hasta un tercio con agua. Coloque una botella de vidrio en un caldero con agua para recuperar un tercio del agua. diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.fr.tr similarity index 98% rename from mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr rename to mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.fr.tr index a241c5cb0..ea920874b 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.fr.tr @@ -1,4 +1,4 @@ -# textdomain: mcl_cauldron +# textdomain: mcl_cauldrons Cauldron=Chaudrons Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Les chaudrons sont utilisés pour stocker l'eau et se remplissent lentement sous la pluie. Ils peuvent également être utilisés pour laver les bannières. Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Placez une marmite d'eau dans le chaudron pour le remplir d'eau. Placez un seau vide sur un chaudron plein pour récupérer l'eau. Placez une bouteille d'eau dans le chaudron pour remplir le chaudron au tiers avec de l'eau. Placez une bouteille en verre dans un chaudron avec de l'eau pour récupérer un tiers de l'eau. Utilisez une bannière blasonnée sur un chaudron avec de l'eau pour laver sa couche supérieure. diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.pl.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.pl.tr index 58826d9ab..32adf9851 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.pl.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.pl.tr @@ -1,4 +1,4 @@ -# textdomain: mcl_cauldron +# textdomain: mcl_cauldrons Cauldron=Kocioł Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Kotły są wykorzystywane do przechowywania wody oraz powoli wypełniają się podczas deszczu. Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Umieść wiadro wody w kotle by wypełnić go wodą. Umieść puste wiadro na pełnym kotle by odzyskać wodę. Umieść szklaną butelkę w kotle z wodą aby odzyskać jedną trzecią wody. Użyj upiększonego sztandaru na kotle z wodą aby zmyć górną warstwę. diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.ru.tr similarity index 56% rename from mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr rename to mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.ru.tr index 6ecae1025..b2255594d 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.ru.tr @@ -1,7 +1,7 @@ -# textdomain: mcl_cauldron +# textdomain: mcl_cauldrons Cauldron=Котёл -Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Котлы используются для хранения воды и медленного наполнения под дождём. Они также могут использоваться для промывания флагов. -Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Попытайтесь поместить ведро воды в котёл, чтобы наполнить его водой. Попытка поместить пустое ведро приведёт к освобождению котла. Поместите в котёл бутылку воды, чтобы наполнить его на треть. +Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Котлы используются для хранения воды и могут медленно наполняться под дождём. Котлы можно использовать для смывания узоров с флага. +Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Используйте ведро воды на котле, чтобы наполнить его водой. Забрать воду из котла можно пустым ведром. Пузырёк с водой также наполняет котёл на одну треть. Cauldron (1/3 Water)=Котёл (1/3 воды) Cauldron (2/3 Water)=Котёл (2/3 воды) Cauldron (3/3 Water)=Котёл (3/3 воды) diff --git a/mods/ITEMS/mcl_cauldrons/locale/template.txt b/mods/ITEMS/mcl_cauldrons/locale/template.txt index 5e18f3283..4c476e166 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/template.txt +++ b/mods/ITEMS/mcl_cauldrons/locale/template.txt @@ -1,4 +1,4 @@ -# textdomain: mcl_cauldron +# textdomain: mcl_cauldrons Cauldron= Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.= Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.= diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 664104b64..2ad6518a7 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,4 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape +local C = minetest.colorize local mod_doc = minetest.get_modpath("doc") -- Chest Entity @@ -174,7 +176,7 @@ end]] local function player_chest_open(player, pos, node_name, textures, param2, double, sound, mesh, shulker) local name = player:get_player_name() open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh, shulker = shulker} - if animate_chests then + if animate_chests and not string.find(node_name, "barrel") then local dir = minetest.facedir_to_dir(param2) find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, shulker and "shulker" or "chest", dir):open(name) end @@ -226,6 +228,8 @@ local function chest_update_after_close(pos) minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + elseif node.name == "mcl_chests:barrel_open" then + minetest.swap_node(pos, {name = "mcl_chests:barrel", param2 = node.param2}) end end @@ -236,7 +240,7 @@ local function player_chest_close(player) if open_chest == nil then return end - if animate_chests then + if animate_chests and not string.find(open_chest.node_name, "barrel") then find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double, open_chest.sound, open_chest.mesh, open_chest.shulker and "shulker" or "chest"):close(name) end chest_update_after_close(open_chest.pos) @@ -244,6 +248,51 @@ local function player_chest_close(player) open_chests[name] = nil end +local function drop_item_stack(pos, stack) + if not stack or stack:is_empty() then return end + local drop_offset = vector.new(math.random() - 0.5, 0, math.random() - 0.5) + minetest.add_item(vector.add(pos, drop_offset), stack) +end + +local function drop_items_chest(pos, oldnode, oldmetadata, digger) + if oldmetadata and oldmetadata.inventory then + -- process after_dig_node callback + local main = oldmetadata.inventory.main + if not main then return end + for _, stack in pairs(main) do + drop_item_stack(pos, stack) + end + else + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, inv:get_size("main") do + drop_item_stack(pos, inv:get_stack("main", i)) + end + meta:from_table() + end +end + +local function on_chest_blast(pos, intensity) + local node = minetest.get_node(pos) + drop_items_chest(pos, node) + minetest.remove_node(pos) + -- drop node itself with some probability depended on explosion intensity (1 for TNT): + if math.random(1, math.floor((intensity or 1) * 2)) ~= 1 then return end + local node_def = minetest.registered_nodes[node.name] + if not node_def then return end + local node_name = node_def.drop or node_def.name + drop_item_stack(pos, ItemStack(node_name)) +end + +local function close_forms(canonical_basename, pos) + local players = minetest.get_connected_players() + for p=1, #players do + if vector.distance(players[p]:get_pos(), pos) <= 30 then + minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + end + end +end + -- This is a helper function to register both chests and trapped chests. Trapped chests will make use of the additional parameters local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tiles_table, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, canonical_basename) -- START OF register_chest FUNCTION BODY @@ -291,29 +340,6 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end end - local function drop_items_chest(pos, oldnode, oldmetadata) - local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() - if oldmetadata then - meta:from_table(oldmetadata) - end - local inv = meta:get_inventory() - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2) - end - - local function on_chest_blast(pos) - local node = minetest.get_node(pos) - drop_items_chest(pos, node) - minetest.remove_node(pos) - end - local function limit_put_list(stack, list) for _, other in ipairs(list) do stack = other:add_item(stack) @@ -363,15 +389,6 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end, }) - local function close_forms(canonical_basename, pos) - local players = minetest.get_connected_players() - for p=1, #players do - if vector.distance(players[p]:get_pos(), pos) <= 30 then - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) - end - end - end - minetest.register_node(small_name, { description = desc, _tt_help = tt_help, @@ -478,10 +495,10 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -629,12 +646,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,7;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -777,12 +794,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,7;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -902,38 +919,6 @@ register_chest("trapped_chest_on", "trapped_chest" ) ---[[local function close_if_trapped_chest(pos, player) - local node = minetest.get_node(pos) - - if node.name == "mcl_chests:trapped_chest_on_small" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small") - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - player_chest_close(player) - elseif node.name == "mcl_chests:trapped_chest_on_left" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - - player_chest_close(player) - elseif node.name == "mcl_chests:trapped_chest_on_right" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - - player_chest_close(player) - end -end]] - -- Disable chest when it has been closed minetest.register_on_player_receive_fields(function(player, formname, fields) if formname:find("mcl_chests:") == 1 then @@ -990,10 +975,10 @@ minetest.register_node("mcl_chests:ender_chest", { }) local formspec_ender_chest = "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. + "label[0,0;"..F(C("#313131", S("Ender Chest"))).."]".. "list[current_player;enderchest;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -1125,10 +1110,10 @@ local function formspec_shulker_box(name) name = S("Shulker Box") end return "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[context;main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -1436,3 +1421,99 @@ minetest.register_lbm({ minetest.get_meta(pos):set_string("formspec", "") end, }) + +local function barrel_open(pos, node, clicker) + local name = minetest.get_meta(pos):get_string("name") + + if name == "" then + name = S("Barrel") + end + + local playername = clicker:get_player_name() + + minetest.show_formspec(playername, + "mcl_chests:barrel_"..pos.x.."_"..pos.y.."_"..pos.z, + table.concat({ + "size[9,8.75]", + "label[0,0;"..F(C("#313131", name)).."]", + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]", + mcl_formspec.get_itemslot_bg(0, 0.5, 9, 3), + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]", + "list[current_player;main;0,4.5;9,3;9]", + mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3), + "list[current_player;main;0,7.74;9,1;]", + mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1), + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]", + "listring[current_player;main]", + }) + ) + + minetest.swap_node(pos, { name = "mcl_chests:barrel_open", param2 = node.param2 }) + player_chest_open(clicker, pos, "mcl_chests:barrel") +end + +minetest.register_node("mcl_chests:barrel", { + description = S("Barrel"), + _tt_help = S("27 inventory slots"), + _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), + _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), + tiles = {"mcl_barrels_barrel_top.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + on_place = function(itemstack, placer, pointed_thing) + minetest.rotate_and_place(itemstack, placer, pointed_thing, minetest.is_creative_enabled(placer:get_player_name()), {}, false) + return itemstack + end, + stack_max = 64, + sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 9*3) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) + end, + after_dig_node = drop_items_chest, + on_blast = on_chest_blast, + on_rightclick = barrel_open, + on_destruct = function(pos) + close_forms("barrel", pos) + end, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +minetest.register_node("mcl_chests:barrel_open", { + description = S("Barrel Open"), + _tt_help = S("27 inventory slots"), + _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), + _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), + _doc_items_create_entry = false, + tiles = {"mcl_barrels_barrel_top_open.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mcl_chests:barrel", + stack_max = 64, + sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1, not_in_creative_inventory = 1}, + after_dig_node = drop_items_chest, + on_blast = on_chest_blast, + on_rightclick = barrel_open, + on_destruct = function(pos) + close_forms("barrel_open", pos) + end, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +--Minecraft Java Edition craft +minetest.register_craft({ + output = "mcl_chests:barrel", + recipe = { + {"group:wood", "group:wood_slab", "group:wood"}, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood_slab", "group:wood"}, + } +}) diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr index b84dac022..431365633 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr @@ -1,31 +1,31 @@ # textdomain: mcl_chests Chest=Coffre Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Les coffres sont des conteneurs qui offrent 27 emplacements d'inventaire. Les coffres peuvent être transformés en grands coffres avec une capacité double en plaçant deux coffres l'un à côté de l'autre. -To access its inventory, rightclick it. When broken, the items will drop out.=Pour accéder à son inventaire, faites un clic droit dessus. Une fois cassés, les articles tomberont. +To access its inventory, rightclick it. When broken, the items will drop out.=Pour accéder à son inventaire, faites un clic droit dessus. Une fois cassé, les articles tomberont. Trapped Chest=Coffre Piégé A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Un coffre piégé est un conteneur qui fournit 27 emplacements d'inventaire. Lorsqu'il est ouvert, il envoie un signal redstone à ses blocs adjacents tant qu'il reste ouvert. Les coffres piégés peuvent être transformés en grands coffres piégés avec une capacité double en plaçant deux coffres piégés l'un à côté de l'autre. Ender Chest=Coffre Ender Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Les coffres Ender vous donnent accès à un seul inventaire interdimensionnel personnel avec 27 emplacements. Cet inventaire est le même quel que soit le coffre d'ender d'où vous y accédez. Si vous placez un objet dans un coffre d'ender, vous le trouverez dans tous les autres coffres d'ender. Chaque joueur ne verra que ses propres objets, mais pas ceux des autres joueurs. Rightclick the ender chest to access your personal interdimensional inventory.=Faites un clic droit sur le coffre d'ender pour accéder à votre inventaire interdimensionnel personnel. -White Shulker Box=Boîte de Shulter Blanche -Light Grey Shulker Box=Boîte de Shulter Gris Clair -Orange Shulker Box=Boîte de Shulter Orange -Cyan Shulker Box=Boîte de Shulter Cyan -Magenta Shulker Box=Boîte de Shulter Magenta -Purple Shulker Box=Boîte de Shulter Violette -Light Blue Shulker Box=Boîte de Shulter Bleu Clair -Blue Shulker Box=Boîte de Shulter Bleue -Yellow Shulker Box=Boîte de Shulter Jaune -Brown Shulker Box=Boîte de Shulter Marron -Lime Shulker Box=Boîte de Shulter Vert Clair -Green Shulker Box=Boîte de Shulter Verte -Pink Shulker Box=Boîte de Shulter Rose -Red Shulker Box=Boîte de Shulter Rouge -Grey Shulker Box=Boîte de Shulter Grise -Black Shulker Box=Boîte de Shulter Noire +White Shulker Box=Boîte de Shulker Blanche +Light Grey Shulker Box=Boîte de Shulker Gris Clair +Orange Shulker Box=Boîte de Shulker Orange +Cyan Shulker Box=Boîte de Shulker Cyan +Magenta Shulker Box=Boîte de Shulker Magenta +Purple Shulker Box=Boîte de Shulker Violette +Light Blue Shulker Box=Boîte de Shulker Bleu Clair +Blue Shulker Box=Boîte de Shulker Bleue +Yellow Shulker Box=Boîte de Shulker Jaune +Brown Shulker Box=Boîte de Shulker Marron +Lime Shulker Box=Boîte de Shulker Vert Clair +Green Shulker Box=Boîte de Shulker Verte +Pink Shulker Box=Boîte de Shulker Rose +Red Shulker Box=Boîte de Shulker Rouge +Grey Shulker Box=Boîte de Shulker Grise +Black Shulker Box=Boîte de Shulker Noire A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Une boîte shulker est un conteneur portable qui fournit 27 emplacements d'inventaire pour tout article, à l'exception des boîtes shulker. Les boîtes Shulker conservent leur inventaire lorsqu'elles sont brisées, de sorte que les boîtes Shulker ainsi que leur contenu peuvent être considérés comme un seul élément. Les boîtes Shulker sont disponibles dans de nombreuses couleurs différentes. To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.=Pour accéder à l'inventaire d'une boîte shulker, placez-la et cliquez dessus avec le bouton droit. Pour emporter une boîte shulker et son contenu, il suffit de la casser et de la récupérer, les objets ne tomberont pas. Replacez la boîte shulker pour pouvoir récupérer son contenu. -Shulker Box=Boîte de Shulter +Shulker Box=Boîte de Shulker Large Chest=Coffre Large Inventory=Inventaire 27 inventory slots=27 emplacements d'inventaire @@ -34,3 +34,5 @@ Can be combined to a large chest=Peut être combiné à un grand coffre 27 interdimensional inventory slots=27 emplacements d'inventaire interdimensionnels Put items inside, retrieve them from any ender chest=Mettez des objets à l'intérieur, récupérez-les dans n'importe quel coffre Emits a redstone signal when opened=Émet un signal redstone à l'ouverture +Barrel=Tonneau +Barrels are containers which provide 27 inventory slots.=Les tonneaux sont des conteneurs qui offrent 27 emplacements d'inventaire. diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr index dc25458c2..9d1ff5aa9 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr @@ -1,36 +1,38 @@ # textdomain: mcl_chests Chest=Сундук -Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Сундуки это хранилища, предоставляющие 27 отсеков инвентаря. Сундук можно превратить в большой сундук, удвоив его вместительность, для этого нужно поставить ещё один сундук рядом с уже имеющимся. -To access its inventory, rightclick it. When broken, the items will drop out.=Чтобы получить доступ к инвентарю, кликните по сундуку правой клавишей. Если сломать сундук, то он превратится в носимый предмет. +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Сундук это хранилище, предоставляющее 27 слотов инвентаря. Сундук можно превратить в большой сундук с двойной вместительностью, если поставить ещё один сундук рядом с уже имеющимся. +To access its inventory, rightclick it. When broken, the items will drop out.=Чтобы открыть инвентарь сундука, кликните по нему правой кнопкой мыши. Если сломать сундук, вещи из его инвентаря выпадут. Trapped Chest=Сундук-ловушка -A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Сундук-ловушка - это хранилище, предоставляющее 27 отсеков инвентаря. При открытии он посылает сигнал редстоуна соседним блокам всё время, пока остается открытым. Сундук-ловушку можно превратить в большой сундук-ловушку, удвоив его вместительность, для этого нужно поставить ещё один сундук-ловушку рядом с уже имеющимся. -Ender Chest=Сундук Предела -Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Сундук Предела предоставляет вам доступ к одиночному персональному межпространственному инвентарю из 27 отсеков. Этот инвентарь остаётся прежним, неважно какой из сундуков Предела вы используете для доступа к нему. Если вы положите предмет в сундук Предела, вы обнаружите его во всех остальных сундуках Предела. Каждый игрок видит только свои собственные предметы и не видит предметы остальных игроков. -Rightclick the ender chest to access your personal interdimensional inventory.=Кликните правой по сундуку Предела, чтобы получить доступ к вашему персональному межпространственному инвентарю. +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Сундук-ловушка это хранилище, предоставляющее 27 слотов инвентаря. Когда сундук-ловушка открыт, он посылает сигнал редстоуна рядом стоящим блокам. Сундук-ловушку можно превратить в большой сундук-ловушку с двойной вместительностью, если поставить ещё один сундук-ловушку рядом с уже имеющимся. +Ender Chest=Сундук Края +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Сундук Края предоставляет вам доступ к персональному межпространственному инвентарю из 27 слотов. Этот инвентарь остаётся прежним, неважно какой из сундуков Края вы используете для доступа к нему. Если вы положите предмет в сундук Предела, вы обнаружите его во всех остальных сундуках Предела. Каждый игрок видит только свои собственные предметы и не видит предметы остальных игроков. +Rightclick the ender chest to access your personal interdimensional inventory.=Кликните правой кнопкой мыши по сундуку Края, чтобы получить доступ к вашему персональному межпространственному инвентарю. White Shulker Box=Белый ящик шалкера Light Grey Shulker Box=Светло-серый ящик шалкера Orange Shulker Box=Оранжевый ящик шалкера -Cyan Shulker Box=Голубой ящик шалкера -Magenta Shulker Box=Фиолетовый ящик шалкера -Purple Shulker Box=Пурпурный ящик шалкера -Light Blue Shulker Box=Светло-голубой ящик шалкера +Cyan Shulker Box=Бирюзовый ящик шалкера +Magenta Shulker Box=Сиреневый ящик шалкера +Purple Shulker Box=Фиолетовый ящик шалкера +Light Blue Shulker Box=Голубой ящик шалкера Blue Shulker Box=Синий ящик шалкера Yellow Shulker Box=Жёлтый ящик шалкера Brown Shulker Box=Коричневый ящик шалкера -Lime Shulker Box=Зелёный лаймовый ящик шалкера +Lime Shulker Box=Лаймовый ящик шалкера Green Shulker Box=Зелёный ящик шалкера Pink Shulker Box=Розовый ящик шалкера Red Shulker Box=Красный ящик шалкера Grey Shulker Box=Серый ящик шалкера Black Shulker Box=Чёрный ящик шалкера -A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Ящик шалкера это переносное хранилище, предоставляющее 27 отсеков инвентаря для любых предметов, за исключением ящиков шалкера. Ящики шалкера сохраняют в себе инвентарь, если их сломать, так что их вместе со всем инвентарём можно переносить как один предмет. Ящики шалкера могут быть разных цветов. -To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.=Чтобы получить доступ к инвентарю ящика шалкера, поставьте его куда-нибудь и кликните по нему правой клавишей. Чтобы взять с собой ящик шалкера со всем его содержимым, просто сломайте его, а потом подберите, ни один предмет из него не выпадет. Чтобы вновь получить доступ к содержимому, его надо снова поставить. +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Ящик шалкера это переносное хранилище, предоставляющее 27 слотов инвентаря для любых предметов, за исключением ящиков шалкера. Ящики шалкера сохраняют в себе инвентарь, если их сломать, так что их вместе со всем инвентарём можно переносить как один предмет. Ящики шалкера могут быть разных цветов. +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.=Чтобы получить доступ к инвентарю ящика шалкера, поставьте его и кликните по нему правой кнопкой мыши. Чтобы взять с собой ящик шалкера со всем его содержимым, просто сломайте его, а потом подберите, ни один предмет из него не выпадет. Чтобы вновь получить доступ к содержимому, его нужно снова поставить. Shulker Box=Ящик шалкера Large Chest=Большой сундук Inventory=Инвентарь -27 inventory slots=27 отсеков инвентаря +27 inventory slots=27 слотов инвентаря Can be carried around with its contents=Можно переносить вместе со всем содержимым Can be combined to a large chest=Можно объединить в большой сундук -27 interdimensional inventory slots=27 межпространственных отсеков инвентаря -Put items inside, retrieve them from any ender chest=Положите внутрь предмет и получите его из любого сундука Предела +27 interdimensional inventory slots=27 межпространственных слотов инвентаря +Put items inside, retrieve them from any ender chest=Положите внутрь предмет и получите его из любого сундука Края Emits a redstone signal when opened=Подаёт сигнал редстоуна, будучи открытым +Barrel=Бочка +Barrels are containers which provide 27 inventory slots.=Бочки это хранилища, предоставляющие 27 слотов инвентаря. diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt index d680c24c9..fffeaaac7 100644 --- a/mods/ITEMS/mcl_chests/locale/template.txt +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -34,3 +34,5 @@ Can be combined to a large chest= 27 interdimensional inventory slots= Put items inside, retrieve them from any ender chest= Emits a redstone signal when opened= +Barrel= +Barrels are containers which provide 27 inventory slots.= diff --git a/mods/ITEMS/mcl_chests/mod.conf b/mods/ITEMS/mcl_chests/mod.conf index 0ff5129ca..a7c66a09e 100644 --- a/mods/ITEMS/mcl_chests/mod.conf +++ b/mods/ITEMS/mcl_chests/mod.conf @@ -1,3 +1,4 @@ name = mcl_chests +author = Wuzzy, Fleckenstein, AFCMS depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_bottom.png b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_bottom.png new file mode 100644 index 000000000..9c5788061 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_bottom.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_side.png b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_side.png new file mode 100644 index 000000000..8a01cc4a9 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_side.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top.png b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top.png new file mode 100644 index 000000000..8af5a5c90 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top.png differ diff --git a/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top_open.png b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top_open.png new file mode 100644 index 000000000..1d3a02be1 Binary files /dev/null and b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top_open.png differ diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.fr.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.fr.tr index 604f50858..3f2d430f1 100644 --- a/mods/ITEMS/mcl_clock/locale/mcl_clock.fr.tr +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.fr.tr @@ -1,5 +1,5 @@ # textdomain: mcl_clock Clocks are tools which shows the current time of day in the Overworld.=Les horloges sont des outils qui indiquent l'heure actuelle dans l'Overworld. -The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=L'horloge contient un disque rotatif avec un symbole du soleil (disque jaune) et un symbole de la lune et un petit "pointeur" qui montre l'heure actuelle en estimant la position réelle du soleil et de la lune dans le ciel. Midi est représenté par le symbole du soleil et minuit est représenté par le symbole de la lune. +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=L'horloge contient un disque rotatif avec un symbole du soleil (disque jaune), un symbole de la lune et un petit "pointeur" qui montre l'heure actuelle en estimant la position réelle du soleil et de la lune dans le ciel. Midi est représenté par le symbole du soleil et minuit est représenté par le symbole de la lune. Clock=Horloge Displays the time of day in the Overworld=Affiche l'heure de la journée dans l'Overworld diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr index dca0f960c..bb24223a2 100644 --- a/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_clock Clocks are tools which shows the current time of day in the Overworld.=Часы это инструмент, показывающий текущее время Верхнего Мира. -The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=Часы имеют вращающийся диск со значком солнца (жёлтый диск) и луны, а также маленькую стрелку, которая показывает время, обозначая реальное положение солнца и луны в небе. Полдень обозначается символом солнца, а полночь символом луны. +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=Часы имеют вращающийся диск со значком солнца и луны, а также маленькую стрелку, которая показывает время, обозначая реальное положение солнца и луны в небе. Полдень обозначается символом солнца, а полночь символом луны. Clock=Часы Displays the time of day in the Overworld=Показывают время Верхнего Мира diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr index 524c28bcc..80e62cea8 100644 --- a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr @@ -1,6 +1,6 @@ # textdomain: mcl_cocoas Premature Cocoa Pod=Молодой стручок какао -Cocoa pods grow on the side of jungle trees in 3 stages.=Стручки какао растут на деревьях джунглей в 3 этапа. +Cocoa pods grow on the side of jungle trees in 3 stages.=Стручки какао растут на тропических деревьях в 3 этапа. Medium Cocoa Pod=Средний стручок какао Mature Cocoa Pod=Зрелый стручок какао -A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Зрелый стручок какао вырос на дереве джунглей до своего полного размера и готов к сбору в качестве какао-бобов. Дальше ему расти некуда. +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Зрелый стручок какао вырос на тропическом дереве до своего полного размера и готов к сбору в качестве какао-бобов. Стручок не будет расти дальше. diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr index d457364ef..75f0073d5 100644 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr @@ -12,7 +12,7 @@ Light Grey Glazed Terracotta=Terre Cuite Emaillée Gris Clair Light Grey Concrete Powder=Béton en Poudre Gris Clair Light Grey Concrete=Béton Gris Clair Black Terracotta=Terre Cuite Noir -Black Glazed Terracotta=Terre Cuite Emaillée Noir +Black Glazed Terracotta=Terre Cuite Emaillée Noire Black Concrete Powder=Béton en Poudre Noir Black Concrete=Béton Noir Red Terracotta=Terre Cuite Rouge @@ -63,13 +63,13 @@ Light Blue Terracotta=Terre Cuite Bleu Clair Light Blue Glazed Terracotta=Terre Cuite Emaillée Bleu Clair Light Blue Concrete Powder=Béton en Poudre Bleu Clair Light Blue Concrete=Béton Bleu Clair -Terracotta is a basic building material. It comes in many different colors.=La terre cuite est un matériau de construction de base. Il est disponible dans de nombreuses couleurs différentes. -Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=La terre cuite émaillée est un bloc décoratif au motif complexe. Il peut être tourné en le plaçant dans différentes directions. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=La poudre de béton est utilisée pour créer du béton, mais elle peut également être utilisée comme décoration elle-même. Il est disponible en différentes couleurs. La poudre de béton se transforme en béton de la même couleur au contact de l'eau. +Terracotta is a basic building material. It comes in many different colors.=La terre cuite est un matériau de construction de base. Elle est disponible dans de nombreuses couleurs différentes. +Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=La terre cuite émaillée est un bloc décoratif au motif complexe. Elle peut être tournée en la plaçant dans différentes directions. +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=La poudre de béton est utilisée pour créer du béton, mais elle peut également être utilisée comme décoration elle-même. Elle est disponible en différentes couleurs. La poudre de béton se transforme en béton de la même couleur au contact de l'eau. Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Le béton est un bloc décoratif qui se décline en de nombreuses couleurs différentes. Il est remarquable pour avoir une couleur très forte et propre. Terracotta=Terre Cuite Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=La terre cuite est un matériau de construction de base qui se décline en de nombreuses couleurs différentes. Ce bloc particulier n'est pas coloré. -Colored Terracotta=Terre Cuite Coloré +Colored Terracotta=Terre Cuite Colorée Glazed Terracotta=Terre Cuite Emaillée Concrete Powder=Béton en Poudre Concrete=Béton diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr index e1d694457..9c43b5681 100644 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr @@ -27,26 +27,26 @@ Green Terracotta=Зелёная керамика Green Glazed Terracotta=Зелёная глазурованная керамика Green Concrete Powder=Зелёный цемент Green Concrete=Зелёный бетон -Cyan Terracotta=Голубая керамика -Cyan Glazed Terracotta=Голубая глазурованная керамика -Cyan Concrete Powder=Голубой цемент -Cyan Concrete=Голубой бетон +Cyan Terracotta=Бирюзовая керамика +Cyan Glazed Terracotta=Бирюзовая глазурованная керамика +Cyan Concrete Powder=Бирюзовый цемент +Cyan Concrete=Бирюзовый бетон Blue Terracotta=Синяя керамика Blue Glazed Terracotta=Синяя глазурованная керамика Blue Concrete Powder=Синий цемент Blue Concrete=Синий бетон -Magenta Terracotta=Фиолетовая керамика -Magenta Glazed Terracotta=Фиолетовая глазурованная керамика -Magenta Concrete Powder=Фиолетовый цемент -Magenta Concrete=Фиолетовый бетон +Magenta Terracotta=Сиреневая керамика +Magenta Glazed Terracotta=Сиреневая глазурованная керамика +Magenta Concrete Powder=Сиреневый цемент +Magenta Concrete=Сиреневый бетон Orange Terracotta=Оранжевая керамика Orange Glazed Terracotta=Оранжевая глазурованная керамика Orange Concrete Powder=Оранжевый цемент Orange Concrete=Оранжевый бетон -Purple Terracotta=Пурпурная керамика -Purple Glazed Terracotta=Пурпурная глазурованная керамика -Purple Concrete Powder=Пурпурный цемент -Purple Concrete=Пурпурный бетон +Purple Terracotta=Фиолетовая керамика +Purple Glazed Terracotta=Фиолетовая глазурованная керамика +Purple Concrete Powder=Фиолетовый цемент +Purple Concrete=Фиолетовый бетон Brown Terracotta=Коричневая керамика Brown Glazed Terracotta=Коричневая глазурованная керамика Brown Concrete Powder=Коричневый цемент @@ -55,18 +55,18 @@ Pink Terracotta=Розовая керамика Pink Glazed Terracotta=Розовая глазурованная керамика Pink Concrete Powder=Розовый цемент Pink Concrete=Розовый бетон -Lime Terracotta=Зелёная лаймовая керамика -Lime Glazed Terracotta=Зелёная лаймовая глазурованная керамика -Lime Concrete Powder=Зелёный лаймовый цемент -Lime Concrete=Зелёный лаймовый бетон -Light Blue Terracotta=Светло-голубая керамика -Light Blue Glazed Terracotta=Светло-голубая глазурованная керамика -Light Blue Concrete Powder=Светло-голубой цемент -Light Blue Concrete=Светло-голубой бетон -Terracotta is a basic building material. It comes in many different colors.=Керамика это основной строительный материал. Он бывает разных цветов. +Lime Terracotta=Лаймовая керамика +Lime Glazed Terracotta=Лаймовая глазурованная керамика +Lime Concrete Powder=Лаймовый цемент +Lime Concrete=Лаймовый бетон +Light Blue Terracotta=Голубая керамика +Light Blue Glazed Terracotta=Голубая глазурованная керамика +Light Blue Concrete Powder=Голубой цемент +Light Blue Concrete=Голубой бетон +Terracotta is a basic building material. It comes in many different colors.=Керамика это основной строительный материал. Она бывает разных цветов. Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Глазурованная керамика это декоративный блок со сложным орнаментом. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Цемент используется для создания бетона, хотя также может быть украшением сам по себе. Он бывает разных цветов. При контакте с водой цемент превращается в бетон, сохраняя свой цвет. -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Бетон это декоративный блок, который бывает разных цветов. Бетон славится хорошим и чистым цветом. +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Цемент используется для создания бетона, хотя также может быть декорацией сам по себе. Он бывает разных цветов. При контакте с водой цемент превращается в бетон того же цвета. +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Бетон это декоративный блок, который может быть разных цветов. Бетон приметен своим хорошим и чистым цветом. Terracotta=Керамика Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Керамика - основной строительный материал, который может быть разных цветов. Обычный блок керамики не окрашен. Colored Terracotta=Окрашенная керамика diff --git a/mods/ITEMS/mcl_composters/init.lua b/mods/ITEMS/mcl_composters/init.lua new file mode 100644 index 000000000..6c0450b2f --- /dev/null +++ b/mods/ITEMS/mcl_composters/init.lua @@ -0,0 +1,242 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- +-- Composter mod, adds composters. +-- +-- Copyleft 2022 by kabou +-- GNU General Public Licence 3.0 +-- + +local composter_description = S( + "Composter" +) +local composter_longdesc = S( + "Composters can convert various organic items into bonemeal." +) +local composter_usagehelp = S( + "Use organic items on the composter to fill it with layers of compost. " .. + "Every time an item is put in the composter, there is a chance that the " .. + "composter adds another layer of compost. Some items have a bigger chance " .. + "of adding an extra layer than other items. After filling up with 7 layers " .. + "of compost, the composter is full. After a delay of approximately one " .. + "second the composter becomes ready and bone meal can be retrieved from it. " .. + "Right-clicking the composter takes out the bone meal empties the composter." +) + +minetest.register_craft({ + output = "mcl_composters:composter", + recipe = { + {"group:wood_slab", "", "group:wood_slab"}, + {"group:wood_slab", "", "group:wood_slab"}, + {"group:wood_slab", "group:wood_slab", "group:wood_slab"}, + } +}) + +local function composter_add_item(pos, node, player, itemstack, pointed_thing) + -- + -- handler for filling the composter when rightclicked + -- + -- as an on_rightclick handler, it returns an itemstack + -- + if not player or (player:get_player_control() and player:get_player_control().sneak) then + return itemstack + end + if not itemstack and itemstack:is_empty() then + return itemstack + end + local itemname = itemstack:get_name() + local chance = minetest.get_item_group(itemname, "compostability") + + if chance > 0 then + if not minetest.is_creative_enabled(player:get_player_name()) then + itemstack:take_item() + end + -- calculate leveling up chance + local rand = math.random(0,100) + if chance >= rand then + -- get current compost level + local node_defs = minetest.registered_nodes[node.name] + local level = node_defs["_mcl_compost_level"] + -- spawn green particles above new layer + mcl_dye.add_bone_meal_particle(vector.add(pos, {x=0, y=level/8, z=0})) + -- TODO: play some sounds + -- update composter block + if level < 7 then + level = level + 1 + else + level = "ready" + end + minetest.swap_node(pos, {name = "mcl_composters:composter_" .. level}) + -- a full composter becomes ready for harvest after one second + -- the block will get updated by the node timer callback set in node reg def + if level == 7 then + local timer = minetest.get_node_timer(pos) + timer:start(1) + end + end + end + return itemstack +end + +local function composter_ready(pos) + -- + -- update the composter block to ready for harvesting + -- this function is a node callback on_timer. + -- the timer is set in function 'composter_fill' when composter level is 7 + -- + -- returns false in order to cancel further activity of the timer + -- + minetest.swap_node(pos, {name = "mcl_composters:composter_ready"}) + -- maybe spawn particles again? + -- TODO: play some sounds + return false +end + +local function composter_harvest(pos, node, player, itemstack, pointed_thing) + -- + -- handler for harvesting bone meal from a ready composter when rightclicked + -- + if not player or (player:get_player_control() and player:get_player_control().sneak) then + return + end + -- reset ready type composter to empty type + minetest.swap_node(pos, {name="mcl_composters:composter"}) + -- spawn bone meal item (wtf dye?! is this how they make white cocoa) + minetest.add_item(pos, "mcl_dye:white") + -- TODO play some sounds + +end + +local function composter_get_nodeboxes(level) + -- + -- Convenience function to construct the nodeboxes for varying levels of compost + -- + local top_y_tbl = {[0]=-7, -5, -3, -1, 1, 3, 5, 7} + local top_y = top_y_tbl[level] / 16 + return { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall + { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall + {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall + {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall + {-0.5, -0.5, -0.5, 0.5, top_y, 0.5}, -- Bottom level + } + } +end + +-- +-- Register empty composter node +-- This is the base model that is craftable and can be placed in an inventory +-- +minetest.register_node("mcl_composters:composter", { + description = composter_description, + _tt_help = S("Converts organic items into bonemeal"), + _doc_items_longdesc = composter_longdesc, + _doc_items_usagehelp = composter_usagehelp, + paramtype = "light", + drawtype = "nodebox", + node_box = composter_get_nodeboxes(0), + selection_box = {type = "regular"}, + tiles = { + "mcl_composter_bottom.png^mcl_composter_top.png", + "mcl_composter_bottom.png", + "mcl_composter_side.png" + }, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + is_ground_content = false, + groups = { + handy=1, material_wood=1, deco_block=1, dirtifier=1, + flammable=2, fire_encouragement=3, fire_flammability=4, + }, + sounds = mcl_sounds.node_sound_wood_defaults(), + _mcl_hardness = 2, + _mcl_blast_resistance = 2, + _mcl_compost_level = 0, + on_rightclick = composter_add_item +}) + +-- +-- Template function for composters with compost +-- For each fill level a custom node is registered +-- +local function register_filled_composter(level) + local id = "mcl_composters:composter_"..level + minetest.register_node(id, { + description = S("Composter") .. " (" .. level .. "/7 " .. S("filled") .. ")", + _doc_items_create_entry = false, + paramtype = "light", + drawtype = "nodebox", + node_box = composter_get_nodeboxes(level), + selection_box = {type = "regular"}, + tiles = { + "mcl_composter_compost.png^mcl_composter_top.png", + "mcl_composter_bottom.png", + "mcl_composter_side.png" + }, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + is_ground_content = false, + groups = { + handy=1, material_wood=1, deco_block=1, dirtifier=1, + not_in_creative_inventory=1, not_in_craft_guide=1, + flammable=2, fire_encouragement=3, fire_flammability=4, + comparator_signal=level + }, + sounds = mcl_sounds.node_sound_wood_defaults(), + drop = "mcl_composters:composter", + _mcl_hardness = 2, + _mcl_blast_resistance = 2, + _mcl_compost_level = level, + on_rightclick = composter_add_item, + on_timer = composter_ready + }) + + -- Add entry aliases for the Help + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_composters:composter", "nodes", id) + end +end + +-- +-- Register filled composters (7 levels) +-- +for level = 1, 7 do + register_filled_composter(level) +end + +-- +-- Register composter ready to be harvested +-- +minetest.register_node("mcl_composters:composter_ready", { + description = S("Composter") .. "(" .. S("ready for harvest") .. ")", + _doc_items_create_entry = false, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + paramtype = "light", + drawtype = "nodebox", + node_box = composter_get_nodeboxes(7), + selection_box = {type = "regular"}, + tiles = { + "mcl_composter_ready.png^mcl_composter_top.png", + "mcl_composter_bottom.png", + "mcl_composter_side.png" + }, + is_ground_content = false, + groups = { + handy=1, material_wood=1, deco_block=1, dirtifier=1, + not_in_creative_inventory=1, not_in_craft_guide=1, + flammable=2, fire_encouragement=3, fire_flammability=4, + comparator_signal=8 + }, + sounds = mcl_sounds.node_sound_wood_defaults(), + drop = "mcl_composters:composter", + _mcl_hardness = 2, + _mcl_blast_resistance = 2, + _mcl_compost_level = 7, + on_rightclick = composter_harvest +}) + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_composters:composter", + "nodes", "mcl_composters:composter_ready" ) +end diff --git a/mods/ITEMS/mcl_composters/locale/mcl_composters.fr.tr b/mods/ITEMS/mcl_composters/locale/mcl_composters.fr.tr new file mode 100644 index 000000000..7e0b9c8b1 --- /dev/null +++ b/mods/ITEMS/mcl_composters/locale/mcl_composters.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_composters +Composter=Composteur +Composters can convert various organic items into bonemeal.=Les composteurs convertissent divers éléments organiques en farine d'os. +Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full and bone meal can be retrieved from it. Taking out the bone meal empties the composter.=Utiliser des éléments organiques sur le composteur le remplit de couches de compost. Chaque fois qu'un élément est mis dans le composteur, il y a une chance que le composteur rajoute une couche de compost. Certains élémnets ont de plus grandes chances que d'autres d'ajouter une couche de compost. Une fois le composteur rempli de 7 couche de compost, il est plein et on peut récupérer la farine d'os. +filled=plain +ready for harvest=prêt pour la récolte +Converts organic items into bonemeal=Convertit les éléments organiques en farine d'os diff --git a/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr b/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr new file mode 100644 index 000000000..caaa5a73a --- /dev/null +++ b/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_composters +Composter=Компостер +Composters can convert various organic items into bonemeal.=Компостер может перерабатывать органические предметы в костную муку +Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full and bone meal can be retrieved from it. Taking out the bone meal empties the composter.=Используйте органические предметы на компостере, чтобы заполнить его слоями перегноя. Каждый раз когда в компостер попадает предмет, есть шанс что в компостере появится новый слой перегноя. Некоторые предметы имеют больший шанс на появление нового слоя. После заполнения 7 слоями перегноя, компостер можно опустошить, забрав из него костную муку. +filled=заполнен +ready for harvest=готов к сбору +Converts organic items into bonemeal=Перерабатывает органику в костную муку diff --git a/mods/ITEMS/mcl_composters/locale/template.txt b/mods/ITEMS/mcl_composters/locale/template.txt new file mode 100644 index 000000000..c5f9bb858 --- /dev/null +++ b/mods/ITEMS/mcl_composters/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain: mcl_composters +Composter= +Composters can convert various organic items into bonemeal.= +Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter."= +filled= +ready for harvest= +Converts organic items into bonemeal= diff --git a/mods/ITEMS/mcl_composters/mod.conf b/mods/ITEMS/mcl_composters/mod.conf new file mode 100644 index 000000000..86d729887 --- /dev/null +++ b/mods/ITEMS/mcl_composters/mod.conf @@ -0,0 +1,5 @@ +name = mcl_composters +author = kabou +description = Composters can convert various organic items into bonemeal. +depends = mcl_core, mcl_sounds, mcl_dye +optional_depends = doc diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png new file mode 100644 index 000000000..cfed3a8a5 Binary files /dev/null and b/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_compost.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_compost.png new file mode 100644 index 000000000..afda87c71 Binary files /dev/null and b/mods/ITEMS/mcl_composters/textures/mcl_composter_compost.png differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_ready.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_ready.png new file mode 100644 index 000000000..7caf79f96 Binary files /dev/null and b/mods/ITEMS/mcl_composters/textures/mcl_composter_ready.png differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png new file mode 100644 index 000000000..c9e5a6fe3 Binary files /dev/null and b/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png new file mode 100644 index 000000000..fc6e202d3 Binary files /dev/null and b/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png differ diff --git a/mods/ITEMS/mcl_copper/locale/mcl_copper.fr.tr b/mods/ITEMS/mcl_copper/locale/mcl_copper.fr.tr new file mode 100644 index 000000000..1efae66ee --- /dev/null +++ b/mods/ITEMS/mcl_copper/locale/mcl_copper.fr.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_copper +A block of copper is mostly a decorative block.=Le bloc de cuivre est surtout un bloc décoratif. +A block used for compact raw copper storage.=Un bloc utilisé pour le stockage compact de cuivre brut. +Block of Copper=Bloc de cuivre +Block of Raw Copper=Bloc de cuivre brut +Copper Ingot=Lingot de cuivre +Copper Ore=Minerai de cuivre +Cut copper is a decorative block.=Le cuivre taillé est un bloc décoratif. +Cut Copper=Cuivre taillé +Double Slab of Cut Copper=Double dalle de cuivre taillé +Double Slab of Exposed Cut Copper=Double dalle de cuivre taillé exposé +Double Slab of Oxidized Cut Copper=Double dalle de cuivre taillé oxydé +Double Slab of Weathered Cut Copper=Double dalle de cuivre taillé érodé +Exposed copper is a decorative block.=Le cuivre exposé est un bloc décoratif. +Exposed Copper=Cuivre exposé +Exposed cut copper is a decorative block.=Le cuivre taillé exposé est un bloc décoratif. +Exposed Cut Copper=Cuivre taillé exposé +Molten Raw Copper. It is used to craft blocks.=Cuivre brut fondu. Utilisé pour fabriquer des blocs. +Oxidized copper is a decorative block.=Le cuivre oxydé est un bloc décoratif. +Oxidized Copper=Cuivre oxydé +Oxidized cut copper is a decorative block.=Le cuivre taillé oxydé est un bloc décoratif. +Oxidized Cut Copper=Cuivre taillé oxydé +Raw Copper. Mine a Copper Ore to get it.=Cuivre brut. Creuser dans du minerai de cuivre pour l'obtenir. +Raw Copper=Cuivre brut +Slab of Cut Copper=Dalle de cuivre taillé +Slab of Exposed Cut Copper=Dalle de cuivre taillé exposé +Slab of Oxidized Cut Copper=Dalle de cuivre taillé oxydé +Slab of Weathered Cut Copper=Dalle de cuivre taillé érodé +Some copper contained in stone, it is pretty common and can be found below sea level.=Un peu de cuivre se trouve dans la pierre, il est plutôt répandu et peut être trouvé sous le niveau de la mer. +Stairs of Cut Copper=Escalier de cuivre taillé +Stairs of Exposed Cut Copper=Escalier de cuivre taillé exposé +Stairs of Oxidized Cut Copper=Escalier de cuivre taillé oxydé +Stairs of Weathered Cut Copper=Escalier de cuivre taillé érodé +Weathered copper is a decorative block.=Le cuivre érodé est un bloc décoratif. +Weathered Copper=Cuivre érodé +Weathered cut copper is a decorative block.=Le cuivre taillé érodé est un bloc décoratif. +Weathered Cut Copper=Cuivre taillé érodé diff --git a/mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr b/mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr new file mode 100644 index 000000000..d611dea6f --- /dev/null +++ b/mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_copper +A block of copper is mostly a decorative block.=Медный блок — это декоративный блок. +A block used for compact raw copper storage.=Блок используется для компактного хранения необработанной меди. +Block of Copper=Медный блок +Block of Raw Copper=Блок необработанной меди +Copper Ingot=Медный слиток +Copper Ore=Медная руда +Cut copper is a decorative block.=Резной медный блок это декоративный блок. +Cut Copper=Резной медный блок +Double Slab of Cut Copper=Двойная плита из резного медного блока +Double Slab of Exposed Cut Copper=Двойная плита из потемневшего резного медного блока +Double Slab of Oxidized Cut Copper=Двойная плита из окисленного резного медного блока +Double Slab of Weathered Cut Copper=Двойная плита из состаренного резного медного блока +Exposed copper is a decorative block.=Потемневший медный блок это декоративный блок. +Exposed Copper=Потемневший медный блок +Exposed cut copper is a decorative block.=Потемневший резной медный блок это декоративный блок. +Exposed Cut Copper=Потемневший резной медный блок +Molten Raw Copper. It is used to craft blocks.=Медный слиток. Используется для крафта блоков. +Oxidized copper is a decorative block.=Окисленный медный блок это декоративный блок. +Oxidized Copper=Окисленный медный блок +Oxidized cut copper is a decorative block.=Окисленный резной медный блок это декоративный блок. +Oxidized Cut Copper=Окисленный резной медный блок +Raw Copper. Mine a Copper Ore to get it.=Необработанная медь. Добудьте медную руду чтобы получить её. +Raw Copper=Необработанная медь +Slab of Cut Copper=Плита из резного медного блока +Slab of Exposed Cut Copper=Плита из потемневшего резного медного блока +Slab of Oxidized Cut Copper=Плита из окисленного резного медного блока +Slab of Weathered Cut Copper=Плита из состаренного резного медного блока +Some copper contained in stone, it is pretty common and can be found below sea level.=Залежи медной руды находятся в камне, медь довольно распространена и может быть найдена ниже уровня моря. +Stairs of Cut Copper=Ступени из резного медного блока +Stairs of Exposed Cut Copper=Ступени из потемневшего резного медного блока +Stairs of Oxidized Cut Copper=Ступени из окисленного резного медного блока +Stairs of Weathered Cut Copper=Ступени из состаренного резного медного блока +Weathered copper is a decorative block.=Состаренный медный блок это декоративный блок. +Weathered Copper=Состаренный медный блок +Weathered cut copper is a decorative block.=Состаренный резной медный блок это декоративный блок. +Weathered Cut Copper=Состаренный резной медный блок diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index 3ff2b142c..252282602 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -388,6 +388,14 @@ minetest.register_craft({ -- -- Crafting (tool repair) -- + +minetest.register_craft({ + output = "mcl_core:moss_carpet 3", + recipe = { + {"mcl_core:moss", "mcl_core:moss"}, + } +}) + minetest.register_craft({ type = "toolrepair", additional_wear = -mcl_core.repair, diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 85a078766..26519ab7e 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -139,7 +139,7 @@ minetest.register_craftitem("mcl_core:apple", { stack_max = 64, on_place = minetest.item_eat(4), on_secondary_use = minetest.item_eat(4), - groups = { food = 2, eatable = 4 }, + groups = { food = 2, eatable = 4, compostability=65 }, _mcl_saturation = 2.4, }) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 7107a2373..20978e26f 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -4,7 +4,8 @@ local modpath = minetest.get_modpath(minetest.get_current_modname()) -local mg_name = minetest.get_mapgen_setting("mg_name") +local mg_name = mcl_mapgen.name +local v6 = mcl_mapgen.v6 local math = math local vector = vector @@ -381,7 +382,7 @@ function mcl_core.generate_tree(pos, tree_type, options) local balloon = options and options.balloon if tree_type == nil or tree_type == OAK_TREE_ID then - if mg_name == "v6" then + if v6 then mcl_core.generate_v6_oak_tree(pos) else if balloon then @@ -396,7 +397,7 @@ function mcl_core.generate_tree(pos, tree_type, options) if two_by_two then mcl_core.generate_huge_spruce_tree(pos) else - if mg_name == "v6" then + if v6 then mcl_core.generate_v6_spruce_tree(pos) else mcl_core.generate_spruce_tree(pos) @@ -408,7 +409,7 @@ function mcl_core.generate_tree(pos, tree_type, options) if two_by_two then mcl_core.generate_huge_jungle_tree(pos) else - if mg_name == "v6" then + if v6 then mcl_core.generate_v6_jungle_tree(pos) else mcl_core.generate_jungle_tree(pos) @@ -786,7 +787,7 @@ function mcl_core.generate_huge_jungle_tree(pos) end -local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed")) +local grass_spread_randomizer = PseudoRandom(mcl_mapgen.seed) function mcl_core.get_grass_palette_index(pos) local biome_data = minetest.get_biome_data(pos) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index b064cebbe..d050da26b 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -12,6 +12,7 @@ A decorative and mostly transparent block.=Ein Dekoblock, der größtenteils tra A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Ein Grasblock ist Erde mit einer Grasschicht. Grasblöcke sind vielseitige Blöcke, die das Wachstum aller möglichen Pflanzen fördern. Mit einer Hacke kann man das Land bestellen und einen Ackerboden machen. Mit einer Schaufel verwandelt man ihn in einen Graspfad. Im Licht wird das Gras sich langsam auf benachbarte Erde ausbreiten. Unter einem lichtundurchlässigen Block kann sich dieser Block wieder zurück zu Erde verwandeln. A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Ein Lapislazuliblock ist hauptsächlich ein Deko-Block aber er ist auch nützlich zur kompakten Aufbewahrung von Lapislazuli. A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Eine Lavaquelle zündet einige Luftblöcke über ihr an, wenn sie sich neben einem entzündlichen Block befinden. +A moss block is a natural block that can be spread to some other blocks by using bone meal.=Ein Moosblock ist ein natürlicher Block, der mit Hilfe von Knochenmehl auf andere Blöcke übertragen werden kann. A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Ein Leiterstück, mit dem Sie vertikal klettern können. Leitern können nur an der Seite fester Blöcke und nicht an Glas, Blättern, Eis, Platten, Leuchtsteinen oder Ozeanlaternen platziert werden. Acacia Bark=Akazienrinde Acacia Leaves=Akazienblätter @@ -142,6 +143,9 @@ Lit Redstone Ore=Leuchtendes Redstoneerz Magenta Stained Glass=Magenta Buntglas Molten gold. It is used to craft armor, tools, and whatnot.=Geschmolzenes Gold. Es wird benutzt, um Rüstungen, Werkzeuge, und anderes herzustellen. Molten iron. It is used to craft armor, tools, and whatnot.=Geschmolzenes Eisen. Es wird benutzt, um Rüstungen, Werkzeuge, und vieles mehr herzustellen. +Moss=Moos +Moss Carpet=Moosteppich +Moss Carpets are a thin decorative variant of the moss block.=Moosteppiche sind eine dünne, dekorative Variante des Moosblock. Mossy Cobblestone=Moosiges Kopfsteinpflaster Mossy Stone Bricks=Moosige Steinziegel Mycelium=Myzel diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr index 64aadd6db..c4c818aae 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -9,7 +9,7 @@ A block of gold is mostly a shiny decorative block but also useful as a compact A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Un bloc de fer est principalement un bloc décoratif mais également utile comme stockage compact de lingots de fer. A cactus can only be placed on top of another cactus or any sand.=Un cactus ne peut être placé que sur un autre cactus ou du sable. A decorative and mostly transparent block.=Un bloc décoratif et surtout transparent. -A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Un bloc d'herbe est de la terre avec une couverture d'herbe. Les blocs d'herbe sont des blocs ingénieux qui permettent la croissance de toutes sortes de plantes. Ils peuvent être transformés en terres agricoles avec une houe et transformés en chemins d'herbe avec une pelle. À la lumière, l'herbe se propage lentement sur la terre à proximité. Sous un bloc opaque ou un liquide, un bloc d'herbe peut redevenir terre. +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Un bloc d'herbe est de la terre avec une couverture d'herbe. Les blocs d'herbe sont des blocs pleins de ressource qui permettent la croissance de toutes sortes de plantes. Ils peuvent être transformés en terres agricoles avec une houe et transformés en chemins d'herbe avec une pelle. À la lumière, l'herbe se propage lentement sur la terre à proximité. Sous un bloc opaque ou un liquide, un bloc d'herbe peut redevenir terre. A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Un bloc de lapis-lazuli est principalement un bloc décoratif mais également utile comme stockage compact de lapis-lazuli. A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Une source de lave met le feu à quelques blocs d'air au-dessus lorsqu'ils sont à côté d'un bloc inflammable. A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Un morceau d'échelle qui vous permet de grimper verticalement. Les échelles ne peuvent être placées que sur le côté de blocs solides et non sur du verre, des feuilles, de la glace, des dalles, des pierres incandescentes ou des lanternes marines. @@ -20,13 +20,13 @@ Acacia Wood=Bois d'Acacia Acacia Wood Planks=Planches d'Acacia Acacia leaves are grown from acacia trees.=Les feuilles d'acacia sont cultivées à partir d'acacias. Andesite=Andésite -Andesite is an igneous rock.=L'andésite est une roche ignée. +Andesite is an igneous rock.=L'andésite est une roche volcanique. Apple=Pomme Apples are food items which can be eaten.=Les pommes sont des aliments qui peuvent être consommés. Barrier=Barrière invisible -Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Les barrières sont des blocs accessibles à pied. Ils sont utilisés pour créer des limites de cartes d'aventure et similaires. Les monstres et les animaux n'apparaissent pas sur les barrières, et les clôtures ne se connectent pas aux barrières. D'autres blocs peuvent être construits sur des barrières comme sur n'importe quel autre bloc. +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Les barrières sont des blocs sur lesquels on peut marcher. Ils sont utilisés pour créer des limites de cartes d'aventure et autres. Les monstres et les animaux n'apparaissent pas sur les barrières, et les clôtures ne se connectent pas aux barrières. D'autres blocs peuvent être construits sur des barrières comme sur n'importe quel autre bloc. Bedrock=Bedrock -Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Le bedrock est un type de roche très dur. Il ne peut pas être brisé, détruit, collecté ou déplacé par des moyens normaux, sauf en mode créatif. +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=La bedrock est un type de roche très dur. Elle ne peut pas être brisée, détruite, collectée ou déplacée par des moyens normaux, sauf en mode créatif. Birch Bark=Écorce de Bouleau Birch Leaves=Feuilles de Bouleau Birch Sapling=Pousse de Bouleau @@ -39,7 +39,7 @@ Block of Diamond=Bloc de Diamant Block of Emerald=Bloc d'Emeraude Block of Gold=Bloc d'Or Block of Iron=Bloc de Fer -Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Les blocs de charbon sont utiles comme stockage compact de charbon et très utiles comme combustible de four. Un bloc de charbon est aussi efficace que 10 charbon. +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Les blocs de charbon sont utiles comme stockage compact de charbon et très utiles comme combustible de four. Un bloc de charbon est aussi efficace que 10 charbons. Blue Stained Glass=Verre Bleu Bone Block=Bloc d'Os Bone blocks are decorative blocks and a compact storage of bone meal.=Les blocs d'os sont des blocs décoratifs et un stockage compact de poudre d'os. @@ -47,15 +47,15 @@ Bowl=Bol Bowls are mainly used to hold tasty soups.=Les bols sont principalement utilisés pour contenir de délicieuses soupes. Brick=Brique Brick Block=Bloc de Brique -Brick blocks are a good building material for building solid houses and can take quite a punch.=Les blocs de briques sont un bon matériau de construction pour la construction de maisons solides et peuvent resite au coup. +Brick blocks are a good building material for building solid houses and can take quite a punch.=Les blocs de briques sont un bon matériau de construction pour la construction de maisons solides et peuvent résister aux coups. Bricks are used to craft brick blocks.=Les briques sont utilisées pour fabriquer des blocs de briques. Brown Stained Glass=Verre Marron Cactus=Cactus Charcoal=Charbon de Bois Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Le charbon de bois est un combustible de four alternatif créé par la cuisson du bois dans un four. Il a le même temps de combustion que le charbon et partage également bon nombre de ses recettes d'artisanat, mais il ne peut pas être utilisé pour créer des blocs de charbon. Chiseled Stone Bricks=Pierre Sculptée -Chiseled Red Sandstone=Grès Rouge Sculptée -Chiseled Sandstone=Grès Sculptée +Chiseled Red Sandstone=Grès Rouge Sculpté +Chiseled Sandstone=Grès Sculpté Chiseled red sandstone is a decorative building block.=Le grès rouge ciselé est un bloc de construction décoratif. Chiseled sandstone is a decorative building block.=Le grès ciselé est un bloc de construction décoratif. Clay=Argile @@ -68,7 +68,7 @@ Coarse Dirt=Terre Stérile Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=La terre stérile agit comme un sol pour certaines plantes et est similaire à la terre, mais elle ne fera jamais pousser grand chose. Cobblestone=Pierre Cobweb=Toile d'Araignée -Cobwebs can be walked through, but significantly slow you down.=Les toiles d'araignée peuvent être parcourues, mais vous ralentissent considérablement. +Cobwebs can be walked through, but significantly slow you down.=Les toiles d'araignée peuvent être traversées, mais vous ralentissent considérablement. Cracked Stone Bricks=Pierre Taillée Craquelée Cut Red Sandstone=Grès Rouge Taillé Cut Sandstone=Grès Taillé @@ -81,27 +81,27 @@ Dark Oak Sapling=Pousse de Chêne Noir Dark Oak Wood=Bois de Chêne Noir Dark Oak Wood Planks=Planche de Chêne Noir Dark oak leaves are grown from dark oak trees.=Les feuilles de chêne noir sont issues de chênes noirs. -Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Les pousses de chêne noir peuvent devenir des chênes noirs, mais seulement en groupes. Une pousse de chêne noir solitaire ne poussera pas. Un groupe de quatre pousses de chêne noir se transforme en chêne noir après un certain temps lorsqu'ils sont placés sur le sol (comme la terre) dans un carré 2×2 et exposés à la lumière. -Dead Bush=Arbuste mort -Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Les buissons morts sont des plantes inhabituelles que l'on trouve souvent dans les zones sèches. Ils peuvent être récoltés avec des bâtons. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Les pousses de chêne noir peuvent devenir des chênes noirs, mais seulement en groupes. Une pousse de chêne noir solitaire ne poussera pas. Un groupe de quatre pousses de chêne noir se transforme en chêne noir après un certain temps lorsqu'elles sont placése sur le sol (comme la terre) dans un carré 2×2 et exposées à la lumière. +Dead Bush=Buisson mort +Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Les buissons morts sont des plantes peu remarquables que l'on trouve souvent dans les zones sèches. Ils peuvent servir à récolter des bâtons. Diamond=Diamant Diamond Ore=Minerai de Diamant Diamond ore is rare and can be found in clusters near the bottom of the world.=Le minerai de diamant est rare et peut être trouvé en filons près du fond du monde. Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Les diamants sont des minéraux précieux et utiles pour créer le plus haut niveau d'armure et d'outils. Diorite=Diorite -Diorite is an igneous rock.=La diorite est une roche ignée. +Diorite is an igneous rock.=La diorite est une roche volcanique. Dirt=Terre Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=La terre agit comme un sol pour quelques plantes. Lorsqu'il est à la lumière, ce bloc peut faire pousser une couverture d'herbe ou de mycélium si ces blocs sont à proximité. Emerald=Emeraude Emerald Ore=Minerai d'Emeraude -Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons. +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et ne peut être trouvé que seul, pas en filons. Emeralds are used in villager trades as currency.=Les émeraudes sont utilisées pour faire des échanges avec les villageois. Flint=Silex Flint is a raw material.=Le silex est une matière première. Flowing Lava=Lave qui coule Flowing Water=Eau qui coule Frosted Ice=Glace Givrée -Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=La glace givrée est un bloc solide de courte durée. Il fond dans une source d'eau en quelques secondes. +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=La glace givrée est un bloc solide de courte durée. Elle fond dans une source d'eau en quelques secondes. Glass=Verre Gold Ingot=Lingot d'Or Gold Nugget=Pépite d'Or @@ -109,7 +109,7 @@ Gold Ore=Minerai d'Or Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Les pépites d'or sont de très petites pièces d'or en fusion; le but principal est de créer des lingots d'or. Golden Apple=Pomme Dorée Golden apples are precious food items which can be eaten.=Les pommes dorrées sont des aliments précieux qui peuvent être consommés. -Granite=Granit +Granite=Granite Grass Block=Bloc d'Herbe Grass Path=Chemin d'Herbe Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Les chemins d'herbe sont une variante décorative des blocs d'herbe. Leur sommet a une couleur différente et ils sont un peu plus bas que les blocs d'herbe, ce qui les rend utiles pour construire des sentiers. Les chemins d'herbe peuvent être créés avec une pelle. Un chemin d'herbe se transforme en terre quand il est en dessous d'un bloc solide. @@ -117,12 +117,12 @@ Gravel=Gravier Green Stained Glass=Verre Vert Grey Stained Glass=Verre Gris Ice=Glace -Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=La glace est un bloc solide que l'on trouve généralement dans les régions froides. Il fond près des sources de lumière de bloc à un niveau de lumière de 12 ou plus. Lorsqu'il fond ou se casse en se reposant sur un autre bloc, il se transforme en source d'eau. +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=La glace est un bloc solide que l'on trouve généralement dans les régions froides. Elle fond près des sources de lumière de bloc à un niveau de lumière de 12 ou plus. Lorsqu'elle fond ou se casse en se reposant sur un autre bloc, elle se transforme en source d'eau. In the End dimension, starting a fire on this block will create an eternal fire.=Dans la dimension End, démarrer un feu sur ce bloc créera un feu éternel. Iron Ingot=Lingot de Fer Iron Nugget=Pépite de Fer Iron Ore=Minerai de Fer -Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Les pépites de fer sont de très petits morceaux de fer fondu; le but principal est de créer des lingots de fer. +Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Les pépites de fer sont de très petits morceaux de fer fondu; leur interêt principal est de créer des lingots de fer. Jungle Bark=Écorce d'Acajou Jungle Leaves=Feuilles d'Acajou Jungle Sapling=Pousse d'Acajou @@ -134,7 +134,7 @@ Lapis Lazuli Block=Bloc de Lapis-Lazuli Lapis Lazuli Ore=Minerai de Lapis-Lazuli Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Le minerai de lapis-lazuli produit du lapis-lazuli. Il peut être rarement trouvé dans des filons près du fond du monde. Lava Source=Source de Lave -Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=La lave est chaude et plutôt dangereuse. Ne le touchez pas, cela vous fera beaucoup de mal et il est difficile d'en sortir. +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=La lave est chaude et plutôt dangereuse. Ne la touchez pas, cela vous fera très de mal et il est difficile d'en sortir. Light Blue Stained Glass=Verre Bleu Clair Light Grey Stained Glass=Verre Gris Clair Lime Stained Glass=Verre Vert Clair @@ -162,7 +162,7 @@ Paper=Papier Paper is used to craft books and maps.=Le papier est utilisé pour créer des livres et des cartes. Pink Stained Glass=Verre Rose Podzol=Podzol -Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Le podzol est un type de terre trouvé dans les forêts de la taïga. Seules quelques plantes peuvent y survivre. +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Le podzol est un type de terre présente dans les forêts de la taïga. Seules quelques plantes peuvent y survivre. Polished Andesite=Andrésite Polie Polished Diorite=Diorite Polie Polished Granite=Granit Poli @@ -184,13 +184,13 @@ Sand is found in large quantities at beaches and deserts.=Le sable se trouve en Sandstone=Grès Sandstone is compressed sand and is a rather soft kind of stone.=Le grès est du sable comprimé et est un type de pierre plutôt tendre. Slime Block=Bloc de Slime -Slime blocks are very bouncy and prevent fall damage.=Les blocs de slime sont gonflables et empêchent les dommages de chute. +Slime blocks are very bouncy and prevent fall damage.=Les blocs de slime sont rebondissants et empêchent les dommages de chute. Smooth Red Sandstone=Grès Rouge Lisse Smooth Sandstone=Grès Lisse Smooth red sandstone is a decorative building block.=Le grès rouge lisse est un bloc de construction décoratif. Smooth sandstone is compressed sand and is a rather soft kind of stone.=Le grès lisse est du sable comprimé et est un type de pierre plutôt tendre. Snow=Neige -Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Du charbon contenu dans la pierre, il est très commun et peut être trouvé à l'intérieur de la pierre en grappes moyennes à grandes à presque toutes les hauteurs. +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Du charbon contenu dans la pierre, il est très commun et peut être trouvé à l'intérieur de la pierre en filons moyens ou grands à presque toutes les hauteurs. Some iron contained in stone, it is prety common and can be found below sea level.=Du fer contenu dans la pierre, il est assez courant et se trouve sous le niveau de la mer. Spruce Bark=Écorce de Sapin Spruce Leaves=Feuilles de Sapin @@ -205,7 +205,7 @@ Stone=Roche Stone Bricks=Pierre Taillée Sugar=Sucre Sugar Canes=Canne à Sucre -Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Les cannes à sucre sont une plante qui a certaines utilisations dans l'artisanat. Les cannes à sucre poussent lentement jusqu'à 3 blocs lorsqu'elles sont à côté de l'eau et sont placées sur un bloc d'herbe, de saleté, de sable, de sable rouge, de podzol ou de saleté grossière. Lorsqu'une canne à sucre est cassée, toutes les cannes à sucre connectées ci-dessus se brisent également. +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Les cannes à sucre sont une plante qui a certaines utilisations dans l'artisanat. Les cannes à sucre poussent lentement jusqu'à 3 blocs lorsqu'elles sont à côté de l'eau et sont placées sur un bloc d'herbe, de terre, de sable, de sable rouge, de podzol ou de terre stérile. Lorsqu'une canne à sucre est cassée, toutes les cannes à sucre connectées au-dessus se brisent également. Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Les cannes à sucre ne peuvent être placées que sur d'autres cannes à sucre et sur des blocs sur lesquels elles poussent. Sugar comes from sugar canes and is used to make sweet foods.=Le sucre provient des cannes à sucre et est utilisé pour fabriquer des aliments sucrés. The trunk of a birch tree.=Le tronc d'un bouleau. @@ -220,14 +220,14 @@ This is a full block of snow. Snow of this thickness is usually found in areas o This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Il s'agit d'un morceau de cactus que l'on trouve couramment dans les zones sèches, en particulier dans les déserts. Au fil du temps, les cactus pousseront jusqu'à 3 blocs de haut sur le sable ou le sable rouge. Un cactus blesse les êtres vivants qui le touchent avec des dégâts de 1 HP toutes les demi-secondes. Lorsqu'un bloc de cactus est brisé, tous les blocs de cactus connectés au-dessus se brisent également. This stone contains pure gold, a rare metal.=Cette pierre contient de l'or pur, un métal rare. Top Snow=neige -Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=La neige est une couche de neige. Il fond près de sources lumineuses autres que le soleil avec un niveau de lumière de 12 ou plus. +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=La neige est une couche de neige. Elle fond près de sources lumineuses autres que le soleil avec un niveau de lumière de 12 ou plus. Vines=Lianes Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Les lianes sont des blocs grimpants qui peuvent être placés sur les côtés de blocs pleins. Les lianes poussent et s'étendent lentement. Void=Néant Water=Eau Water Source=Source d'Eau Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=L'eau est abondante dans les océans et apparaît également dans quelques sources dans le sol. Vous pouvez nager facilement dans l'eau, mais vous devez de temps en temps reprendre votre souffle. -When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un jeune arbre de bouleau se transforme en bouleau après un certain temps. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, une pousse de bouleau se transforme en bouleau après un certain temps. When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, une pousse d'Acajou se transforme en arbre d'Acajou après un certain temps. Quand il y a 4 pousses d'Acajou dans un carré 2×2, ils deviendront un énorme arbre d'Acajou. When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un pousse de sapin se transforme en sapin après un certain temps. Lorsqu'il y a 4 pousses de sapin dans un carré 2×2, elles deviendront un énorme sapin. When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=Lorsqu'il est placé sur le sol (comme la terre) et exposé à la lumière, un pousse d'acacia se développera en un acacia après un certain temps. @@ -235,7 +235,7 @@ When placed on soil (such as dirt) and exposed to light, an oak sapling will gro When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Lorsque vous tenez une barrière en main, vous révélez toutes les barrières placées à une courte distance autour de vous. White Stained Glass=Verre Blanc Yellow Stained Glass=Verre Jaune -“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=Le "charbon" fait référence aux morceaux de charbon obtenus en creusant du minerai de charbon qui peut être trouvé sous terre. Le charbon est votre combustible de four standard, mais il peut également être utilisé pour fabriquer des torches, des blocs de charbon et quelques autres choses. +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=Le "charbon" fait référence aux morceaux de charbon obtenus en creusant du minerai de charbon qui peut être trouvé sous terre. Le charbon est votre combustible de four standard, mais il peut également être utilisé pour fabriquer des torches, des blocs de charbon et d'autres choses. Water interacts with lava in various ways:=L'eau interagit avec la lave de différentes manières: • When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Lorsque l'eau est directement au-dessus ou horizontalement à côté d'une source de lave, la lave se transforme en obsidienne. • When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Lorsque l'eau qui coule touche la lave qui coule par le haut ou horizontalement, la lave se transforme en pierre. @@ -244,7 +244,7 @@ Lava interacts with water various ways:=La lave interagit avec l'eau de différe • When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Lorsqu'une source de lave se trouve directement sous ou horizontalement à côté de l'eau, la lave se transforme en obsidienne. • When lava is directly above water, the water turns into stone.=• Lorsque la lave est directement au-dessus de l'eau, l'eau se transforme en pierre. Stained Glass=Verre teinté -Granite is an igneous rock.=Le granit est une roche ignée. +Granite is an igneous rock.=Le granit est une roche volcanique. Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=La neige peut être empilée et a l'un des 8 niveaux de hauteur différents. Aux niveaux 2 à 8, la neige provoque des collisions. La neige laisse tomber 2-9 boules de neige, selon sa hauteur. This block can only be placed on full solid blocks and on another top snow (which increases its height).=Ce bloc ne peut être placé que sur des blocs pleins et sur une autre neige (ce qui augmente sa hauteur). Needs soil and water to grow=A besoin de terre et d'eau pour se développer diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index 2d5b5462c..ce4d05c40 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -1,211 +1,223 @@ # textdomain: mcl_core @1 could not survive in lava.=@1 не смог(ла) выжить в лаве. @1 died in lava.=@1 погиб(ла) в лаве. -@1 melted in lava.=@1 расплавился(лась) в лаве. +@1 melted in lava.=@1 был(а) расплавлен(а) в лаве. @1 took a bath in a hot lava tub.=@1 принял(а) ванну с горячей лавой. A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Алмазный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения алмазов. A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Изумрудный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения изумрудов. A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Золотой блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения золотых слитков. -A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Алмазный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения железных слитков. +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Железный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения железных слитков. A cactus can only be placed on top of another cactus or any sand.=Кактус можно поставить только на верхушку другого кактуса или на любой песок. A decorative and mostly transparent block.=Декоративный и преимущественно прозрачный блок. -A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Травяной блок это грязь, покрытая травой. Травяные блоки удобны тем, что позволяют выращивать любые сорта растений. Их можно превратить в грядки при помощи мотыги или в тропинки при помощи лопаты. При наличии света трава понемногу распространяется на грязь по соседству. Под непрозрачным блоком или жидкостью травяной блок может превратиться обратно в грязь. -A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Ляпис-лазурный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения ляпис-лазури. +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Дёрн это блок земли, покрытый травой. Дёрн удобен тем, что на нём могут расти разнообразные растения. Дёрн можно превратить в грядку при помощи мотыги или в тропинку при помощи лопаты. При наличии света дёрн понемногу распространяется на блоки земли по соседству. Под непрозрачным блоком или жидкостью дёрн может превратиться обратно в землю. +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Блок лазурита это, прежде всего, декоративный блок, но он также удобен для компактного хранения лазурита. A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Источник лавы поджигает пару воздушных блоков над ним, если они расположены рядом с легковоспламенимым блоком. -A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Сегмент лестницы, позволяющий вам карабкаться вертикально. Лестницы можно устанавливать только на стороны твёрдых блоков. Их нельзя разместить на стекле, листьях, льду, светящемся камне и морских фонарях. +A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Лестница позволяет вам карабкаться вертикально. Лестницы можно устанавливать только сбоку на твёрдые блокои. Их нельзя разместить на стекле, листьях, льду, светящемся камне и морских фонарях. Acacia Bark=Кора акации Acacia Leaves=Листва акации Acacia Sapling=Саженец акации -Acacia Wood=Акация +Acacia Wood=Акациевая древесина Acacia Wood Planks=Доски акации Acacia leaves are grown from acacia trees.=Листва акации произрастает на деревьях акации. Andesite=Андезит Andesite is an igneous rock.=Андезит это камень вулканической природы. Apple=Яблоко -Apples are food items which can be eaten.=Яблоки относятся к продуктовым предметам, которые можно есть. +Apples are food items which can be eaten.=Яблоки это съедобный продукт. Barrier=Барьер -Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Барьеры это невидимые блоки-препятствия. Они могут использоваться, например, для создания границ карты. Монстры и животные не будут появляться на барьерах. Заборы с барьерами визуально не связываются. Другие блоки могут строиться на барьерах, как на любых других блоках. +Barriers are invisble walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Барьеры это невидимые блоки-препятствия. Они могут использоваться, например, для создания границ карты. Монстры и животные не будут появляться на барьерах. Заборы с барьерами не соединяются. Другие блоки могут строиться на барьерах, как на любых других блоках. Bedrock=Бедрок -Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Бедрок это очень твёрдый камень. Его невозможно сломать, выкопать или сдвинуть обычным способом, за исключением творческого режима. +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Бедрок это очень твёрдый камень. Его невозможно сломать, добыть или сдвинуть обычным способом, за исключением творческого режима. Birch Bark=Кора берёзы Birch Leaves=Листва берёзы Birch Sapling=Саженец берёзы -Birch Wood=Берёза +Birch Wood=Берёзовая древесина Birch Wood Planks=Берёзовые доски Birch leaves are grown from birch trees.=Листва берёзы произрастает на берёзах. -Black Stained Glass=Чёрное витражное стекло +Black Stained Glass=Чёрное окрашенное стекло Block of Coal=Угольный блок Block of Diamond=Алмазный блок Block of Emerald=Изумрудный блок Block of Gold=Золотой блок Block of Iron=Железный блок -Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Угольный блок удобен для компактного хранения угля, а также как топливо для печи. -Blue Stained Glass=Синее витражное стекло +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Угольный блок удобен для компактного хранения угля, а также полезен как топливо для печи. +Blue Stained Glass=Синее окрашенное стекло Bone Block=Костный блок Bone blocks are decorative blocks and a compact storage of bone meal.=Костные блоки это декоративные блоки, а также способ компактного хранения костной муки. -Bowl=Чаша -Bowls are mainly used to hold tasty soups.=Чаши чаще всего используются для хранения вкусных супов. +Bowl=Миска +Bowls are mainly used to hold tasty soups.=Миски используются для крафта вкусных супов. Brick=Кирпич Brick Block=Кирпичный блок Brick blocks are a good building material for building solid houses and can take quite a punch.=Кирпичные блоки это отличный строительный материал для создания прочных домов, они выдерживают довольно сильные удары. Bricks are used to craft brick blocks.=Кирпичи используются для создания кирпичных блоков. -Brown Stained Glass=Коричневое витражное стекло +Brown Stained Glass=Коричневое окрашенное стекло Cactus=Кактус Charcoal=Древесный уголь -Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Древесный уголь это альтернативное печное топливо, получаемое путём сжигания дерева в качестве ингредиента в печи. Оно имеет такую же длительность горения, как и каменный уголь, но из него нельзя сделать угольные блоки. -Chiseled Stone Bricks=Точёный каменный блок -Chiseled Red Sandstone=Точёный красный камень -Chiseled Sandstone=Точёный песчаник -Chiseled red sandstone is a decorative building block.=Точёный красный камень это декоративный строительный блок. -Chiseled sandstone is a decorative building block.=Точёный песчаник это декоративный строительный блок. -Clay=Глина -Clay Ball=Глиняный шарик -Clay balls are a raw material, mainly used to create bricks in the furnace.=Глиняные шарики это необработанный материал, в основном используемый для создания кирпичей при помощи печи. -Clay is a versatile kind of earth commonly found at beaches underwater.=Глина это универсальный тип почвы, часто встречающийся под водой возле отмелей. +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Древесный уголь это альтернативное печное топливо, получаемое путём сжигания древесины в качестве ингредиента в печи. Оно имеет такую же длительность горения, как и каменный уголь, но из него нельзя сделать угольные блоки. +Chiseled Stone Bricks=Декоративные песчаниковые кирпичи +Chiseled Red Sandstone=Декоративный красный песчаник +Chiseled Sandstone=Декоративный песчаник +Chiseled red sandstone is a decorative building block.=Декоративный красный песчаник это декоративный строительный блок. +Chiseled sandstone is a decorative building block.=Декоративный песчаник это декоративный строительный блок. +Clay=Блок глины +Clay Ball=Глина +Clay balls are a raw material, mainly used to create bricks in the furnace.=Глина это необработанный материал, в основном используемый для создания кирпичей при помощи печи. +Clay is a versatile kind of earth commonly found at beaches underwater.=Глиняный блок это тип почвы, часто встречающийся на побережьях под водой. Coal=Уголь Coal Ore=Угольная руда -Coarse Dirt=Твёрдая грязь -Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Твёрдая грязь равносильна почве для некоторых растений и похожа на обычную грязь, но на ней не растёт трава. +Coarse Dirt=Каменистая земля +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Каменистая земля это почва для некоторых растений и похожа на обычную землю, но на ней никогда не растёт трава. Cobblestone=Булыжник Cobweb=Паутина Cobwebs can be walked through, but significantly slow you down.=Паутину можно пройти насквозь, но она ощутимо снижает вашу скорость. -Cracked Stone Bricks=Треснутые каменные блоки -Cut Red Sandstone=Резной красный камень +Cracked Stone Bricks=Потрескавшиеся каменные кирпичи +Cut Red Sandstone=Резной красный песчаник Cut Sandstone=Резной песчаник -Cut red sandstone is a decorative building block.=Резной красный камень это декоративный строительный блок. +Cut red sandstone is a decorative building block.=Резной красный песчаник это декоративный строительный блок. Cut sandstone is a decorative building block.=Резной песчаник это декоративный строительный блок. -Cyan Stained Glass=Голубое витражное стекло +Cyan Stained Glass=Бирюзовое окрашенное стекло Dark Oak Bark=Кора тёмного дуба Dark Oak Leaves=Листва тёмного дуба Dark Oak Sapling=Саженец тёмного дуба -Dark Oak Wood=Тёмный дуб +Dark Oak Wood=Древесина тёмного дуба Dark Oak Wood Planks=Доски из тёмного дуба Dark oak leaves are grown from dark oak trees.=Листва тёмного дуба произрастает на деревьях тёмного дуба. -Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Из саженцев тёмного дуба могут вырастать деревья, но для этого надо высаживать их группами. Одинокие саженцы не будут расти. Группа из четырёх саженцев станет деревом через некоторое время после высадки на освещённый участок почвы (или грязи) в виде квадрата 2*2. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Из саженцев тёмного дуба могут вырастать деревья, но для этого надо высаживать их группами. Одинарные саженцы не будут расти. Группа из четырёх саженцев станет деревом через некоторое время после высадки на освещённый участок почвы в виде квадрата 2×2. Dead Bush=Мёртвый куст Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Мёртвые кусты это непримечательные растения, часто встречающиеся в засушливых областях. Их можно собирать, чтобы сделать из них палки. Diamond=Алмаз Diamond Ore=Алмазная руда -Diamond ore is rare and can be found in clusters near the bottom of the world.=Алмазная руда встречается редко, в виде скоплений около дна мира. +Diamond ore is rare and can be found in clusters near the bottom of the world.=Алмазная руда встречается редко, в виде скоплений в нижних слоях мира. Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Алмазы это драгоценные камни, используемые для создания брони и инструментов высшего качества. Diorite=Диорит Diorite is an igneous rock.=Диорит это камень вулканической природы. -Dirt=Грязь -Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=Грязь то же самое, что почва для некоторых растений. Под освещением на этом блоке может прорасти трава или мицелий, если такие блоки уже есть поблизости. +Dirt=Земля +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=Земля это почва для некоторых растений. Под освещением на этом блоке может прорасти трава или мицелий, если такие блоки уже есть поблизости. Emerald=Изумруд Emerald Ore=Изумрудная руда -Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку. -Emeralds are used in villager trades as currency.= +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку, а не в кластерах. +Emeralds are used in villager trades as currency.=Изумруды используют деревенские жители в качестве валюты. Flint=Кремень Flint is a raw material.=Кремень это необработанный материал. Flowing Lava=Текущая лава Flowing Water=Текущая вода -Frosted Ice=Намёрзший лёд -Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=Намёрзший лёд это быстро исчезающий твёрдый блок. Он за несколько секунд тает, превращаясь в источник воды. +Frosted Ice=Подмороженный лёд +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=Подмороженный лёд это быстро исчезающий твёрдый блок. Он растает через несколько секунд, превратившись в источник воды. Glass=Стекло Gold Ingot=Золотой слиток Gold Nugget=Золотой самородок Gold Ore=Золотая руда Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Золотые самородки это мелкие частички чистого золота, которые можно объединять в золотые слитки. Golden Apple=Золотое яблоко -Golden apples are precious food items which can be eaten.=Золотые яблоки это изысканные продуктовые предметы, которые можно есть. +Golden apples are precious food items which can be eaten.=Золотые яблоки это ценный съедобный продукт. Granite=Гранит -Grass Block=Травяной блок +Grass Block=Дёрн Grass Path=Тропинка -Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Тропинки это декоративная разновидность травяных блоков. Их верхняя часть окрашена другим цветом, а они сами чуть ниже, чтобы это смотрелось как притоптанная трава. Такие блоки можно создать при помощи лопаты. При помещении под твёрдый блок данные блоки превращаются в грязь. +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Тропинки это декоративная разновидность травяных блоков. Их верхняя часть окрашена другим цветом, а они сами чуть ниже, чтобы это смотрелось как притоптанная трава. Такие блоки можно создать при помощи лопаты. При помещении под твёрдый блок данные блоки превращаются в землю. Gravel=Гравий -Green Stained Glass=Зелёное витражное стекло -Grey Stained Glass=Серое витражное стекло +Green Stained Glass=Зелёное окрашенное стекло +Grey Stained Glass=Серое окрашенное стекло Ice=Лёд -Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Лёд это твёрдый блок, обычно встречающийся в холодных областях. Он плавится, когда рядом имеется источник света уровня 12 и выше. Если он плавится или ломается, будучи расположенным на другом блоке, то превращается в источник воды. -In the End dimension, starting a fire on this block will create an eternal fire.=В измерении Предела разжигание огня на этом блоке создаст вечный огонь. +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Лёд это твёрдый блок, обычно встречающийся в холодных областях. Он тает, когда рядом имеется источник света уровня 12 и выше. Если он тает или ломается, будучи расположенным на другом блоке, то превращается в источник воды. +In the End dimension, starting a fire on this block will create an eternal fire.=В измерении Края разжигание огня на этом блоке создаст вечный огонь. Iron Ingot=Железный слиток Iron Nugget=Железный самородок Iron Ore=Железная руда Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Железные самородки это маленькие частички чистого железа, которые можно объединять в железные слитки. -Jungle Bark=Кора дерева джунглей -Jungle Leaves=Листва дерева джунглей -Jungle Sapling=Саженец дерева джунглей -Jungle Wood=Дерево джунглей -Jungle Wood Planks=Доски из дерева джунглей -Jungle leaves are grown from jungle trees.=Листва дерева джунглей произрастает на деревьях джунглей. +Jungle Bark=Кора тропического дерева +Jungle Leaves=Листва тропического дерева +Jungle Sapling=Саженец тропического дерева +Jungle Wood=Древесина тропического дерева +Jungle Wood Planks=Доски из тропического дерева +Jungle leaves are grown from jungle trees.=Листва тропического дерева произрастает на тропических деревьях. Ladder=Лестница -Lapis Lazuli Block=Ляпис-лазурный блок -Lapis Lazuli Ore=Ляпис-лазурная руда -Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Ляпис-лазурная руда это руда ляпис-лазури. Она изредка встречается в виде скоплений вблизи дна мира. +Lapis Lazuli Block=Блок лазурита +Lapis Lazuli Ore=Лазуритовая руда +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Лазуритовая руда это руда лазурита. Она изредка встречается в виде скоплений в нижних слоях мира. Lava Source=Источник лавы -Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Лава горячая и довольно опасная. Не прикасайтесь к ней, это причинит сильную боль, и выбраться из неё сложно. -Light Blue Stained Glass=Светло-голубое витражное стекло -Light Grey Stained Glass=Светло-серое витражное стекло -Lime Stained Glass=Зелёное лаймовое витражное стекло -Lit Redstone Ore=Светящаяся руда красного камня -Magenta Stained Glass=Фиолетовое витражное стекло -Molten gold. It is used to craft armor, tools, and whatnot.=Чистое золото. Используется для создания брони, инструментов и чего угодно. -Molten iron. It is used to craft armor, tools, and whatnot.=Чистое железо. Используется для создания брони, инструментов и чего угодно. -Mossy Cobblestone=Мшистый булыжник -Mossy Stone Bricks=Мшистый каменный блок +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Лава горячая и довольно опасная. Не прикасайтесь к ней, это нанесет вам урон, и выплыть из неё сложно. +Light Blue Stained Glass=Голубое окрашенное стекло +Light Grey Stained Glass=Светло-серое окрашенное стекло +Lime Stained Glass=Лаймовое окрашенное стекло +Lit Redstone Ore=Светящаяся руда редстоуна +Magenta Stained Glass=Сиреневое окрашенное стекло +Molten gold. It is used to craft armor, tools, and whatnot.=Золотой слиток. Используется для создания брони, инструментов и прочего. +Molten iron. It is used to craft armor, tools, and whatnot.=Железный слиток. Используется для создания брони, инструментов и прочего. +Mossy Cobblestone=Замшелый булыжник +Mossy Stone Bricks=Замшелые каменные кирпичи Mycelium=Мицелий -Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Мицелий это тип грязи, идеально подходящий для грибов. В отличие от других грязевых блоков, он не может быть превращён в грядку при помощи мотыги. При наличии освещения мицелий медленно распространяется по соседствующей с ним грязи. Под непрозрачным блоком или жидкостью со временем превращается обратно в грязь. +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Мицелий это идеальная почва для грибов. В отличие от других земляных блоков, он не может быть превращён в грядку при помощи мотыги. При наличии освещения мицелий медленно распространяется по соседствующие с ним блоки земли. Под непрозрачным блоком или жидкостью со временем превращается обратно в землю. Oak Bark=Кора дуба Oak Leaves=Листва дуба Oak Sapling=Саженец дуба -Oak Wood=Дуб +Oak Wood=Дубовая древесина Oak Wood Planks=Дубовые доски Oak leaves are grown from oak trees.=Листва дуба произрастает на дубовых деревьях. Obsidian=Обсидиан Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=Обсидиан это чрезвычайно твёрдый минерал с высочайшей взрывоустойчивостью. -One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Один из самых обычных блоков мира, почти вся подземная часть состоит из камня. Иногда он содержит руду. Камень может создаться при встрече воды с лавой. -Orange Stained Glass=Оранжевое витражное стекло -Packed Ice=Упакованный лёд -Packed ice is a compressed form of ice. It is opaque and solid.=Упакованный лёд это сжатая форма льда. Он непрозрачный и твёрдый. +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Один из самых распространённых блоков в мире, почти вся подземная часть состоит из камня. Иногда он содержит руду. Камень может создаться при встрече воды с лавой. +Orange Stained Glass=Оранжевое окрашенное стекло +Packed Ice=Плотный лёд +Packed ice is a compressed form of ice. It is opaque and solid.=Плотный лёд это сжатая форма льда. Он непрозрачный и твёрдый. Paper=Бумага Paper is used to craft books and maps.=Бумага используется для создания книг и карт. -Pink Stained Glass=Розовое витражное стекло +Pink Stained Glass=Розовое окрашенное стекло Podzol=Подзол -Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Подзол это тип грязи, встречающийся в таёжных лесах. Только несколько растений имеют способность выжить на нём. +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Подзол это тип земли, встречающийся в таёжных лесах. Только несколько растений имеют способность выжить на нём. Polished Andesite=Гладкий андезит Polished Diorite=Гладкий диорит Polished Granite=Гладкий гранит Polished Stone=Гладкий камень -Polished andesite is a decorative building block made from andesite.=Гладкий андезит это декоративный строительный блок, сделанный из андезита. -Polished diorite is a decorative building block made from diorite.=Гладкий диорит это декоративный строительный блок, сделанный из диорита. -Polished granite is a decorative building block made from granite.=Гладкий гранит это декоративный строительный блок, сделанный из гранита. -Purple Stained Glass=Пурпурное витражное стекло +Polished andesite is a decorative building block made from andesite.=Гладкий андезит это декоративный строительный блок из андезита. +Polished diorite is a decorative building block made from diorite.=Гладкий диорит это декоративный строительный блок из диорита. +Polished granite is a decorative building block made from granite.=Гладкий гранит это декоративный строительный блок из гранита. +Purple Stained Glass=Фиолетовое окрашенное стекло Realm Barrier=Барьер области Red Sand=Красный песок Red Sandstone=Красный песчаник -Red Stained Glass=Красное витражное стекло +Red Stained Glass=Красное окрашенное стекло Red sand is found in large quantities in mesa biomes.=Красный песок в больших количествах встречается в биомах столовых гор. -Red sandstone is compressed red sand and is a rather soft kind of stone.=Красный песчаник это сжатый красный песок, мягкая разновидность камня. -Redstone Ore=Краснокаменная руда -Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Краснокаменная руда обычно содержится вблизи дна мира. +Red sandstone is compressed red sand and is a rather soft kind of stone.=Красный песчаник это сжатый красный песок, некая разновидность камня. +Redstone Ore=Редстоуновая руда +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Редстоуновая руда обычно содержится в нижних слоях мира. Sand=Песок Sand is found in large quantities at beaches and deserts.=Песок в больших количествах встречается на пляжах и в пустынях. Sandstone=Песчаник -Sandstone is compressed sand and is a rather soft kind of stone.=Песчаник это сжатый песок, мягкая разновидность камня. +Sandstone is compressed sand and is a rather soft kind of stone.=Песчаник это сжатый песок, некая разновидность камня. Slime Block=Блок слизи -Slime blocks are very bouncy and prevent fall damage.=Блок слизи очень упруг и спасает от повреждений при падении. -Smooth Red Sandstone=Гладкий красный камень +Slime blocks are very bouncy and prevent fall damage.=Блок слизи очень упругий и спасает от повреждений при падении. +Smooth Red Sandstone=Гладкий красный песчаник Smooth Sandstone=Гладкий песчаник -Smooth red sandstone is a decorative building block.=Гладкий красный камень это декоративный строительный блок. -Smooth sandstone is compressed sand and is a rather soft kind of stone.=Гладкий песчаник это сжатый песок, мягкая разновидность камня. +Smooth red sandstone is a decorative building block.=Гладкий красный песчаник это декоративный строительный блок. +Smooth sandstone is compressed sand and is a rather soft kind of stone.=Гладкий песчаник это сжатый песок, некая разновидность камня. Snow=Снег -Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Немного угля содержится в камне, это обычное явление, скопления таких блоков встречаются около возвышенностей. -Some iron contained in stone, it is prety common and can be found below sea level.=Немного железа содержится в камне, это довольно обычное явление, такие блоки встречаются ниже уровня моря. +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Уголь содержится в камне, он весьма распространён, скопления таких блоков встречаются около возвышенностей. +Some iron contained in stone, it is prety common and can be found below sea level.=Железо содержится в камне, оно весьма распространено, такие блоки встречаются ниже уровня моря. Spruce Bark=Кора ели Spruce Leaves=Хвоя Spruce Sapling=Саженец ели -Spruce Wood=Ель +Spruce Wood=Еловая древесина Spruce Wood Planks=Еловые доски Spruce leaves are grown from spruce trees.=Хвоя растёт на еловых деревьях. -Stained glass is a decorative and mostly transparent block which comes in various different colors.=Витражное стекло это декоративный и в основном прозрачный блок, встречающийся в различных расцветках. +Stained glass is a decorative and mostly transparent block which comes in various different colors.=Окрашенное стекло это декоративный прозрачный блок, встречающийся в различных расцветках. Stick=Палка -Sticks are a very versatile crafting material; used in countless crafting recipes.=Палки это универсальный материал, используемый для создания различных вещей, присутствует во многих рецептах. +Sticks are a very versatile crafting material; used in countless crafting recipes.=Палки это универсальный материал, используемый для крафта различных предметов, присутствует во многих рецептах. Stone=Камень -Stone Bricks=Каменные блоки +Stripped Acacia Log=Отёсаное бревно акации +Stripped Acacia Wood=Отёсаная древесина акации +Stripped Birch Log=Отёсаное берёзовое бревно +Stripped Birch Wood=Отёсаная берёзовая древесина +Stripped Dark Oak Log=Отёсаное бревно тёмного дуба +Stripped Dark Oak Wood=Отёсаная древесина тёмного дуба +Stripped Jungle Log=Отёсаное бревно тропического дерева +Stripped Jungle Wood=Отёсаная древесина тропического дерева +Stripped Oak Log=Отёсаное дубовое бревно +Stripped Oak Wood=Отёсаная дубовая древесина +Stripped Spruce Log=Отёсаное еловое бревно +Stripped Spruce Wood=Отёсаная еловая древесина +Stone Bricks=Каменные кирпичи Sugar=Сахар Sugar Canes=Сахарный тростник -Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Сахарный тростник это растение, имеющее некоторое применение в крафтинге. Если тростник находится по соседству с водой на травяном блоке, грязи, красном песке, подзоле или грубой грязи, он будет медленно расти вверх до 3 блоков. Если сломать тростник, все верхние части также сломаются. +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Сахарный тростник это растение, используемое в крафте. Если тростник находится по соседству с водой на дёрне, земле, песке, красном песке, подзоле или каменистой земле, он будет медленно расти вверх до 3 блоков. Если сломать тростник, все верхние части также сломаются. Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Сахарный тростник может быть помещён только на верхушку другого сахарного тростника, либо на верхнюю часть другого блока, на котором он может расти. Sugar comes from sugar canes and is used to make sweet foods.=Сахар добывают из сахарного тростника и используют для приготовления сладких продуктов. The trunk of a birch tree.=Берёзовый ствол @@ -214,45 +226,46 @@ The trunk of a jungle tree.=Ствол дерева джунглей The trunk of a spruce tree.=Еловый ствол The trunk of an acacia.=Ствол акации The trunk of an oak tree.=Дубовый ствол -This block consists of a couple of loose stones and can't support itself.=Этот блок состоит из пары рыхлых камней и не может удержать себя. -This is a decorative block surrounded by the bark of a tree trunk.=Это декоративный блок, окружённый древесной корой. -This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Это целый блок снега. Снег такой толщины обычно встречается в экстремально холодных зонах. -This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Это часть кактуса, обычно встречающегося в засушливых областях, особенно в пустынях. Со временем кактусы растут до 3 блоков вверх на песке или красном песке. Кактус колет живых существ, трогающих его, причиняя урон в 1 HP каждые полсекунды. Если сломать кактус, все вышестоящие блоки сломаются также. +This block consists of a couple of loose stones and can't support itself.=Этот блок рыхлый и не может поддерживать себя. +This is a decorative block surrounded by the bark of a tree trunk.=Это декоративный блок из древесной коры. +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Это блок снега. Снег такой толщины обычно встречается в экстремально холодных зонах. +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Это кактус, обычно встречающийся в засушливых регионах, особенно в пустынях. Со временем кактусы вырастают до 3 блоков вверх на песке или красном песке. Кактус колет живых существ, касающихся его, причиняя урон в 1 единицу здоровья каждые полсекунды. Если сломать кактус, все вышестоящие блоки сломаются также. This stone contains pure gold, a rare metal.=Этот камень содержит чистое золото, редкий металл. -Top Snow=Наст -Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=Наст это верхний слой снега. Он тает вблизи не солнечных источников света с яркостью уровня 12 и выше. +Top Snow=Слой снега +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=Слой снега. Он тает вблизи источников света с яркостью уровня 12 и выше. Vines=Лоза -Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Лоза это блок, по которому можно карабкаться, он может быть помещён по сторонам твёрдого кубического блока. +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Лоза это блок, по которому можно карабкаться, он может быть помещён по сторонам твёрдого блока. Void=Пустота Water=Вода Water Source=Источник воды Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=Вода изобилует в океанах и также встречается в виде ключей под землёй. -When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=После высадки на почву (например, грязь) при наличии света саженец берёзы вырастет в берёзу через некоторое время. -When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=После высадки на почву (например, грязь) при наличии света саженец дерева джунглей вырастет в дерево джунглей через некоторое время. Если высадить 4 саженца по схеме 2*2, вырастет огромное дерево джунглей. -When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=После высадки на почву (например, грязь) при наличии света саженец ели вырастет в ель через некоторое время. Если высадить 4 саженца по схеме 2*2, вырастет огромная ель. -When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=После высадки на почву (например, грязь) при наличии света саженец акации вырастет в акацию через некоторое время. -When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=После высадки на почву (например, грязь) при наличии света саженец дуба вырастет в дуб через некоторое время. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=После посадки на почву (например, на землю) при наличии света саженец берёзы вырастет в берёзу через некоторое время. +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=После посадки на почву (например, на землю) при наличии света саженец тропического дерева вырастет в тропическое дерево через некоторое время. Если высадить 4 саженца по схеме 2×2, вырастет огромное тропическое дерево. +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=После посадки на почву (например, на землю) при наличии света саженец ели вырастет в ель через некоторое время. Если высадить 4 саженца по схеме 2×2, вырастет огромная ель. +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=После посадки на почву (например, на землю) при наличии света саженец акации вырастет в акацию через некоторое время. +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=После посадки на почву (например, на землю) при наличии света саженец дуба вырастет в дуб через некоторое время. When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Когда вы держите барьер в руке, вы видите все барьеры, размещённые вокруг вас вблизи. -White Stained Glass=Белое витражное стекло -Yellow Stained Glass=Жёлтое витражное стекло -“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=“Уголь” относится к угольным кускам, добываемым из угольной руды, которую можно встретить под землёй. Уголь это стандартное печное топливо для вас, но он также нужен, чтобы сделать факелы, угольные блоки и несколько других вещей. +White Stained Glass=Белое окрашенное стекло +Yellow Stained Glass=Жёлтое окрашенное стекло +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=“Уголь” относится к угольным кускам, добываемым из угольной руды, которую можно встретить под землёй. Уголь это стандартное печное топливо, но он также нужен, чтобы сделать факелы, угольные блоки и некоторые другие предметы. Water interacts with lava in various ways:=Вода взаимодействует с лавой по-разному: -• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Если вода прямо над источником лавы или соседствует с ним в горизонтальном направлении, лава превращается в обсидиан. -• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Если текущая вода прикасается к текущей лаве сверху или сбоку, лава превращается в булыжник. -• When water is directly below lava, the water turns into stone.=• Если вода попадает прямо под лаву, эта вода превращается в камень. +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Если вода прямо над источником лавы или соседствует с ним в горизонтальном направлении, источник лавы превращается в обсидиан. +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Если текущая вода прикасается к текущей лаве сверху или сбоку, текущая лава превращается в булыжник. +• When water is directly below lava, the water turns into stone.=• Если вода попадает прямо под лаву, этот источник воды превращается в камень. Lava interacts with water various ways:=Лава взаимодействует с водой по-разному: -• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Когда источник лавы прямо под водой, либо вода сбоку от него, лава превращается в обсидиан. -• When lava is directly above water, the water turns into stone.=• Когда лава прямо над водой, вода превращается в камень. -Stained Glass=Витражное стекло -Granite is an igneous rock.=Гранит это камень вулканической природы. -Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=Наст может стыковаться и иметь один из 8 разных уровней высоты. При уровнях 2-8 в снег нельзя провалиться. Верхний снег превращается в 2-9 снежков, в зависимости от его высоты. -This block can only be placed on full solid blocks and on another top snow (which increases its height).=Этот блок можно поместить только на целый твёрдый блок либо на другой наст (что увеличит его высоту). +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Когда источник лавы прямо под водой, либо вода сбоку от него, источник лавы превращается в обсидиан. +• When lava is directly above water, the water turns into stone.=• Когда лава прямо над водой, источник воды превращается в камень. +Stained Glass=Окрашенное стекло +Granite is an igneous rock.=Гранит это камень вулканической породы. +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=Слои снега могут наслаиваться друг на друга и иметь один из 8 разных уровней высоты. При уровнях 2-8 слой снега становится непроходиымы. Слой снега дропает 2-9 снежков, в зависимости от его высоты. +This block can only be placed on full solid blocks and on another top snow (which increases its height).=Этот блок можно поместить только на целый твёрдый блок либо на другой слой (что увеличит его высоту). Needs soil and water to grow=Нуждается в почве и воде, чтобы расти Needs soil and light to grow=Нуждается в почве и свете, чтобы расти Grows on sand=Растёт на песке -Contact damage: @1 per half second=Повреждение при контакте: @1 за полсекунды +Contact damage: @1 per half second=Урон при контакте: @1 за полсекунды Slows down movement=Замедляет перемещение -2×2 saplings required=Высаживается по схеме 2*2 -2×2 saplings @= large tree=2*2 саженца @= большое дерево -Grows on sand or dirt next to water=Растёт на песке или грязи рядом с водой -Stackable=Можно состыковать +2×2 saplings required=Высаживается по схеме 2×2 +2×2 saplings @= large tree=2×2 саженца @= большое дерево +Grows on sand or dirt next to water=Растёт на песке или земле рядом с водой +Stackable=Наслаивается +Enchanted Golden Apple=Зачарованное золотое яблоко diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt index 19d156711..57b15ef82 100644 --- a/mods/ITEMS/mcl_core/locale/template.txt +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -92,6 +92,7 @@ Diorite= Diorite is an igneous rock.= Dirt= Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.= +Enchanted Golden Apple= Emerald= Emerald Ore= Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.= @@ -154,6 +155,8 @@ Oak Wood Planks= Oak leaves are grown from oak trees.= Obsidian= Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.= +Crying Obsidian= +Crying obsidian is a luminous obsidian that can generate as part of ruined portals.= One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.= Orange Stained Glass= Packed Ice= diff --git a/mods/ITEMS/mcl_core/mod.conf b/mods/ITEMS/mcl_core/mod.conf index 45018df75..3d7f59245 100644 --- a/mods/ITEMS/mcl_core/mod.conf +++ b/mods/ITEMS/mcl_core/mod.conf @@ -1,4 +1,4 @@ name = mcl_core description = Core items of MineClone 2: Basic biome blocks (dirt, sand, stones, etc.), derived items, glass, sugar cane, cactus, barrier, mining tools, hand, craftitems, and misc. items which don't really fit anywhere else. -depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting, mcl_colors +depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting, mcl_colors, mcl_mapgen optional_depends = doc diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index fe1ee58c2..eed6ab906 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -11,6 +11,7 @@ else ice_drawtype = "normal" ice_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false end +local mossnodes = {"mcl_core:stone", "mcl_core:granite", "mcl_core:granite_smooth", "mcl_core:diorite", "mcl_core:diorite_smooth", "mcl_core:andesite", "mcl_core:andesite_smooth", "mcl_deepslate:deepslate", --[[glowberries, ]]"mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:podzol", "mcl_core:coarse_dirt", "mcl_core:mycelium"} mcl_core.fortune_drop_ore = { discrete_uniform_distribution = true, @@ -368,7 +369,7 @@ minetest.register_node("mcl_core:dirt_with_grass", { color = "#8EB971", is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1,dirt=2,grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1}, + groups = {handy=1,shovely=1,dirt=2,grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1, compostability=30}, drop = "mcl_core:dirt", sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.1}, @@ -465,6 +466,19 @@ minetest.register_node("mcl_core:dirt", { _mcl_hardness = 0.5, }) +minetest.register_node("mcl_core:moss", { + description = S("Moss"), + _doc_items_longdesc = S("A moss block is a natural block that can be spread to some other blocks by using bone meal."),--TODO: Other desciption? + _doc_items_hidden = false, + tiles = {"mcl_core_moss_block.png"}, + is_ground_content = true, + stack_max = 64, + groups = {handy=1, hoey=1, compostability=65}, + --sounds = TODO: add sound + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, +}) + minetest.register_node("mcl_core:coarse_dirt", { description = S("Coarse Dirt"), _doc_items_longdesc = S("Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover."), @@ -826,6 +840,19 @@ minetest.register_node("mcl_core:obsidian", { end, }) +minetest.register_node("mcl_core:crying_obsidian", { + description = S("Crying Obsidian"), + _doc_items_longdesc = S("Crying obsidian is a luminous obsidian that can generate as part of ruined portals."), + tiles = {"default_obsidian.png^mcl_core_crying_obsidian.png"}, + is_ground_content = false, + light_source = 10, + sounds = mcl_sounds.node_sound_stone_defaults(), + stack_max = 64, + groups = {pickaxey=5, building_block=1, material_stone=1}, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, +}) + minetest.register_node("mcl_core:ice", { description = S("Ice"), _doc_items_longdesc = S("Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source."), @@ -1062,10 +1089,79 @@ minetest.register_node("mcl_core:snowblock", { _mcl_silk_touch_drop = true, }) +minetest.register_node("mcl_core:moss", { + description = S("Moss"), + _doc_items_longdesc = S("A moss block is a natural block that can be spread to some other blocks by using bone meal."),--TODO: Other desciption? + _doc_items_hidden = false, + tiles = {"mcl_core_moss_block.png"}, + is_ground_content = true, + stack_max = 64, + groups = {handy=1, hoey=1, compostability=65}, + --sounds = TODO: add sound + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + if player:get_wielded_item():get_name() == "mcl_dye:white" then + if not minetest.is_creative_enabled(player) and not minetest.check_player_privs(player, "creative") then + itemstack:take_item() + end + + for i, j in pairs(minetest.find_nodes_in_area_under_air({x = pos.x-1, y = pos.y-1, z = pos.z-1}, {x = pos.x+1, y = pos.y+1, z = pos.z+1}, mossnodes)) do + minetest.set_node(j, {name="mcl_core:moss"}) + end + for i, j in pairs(minetest.find_nodes_in_area_under_air({x = pos.x-2, y = pos.y-1, z = pos.z-2}, {x = pos.x+2, y = pos.y+1, z = pos.z+2}, mossnodes)) do + if math.random(1,3) == 1 then minetest.set_node(j, {name="mcl_core:moss"}) end + end + for i, j in pairs(minetest.find_nodes_in_area_under_air({x = pos.x-3, y = pos.y-1, z = pos.z-3}, {x = pos.x+3, y = pos.y+1, z = pos.z+3}, mossnodes)) do + if math.random(1,9) == 1 then minetest.set_node(j, {name="mcl_core:moss"}) end + end + for i, j in pairs(minetest.find_nodes_in_area_under_air({x = pos.x-3, y = pos.y-1, z = pos.z-3}, {x = pos.x+3, y = pos.y+1, z = pos.z+3}, {"mcl_core:moss"})) do + if math.random(1,2) == 1 then + minetest.set_node({x=j.x,y=j.y+1,z=j.z} ,{name="mcl_flowers:tallgrass"}) + end + end + for i, j in pairs(minetest.find_nodes_in_area_under_air({x = pos.x-3, y = pos.y-1, z = pos.z-3}, {x = pos.x+3, y = pos.y+1, z = pos.z+3}, {"mcl_core:moss"})) do + if math.random(1,4) == 1 then + minetest.set_node({x=j.x,y=j.y+1,z=j.z}, {name="mcl_core:moss_carpet"}) + end + end + for i, j in pairs(minetest.find_nodes_in_area_under_air({x = pos.x-3, y = pos.y-1, z = pos.z-3}, {x = pos.x+3, y = pos.y+1, z = pos.z+3}, {"mcl_core:moss"})) do + if math.random(1,10) == 1 then + minetest.set_node({x=j.x,y=j.y+1,z=j.z} ,{name="mcl_flowers:double_grass"}) + minetest.set_node({x=j.x,y=j.y+2,z=j.z} ,{name="mcl_flowers:double_grass_top"}) + end + end + elseif minetest.registered_nodes[player:get_wielded_item():get_name()] then + itemstack:take_item() + minetest.set_node(pointed_thing.above, {name=player:get_wielded_item():get_name()}) + end + end, +}) + +minetest.register_node("mcl_core:moss_carpet", { + description = S("Moss Carpet"), + _doc_items_longdesc = S("Moss Carpets are a thin decorative variant of the moss block."), + _doc_items_hidden = false, + tiles = {"mcl_core_moss_block.png"}, + is_ground_content = true, + paramtype = "light", + stack_max = 64, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, + }, + }, + groups = {handy=1, hoey=1, compostability=30}, + --sounds = TODO: add sound + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, +}) + -- Add entry aliases for the Help if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_core:stone_with_redstone", "nodes", "mcl_core:stone_with_redstone_lit") doc.add_entry_alias("nodes", "mcl_core:water_source", "nodes", "mcl_core:water_flowing") doc.add_entry_alias("nodes", "mcl_core:lava_source", "nodes", "mcl_core:lava_flowing") end - diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index e61d6df80..cea73da11 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -12,7 +12,7 @@ minetest.register_node("mcl_core:cactus", { tiles = {"mcl_core_cactus_top.png", "mcl_core_cactus_bottom.png", "mcl_core_cactus_side.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1, attached_node=1, plant=1, deco_block=1, dig_by_piston=1, enderman_takable=1}, + groups = {handy=1, attached_node=1, plant=1, deco_block=1, dig_by_piston=1, enderman_takable=1, compostability=50}, sounds = mcl_sounds.node_sound_wood_defaults(), paramtype = "light", sunlight_propagates = true, @@ -79,7 +79,7 @@ minetest.register_node("mcl_core:reeds", { }, }, stack_max = 64, - groups = {dig_immediate=3, craftitem=1, deco_block=1, plant=1, non_mycelium_plant=1, dig_by_piston=1}, + groups = {dig_immediate=3, craftitem=1, deco_block=1, plant=1, non_mycelium_plant=1, dig_by_piston=1, compostability=50}, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", drop = "mcl_core:reeds", -- to prevent color inheritation diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 9505bb19a..d99954e3f 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -104,7 +104,7 @@ minetest.register_node("mcl_core:vine", { type = "wallmounted", }, stack_max = 64, - groups = {handy=1,axey=1,shearsy=1,swordy=1, flammable=2,deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=15, fire_flammability=100}, + groups = {handy=1,axey=1,shearsy=1,swordy=1, flammable=2,deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=15, fire_flammability=100, compostability=50}, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", _mcl_shears_drop = true, diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index 6e7ab350b..8b3aea689 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -5,10 +5,11 @@ local mod_doc = minetest.get_modpath("doc") minetest.register_node("mcl_core:glass", { description = S("Glass"), _doc_items_longdesc = S("A decorative and mostly transparent block."), - drawtype = "glasslike", + drawtype = "glasslike_framed_optional", is_ground_content = false, - tiles = {"default_glass.png"}, + tiles = {"default_glass.png", "default_glass_detail.png"}, paramtype = "light", + paramtype2 = "glasslikeliquidlevel", sunlight_propagates = true, stack_max = 64, groups = {handy=1, glass=1, building_block=1, material_glass=1}, @@ -39,10 +40,11 @@ function mcl_core.add_stained_glass(desc, recipeitem, colorgroup, color) _doc_items_create_entry = create_entry, _doc_items_entry_name = entry_name, _doc_items_longdesc = longdesc, - drawtype = "glasslike", + drawtype = "glasslike_framed_optional", is_ground_content = false, - tiles = {"mcl_core_glass_"..color..".png"}, + tiles = {"mcl_core_glass_"..color..".png", "mcl_core_glass_"..color.."_detail.png"}, paramtype = "light", + paramtype2 = "glasslikeliquidlevel", sunlight_propagates = true, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "blend" or true, stack_max = 64, diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 0e0f71a11..47913be71 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -10,67 +10,133 @@ local WATER_VISC = 1 local LAVA_VISC = 7 local LIGHT_LAVA = minetest.LIGHT_MAX local USE_TEXTURE_ALPHA = true +local BUBBLE_COLUMN_SPEED = 1 +local BUBBLE_ABM_INTERVAL = 2 +local BUBBLE_AMOUNT = math.floor(BUBBLE_ABM_INTERVAL / math.abs(BUBBLE_COLUMN_SPEED) + 0.5) if minetest.features.use_texture_alpha_string_modes then USE_TEXTURE_ALPHA = "blend" end -minetest.register_node("mcl_core:water_flowing", { - description = S("Flowing Water"), - _doc_items_create_entry = false, - wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", - drawtype = "flowingliquid", - tiles = {"default_water_flowing_animated.png^[verticalframe:64:0"}, - special_tiles = { - { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} - }, - { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} - }, - }, - sounds = mcl_sounds.node_sound_water_defaults(), - is_ground_content = false, - use_texture_alpha = USE_TEXTURE_ALPHA, - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drop = "", - drowning = 4, - liquidtype = "flowing", - liquid_alternative_flowing = "mcl_core:water_flowing", - liquid_alternative_source = "mcl_core:water_source", - liquid_viscosity = WATER_VISC, - liquid_range = 7, - post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, - groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1, dig_by_piston=1}, - _mcl_blast_resistance = 100, - -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode - _mcl_hardness = -1, -}) +function mcl_core.register_liquid(def) + local base_name = def.base_name + local description_flowing = def.description_flowing + local description_source = def.description_source + local _doc_items_entry_name = def._doc_items_entry_name + local _doc_items_longdesc = def._doc_items_longdesc + local wield_image = def.wield_image + local tiles_flowing = def.tiles_flowing + local tiles_source = def.tiles_source + local special_tiles_flowing = def.special_tiles_flowing + local special_tiles_source = def.special_tiles_source + local sounds = def.sounds + local use_texture_alpha = def.use_texture_alpha + local drowning = def.drowning + local liquid_viscosity = def.liquid_viscosity + local liquid_range = def.liquid_range + local post_effect_color = def.post_effect_color + local groups = def.groups -minetest.register_node("mcl_core:water_source", { - description = S("Water Source"), + local source_node_name = string.format("mcl_core:%s_source", base_name) + local flowing_node_name = string.format("mcl_core:%s_flowing", base_name) + local mandatory_liquid_groups = {liquid=3, not_in_creative_inventory=1, dig_by_piston=1} + for group_id, group_level in pairs(mandatory_liquid_groups) do + if not groups[group_id] then + groups[group_id] = group_level + elseif groups[group_id] == false then + groups[group_id] = nil + end + end + minetest.register_node(flowing_node_name, { + description = description_flowing, + _doc_items_create_entry = false, + wield_image = wield_image, + drawtype = "flowingliquid", + tiles = tiles_flowing, + special_tiles = special_tiles_flowing, + sounds = sounds, + is_ground_content = false, + use_texture_alpha = use_texture_alpha, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = drowning, + liquidtype = "flowing", + liquid_alternative_flowing = flowing_node_name, + liquid_alternative_source = source_node_name, + liquid_viscosity = liquid_viscosity, + liquid_range = liquid_range, + post_effect_color = post_effect_color, + groups = groups, + _mcl_blast_resistance = 100, + -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode + _mcl_hardness = -1, + }) + + minetest.register_node(source_node_name, { + description = description_source, + _doc_items_entry_name = _doc_items_entry_name, + _doc_items_longdesc = _doc_items_longdesc, + _doc_items_hidden = false, + drawtype = "liquid", + tiles = tiles_source, + special_tiles = special_tiles_source, + sounds = sounds, + is_ground_content = false, + use_texture_alpha = use_texture_alpha, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = drowning, + liquidtype = "source", + liquid_alternative_flowing = flowing_node_name, + liquid_alternative_source = source_node_name, + liquid_viscosity = liquid_viscosity, + liquid_range = liquid_range, + post_effect_color = post_effect_color, + stack_max = 64, + groups = groups, + _mcl_blast_resistance = 100, + -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode + _mcl_hardness = -1, + }) +end + +mcl_core.register_liquid({ + base_name = "water", + description_flowing = S("Flowing Water"), + description_source = S("Water Source"), _doc_items_entry_name = S("Water"), - _doc_items_longdesc = -S("Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.").."\n\n".. -S("Water interacts with lava in various ways:").."\n".. -S("• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.").."\n".. -S("• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.").."\n".. -S("• When water is directly below lava, the water turns into stone."), - _doc_items_hidden = false, - drawtype = "liquid", - tiles = { - {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}} + _doc_items_longdesc = + S("Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.").."\n\n".. + S("Water interacts with lava in various ways:").."\n".. + S("• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.").."\n".. + S("• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.").."\n".. + S("• When water is directly below lava, the water turns into stone."), + wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", + tiles_flowing = {"default_water_flowing_animated.png^[verticalframe:64:0"}, + tiles_source = {{name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}}}, + special_tiles_flowing = { + { + image="default_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + { + image="default_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, }, - special_tiles = { + special_tiles_source = { -- New-style water source material (mostly unused) { name="default_water_source_animated.png", @@ -78,29 +144,94 @@ S("• When water is directly below lava, the water turns into stone."), backface_culling = false, } }, - sounds = mcl_sounds.node_sound_water_defaults(), - is_ground_content = false, - use_texture_alpha = USE_TEXTURE_ALPHA, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drop = "", - drowning = 4, - liquidtype = "source", - liquid_alternative_flowing = "mcl_core:water_flowing", - liquid_alternative_source = "mcl_core:water_source", - liquid_viscosity = WATER_VISC, - liquid_range = 7, - post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, - stack_max = 64, - groups = { water=3, liquid=3, puts_out_fire=1, freezes=1, not_in_creative_inventory=1, dig_by_piston=1}, - _mcl_blast_resistance = 100, - -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode - _mcl_hardness = -1, + sounds = mcl_sounds.node_sound_water_defaults(), + use_texture_alpha = USE_TEXTURE_ALPHA, + drowning = 4, + liquid_viscosity = WATER_VISC, + liquid_range = 7, + post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, + groups = {water=3, puts_out_fire=1, freezes=1, melt_around=1}, }) +mcl_core.register_liquid({ + base_name = "whirlpool", + description_flowing = S("Flowing Water"), + description_source = S("Whirlpool"), + _doc_items_entry_name = S("Water"), + _doc_items_longdesc = + S("A whirlpool, or downward bubble column, is originating from magma at the bottom of underwater canyons.").."\n".. + S("They drag entities downward."), + wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", + tiles_flowing = {"default_water_flowing_animated.png^[verticalframe:64:0"}, + tiles_source = {{name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}}}, + special_tiles_flowing = { + { + image="default_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + { + image="default_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + }, + special_tiles_source = { + { + name="default_water_source_animated.png", + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}, + backface_culling = false, + } + }, + sounds = mcl_sounds.node_sound_water_defaults(), + use_texture_alpha = USE_TEXTURE_ALPHA, + drowning = 0, + liquid_viscosity = WATER_VISC, + liquid_range = 7, + post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, + groups = {puts_out_fire=1, freezes=1, melt_around=1}, +}) + +mcl_core.register_liquid({ + base_name = "bubble_column", + description_flowing = S("Flowing Water"), + description_source = S("Bubble Column"), + _doc_items_entry_name = S("Water"), + _doc_items_longdesc = + S("A bubble column is generated above soul sand.").."\n".. + S("It accelerates entities upward."), + wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", + tiles_flowing = {"default_water_flowing_animated.png^[verticalframe:64:0"}, + tiles_source = {{name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}}}, + special_tiles_flowing = { + { + image="default_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + { + image="default_water_flowing_animated.png", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + }, + special_tiles_source = { + { + name="default_water_source_animated.png", + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}, + backface_culling = false, + } + }, + sounds = mcl_sounds.node_sound_water_defaults(), + use_texture_alpha = USE_TEXTURE_ALPHA, + drowning = 0, + liquid_viscosity = WATER_VISC, + liquid_range = 7, + post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, + groups = {puts_out_fire=1, freezes=1, melt_around=1}, +}) + + minetest.register_node("mcl_core:lava_flowing", { description = S("Flowing Lava"), _doc_items_create_entry = false, @@ -243,3 +374,64 @@ if minetest.settings:get("mcl_node_particles") == "full" then end, }) end + +--if minetest.settings:get("mcl_node_particles") ~= "none" then + local nether_node_to_check = { + ["mcl_core:whirlpool_source"] = "mcl_nether:magma", + ["mcl_core:bubble_column_source"] = "mcl_nether:soul_sand", + } + local nether_node_offset_y = { + ["mcl_core:whirlpool_source"] = 0.5, + ["mcl_core:bubble_column_source"] = -0.5, + } + local nether_node_speed_y = { + ["mcl_core:whirlpool_source"] = -BUBBLE_COLUMN_SPEED, + ["mcl_core:bubble_column_source"] = BUBBLE_COLUMN_SPEED, + } + local bubble_source_fast_switch_from_to = { + ["mcl_nether:soul_sand"] = "mcl_core:bubble_column_source", + ["mcl_core:bubble_column_source"] = "mcl_core:bubble_column_source", + ["mcl_nether:magma"] = "mcl_core:whirlpool_source", + ["mcl_core:whirlpool_source"] = "mcl_core:whirlpool_source", + } + minetest.register_abm({ + label = "Process bubble columns and whirlpools", + nodenames = {"mcl_core:whirlpool_source", "mcl_core:bubble_column_source"}, + interval = BUBBLE_ABM_INTERVAL, + chance = 1, + catch_up = false, + action = function(pos, node) + local x, y, z, name = pos.x, pos.y, pos.z, node.name + local check = nether_node_to_check[name] + local below = minetest.get_node({x = x, y = y - 1, z = z}).name + if below ~= name and below ~= check then + minetest.swap_node(pos, {name = bubble_source_fast_switch_from_to[below] or "mcl_core:water_source"}) + return + end + local upper_pos = {x = x, y = y + 1, z = z} + local upper = minetest.get_node(upper_pos).name + if upper == "mcl_core:water_source" then + minetest.swap_node(upper_pos, {name = name}) + end + local offset_y, speed_y = nether_node_offset_y[name], nether_node_speed_y[name] + for _, obj in pairs(minetest.get_objects_inside_radius(pos, 12)) do + if obj:is_player() then + minetest.add_particlespawner({ + amount = BUBBLE_AMOUNT, + minpos = {x = x - 0.2, y = y + offset_y, z = z - 0.2}, + maxpos = {x = x + 0.2, y = y + offset_y, z = z + 0.2}, + minvel = {x = 0 , y = speed_y, z = 0 }, + maxvel = {x = 0 , y = speed_y, z = 0 }, + minexptime = 0.95 / BUBBLE_COLUMN_SPEED, + maxexptime = 1.05 / BUBBLE_COLUMN_SPEED, + minsize = 0.6, + maxsize = 1.9, + collisiondetection = false, + texture = "mcl_core_bubble.png", + playername = obj:get_player_name(), + }) + end + end + end, + }) +--end diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index a5ef7aa97..060879e17 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -162,7 +162,8 @@ local function register_leaves(subname, description, longdesc, tiles, sapling, d deco_block=1, dig_by_piston=1, fire_encouragement=30, - fire_flammability=60 + fire_flammability=60, + compostability=30 }, drop = get_drops(0), _mcl_shears_drop = true, @@ -194,7 +195,7 @@ local function register_sapling(subname, description, longdesc, tt_help, texture fixed = selbox }, stack_max = 64, - groups = {dig_immediate=3, plant=1,sapling=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1}, + groups = {dig_immediate=3, plant=1,sapling=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, sounds = mcl_sounds.node_sound_leaves_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -275,4 +276,4 @@ register_leaves("birchleaves", S("Birch Leaves"), S("Birch leaves are grown from -- Node aliases minetest.register_alias("default:acacia_tree", "mcl_core:acaciatree") -minetest.register_alias("default:acacia_leaves", "mcl_core:acacialeaves") \ No newline at end of file +minetest.register_alias("default:acacia_leaves", "mcl_core:acacialeaves") diff --git a/mods/ITEMS/mcl_core/textures/default_glass_detail.png b/mods/ITEMS/mcl_core/textures/default_glass_detail.png new file mode 100644 index 000000000..791309817 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/default_glass_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_bubble.png b/mods/ITEMS/mcl_core/textures/mcl_core_bubble.png new file mode 100644 index 000000000..083d6707c Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_bubble.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian.png b/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian.png new file mode 100644 index 000000000..6229fe08a Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_crying_obsidian.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_black_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_black_detail.png new file mode 100644 index 000000000..48bcb54c4 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_black_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_blue_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_blue_detail.png new file mode 100644 index 000000000..0d026ce7c Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_blue_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_brown_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_brown_detail.png new file mode 100644 index 000000000..e012b08f2 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_brown_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_cyan_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_cyan_detail.png new file mode 100644 index 000000000..92dedaa84 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_cyan_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray_detail.png new file mode 100644 index 000000000..f7daeba19 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_gray_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_green_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_green_detail.png new file mode 100644 index 000000000..fb54f942b Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_green_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue_detail.png new file mode 100644 index 000000000..5c7a34fce Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_light_blue_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime_detail.png new file mode 100644 index 000000000..963933572 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_lime_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta_detail.png new file mode 100644 index 000000000..8a1ffeda8 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_magenta_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange_detail.png new file mode 100644 index 000000000..4894833f1 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_orange_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_pink_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_pink_detail.png new file mode 100644 index 000000000..38bd3a8c3 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_pink_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_purple_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_purple_detail.png new file mode 100644 index 000000000..a31284094 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_purple_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_red_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_red_detail.png new file mode 100644 index 000000000..db44333b2 Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_red_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver_detail.png new file mode 100644 index 000000000..8ff77440a Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_silver_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_white_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_white_detail.png new file mode 100644 index 000000000..baddd95eb Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_white_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow_detail.png b/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow_detail.png new file mode 100644 index 000000000..83eedf08b Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_glass_yellow_detail.png differ diff --git a/mods/ITEMS/mcl_core/textures/mcl_core_moss_block.png b/mods/ITEMS/mcl_core/textures/mcl_core_moss_block.png new file mode 100644 index 000000000..1fed6df9e Binary files /dev/null and b/mods/ITEMS/mcl_core/textures/mcl_core_moss_block.png differ diff --git a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png b/mods/ITEMS/mcl_core/textures/mcl_stairs_stone_slab_top.png similarity index 100% rename from mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png rename to mods/ITEMS/mcl_core/textures/mcl_stairs_stone_slab_top.png diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr index 1e4eb560f..88aa019f6 100644 --- a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr @@ -1,8 +1,8 @@ # textdomain: mcl_crafting_table Crafting Table=Верстак -A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Верстак это блок, позволяющий крафтить в решётке 3×3, что позволяет выполнять продвинутый крафтинг. -Rightclick the crafting table to access the 3×3 crafting grid.=Кликните правой для получения доступа к решётке крафтинга 3×3. +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Верстак это блок с сеткой крафта 3×3, что позволяет использовать продвинутые рецепты. +Rightclick the crafting table to access the 3×3 crafting grid.=Кликните правой кнопкой мыши для получения доступа к сетке крафта 3×3. Recipe book=Книга рецептов -Crafting=Крафтинг +Crafting=Крафт Inventory=Инвентарь -3×3 crafting grid=Решётка крафтинга 3×3 +3×3 crafting grid=Сетка крафта 3×3 diff --git a/mods/ITEMS/mcl_deepslate/init.lua b/mods/ITEMS/mcl_deepslate/init.lua index 55b8a5a79..7984ba89a 100644 --- a/mods/ITEMS/mcl_deepslate/init.lua +++ b/mods/ITEMS/mcl_deepslate/init.lua @@ -249,30 +249,30 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_size = size, y_min = y_min, y_max = y_max, - biomes = biomes, + biomes = biomes, }) end local ore_mapgen = { - { "coal", 1575, 5, 3, layer_min, layer_max }, - { "coal", 1530, 8, 3, layer_min, layer_max }, - { "coal", 1500, 12, 3, layer_min, layer_max }, - { "iron", 830, 5, 3, layer_min, layer_max }, - { "gold", 4775, 5, 3, layer_min, layer_max }, - { "gold", 6560, 7, 3, layer_min, layer_max }, - { "diamond", 10000, 4, 3, layer_min, mcl_worlds.layer_to_y(12) }, - { "diamond", 5000, 2, 3, layer_min, mcl_worlds.layer_to_y(12) }, - { "diamond", 10000, 8, 3, layer_min, mcl_worlds.layer_to_y(12) }, - { "diamond", 20000, 1, 1, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "diamond", 20000, 2, 2, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "redstone", 500, 4, 3, layer_min, mcl_worlds.layer_to_y(13) }, - { "redstone", 800, 7, 4, layer_min, mcl_worlds.layer_to_y(13) }, - { "redstone", 1000, 4, 3, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "redstone", 1600, 7, 4, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "lapis", 10000, 7, 4, mcl_worlds.layer_to_y(14), layer_max }, - { "lapis", 12000, 6, 3, mcl_worlds.layer_to_y(10), mcl_worlds.layer_to_y(13) }, - { "lapis", 14000, 5, 3, mcl_worlds.layer_to_y(6), mcl_worlds.layer_to_y(9) }, - { "lapis", 16000, 4, 3, mcl_worlds.layer_to_y(2), mcl_worlds.layer_to_y(5) }, - { "lapis", 18000, 3, 2, mcl_worlds.layer_to_y(0), mcl_worlds.layer_to_y(2) }, + { "coal" , 1575, 5, 3, layer_min , layer_max }, + { "coal" , 1530, 8, 3, layer_min , layer_max }, + { "coal" , 1500, 12, 3, layer_min , layer_max }, + { "iron" , 830, 5, 3, layer_min , layer_max }, + { "gold" , 4775, 5, 3, layer_min , layer_max }, + { "gold" , 6560, 7, 3, layer_min , layer_max }, + { "diamond" , 10000, 4, 3, layer_min , mcl_worlds.layer_to_y(12) }, + { "diamond" , 5000, 2, 3, layer_min , mcl_worlds.layer_to_y(12) }, + { "diamond" , 10000, 8, 3, layer_min , mcl_worlds.layer_to_y(12) }, + { "diamond" , 20000, 1, 1, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, + { "diamond" , 20000, 2, 2, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, + { "redstone", 500, 4, 3, layer_min , mcl_worlds.layer_to_y(13) }, + { "redstone", 800, 7, 4, layer_min , mcl_worlds.layer_to_y(13) }, + { "redstone", 1000, 4, 3, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, + { "redstone", 1600, 7, 4, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, + { "lapis" , 10000, 7, 4, mcl_worlds.layer_to_y(14), layer_max }, + { "lapis" , 12000, 6, 3, mcl_worlds.layer_to_y(10), mcl_worlds.layer_to_y(13) }, + { "lapis" , 14000, 5, 3, mcl_worlds.layer_to_y(6) , mcl_worlds.layer_to_y(9) }, + { "lapis" , 16000, 4, 3, mcl_worlds.layer_to_y(2) , mcl_worlds.layer_to_y(5) }, + { "lapis" , 18000, 3, 2, mcl_worlds.layer_to_y(0) , mcl_worlds.layer_to_y(2) }, } for _, o in pairs(ore_mapgen) do register_ore_mg("mcl_deepslate:deepslate_with_"..o[1], o[2], o[3], o[4], o[5], o[6]) diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.fr.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.fr.tr new file mode 100644 index 000000000..1305ad387 --- /dev/null +++ b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.fr.tr @@ -0,0 +1,51 @@ +# textdomain: mcl_deepslate +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Un bloc infesté est un bloc dont va sortir un poisson d'argent lorsqu'il sera cassé. Il a la même apparence que son équivalent normal. +Chiseled deepslate is the chiseled version of deepslate.=l'ardoise des abîmes sculptée est la version sculptée de l'ardoise des abîmes. +Chiseled Deepslate=Ardoise des abîmes sculptée +Cobbled deepslate is a stone variant that functions similar to cobblestone or blackstone.=La pierre des abîmes est une variante de roche similaire à la pierre ou la pierre noire. +Cobbled Deepslate Slab=Dalle de pierre des abîmes +Cobbled Deepslate Stairs=Escalier de pierre des abîmes +Cobbled Deepslate Wall=Muret de pierre des abîmes +Cobbled Deepslate=Pierre des abîmes +Cracked Deepslate Bricks=Ardoise des abîmes taillée craquelée +Cracked Deepslate Tiles=Ardoise des abîmes carrelée craquelée +Deepslate bricks are the brick version of deepslate.=L'ardoise des abîmes taillée est la version brique de l'ardoise des abîmes. +Deepslate Bricks Slab=Dalle d'ardoise des abîmes taillée +Deepslate Bricks Stairs=Escalier d'ardoise des abîmes taillée +Deepslate Bricks Wall=Muret d'ardoise des abîmes taillée +Deepslate Bricks=Ardoise des abîmes taillée +Deepslate coal ore is a variant of coal ore that can generate in deepslate and tuff blobs.=Le minerai de charbon de l'ardoise des abîmes est une variante de minerai de charbon qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate Coal Ore=Minerai de charbon de l'ardoise des abîmes +Deepslate copper ore is a variant of copper ore that can generate in deepslate and tuff blobs.=Le minerai de cuivre de l'ardoise des abîmes est une variante de minerai de cuivre qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate Copper Ore=Minerai de cuivre de l'ardoise des abîmes +Deepslate diamond ore is a variant of diamond ore that can generate in deepslate and tuff blobs.=Le minerai de diamand de l'ardoise des abîmes est une variante de minerai de diamand qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate Diamond Ore=Minerai de diamand de l'ardoise des abîmes +Deepslate emerald ore is a variant of emerald ore that can generate in deepslate and tuff blobs.=Le minerai d'émeraude de l'ardoise des abîmes est une variante de minerai d'émeraude qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate Emerald Ore=Minerai d'émeraude de l'ardoise des abîmes +Deepslate gold ore is a variant of gold ore that can generate in deepslate and tuff blobs.=Le minerai d'or de l'ardoise des abîmes est une variante de minerai d'or qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate Gold Ore=Minerai d'or de l'ardoise des abîmes +Deepslate iron ore is a variant of iron ore that can generate in deepslate and tuff blobs.=Le minerai de fer de l'ardoise des abîmes est une variante de minerai de fer qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate Iron Ore=Minerai de fer de l'ardoise des abîmes +Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone.=L'ardoise des abîmes est un type de roche présente dans les profondeurs de l'Overworld qui fonctionne de manière similaire à la roche classique mais en plus dur. +Deepslate Lapis Lazuli Ore=Minerai de lapis-lazuli de l'ardoise des abîmes +Deepslate lapis ore is a variant of lapis ore that can generate in deepslate and tuff blobs.=Le minerai de lapis de l'ardoise des abîmes est une variante de minerai de lapis-lazuli qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs.=Le minerai de redstone de l'ardoise des abîmes est une variante de minerai de redstone qui apparaît dans l'ardoise des abîmes et les filons de tuf. +Deepslate Redstone Ore=Minerai de Redstone de l'ardoise des abîmes +Deepslate tiles are a decorative variant of deepslate.=L''ardoise des abîmes carrelée est une variante décorative de l'ardoise des abîmes. +Deepslate Tiles Slab=Dalle d'ardoise des abîmes carrelée +Deepslate Tiles Stairs=Escalier d'ardoise des abîmes carrelée +Deepslate Tiles Wall=Muret d'ardoise des abîmes carrelée +Deepslate Tiles=Ardoise des abîmes carrelée +Deepslate=Ardoise des abïmes +Double Cobbled Deepslate Slab=Dalle double de pierre des abîmes +Double Deepslate Bricks Slab=Dalle double d'ardoise des abîmes taillée +Double Deepslate Tiles Slab=Dalle double d'ardoise des abîmes carrelée +Double Polished Deepslate Slab=Dalle double d'ardoise des abïmes polie +Hides a silverfish=Cache un poisson d'argent +Infested Deepslate=Ardoise des abïmes infestée +Lit Deepslate Redstone Ore=Minerai de Redstone de l'ardoise des abîmes éclairé +Polished deepslate is the stone-like polished version of deepslate.=l'ardoise des abîmes polie est la version polie de l'ardoise des abîmes, de manière similaire à la pierre. +Polished Deepslate Slab=Dalle d'ardoise des abïmes +Polished Deepslate Stairs=Escalier d'ardoise des abïmes +Polished Deepslate Wall=Muret d'ardoise des abïmes +Polished Deepslate=Ardoise des abïmes polie \ No newline at end of file diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr new file mode 100644 index 000000000..59e878e06 --- /dev/null +++ b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr @@ -0,0 +1,51 @@ +# textdomain: mcl_deepslate +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого из него появляется чешуйница. Блок выглядит идентично своему нормальному варианту. +Chiseled deepslate is the chiseled version of deepslate.=Резной сланец это резной вариант глубинного сланца. +Chiseled Deepslate=Резной сланец +Cobbled deepslate is a stone variant that functions similar to cobblestone or blackstone.=Дроблёный сланец это вариант камня, схожий на булыжник или чернокамень. +Cobbled Deepslate Slab=Плита из дроблёного сланца +Cobbled Deepslate Stairs=Ступени из дроблёного сланца +Cobbled Deepslate Wall=Стена из дроблёного сланца +Cobbled Deepslate=Дроблёный сланец +Cracked Deepslate Bricks=Потрескавшиеся сланцевые кирпичи +Cracked Deepslate Tiles=Потрескавшаяся сланцевая плитка +Deepslate bricks are the brick version of deepslate.=Сланцевые кирпичи это кирпичный вариант глубинного сланца. +Deepslate Bricks Slab=Плита из сланцевых кирпичей +Deepslate Bricks Stairs=Ступени из сланцевых кирпичей +Deepslate Bricks Wall=Стена из сланцевых кирпичей +Deepslate Bricks=Сланцевые кирпичи +Deepslate coal ore is a variant of coal ore that can generate in deepslate and tuff blobs.=Глубинная угольная руда это вариант угольной руды, генерирующийся в глубинном сланце. +Deepslate Coal Ore=Глубинная угольная руда +Deepslate copper ore is a variant of copper ore that can generate in deepslate and tuff blobs.=Глубинная медная руда это вариант медной руды, генерирующийся в глубинном сланце. +Deepslate Copper Ore=Глубинная медная руда +Deepslate diamond ore is a variant of diamond ore that can generate in deepslate and tuff blobs.=Глубинная алмазная руда это вариант алмазной руды, генерирующийся в глубинном сланце. +Deepslate Diamond Ore=Глубинная алмазная руда +Deepslate emerald ore is a variant of emerald ore that can generate in deepslate and tuff blobs.=Глубинная изумрудная руда это вариант изумрудной руды, генерирующийся в глубинном сланце. +Deepslate Emerald Ore=Глубинная изумрудная руда +Deepslate gold ore is a variant of gold ore that can generate in deepslate and tuff blobs.=Глубинная золотая руда это вариант золотой руды, генерирующийся в глубинном сланце. +Deepslate Gold Ore=Глубинная золотая руда +Deepslate iron ore is a variant of iron ore that can generate in deepslate and tuff blobs.=Глубинная железная руда это вариант железной руды, генерирующийся в глубинном сланце. +Deepslate Iron Ore=Глубинная железная руда +Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone.=Глубинный сланец это камень, который можно найти в глубине Верхнего мира. Схож с обычным камнем, но сланец твёрже. +Deepslate Lapis Lazuli Ore=Глубинная лазуритовая руда +Deepslate lapis ore is a variant of lapis ore that can generate in deepslate and tuff blobs.=Глубинная лазуритовая руда это вариант лазуритовой руды, генерирующийся в глубинном сланце. +Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs.=Глубинная редстоуновая руда это вариант редстоуновой руды, генерирующийся в глубинном сланце. +Deepslate Redstone Ore=Глубинная редстоуновая руда +Deepslate tiles are a decorative variant of deepslate.=Сланцевая плитка это декоративный вариант глубинного сланца. +Deepslate Tiles Slab=Плита из сланцевой плитки +Deepslate Tiles Stairs=Ступени из сланцевой плитки +Deepslate Tiles Wall=Стена из сланцевой плитки +Deepslate Tiles=Сланцевая плитка +Deepslate=Глубинный сланец +Double Cobbled Deepslate Slab=Двойная плита из дроблёного сланца +Double Deepslate Bricks Slab=Двойная плита из сланцевых кирпичей +Double Deepslate Tiles Slab=Двойная плита из сланцевой плитки +Double Polished Deepslate Slab=Двойная плита из полированного сланца +Hides a silverfish=Прячет в себе чешуйницу +Infested Deepslate=Заражённый глубинный сланец +Lit Deepslate Redstone Ore=Светящаяся глубинная редстоуновая руда +Polished deepslate is the stone-like polished version of deepslate.=Полированный сланец это гладкая версия глубинного сланца. +Polished Deepslate Slab=Плита из полированного сланца +Polished Deepslate Stairs=Ступени из полированного сланца +Polished Deepslate Wall=Стена из полированного сланца +Polished Deepslate=Полированный сланец \ No newline at end of file diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr index be88513cb..ebf36b86a 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.de.tr @@ -7,6 +7,8 @@ Birch Door=Birkentür Dark Oak Door=Schwarzeichentür Jungle Door=Dschungeltür Spruce Door=Fichtentür +Crimson Door= +Warped Door= Iron Door=Eisentür Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Eisentüren sind 2 Blöcke hohe Barrieren, die nur von einem Redstone-Signal geöffnet oder geschlossen werden können. To open or close an iron door, supply its lower half with a redstone signal.=Um eine Eisentür zu öffnen oder zu schließen, versorgen Sie die untere Hälfte mit einem Redstone-Signal. @@ -16,6 +18,8 @@ Birch Trapdoor=Birkenfalltür Spruce Trapdoor=Fichtenfalltür Dark Oak Trapdoor=Schwarzeichenfalltür Jungle Trapdoor=Dschungelfalltür +Crimson Trapdoor= +Warped Trapdoor= Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Holzfalltüren sind horizontale Barrieren, die von Hand oder mit einem Redstone-Signal geöffnet oder geschlossen werden können. Sie belegen den oberen oder unteren Teil eines Blocks, je nachdem, wie sie platziert wurden. Wenn geöffnet, können sie wie eine Leiter erklommen werden. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Um die Falltür zu öffnen oder zu schließen, rechtsklicken Sie sie oder schicken Sie ein Redstone-Signal zu ihr. Iron Trapdoor=Eisenfalltür diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr index 1a510815b..a765553d7 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.es.tr @@ -7,6 +7,8 @@ Birch Door=Puerta de abedul Dark Oak Door=Puerta de roble oscuro Jungle Door=Puerta de jungla Spruce Door=Puerta de abeto +Crimson Door= +Warped Door= Iron Door=Puerta de Hierro Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Las puertas de hierro son barreras altas de 2 bloques que solo se pueden abrir o cerrar mediante una señal de redstone, no a mano. To open or close an iron door, supply its lower half with a redstone signal.=Para abrir o cerrar una puerta de hierro, suministre a su mitad inferior una señal de redstone. @@ -16,6 +18,8 @@ Birch Trapdoor=Trampilla de abedul Spruce Trapdoor=Trampilla de abeto Dark Oak Trapdoor=Trampilla de roble oscuro Jungle Trapdoor=Trampilla de jungla +Crimson Trapdoor= +Warped Trapdoor= Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Las trampillas de madera son barreras horizontales que se pueden abrir y cerrar a mano o una señal de redstone. Ocupan la parte superior o inferior de un bloque, dependiendo de cómo se hayan colocado. Cuando están abiertos, se pueden subir como una escalera. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir o cerrar la trampilla, haga clic derecho o envíele una señal de redstone. Iron Trapdoor=Trampilla de hierro diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr index 9d1f25d9a..0bf2dea28 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr @@ -7,6 +7,8 @@ Birch Door=Porte en Bouleau Dark Oak Door=Porte en Chêne Noir Jungle Door=Porte en Acajou Spruce Door=Porte en Sapin +Crimson Door=Porte Ecarlate +Warped Door=Porte Tordue Iron Door=Porte en Fer Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Les portes en fer sont des barrières hautes à 2 blocs qui ne peuvent être ouvertes ou fermées que par un signal redstone, mais pas à la main. To open or close an iron door, supply its lower half with a redstone signal.=Pour ouvrir ou fermer une porte en fer, fournir à sa moitié inférieure un signal redstone. @@ -16,9 +18,11 @@ Birch Trapdoor=Trappe en Bouleau Spruce Trapdoor=Trappe en Sapin Dark Oak Trapdoor=Trappe en Chêne Noir Jungle Trapdoor=Trappe en Acajou -Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en bois sont des barrières horizontales qui peuvent être ouvertes et fermées à la main ou par un signal redstone. Ils occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont ils ont été placés. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. +Crimson Trapdoor=Trappe Ecarlate +Warped Trapdoor=Trappe Tordue +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en bois sont des barrières horizontales qui peuvent être ouvertes et fermées à la main ou par un signal redstone. Elles occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont elles ont été placées. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Pour ouvrir ou fermer la trappe, faites un clic droit dessus ou envoyez-lui un signal redstone. Iron Trapdoor=Trappe en Fer -Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en fer sont des barrières horizontales qui ne peuvent être ouvertes et fermées que par des signaux de redstone, mais pas à la main. Ils occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont ils ont été placés. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en fer sont des barrières horizontales qui ne peuvent être ouvertes et fermées que par des signaux de redstone, mais pas à la main. Elles occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont elles ont été placées. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. Openable by players and redstone power=Ouvrable par les joueurs et puissance redstone Openable by redstone power=Ouvrable par la puissance redstone diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.pl.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.pl.tr index e26c5861a..c502b9ec6 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.pl.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.pl.tr @@ -7,6 +7,8 @@ Birch Door=Brzozowe drzwi Dark Oak Door=Ciemno-dębowe drzwi Jungle Door=Tropikalne drzwi Spruce Door=Świerkowe drzwi +Crimson Door= +Warped Door= Iron Door=Żelazne drzwi Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Żelazne drzwi są blokami o wysokości dwa, które mogą być otwarte lub zamknięte przez zasilanie czerwienitem, ale nie ręcznie. To open or close an iron door, supply its lower half with a redstone signal.=Aby otworzyć lub zamknąć żelazne drzwi zasil ich dolną część czerwienitem. @@ -16,6 +18,8 @@ Birch Trapdoor=Brzozowa klapa Spruce Trapdoor=Świerkowa klapa Dark Oak Trapdoor=Ciemno-dębowa klapa Jungle Trapdoor=Tropikalna klapa +Crimson Trapdoor= +Warped Trapdoor= Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Drewniane klapy są poziomymi barierami, które mogą być otwarte i zamknięte ręcznie bądź przez zasilenie czerwienitem. Zajmują główną lub dolną część bloku w zależności od tego jak zostaną postawione. Gdy są otwarte można się po nich wspinać jak po drabinie. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Aby otworzyć lub zamknąć drewniane klapy, kliknij je prawym przyciskiem bądź zasil ich dolną połowę czerwienitem. Iron Trapdoor=Żelazna klapa diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr index 1515a2cd2..2f4b54dba 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr @@ -1,24 +1,28 @@ # textdomain: mcl_doors -Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери это сдвоенные блочные преграды, которые можно открывать и закрывать вручную и по сигналу редстоуна. -To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Чтобы открыть или закрыть деревянную дверь, кликните правой либо подайте к её нижней части сигнал редстоуна. +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери это барьеры высотой в 2 блока, которые можно открывать и закрывать вручную или по сигналу редстоуна. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Чтобы открыть или закрыть деревянную дверь, кликните правой кнопкой мыши, либо подайте к её нижней части сигнал редстоуна. Oak Door=Дубовая дверь Acacia Door=Дверь из акации Birch Door=Берёзовая дверь Dark Oak Door=Дверь из тёмного дуба -Jungle Door=Дверь из дерева джунглей +Jungle Door=Дверь из тропического дерева Spruce Door=Еловая дверь +Crimson Door= +Warped Door= Iron Door=Железная дверь -Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Железные двери это сдвоенные блочные преграды, которые можно открывать и закрывать только по сигналу редстоуна и нельзя вручную. +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Железные двери это барьеры высотой в 2 блока, которые можно открывать и закрывать только по сигналу редстоуна, но не вручную. To open or close an iron door, supply its lower half with a redstone signal.=Чтобы открыть или закрыть железную дверь, подайте на её нижнюю часть сигнал редстоуна. Oak Trapdoor=Дубовый люк Acacia Trapdoor=Люк из акации Birch Trapdoor=Берёзовый люк Spruce Trapdoor=Еловый люк Dark Oak Trapdoor=Люк из тёмного дуба -Jungle Trapdoor=Люк из дерева джунглей -Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Деревянные люки это горизонтальные преграды, которые можно открывать и закрывать вручную и по сигналу редстоуна. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. +Jungle Trapdoor=Люк из тропического дерева +Crimson Trapdoor= +Warped Trapdoor= +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Деревянные люки это горизонтальные барьеры, которые можно открывать и закрывать вручную и по сигналу редстоуна. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Чтобы открыть или закрыть деревянные люк, кликните по нему правой клавишей либо подайте на него сигнал редстоуна. Iron Trapdoor=Железный люк -Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Железные люки это горизонтальные преграды, которые можно открывать и закрывать только по сигналу редстоуна и нельзя вручную. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. -Openable by players and redstone power=Открывается игроками и действием редстоуна -Openable by redstone power=Открывается действием редстоуна +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Железные люки это горизонтальные преграды, которые можно открывать и закрывать только по сигналу редстоуна, но не вручную. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. +Openable by players and redstone power=Открывается игроками и сигналом редстоуна +Openable by redstone power=Открывается сигналом редстоуна diff --git a/mods/ITEMS/mcl_doors/locale/template.txt b/mods/ITEMS/mcl_doors/locale/template.txt index d8c7c8609..d5a3c7107 100644 --- a/mods/ITEMS/mcl_doors/locale/template.txt +++ b/mods/ITEMS/mcl_doors/locale/template.txt @@ -7,6 +7,8 @@ Birch Door= Dark Oak Door= Jungle Door= Spruce Door= +Crimson Door= +Warped Door= Iron Door= Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.= To open or close an iron door, supply its lower half with a redstone signal.= @@ -16,6 +18,8 @@ Birch Trapdoor= Spruce Trapdoor= Dark Oak Trapdoor= Jungle Trapdoor= +Crimson Trapdoor= +Warped Trapdoor= Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.= To open or close the trapdoor, rightclick it or send a redstone signal to it.= Iron Trapdoor= diff --git a/mods/ITEMS/mcl_doors/register.lua b/mods/ITEMS/mcl_doors/register.lua index c998f6538..8c8b7613f 100644 --- a/mods/ITEMS/mcl_doors/register.lua +++ b/mods/ITEMS/mcl_doors/register.lua @@ -143,6 +143,52 @@ minetest.register_craft({ } }) +--- Crimson Door -- +mcl_doors:register_door("mcl_doors:crimson_door", { + description = S("Crimson Door"), + _doc_items_longdesc = wood_longdesc, + _doc_items_usagehelp = wood_usagehelp, + inventory_image = "mcl_doors_door_crimson.png", + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, + _mcl_hardness = 3, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_crimson_lower.png", "mcl_doors_door_crimson_side_lower.png"}, + tiles_top = {"mcl_doors_door_crimson_upper.png", "mcl_doors_door_crimson_side_upper.png"}, + sounds = mcl_sounds.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "mcl_doors:crimson_door 3", + recipe = { + {"mcl_mushroom:crimson_hyphae_wood", "mcl_mushroom:crimson_hyphae_wood"}, + {"mcl_mushroom:crimson_hyphae_wood", "mcl_mushroom:crimson_hyphae_wood"}, + {"mcl_mushroom:crimson_hyphae_wood", "mcl_mushroom:crimson_hyphae_wood"} + } +}) + +--- Warped Door -- +mcl_doors:register_door("mcl_doors:warped_door", { + description = S("Warped Door"), + _doc_items_longdesc = wood_longdesc, + _doc_items_usagehelp = wood_usagehelp, + inventory_image = "mcl_doors_door_warped.png", + groups = {handy=1,axey=1, material_wood=1, flammable=-1}, + _mcl_hardness = 3, + _mcl_blast_resistance = 3, + tiles_bottom = {"mcl_doors_door_warped_lower.png", "mcl_doors_door_warped_side_lower.png"}, + tiles_top = {"mcl_doors_door_warped_upper.png", "mcl_doors_door_warped_side_upper.png"}, + sounds = mcl_sounds.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "mcl_doors:warped_door 3", + recipe = { + {"mcl_mushroom:warped_hyphae_wood", "mcl_mushroom:warped_hyphae_wood"}, + {"mcl_mushroom:warped_hyphae_wood", "mcl_mushroom:warped_hyphae_wood"}, + {"mcl_mushroom:warped_hyphae_wood", "mcl_mushroom:warped_hyphae_wood"} + } +}) + minetest.register_craft({ type = "fuel", recipe = "mcl_doors:wooden_door", @@ -174,6 +220,18 @@ minetest.register_craft({ burntime = 10, }) +minetest.register_craft({ + type = "fuel", + recipe = "mcl_doors:crimson_door", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mcl_doors:warped_door", + burntime = 10, +}) + --- Iron Door --- mcl_doors:register_door("mcl_doors:iron_door", { description = S("Iron Door"), @@ -212,6 +270,8 @@ local woods = { { "spruce_trapdoor", S("Spruce Trapdoor"), "mcl_doors_trapdoor_spruce.png", "mcl_doors_trapdoor_spruce_side.png", "mcl_core:sprucewood" }, { "dark_oak_trapdoor", S("Dark Oak Trapdoor"), "mcl_doors_trapdoor_dark_oak.png", "mcl_doors_trapdoor_dark_oak_side.png", "mcl_core:darkwood" }, { "jungle_trapdoor", S("Jungle Trapdoor"), "mcl_doors_trapdoor_jungle.png", "mcl_doors_trapdoor_jungle_side.png", "mcl_core:junglewood" }, + { "crimson_trapdoor", S("Crimson Trapdoor"), "mcl_doors_trapdoor_crimson.png", "mcl_doors_trapdoor_crimson_side.png", "mcl_mushroom:crimson_hyphae_wood" }, + { "warped_trapdoor", S("Warped Trapdoor"), "mcl_doors_trapdoor_warped.png", "mcl_doors_trapdoor_warped_side.png", "mcl_mushroom:warped_hyphae_wood" }, } for w=1, #woods do diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson.png new file mode 100644 index 000000000..5682f51e5 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_lower.png new file mode 100644 index 000000000..8e9f30152 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_side_lower.png new file mode 100644 index 000000000..47e071521 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_side_upper.png new file mode 100644 index 000000000..19988c83a Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_upper.png new file mode 100644 index 000000000..7c8203a92 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_crimson_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped.png new file mode 100644 index 000000000..118e9ca01 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_lower.png new file mode 100644 index 000000000..0410811c1 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_side_lower.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_side_lower.png new file mode 100644 index 000000000..3d7fdeeb4 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_side_lower.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_side_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_side_upper.png new file mode 100644 index 000000000..63634ec63 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_side_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_upper.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_upper.png new file mode 100644 index 000000000..fbc7f53a1 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_door_warped_upper.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_crimson.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_crimson.png new file mode 100644 index 000000000..46022bd9d Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_crimson.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_crimson_side.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_crimson_side.png new file mode 100644 index 000000000..5c5af271f Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_crimson_side.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_warped.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_warped.png new file mode 100644 index 000000000..60fd2d6a5 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_warped.png differ diff --git a/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_warped_side.png b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_warped_side.png new file mode 100644 index 000000000..5e31bd260 Binary files /dev/null and b/mods/ITEMS/mcl_doors/textures/mcl_doors_trapdoor_warped_side.png differ diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index f5e282a8c..ca0ca6fe1 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -78,7 +78,7 @@ dyelocal.dyes = { {"dark_green", "dye_dark_green", S("Cactus Green"),{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, {"green", "mcl_dye_lime", S("Lime Dye"), {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, {"yellow", "dye_yellow", S("Dandelion Yellow"), {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "mcl_dye_brown", S("Cocoa Beans"), {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"brown", "mcl_dye_brown", S("Cocoa Beans"), {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1, compostability=65}}, {"orange", "dye_orange", S("Orange Dye"), {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, {"red", "dye_red", S("Rose Red"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, {"magenta", "dye_magenta", S("Magenta Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr index 8d53cc73e..24a937b85 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr @@ -1,5 +1,5 @@ # textdomain: mcl_dye -Bone Meal=Poudre d'Os +Bone Meal=Farine d'Os Light Grey Dye=Teinture Gris Clair Grey Dye=Teinture Gris Ink Sac=Poche d'Encre @@ -19,7 +19,7 @@ This item is a dye which is used for dyeing and crafting.=Cet objet est un color Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Clic droit sur un mouton pour teindre sa laine. D'autres choses sont teintes par l'artisanat. Bone Meal=Farine d'Os Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=La farine d'os est une teinture blanche et également utile comme engrais pour accélérer la croissance de nombreuses plantes. -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Cliquez avec le bouton droit sur un mouton pour blanchir sa laine. Cliquez avec le bouton droit sur une plante pour accélérer sa croissance. Notez que toutes les plantes ne peuvent pas être fertilisées comme ça. Lorsque vous cliquez avec le bouton droit sur un bloc d'herbe, les hautes herbes et les fleurs poussent partout. +Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Cliquez avec le bouton droit sur un mouton pour blanchir sa laine. Cliquez avec le bouton droit sur une plante pour accélérer sa croissance. Notez que toutes les plantes ne peuvent pas être fertilisées ainsi. Lorsque vous cliquez avec le bouton droit sur un bloc d'herbe, les hautes herbes et les fleurs poussent autour. Cocoa beans are a brown dye and can be used to plant cocoas.=Les fèves de cacao ont une teinture brune et peuvent être utilisées pour planter du cacao. Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Faites un clic droit sur un mouton pour brunir sa laine. Clic droit sur le côté d'un tronc d'arbre de la jungle (Bois Acajou) pour planter un jeune cacao. Cocoa Beans=Fèves de Cacao diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr index e70388115..7d3e107b1 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr @@ -3,25 +3,25 @@ Bone Meal=Костная мука Light Grey Dye=Светло-серый краситель Grey Dye=Серый краситель Ink Sac=Чернильный мешок -Purple Dye=Пурпурный краситель -Lapis Lazuli=Ляпис-лазурь -Light Blue Dye=Светло-голубой краситель -Cyan Dye=Голубой краситель -Cactus Green=Зелень кактуса -Lime Dye=Зелёный лаймовый краситель -Dandelion Yellow=Одуванчиковый жёлтый краситель +Purple Dye=Фиолетовый краситель +Lapis Lazuli=Лазурит +Light Blue Dye=Голубой краситель +Cyan Dye=Бирюзовый краситель +Cactus Green=Зеленый краситель +Lime Dye=Лаймовый краситель +Dandelion Yellow=Жёлтый краситель Cocoa Beans=Какао-бобы Orange Dye=Оранжевый краситель -Rose Red=Экстракт красной розы -Magenta Dye=Фиолетовый краситель +Rose Red=Красный краситель +Magenta Dye=Сиреневый краситель Pink Dye=Розовый краситель -This item is a dye which is used for dyeing and crafting.=Это краситель, которые используется, чтобы окрашивать и крафтить. -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Кликните правой по овце, чтобы окрасить её шерсть. Остальные вещи окрашиваются путём крафтинга. +This item is a dye which is used for dyeing and crafting.=Это краситель, который используется для окрашивания и крафта. +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Кликните правой по овце, чтобы окрасить её шерсть. Остальные вещи окрашиваются путём крафта. Bone Meal=Костная мука Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Костная мука является белым красителем. Она также полезна в качестве удобрения, чтобы увеличить скорость роста многих растений. Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Кликните правой по овце, чтобы сделать её шерсть белой. Кликните правой по растению, чтобы ускорить его рост. Имейте в виду, что не все растения можно удобрять таким способом. Если вы кликнете по травяному блоку, то на этом месте вырастет высокая трава и цветы. Cocoa beans are a brown dye and can be used to plant cocoas.=Какао-бобы являются коричневым красителем. Их также можно использовать, чтобы посадить какао. -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Кликните правой по овце, чтобы сделать её шерсть коричневой. Кликните правой по боковой части ствола дерева джунглей, чтобы посадить молодое какао. +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Кликните правой по овце, чтобы сделать её шерсть коричневой. Кликните правой по боковой части ствола тропического дерева, чтобы посадить стебель какао. Cocoa Beans=Какао-бобы -Grows at the side of jungle trees=Растут на стволах деревьев джунглей +Grows at the side of jungle trees=Растут на стволах тропических деревьев Speeds up plant growth=Ускоряет рост растений diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index e876baf31..21736b630 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -388,6 +388,7 @@ mcl_experience.register_on_add_xp(function(player, xp) {list = "armor", index = 3}, {list = "armor", index = 4}, {list = "armor", index = 5}, + {list = "offhand", index = 1}, } local final_candidates = {} @@ -654,7 +655,7 @@ mcl_enchanting.enchantments.soul_speed = { mcl_enchanting.enchantments.unbreaking = { name = S("Unbreaking"), max_level = 3, - primary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true, pickaxe = true, shovel = true, axe = true, hoe = true, sword = true, fishing_rod = true, bow = true}, + primary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true, crossbow = true, pickaxe = true, shovel = true, axe = true, hoe = true, sword = true, fishing_rod = true, bow = true}, secondary = {tool = true}, disallow = {non_combat_armor = true}, incompatible = {}, diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 97a176b97..d6407d0bc 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -509,7 +509,7 @@ function mcl_enchanting.show_enchanting_formspec(player) .. "real_coordinates[true]" .. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]" local itemstack = inv:get_stack("enchanting_item", 1) - local player_levels = mcl_experience.get_level(player) + local player_levels = mcl_experience.get_level(player) or 0 local y = 0.65 local any_enchantment = false local table_slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) @@ -560,7 +560,7 @@ function mcl_enchanting.handle_formspec_fields(player, formname, fields) return end local player_level = mcl_experience.get_level(player) - if player_level < slot.level_requirement then + if not player_level or (player_level < slot.level_requirement) then return end mcl_experience.set_level(player, player_level - button_pressed) diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr index 985499964..57d9d0b93 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr @@ -16,7 +16,7 @@ Increases underwater movement speed.=Augmente la vitesse de déplacement sous l' Efficiency=Efficacité Increases mining speed.=Augmente la vitesse de minage. Feather Falling=Chute amortie -Reduces fall damage.=Reduit les dégats de chute. +Reduces fall damage.=Réduit les dégats de chute. Fire Aspect=Aura de feu Sets target on fire.=Définit la cible en feu. Fire Protection=Protection contre le feu @@ -36,7 +36,7 @@ Increases knockback.=Augmente le recul. Looting=Butin Increases mob loot.=Augmente le butin des mobs. Loyalty=Loyauté -Trident returns after being thrown. Higher levels reduce return time.=Trident revient après avoir été jeté. Des niveaux plus élevés réduisent le temps de retour. +Trident returns after being thrown. Higher levels reduce return time.=Le trident revient après avoir été jeté. Des niveaux plus élevés réduisent le temps de retour. Luck of the Sea=Chance de la mer Increases rate of good loot (enchanting books, etc.)=Augmente le taux de bon butin (livres enchanteurs, etc.) Lure=Appât @@ -52,7 +52,7 @@ Increases arrow damage.=Augmente les dégâts des flèches. Projectile Protection=Protection contre les projectiles Reduces projectile damage.=Réduit les dommages causés par les projectiles. Protection=Protection -Reduces most types of damage by 4% for each level.=éduit la plupart des types de dégâts de 4% pour chaque niveau. +Reduces most types of damage by 4% for each level.=Réduit la plupart des types de dégâts de 4% pour chaque niveau. Punch=Frappe Increases arrow knockback.=Augmente le recul de la flèche. Quick Charge=Charge rapide @@ -60,7 +60,7 @@ Decreases crossbow charging time.=Diminue le temps de chargement de l'arbalète. Respiration=Apnée Extends underwater breathing time.=Prolonge le temps de respiration sous l'eau. Riptide=Impulsion -Trident launches player with itself when thrown. Works only in water or rain.=Trident lance le joueur avec lui-même lorsqu'il est lancé. Fonctionne uniquement sous l'eau ou sous la pluie. +Trident launches player with itself when thrown. Works only in water or rain.=Le trident lance le joueur avec lui-même lorsqu'il est lancé. Fonctionne uniquement sous l'eau ou sous la pluie. Sharpness=Tranchant Increases damage.=Augmente les dégâts. Silk Touch=Toucher de soie diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr index 6cd1e1db6..f599a7799 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr @@ -2,13 +2,13 @@ Aqua Affinity=Родство с водой Increases underwater mining speed.=Увеличивает скорость добычи под водой. Bane of Arthropods=Бич членистоногих -Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Увеличивает урон и применяет Замедление IV к насекомым и членистоногим (паукам, пещерным паукам, чешуйницам и чешуйницам края). +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Увеличивает урон и применяет Замедление IV к насекомым и членистоногим (паукам, пещерным паукам, чешуйницам и чешуйницам Края). Blast Protection=Взрывоустойчивость Reduces explosion damage and knockback.=Уменьшает урон и отдачу от взрывов. Channeling=Громовержец Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Бьёт молнией в цель. Работает только во время грозы, когда цель не защищена плотными блоками. Curse of Binding=Проклятие несъёмности -Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Предмет не может быть изъят из слота доспехов, кроме как в результате смерти, разрушения или в креативном режиме. +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Предмет не может быть изъят из слота доспехов, кроме как в результате смерти, разрушения или в творческом режиме. Curse of Vanishing=Проклятье утраты Item destroyed on death.=Предмет уничтожается при смерти. Depth Strider=Покоритель глубин @@ -21,17 +21,17 @@ Fire Aspect=Заговор огня Sets target on fire.=Поджигает цель. Fire Protection=Защита от огня Reduces fire damage.=Уменьшает урон от огня. -Flame=Пламя +Flame=Горящая стрела Arrows set target on fire.=Стрелы поджигают цель. Fortune=Удача -Increases certain block drops.=Увеличивает выпадение ресурсов из блоков. +Increases certain block drops.=Даёт шанс выпадения большего количества ресурсов из блоков. Frost Walker=Ледоход -Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Превращает воду под игроком в замороженный лёд и предотвращает урон от магмовых блоков. +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Превращает воду под игроком в подмороженный лёд и предотвращает урон от магмовых блоков. Impaling=Пронзатель Trident deals additional damage to ocean mobs.=Трезубец наносит дополнительный урон океаническим мобам. Infinity=Бесконечность Shooting consumes no regular arrows.=При стрельбе не расходуются стрелы. -Knockback=Отскок +Knockback=Отдача Increases knockback.=Увеличивает отдачу. Looting=Добыча Increases mob loot.=Увеличивает добычу от мобов. @@ -66,18 +66,18 @@ Increases damage.=Увеличенный урон. Silk Touch=Шёлковое касание Mined blocks drop themselves.=Добываемый блок выпадает сам, даже если из него должно выпадать что-то другое. Smite=Небесная кара -Increases damage to undead mobs.=Дополнительный урон мертвякам (зомби и т.п.). +Increases damage to undead mobs.=Дополнительный урон нежити. Soul Speed=Скорость души Increases walking speed on soul sand.=Увеличивает скорость ходьбы по песку душ. Sweeping Edge=Разящий клинок Increases sweeping attack damage.=Увеличивает урон по мобам, стоящих рядом с целью. Thorns=Шипы Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Отражают некоторый урон, получаемый от ударов, за счёт снижения прочности с каждым разом. -Unbreaking=Нерушимость +Unbreaking=Прочность Increases item durability.=Увеличивает прочность предмета. Inventory=Инвентарь -@1 Lapis Lazuli=@1 Ляпис-лазурь -@1 Enchantment Levels=@1 Уровень зачаровывания +@1 Lapis Lazuli=@1 лазурит(а) +@1 Enchantment Levels=@1 уровень зачаровывания Level requirement: @1=Требуемый уровень: @1 Enchant an item=Зачаровать предмет []=<игрок> <зачарование> [<уровень>] @@ -98,3 +98,4 @@ The target item is not enchantable.=Указана незачаровываем Enchanted Book=Зачарованная книга Enchanting Table=Стол зачаровывания Enchant=Зачарование +Spend experience, and lapis to enchant various items.=Зачаровавает предметы за опыт и лазурит diff --git a/mods/ITEMS/mcl_enchanting/locale/template.txt b/mods/ITEMS/mcl_enchanting/locale/template.txt index 1f540d6d3..c459a308b 100644 --- a/mods/ITEMS/mcl_enchanting/locale/template.txt +++ b/mods/ITEMS/mcl_enchanting/locale/template.txt @@ -95,6 +95,7 @@ Enchant an item= Enchanted Book= Enchanting Table= +Spend experience, and lapis to enchant various items.= Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.= Enchanting succeded.= diff --git a/mods/ITEMS/mcl_enchanting/mod.conf b/mods/ITEMS/mcl_enchanting/mod.conf index 4d4741fb8..610492857 100644 --- a/mods/ITEMS/mcl_enchanting/mod.conf +++ b/mods/ITEMS/mcl_enchanting/mod.conf @@ -1,5 +1,5 @@ name = mcl_enchanting description = Enchanting for MineClone2 -depends = tt, walkover, mcl_sounds, mcl_colors +depends = tt, walkover, mcl_sounds, mcl_colors, mcl_experience optional_depends = screwdriver author = Fleckenstein diff --git a/mods/ITEMS/mcl_end/eye_of_ender.lua b/mods/ITEMS/mcl_end/eye_of_ender.lua index ea3d70aba..d2e273c8d 100644 --- a/mods/ITEMS/mcl_end/eye_of_ender.lua +++ b/mods/ITEMS/mcl_end/eye_of_ender.lua @@ -10,7 +10,7 @@ minetest.register_entity("mcl_end:ender_eye", { -- Save and restore age get_staticdata = function(self) - return tostring(self._age) + return tostring(self and self._age) or "0" end, on_activate = function(self, staticdata, dtime_s) local age = tonumber(staticdata) @@ -87,7 +87,7 @@ minetest.register_craftitem("mcl_end:ender_eye", { end local origin = user:get_pos() origin.y = origin.y + 1.5 - local strongholds = mcl_structures.get_registered_structures("stronghold") + local strongholds = mcl_structures.strongholds local dim = mcl_worlds.pos_to_dimension(origin) local is_creative = minetest.is_creative_enabled(user:get_player_name()) diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.fr.tr b/mods/ITEMS/mcl_end/locale/mcl_end.fr.tr index dc091a0f4..4131fe8c7 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.fr.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.fr.tr @@ -8,27 +8,27 @@ End rods are decorative light sources.=Les barres de l'End sont des sources de l Dragon Egg=Oeuf de Dragon A dragon egg is a decorative item which can be placed.=Un oeuf de dragon est un objet décoratif qui peut être placé. Chorus Flower=Plante de Chorus -A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Une fleur de chorus est la partie vivante d'une plante de chorus. Il peut devenir une grande plante de chorus, étape par étape. Quand elle grandit, elle peut finir par mourir en vieillissant. Elle meurt également lorsqu'il est incapable de grandir. +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Une fleur de chorus est la partie vivante d'une plante de chorus. Elle peut devenir une grande plante de chorus, étape par étape. Quand elle grandit, elle peut finir par mourir en vieillissant. Elle meurt également lorsqu'il est incapable de grandir. Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Placez-la et attendez qu'elle grandisse. Elle ne peut être placée que sur le dessus de la pierre d'End, sur le dessus d'une tige de plante de chorus ou exactement sur le côté d'une tige de plante de chorus. Dead Chorus Flower=Plante de Chorus Morte This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Ceci fait partie d'une plante de chorus. Ça ne pousse pas. Les fleurs de chorus meurent de vieillesse ou lorsqu'elles ne peuvent pas pousser. Une fleur de chorus morte peut être récoltée pour obtenir une fleur de chorus fraîche qui peut repousser. Chorus Plant Stem=Tige de Plante de Chorus -A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Une tige de plante de chorus est la partie d'une plante de chorus qui maintient la plante entière ensemble. Il a besoin de pierre d'End comme sol. Les tiges sont issues de fleurs de chorus. +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Une tige de plante de chorus est la partie d'une plante de chorus qui soutient la plante entière. Elle a besoin de pierre d'End comme sol. Les tiges sont issues de fleurs de chorus. Chorus Fruit=Fruit de Chorus -A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Un fruit de chorus est un fruit comestible de l'usine de chorus qui abrite la fin. Le manger vous téléporte au sommet d'un bloc solide aléatoire à proximité, à condition de ne pas vous retrouver dans un bloc liquide, solide ou nuisible. La téléportation peut échouer s'il y a très peu ou pas d'endroits où se téléporter. -Popped Chorus Fruit=Chorus Eclaté +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Un fruit de chorus est un fruit comestible de la plante de chorus qui pousse dans l'End. Le manger vous téléporte au sommet d'un bloc solide aléatoire à proximité, à condition de ne pas vous retrouver dans un bloc liquide, solide ou dangereux. La téléportation peut échouer s'il y a très peu ou pas d'endroits où se téléporter. +Popped Chorus Fruit=Fruit du Chorus Eclaté Eye of Ender=Oeil de l'Ender -This item is used to locate End portal shrines in the Overworld and to activate End portals.=Cet objet est utilisé pour localiser les sanctuaires du portail End dans l'Overworld et pour activer les portails End. -Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Utilisez la touche d'attaque pour libérer l'oeil d'ender. Il s'élèvera et volera dans la direction horizontale du sanctuaire portail d'Ender le plus proche. Si vous êtes très proche, l'oeil d'ender empruntera le chemin direct vers le sanctuaire du portail de l'End. Après quelques secondes, il s'arrête. Il peut tomber en tant qu'objet, mais il y a 20% de chances qu'il se brise. -To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Pour activer un portail d'End, les yeux d'ender doivent être placés dans chaque bloc d'un cadre de portail d'End intact. +This item is used to locate End portal shrines in the Overworld and to activate End portals.=Cet objet est utilisé pour localiser les sanctuaires du portail de l'End dans l'Overworld et pour activer les portails de l'End. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Utilisez la touche d'attaque pour libérer l'oeil d'ender. Il s'élèvera et volera dans la direction horizontale du sanctuaire du portail de l'End le plus proche. Si vous êtes très proche, l'oeil d'ender empruntera le chemin direct vers le sanctuaire du portail de l'End. Après quelques secondes, il s'arrête. Il peut tomber en tant qu'objet, mais il y a 20% de chances qu'il se brise. +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Pour activer un portail de l'End, les yeux d'ender doivent être placés dans chaque bloc d'un cadre de portail d'End intact. NOTE: The End dimension is currently incomplete and might change in future versions.=REMARQUE: la dimension de l'End est actuellement incomplète et pourrait changer dans les futures versions. The stem attaches itself to end stone and other chorus blocks.=La tige s'attache à la pierre d'End et à d'autres blocs de chorus. Grows on end stone=Pousse sur la pierre d'End -Randomly teleports you when eaten=Vous téléporte au hasard quand il est mangé +Randomly teleports you when eaten=Vous téléporte aléatoirement quand il est mangé Guides the way to the mysterious End dimension=Guide le chemin vers la dimension mystérieuse de l'End End Crystal=Cristal de l'End -End Crystals are explosive devices. They can be placed on Obsidian or Bedrock. Ignite them by a punch or a hit with an arrow. End Crystals can also be used the spawn the Ender Dragon by placing one at each side of the End Exit Portal.=Les cristaux de l'End sont des dispositifs explosifs. Ils peuvent être placés sur de l'Obsidienne ou de la Bedrock. Allumez-les par un coup de poing ou avec une flèche. Les cristaux de l'End peuvent également être utilisés pour engendrer l'Ender dragon en en plaçant un de chaque côté du portail de sortie de l'End. +End Crystals are explosive devices. They can be placed on Obsidian or Bedrock. Ignite them by a punch or a hit with an arrow. End Crystals can also be used the spawn the Ender Dragon by placing one at each side of the End Exit Portal.=Les cristaux de l'End sont des dispositifs explosifs. Ils peuvent être placés sur de l'Obsidienne ou de la Bedrock. Allumez-les par un coup de poing ou avec une flèche. Les cristaux de l'End peuvent également être utilisés pour invoquer l'Ender dragon en en plaçant un de chaque côté du portail de sortie de l'End. Explosion radius: @1=Rayon d'explosion: @1 Ignited by a punch or a hit with an arrow=Enflammé par un coup de poing ou un coup avec une flèche -Place the End Crystal on Obsidian or Bedrock, then punch it or hit it with an arrow to cause an huge and probably deadly explosion. To Spawn the Ender Dragon, place one at each side of the End Exit Portal.=Placez le cristal de l'End sur l'obsidienne ou le substrat rocheux, puis frappez-le à coup de poing ou avec une flèche pour provoquer une énorme explosion probablement mortelle. Pour engendrer l'Ender dragon, placez-en un de chaque côté du portail de sortie de l'End. +Place the End Crystal on Obsidian or Bedrock, then punch it or hit it with an arrow to cause an huge and probably deadly explosion. To Spawn the Ender Dragon, place one at each side of the End Exit Portal.=Placez le cristal de l'End sur l'obsidienne ou le substrat rocheux, puis frappez-le à coup de poing ou avec une flèche pour provoquer une énorme explosion probablement mortelle. Pour invoquer l'Ender dragon, placez-en un de chaque côté du portail de sortie de l'End. diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr b/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr index 6ab7a3c67..de6a4b61c 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr @@ -1,33 +1,33 @@ # textdomain: mcl_end -End Stone=Камень Предела -End Stone Bricks=Кирпичи из камня Предела +End Stone=Камень Края +End Stone Bricks=Кирпичи из камня Края Purpur Block=Пурпурный блок Purpur Pillar=Пурпурная колонна -End Rod=Стержень Предела -End rods are decorative light sources.=Стержень Предела это декоративный светильник. -Dragon Egg=Драконье яйцо -A dragon egg is a decorative item which can be placed.=Драконье яйцо это декоративный предмет, который можно поставить. -Chorus Flower=Цветок коруса -A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Цветок коруса это живая часть растения коруса. Он может шаг за шагом вырасти в высокое растение коруса. Когда он растёт, то может иногда умирать от старости. Он также умирает, если не может расти. -Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Установите его на место и ожидайте роста. Его можно помещать только на верхушку камня предела, а также верхнюю часть либо строго одну сторону стебля растения коруса. -Dead Chorus Flower=Мёртвый цветок коруса -This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Это часть растения коруса. Она не растёт. Цветы коруса умирают от старости или когда не могут расти. Мёртвый цветок коруса можно собрать, чтобы получить свежий цветок коруса, который может вырасти вновь. -Chorus Plant Stem=Стебель растения коруса -A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Стебель растения коруса это часть растения коруса, которая связывает всё растение вместе. Ему нужен камень предела как почва. Стебли растут из цветков коруса. -Chorus Fruit=Фрукт коруса -A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Фрукт коруса это съедобный фрукт растения коруса, домом которого является Предел. Употребление его в пищу телепортирует вас к вершине случайного твёрдого блок поблизости. Вы не закончите жизнь внутри жидкого, твёрдого или опасного блока, но телепортация может потерпеть неудачу, если поблизости слишком мало подходящих мест или такие места отсутствуют. -Popped Chorus Fruit=Лопнувший фрукт коруса -Eye of Ender=Око Предела -This item is used to locate End portal shrines in the Overworld and to activate End portals.=Этот предмет используется для обнаружения храмов порталов в Верхнем Мире и активации порталов Предела. -Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Используйте клавишу [Атаковать], чтобы освободить око Предела. Оно поднимется и полетит в горизонтальном направлении к ближайшему храму портала. Если вы очень близко к храму портала Предела, то око Предела полетит к нему напрямую. Оно остановится через несколько секунд. Оно может превратиться обратно в предмет, но есть 20-процентная вероятность того, что оно разобьётся. -To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Чтобы активировать портал Предела, нужно поместить по оку Предела на каждый блок целой рамки портала. -NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Предела в настоящее время не завершено полностью и может измениться в будущих версиях. -The stem attaches itself to end stone and other chorus blocks.=Стебель присоединяется к камню Предела, а также к другим блокам коруса. -Grows on end stone=Растёт на камнях Предела +End Rod=Стержень Края +End rods are decorative light sources.=Стержень Края это декоративный источник света. +Dragon Egg=Яйцо дракона +A dragon egg is a decorative item which can be placed.=Яйцо дракона это декоративный предмет, который можно поставить. +Chorus Flower=Цветок хоруса +A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Цветок хоруса это живая часть растения хоруса. Он может шаг за шагом вырасти в высокое растение хоруса. Когда он растёт, то может иногда умирать от старости. Он также умирает, если не может расти. +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Установите его и ждите, пока он вырастет. Его можно помещать только на камень Края, а также на верхнюю часть стебля растения хоруса. +Dead Chorus Flower=Мёртвый цветок хоруса +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Это часть растения хоруса. Он не растёт. Цветы хоруса умирают от старости или когда не могут расти. Мёртвый цветок хоруса можно собрать, чтобы получить свежий цветок хоруса, который может вырасти вновь. +Chorus Plant Stem=Стебель растения хоруса +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Стебель растения хоруса это часть растения хоруса, которая связывает всё растение вместе. Ему нужен камень Края как почва. Стебли растут из цветков хоруса. +Chorus Fruit=Фрукт хоруса +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Фрукт хоруса это съедобный фрукт растения хоруса, домом которого является Край. Употребление его в пищу телепортирует вас к вершине случайного твёрдого блок поблизости. Вы не закончите жизнь внутри жидкого, твёрдого или опасного блока, но телепортация может потерпеть неудачу, если поблизости слишком мало подходящих мест или такие места отсутствуют. +Popped Chorus Fruit=Приготовленный плод хоруса +Eye of Ender=Око Края +This item is used to locate End portal shrines in the Overworld and to activate End portals.=Этот предмет используется для обнаружения храмов с порталами в Верхнем Мире и для активации порталов Края. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Используйте клавишу [Атаковать], чтобы кинуть око Края. Оно поднимется и полетит в горизонтальном направлении к ближайшему храму с порталом. Если вы очень близко к храму портала Края, то око Края полетит к нему напрямую. Оно остановится через несколько секунд. Оно может превратиться обратно в предмет, но есть 20-процентная вероятность того, что око разобьётся. +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Чтобы активировать портал Края, нужно поместить по оку Края на каждый блок всей рамки портала. +NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Края в настоящее время не завершено полностью и может измениться в будущих версиях. +The stem attaches itself to end stone and other chorus blocks.=Стебель присоединяется к камню Края, а также к другим блокам хоруса. +Grows on end stone=Растёт на камнях Края Randomly teleports you when eaten=Телепортирует случайным образом при употреблении в пищу -Guides the way to the mysterious End dimension=Показывает путь к загадочному измерению Предела -End Crystal=Кристалл Предела -End Crystals are explosive devices. They can be placed on Obsidian or Bedrock. Ignite them by a punch or a hit with an arrow. End Crystals can also be used the spawn the Ender Dragon by placing one at each side of the End Exit Portal.=Кристаллы Предела - это взрывные устройства. Их можно размещать на обсидиане или бедроке. Подрывайте их ударом или попаданием стрелы. Кристаллы Предела также можно использовать для порождения Дракона Предела, для этого их нужно поместить по одной штуке с каждой стороны выходного портала Предела. +Guides the way to the mysterious End dimension=Показывает путь к загадочному измерению Края +End Crystal=Кристалл Края +End Crystals are explosive devices. They can be placed on Obsidian or Bedrock. Ignite them by a punch or a hit with an arrow. End Crystals can also be used the spawn the Ender Dragon by placing one at each side of the End Exit Portal.=Кристаллы Края - это взрывные устройства. Их можно размещать на обсидиане или бедроке. Подрывайте их ударом или попаданием стрелы. Кристаллы Края также можно использовать для порождения Дракона Края, для этого их нужно поместить по одной штуке с каждой стороны выходного портала Края. Explosion radius: @1=Радиус взрыва: @1 -Ignited by a punch or a hit with an arrow=Поджигается ударом или при попадании стрелы -Place the End Crystal on Obsidian or Bedrock, then punch it or hit it with an arrow to cause an huge and probably deadly explosion. To Spawn the Ender Dragon, place one at each side of the End Exit Portal.=Разместите кристалл Предела на обсидиане или бедроке и ударьте по нему или попадите в него стрелой, чтобы вызвать огромный и, вероятно, смертельный взрыв. Чтобы вызвать Дракона Предела, поместите по одной штуке с каждой стороны портала выходного портала Предела. +Ignited by a punch or a hit with an arrow=Взрывается от удара или при попадании стрелы +Place the End Crystal on Obsidian or Bedrock, then punch it or hit it with an arrow to cause an huge and probably deadly explosion. To Spawn the Ender Dragon, place one at each side of the End Exit Portal.=Разместите кристалл Края на обсидиане или бедроке и ударьте по нему или попадите в него стрелой, чтобы вызвать огромный и смертоносный взрыв. Чтобы привызвать Дракона Края, поместите по одной штуке с каждой стороны выходного портала Края. diff --git a/mods/ITEMS/mcl_farming/beetroot.lua b/mods/ITEMS/mcl_farming/beetroot.lua index e312aa262..187f34eb4 100644 --- a/mods/ITEMS/mcl_farming/beetroot.lua +++ b/mods/ITEMS/mcl_farming/beetroot.lua @@ -5,7 +5,7 @@ minetest.register_craftitem("mcl_farming:beetroot_seeds", { _tt_help = S("Grows on farmland"), _doc_items_longdesc = S("Grows into a beetroot plant. Chickens like beetroot seeds."), _doc_items_usagehelp = S("Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds."), - groups = { craftitem=1 }, + groups = { craftitem=1, compostability=30 }, inventory_image = "mcl_farming_beetroot_seeds.png", wield_image = "mcl_farming_beetroot_seeds.png", on_place = function(itemstack, placer, pointed_thing) @@ -133,7 +133,7 @@ minetest.register_craftitem("mcl_farming:beetroot_item", { wield_image = "mcl_farming_beetroot.png", on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), - groups = { food = 2, eatable = 1 }, + groups = { food = 2, eatable = 1, compostability=65 }, _mcl_saturation = 1.2, }) diff --git a/mods/ITEMS/mcl_farming/carrots.lua b/mods/ITEMS/mcl_farming/carrots.lua index 7983c58a2..bdecdefed 100644 --- a/mods/ITEMS/mcl_farming/carrots.lua +++ b/mods/ITEMS/mcl_farming/carrots.lua @@ -86,7 +86,7 @@ minetest.register_craftitem("mcl_farming:carrot_item", { _doc_items_longdesc = S("Carrots can be eaten and planted. Pigs and rabbits like carrots."), _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_carrot.png", - groups = { food = 2, eatable = 3 }, + groups = { food = 2, eatable = 3, compostability=65 }, _mcl_saturation = 3.6, on_secondary_use = minetest.item_eat(3), on_place = function(itemstack, placer, pointed_thing) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr index 5ee1bcdfc..b2fa8265d 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr @@ -1,6 +1,6 @@ # textdomain: mcl_farming Beetroot Seeds=Graines de Betterave -Grows into a beetroot plant. Chickens like beetroot seeds.=Pousse en bettrave. Les poulets aiment les graines de betterave +Grows into a beetroot plant. Chickens like beetroot seeds.=Pousse en plante de betterave. Les poulets aiment les graines de betterave Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Placez les graines de betterave sur les terres agricoles (qui peuvent être créées avec une houe) pour planter un plant de betterave. Elles poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de betteraves. Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de betteraves poussent sur les terres agricoles sous le soleil en 4 étapes. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Elles peuvent être récoltées à tout moment mais ne rapporteront de bénéfices qu'à maturité. Premature Beetroot Plant=Plant de Betterave Prématurée @@ -8,24 +8,24 @@ Premature Beetroot Plant (Stage 1)=Plant de Betterave Prématurée (Etape 1) Premature Beetroot Plant (Stage 2)=Plant de Betterave Prématurée (Etape 2) Premature Beetroot Plant (Stage 3)=Plant de Betterave Prématurée (Etape 3) Mature Beetroot Plant=Betterave Mature -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Une betterave mature est une plante agricole prête à être récoltée pour une betterave et quelques graines de betterave. Elle ne grandira plus. +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Une betterave mature est une plante agricole prête à être récoltée pour obtenir une betterave et quelques graines de betterave. Elle ne grandira plus. Beetroot=Betterave Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Les betteraves sont à la fois utilisées comme aliment et comme ingrédient colorant. Les porcs aiment aussi les betteraves. Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Tenez-le dans votre main et faites un clic droit pour le manger. Faites un clic droit sur un animal pour le nourrir. Beetroot Soup=Soupe de Betterave Beetroot soup is a food item.=La soupe de betterave est un aliment. -Premature Carrot Plant=Plant de Carrote Prématurée -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de carotte sont des plantes qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. -Premature Carrot Plant (Stage @1)=Plant de Carrote Prématurée (Etape 1) +Premature Carrot Plant=Plant de Carotte Prématurée +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les carottes sont des plantes qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Elles peuvent être récoltées à tout moment mais ne rapporteront de bénéfices qu'à maturité. +Premature Carrot Plant (Stage @1)=Plant de Carotte Prématurée (Etape 1) Mature Carrot Plant=Plant de Carotte Mature -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Les plants de carottes matures sont prêts à être récoltés pour les carottes. Ils ne grandiront plus. +Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Les plants de carottes matures sont prêtes à être récoltés pour obtenir des carottes. Elles ne grandiront plus. Carrot=Carrotte -Carrots can be eaten and planted. Pigs and rabbits like carrots.=Les carottes peuvent être mangées et plantées. Les cochons et les lapins comme les carottes. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-la dans votre main et faites un clic droit pour le manger. Placez-le au-dessus des terres agricoles pour planter la carotte. Elle pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. -Golden Carrot=Carrot Dorée +Carrots can be eaten and planted. Pigs and rabbits like carrots.=Les carottes peuvent être mangées et plantées. Les cochons et les lapins aiment les carottes. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-la dans votre main et faites un clic droit pour la manger. Placez-la au-dessus des terres agricoles pour planter la carotte. Elle pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. +Golden Carrot=Carotte Dorée A golden carrot is a precious food item which can be eaten. It is really, really filling!=Une carotte dorée est un aliment précieux qui peut être mangé. C'est vraiment, vraiment rassasiant! -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Les houes sont des outils essentiels pour faire pousser des cultures. Ils sont utilisés pour créer des terres agricoles afin d'y planter des graines. Les houes peuvent également être utilisées comme armes très faibles à la rigueur. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Utilisez la houe sur un bloc cultivable (en cliquant dessus avec le bouton droit) pour le transformer en terre agricole. La saleté, les blocs d'herbe et les chemins d'herbe sont des blocs cultivables. L'utilisation d'une houe sur la terre grossière la transforme en terre. +Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Les houes sont des outils essentiels pour faire pousser les cultures. Elles sont utilisées pour créer des terres agricoles afin d'y planter des graines. Les houes peuvent également être utilisées comme armes très faibles à la rigueur. +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Utilisez la houe sur un bloc cultivable (en cliquant dessus avec le bouton droit) pour le transformer en terre agricole. La terre, les blocs d'herbe et les chemins d'herbe sont des blocs cultivables. L'utilisation d'une houe sur la terre grossière la transforme en terre. Wood Hoe=Houe en Bois Stone Hoe=Houe en Pierre Iron Hoe=Houe en Fer @@ -35,28 +35,28 @@ Melon Seeds=Graine de Pastèque Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Se développe en une tige de pastèque qui à son tour forme des pastèques. Les poulets aiment les graines de pastèque. Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Placez les graines de pastèque sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une tige de pastèque. Les tiges de pastèque poussent au soleil et se développent plus rapidement sur les terres agricoles hydratées. À maturité, la tige tentera de faire pousser une pastèque sur le côté. Faites un clic droit sur un animal pour le nourrir de graines de pastèque. Melon=Pastèque -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Une pastèque est un bloc qui peut être cultivé à partir de tiges de pastèque, qui à leur tour sont cultivées à partir de graines de pastèque. Elle peut être récoltée pour des tranches de pastèque. +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Une pastèque est un bloc qui peut être cultivé à partir de tiges de pastèque, qui à leur tour sont cultivées à partir de graines de pastèque. Elle peut être récoltée pour obtenir des tranches de pastèque. Premature Melon Stem=Tige de Pastèque Prématurée Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Les tiges de pastèque poussent sur les terres agricoles en 8 étapes. Sur les terres agricoles hydratées, la croissance est un peu plus rapide. Les tiges de pastèque matures sont capables de faire pousser des pastèques. Premature Melon Stem (Stage @1)=Tige de Pastèque Prématurée (Etape @1) Mature Melon Stem=Tige de Pastèque Mature -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Une tige de pastèque mature tente de faire pousser un pastèque sur l'un de ses quatre blocs adjacents. Une pastèque ne peut pousser que sur des terres agricoles, de la terre ou un bloc d'herbe. Lorsqu'une pastèque est à côté d'une tige de pastèque, la tige de pastèque se plie immédiatement et se connecte au melon. Lorsqu'elle est connectée, une tige de pastèque ne peut pas faire pousser une autre pastèque. Dès que tous les pastèques autour de la tige ont été supprimés, elle perd la connexion et est prêt à faire pousser une autre pastèque. +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Une tige de pastèque mature tente de faire pousser un pastèque sur l'un de ses quatre blocs adjacents. Une pastèque ne peut pousser que sur des terres agricoles, de la terre ou un bloc d'herbe. Lorsqu'une pastèque est à côté d'une tige de pastèque, la tige de pastèque se plie immédiatement et se connecte au melon. Lorsqu'elle est connectée, une tige de pastèque ne peut pas faire pousser une autre pastèque. Dès que tous les pastèques autour de la tige ont été supprimés, elle perd la connexion et est prête à faire pousser une autre pastèque. Melon Slice=Tranche de Pastèque This is a food item which can be eaten.=Il s'agit d'un aliment qui peut être mangé. Premature Potato Plant=Plant de Pomme de Terre Prématuré -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de pommes de terre sont des plants qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. +Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les pommes de terre sont des plantes qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Elles peuvent être récoltées à tout moment mais ne rapporteront de bénéfices qu'à maturité. Premature Potato Plant (Stage @1)=Plant de pomme de terre prématuré (Etape @1) Mature Potato Plant=Plant de Pomme de Terre Mature Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Les plants de pommes de terre matures sont prêts à être récoltés pour les pommes de terre. Ils ne grandiront plus. Potato=Pomme de terre -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Les pommes de terre sont des aliments qui peuvent être consommés, cuits au four et plantés. Des porcs comme des pommes de terre. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-le dans votre main et faites un clic droit pour le manger. Placez-le au-dessus des terres agricoles pour le planter. Il pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Les pommes de terre sont des aliments qui peuvent être consommés, cuits au four et plantés. Les porcs aiment les pommes de terre. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-la dans votre main et faites un clic droit pour la manger. Placez-la au-dessus des terres agricoles pour la planter. Elle pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. Baked Potato=Pomme de Terre au Four -Baked potatoes are food items which are more filling than the unbaked ones.=Les pommes de terre au four sont des aliments qui sont plus copieux que ceux non cuits. +Baked potatoes are food items which are more filling than the unbaked ones.=Les pommes de terre au four sont plus copieuses que celles non cuites. Poisonous Potato=Pomme de Terre Toxique -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Cette pomme de terre n'a pas l'air trop saine. Vous pouvez le manger pour restaurer des points de faim, mais il y a 60% de chances qu'il vous empoisonne brièvement. +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Cette pomme de terre n'a pas l'air très bonne. Vous pouvez la manger pour restaurer des points de faim, mais il y a 60% de chances qu'elle vous empoisonne brièvement. Pumpkin Seeds=Graines de Citrouille -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Pousse dans une tige de citrouille qui à son tour fait pousser des citrouilles. Les poulets aiment des graines de citrouille. +Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Pousse en une tige de citrouille qui à son tour fait pousser des citrouilles. Les poulets aiment les graines de citrouille. Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Placez les graines de citrouille sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une tige de citrouille. Les tiges de citrouille poussent au soleil et poussent plus vite sur les terres agricoles hydratées. À maturité, la tige tente de faire pousser une citrouille à côté d'elle. Faites un clic droit sur un animal pour le nourrir de graines de citrouille. Premature Pumpkin Stem=Tige de Citrouille Prématurée Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Les tiges de citrouille poussent sur les terres agricoles en 8 étapes. Sur les terres agricoles hydratées, la croissance est un peu plus rapide. Les tiges de citrouille matures peuvent faire pousser des citrouilles. @@ -66,15 +66,15 @@ A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blo Faceless Pumpkin=Citrouille sans visage A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Une citrouille sans visage est un bloc décoratif. Il peut être sculpté avec une cisaille pour obtenir des graines de citrouille. Pumpkin=Citrouille -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Une citrouille peut être portée comme un casque. Les citrouilles poussent à partir de tiges de citrouille, qui à leur tour poussent à partir de graines de citrouille. +A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Une citrouille peut être portée comme casque. Les citrouilles poussent à partir de tiges de citrouille, qui à leur tour poussent à partir de graines de citrouille. Jack o'Lantern=Citrouille-lanterne -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Une citrouille-lanterne est une décoration traditionnelle d'Halloween à base de citrouille. Il brille de mille feux. +A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Une citrouille-lanterne est une décoration traditionnelle d'Halloween à base de citrouille. Elle brille de mille feux. Pumpkin Pie=Tarte à la Citrouille A pumpkin pie is a tasty food item which can be eaten.=Une tarte à la citrouille est un aliment savoureux qui peut être mangé. Farmland=Terres Agricoles -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles sont utilisées pour l'agriculture, une surface nécessaire pour planter des cultures. Il est créé lorsqu'une houe est utilisée sur de la terre ou un bloc similaire. Les plantes peuvent pousser sur les terres agricoles, mais lentement. Les terres agricoles deviendront des terres agricoles hydratées (sur lesquelles les plantes poussent plus rapidement) lorsqu'il pleut ou lorsqu'une source d'eau est à proximité. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles sont utilisées pour l'agriculture, le sol nécessaire pour planter des cultures. Ells sont créées lorsqu'une houe est utilisée sur de la terre ou un bloc similaire. Les plantes peuvent pousser sur les terres agricoles, mais lentement. Les terres agricoles deviendront des terres agricoles hydratées (sur lesquelles les plantes poussent plus rapidement) lorsqu'il pleut ou lorsqu'une source d'eau est à proximité. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. Hydrated Farmland=Terres Agricoles Hydratées -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles hydratées sont utilisées dans l'agriculture, c'est là que vous pouvez planter et faire pousser certaines plantes. Il est créé lorsque les terres agricoles sont sous la pluie ou près de l'eau. Sans eau, ce bloc finira par se dessécher. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles hydratées sont utilisées dans l'agriculture, c'est là que vous pouvez planter et faire pousser certaines plantes. Elles sont créées lorsque les terres agricoles sont sous la pluie ou près de l'eau. Sans eau, ce bloc finira par se dessécher. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. Wheat Seeds=Graines de blé Grows into a wheat plant. Chickens like wheat seeds.=Se transforme en blé. Les poulets aiment les graines de blé. Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Placez les graines de blé sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une plante de blé. Ils poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de blé. @@ -88,7 +88,7 @@ Wheat is used in crafting. Some animals like wheat.=Le blé est utilisé dans l' Cookie=Cookie Bread=Pain Hay Bale=Balle de Foin -Hay bales are decorative blocks made from wheat.=Les balles de foin sont des blocs décoratifs en blé. +Hay bales are decorative blocks made from wheat.=Les balles de foin sont des blocs décoratifs faits de blé. To carve a face into the pumpkin, use the shears on the side you want to carve.=Pour sculpter un visage dans la citrouille, utilisez les cisailles du côté que vous souhaitez sculpter. Use the “Place” key on an animal to try to feed it wheat.=Utilisez la touche "Placer" sur un animal pour essayer de le nourrir de blé. Grows on farmland=Pousse sur les terres agricoles @@ -96,4 +96,4 @@ Turns block into farmland=Transforme un bloc en terres agricoles 60% chance of poisoning=60% de chances d'empoisonnement Surface for crops=Surface pour les cultures Can become wet=Peut devenir humide -Uses: @1=Utilisations: @1 +Uses: @1=Utilisations: @1 \ No newline at end of file diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr index f587fb943..04a0e5f68 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr @@ -1,99 +1,101 @@ # textdomain: mcl_farming Beetroot Seeds=Семена свёклы -Grows into a beetroot plant. Chickens like beetroot seeds.=Вырастают на свёкле. Куры обожают свекольные семена. -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Положите семена свёклы на грядку (которую можно создать при помощи мотыги), чтобы посадить свёклу. Они прорастают при солнечном свете и растут быстрее на увлажнённой почке. Кликните правой по животному, чтобы накормить его семенами свёклы. +Grows into a beetroot plant. Chickens like beetroot seeds.=Из них вырастает свёкла. Куры любят свекольные семена. +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Положите семена свёклы на грядку (которую можно создать при помощи мотыги), чтобы посадить свёклу. Они прорастают при солнечном свете и растут быстрее на увлажнённой почке. Кликните правой по животному, чтобы покормить его семенами свёклы. Premature Beetroot Plant (Stage 1)=Рассада молодой свёклы (стадия 1) Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Свёкла растёт в 4 стадии на грядках под действием солнечного света. На увлажнённой грядке процесс пойдёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. Premature Beetroot Plant=Рассада молодой свёклы Premature Beetroot Plant (Stage 2)=Рассада молодой свёклы (стадия 2) Premature Beetroot Plant (Stage 3)=Рассада молодой свёклы (стадия 3) Mature Beetroot Plant=Созревшая свёкла -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Созревшая свёкла это культивируемое растение, с которого уже можно собирать урожай свёклы и некоторое количество свекольных семян. Дальше расти она уже не будет. +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Созревшая свёкла это культивируемое растение, с которого уже можно собирать урожай свёклы и несколько свекольных семян. Дальше расти она уже не будет. Beetroot=Свёкла Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Свёкла это еда и ингредиент для красителя. Свёклу также очень любят свиньи. -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа её в руке. Или кликните правой по животному, чтобы покормить его. -Beetroot Soup=Борщ -Beetroot soup is a food item.=Борщ можно есть, он съедобен. +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Чтобы съесть свёклу, возьмите её в руки с кликните правой кнопкой мыши. Или кликните правой кнопкой мыши по животному, чтобы покормить его. +Beetroot Soup=Свекольный суп +Beetroot soup is a food item.=Свекольный суп можно съесть. Premature Carrot Plant=Рассада молодой моркови -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Морковь растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Морковь растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревшей моркови. Premature Carrot Plant (Stage @1)=Рассада молодой моркови (стадия @1) Mature Carrot Plant=Созревшая морковь Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Созревшая морковь готова к сбору. Дальше расти она уже не будет. Carrot=Морковь Carrots can be eaten and planted. Pigs and rabbits like carrots.=Морковь можно есть и садить. Свиньи и кролики очень любят морковь. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа её в руке. Или поместите её на грядку, чтобы посадить морковь. Она растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Или кликните правой по животному, чтобы покормить его. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть морковь, возьмите её в руки с кликните правой кнопкой мыши. Или кликните правой кнопкой мыши по животному, чтобы покормить его. Морковь растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Golden Carrot=Золотая морковь -A golden carrot is a precious food item which can be eaten. It is really, really filling!=Золотая морковь это изысканный продуктовый предмет, которые можно есть. Она отлично, отлично утоляет голод! +A golden carrot is a precious food item which can be eaten. It is really, really filling!=Золотая морковь это ценный съедобный продукт. Она отлично утоляет голод! Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Мотыга это инструмент, необходимый для выращивания урожая. Она используется для создания грядок, на которые потом можно высадить семена. В случае необходимости мотыгу можно использовать и в качестве слабого оружия. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Примените мотыгу к культивируемому блоку (кликнув правой по нему), чтобы превратить его в грядку. Грязь, травяные блоки и тропинки это культивируемые блоки. Разрыхлив мотыгой грубую грязь, вы получите из её обыкновенную грязь. +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Примените мотыгу к культивируемому блоку (кликнув правой кнопкой мыши по нему), чтобы превратить его в грядку. Земля, дёрн и тропинки это культивируемые блоки. Разрыхлив мотыгой каменистую землю, вы получите из неё обычную землю. Wood Hoe=Деревянная мотыга Stone Hoe=Каменная мотыга Iron Hoe=Железная мотыга Golden Hoe=Золотая мотыга Diamond Hoe=Алмазная мотыга -Melon Seeds=Семена дыни +Melon Seeds=Семена арбуза Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Из них вырастают дыневые стебли, из которых, в свою очередь, вырастают дыни. Семена дыни любят куры. -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Положите семена дыни на грядку (которую можно создать при помощи мотыги), чтобы посадить дыню. Дыневые стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почке. На боку вызревшего стебля будет пытаться расти дыня. Кликните правой по животному, чтобы накормить его дыневыми семенами. -Melon=Дыня -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Дыня это блок, который может расти на дыневом стебле, выросшем из семян дыни. -Premature Melon Stem=Созревший дыневый стебель -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Стебель дыни растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти дыни. -Premature Melon Stem (Stage @1)=Молодой стебель дыни (стадия @1) -Mature Melon Stem=Созревший дыневый стебель -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Зрелый стебель дыни пытается вырастить дыню на одном из четырех соседних блоков. Дыня может расти только на грядках, грязи или на травяном блоке. Когда дыня находится рядом со стеблем, он сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другую дыню. И только когда все дыни вокруг стебля убраны, он будет готов вырастить другую дыню. -Melon Slice=Кусок дыни -This is a food item which can be eaten.=Это продуктовый предмет, его можно есть. +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Положите семена арбуза на грядку (которую можно создать при помощи мотыги), чтобы посадить арбуз. Стебли арбуза прорастают при солнечном свете, они растут быстрее на увлажнённой почке. Сбоку созревшего стебля будет вырастет арбуз. Кликните правой кнопкой мыши по животному, чтобы покормить его арбузными семенами. +Melon=Арбуз +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Арбуз это блок, который может расти на арбузном стебле, выросшем из семян арбуза. +Premature Melon Stem=Созревший арбузный стебель +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Стебель арбуза растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти арбузы. +Premature Melon Stem (Stage @1)=Молодой стебель арбуза (стадия @1) +Mature Melon Stem=Созревший арбузный стебель +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Зрелый стебель арбуза пытается вырастить арбуз на одном из четырех соседних блоков. Арбуз может расти только на грядках, земле или на дёрне. Когда арбуз находится рядом со стеблем, стебель сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другой арбуз. И только когда все арбузы вокруг стебля убраны, он будет готов вырастить другой арбуз. +Melon Slice=Ломтик арбуза +This is a food item which can be eaten.=Это съедобный продукт. Premature Potato Plant=Молодой картофель Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Картофель растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. Premature Potato Plant (Stage @1)=Саженец молодого картофеля (стадия @1) Mature Potato Plant=Созревший картофель Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Созревший картофель готов к сбору. Дальше расти он уже не будет. Potato=Картофель -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Картофель это продуктовый предмет, его можно есть, готовить в печи, а также садить. Картофель любят свиньи. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа его в руке. Или поместите его на грядку, чтобы посадить картофель. Он растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Или кликните правой по животному, чтобы покормить его. +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Картофель это съедобный продукт, его можно съесть, готовить в печи, а также садить. Картофель любят свиньи. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть картофель, возьмите его в руки с кликните правой кнопкой мыши. Или кликните картофелем на грядку чтобы посадить его. Кликните правой кнопкой мыши по животному, чтобы покормить его. Картофель растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Baked Potato=Печёный картофель -Baked potatoes are food items which are more filling than the unbaked ones.=Печёный картофель это продуктовый предмет, который насыщает лучше, чем сырой картофель. +Baked potatoes are food items which are more filling than the unbaked ones.=Печёный картофель это съедобный продукт, который насыщает лучше, чем сырой картофель. Poisonous Potato=Ядовитый картофель -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Этот картофель вреден для здоровья. Его можно есть для восстановления очков голода, но с вероятностью 60% он вас ненадолго отравит. +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Этот картофель вреден. Его можно есть для восстановления очков голода, но с вероятностью 60% вы ненадолго отравитесь. Pumpkin Seeds=Семена тыквы Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Из них вырастают тыквенный стебель, на котором, в свою очередь, растут тыквы. -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Положите семена тыквы на грядку (которую можно создать при помощи мотыги), чтобы посадить тыкву. Тыквенные стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почке. Когда стебель созреет, то попытается вырастить тыкву рядом с собой. Кликните правой по животному, чтобы накормить его тыквенными семенами. +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Положите семена тыквы на грядку (которую можно создать при помощи мотыги), чтобы посадить тыкву. Тыквенные стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почке. Когда стебель созреет, то попытается вырастить тыкву рядом с собой. Кликните правой кнопкой мыши по животному, чтобы покормить его. Premature Pumpkin Stem=Созревший тыквенный стебель Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Стебель тыквы растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти тыквы. Premature Pumpkin Stem (Stage @1)=Молодой стебель тыквы (стадия @1) Mature Pumpkin Stem=Созревший тыквенный стебель A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Зрелый стебель тыквы пытается вырастить тыкву на одном из четырех соседних блоков. Тыква может расти только на грядках, грязи или на травяном блоке. Когда тыква находится рядом со стеблем, он сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другую тыкву. И только когда все тыквы вокруг стебля убраны, он будет готов вырастить другую тыкву. -Faceless Pumpkin=Безликая тыква -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Безликая тыква это декоративный блок. Его можно разрезать ножницами для получения семян тыквы. -Pumpkin=Тыква -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Тыкву можно носить как шлем. Тыквы растут из тыквенных стеблей, которые растут из семян тыквы. +Faceless Pumpkin=Тыква +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Тыква это декоративный блок. Её можно разрезать ножницами для получения семян тыквы. +Pumpkin=Вырезанная тыква +A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Вырезанную тыкву можно носить как шлем. Тыквы растут из тыквенных стеблей, которые растут из семян тыквы. Jack o'Lantern=Светильник Джека A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Светильник Джека это традиционное украшение на Хеллоуин, изготавливаемое из тыквы. Он ярко светит. Pumpkin Pie=Тыквенный пирог -A pumpkin pie is a tasty food item which can be eaten.=Тыквенный пирог это вкусный продуктовый предмет, который можно съесть. +A pumpkin pie is a tasty food item which can be eaten.=Тыквенный пирог это вкусный съедобный продукт. Farmland=Грядка -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Грядка нужна для земледелия, она представляет собой поверхность для высадки культур. Он создается при применении мотыги к грязи и тому подобным блокам. Растения могут расти на грядках, но медленно. Грядки превратятся в увлажнённые грядки, если пойдёт дождь, либо если поблизости есть источник воды. Этот блок превратится обратно в грязь, если поместить на него твёрдый блок, а также под действием поршневого рычага. +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Грядка нужна для земледелия, она представляет собой поверхность для высадки культур. Он создается при применении мотыги к земле и тому подобным блокам. Растения могут расти на грядках, но медленно. Грядки превратятся в увлажнённые грядки, если пойдёт дождь, либо если поблизости есть источник воды. Этот блок превратится обратно в землю, если поместить на него твёрдый блок, или действовать на блок поршнем. Hydrated Farmland=Увлажнённая грядка -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Увлажнённая грядка нужна для земледелия, на ней вы можете выращивать некоторые растения. Она создается, когда обыкновенная грядка попадает под дождь, либо рядом есть источник воды. Без воды этот блок рано или поздно высохнет. Увлажнённая грядка превратится обратно в грязь, если поместить на неё твёрдый блок, либо она попадёт под действие поршневого рычага. +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Увлажнённая грядка нужна для земледелия, на ней вы можете выращивать некоторые растения. Она создается, когда обыкновенная грядка попадает под дождь, либо рядом есть источник воды. Без воды этот блок рано или поздно высохнет. Этот блок превратится обратно в землю, если поместить на него твёрдый блок, или действовать на блок поршнем. Wheat Seeds=Семена пшеницы Grows into a wheat plant. Chickens like wheat seeds.=Вырастают в пшеницу. Семена пшеницы любят куры. -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Положите семена пшеницы на грядку (которую можно создать при помощи мотыги), чтобы посадить пшеницу. Семена растут при солнечном свете, их рост происходит быстрее на увлажнённой почке. Кликните правой по животному, чтобы накормить его семенами пшеницы. +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Положите семена пшеницы на грядку (которую можно создать при помощи мотыги), чтобы посадить пшеницу. Семена растут при солнечном свете, их рост происходит быстрее на увлажнённой почке. Кликните правой кнопкой мыши по животному, чтобы покормить его. Premature Wheat Plant=Ростки молодой пшеницы Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Молодая пшеница растёт на грядке под действием солнечного света за 8 стадий. На увлажнённой грядке она растёт быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. Premature Wheat Plant (Stage @1)=Ростки молодой пшеницы (стадия @1) Mature Wheat Plant=Зрелая пшеница Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Зрелая пшеница готова к сбору сена и семян, дальше расти она уже не будет. Wheat=Пшеница -Wheat is used in crafting. Some animals like wheat.=Пшеницы используется для крафтинга. Некоторые животные любят пшеницу. +Wheat is used in crafting. Some animals like wheat.=Пшеницы используется для крафта. Некоторые животные любят пшеницу. Cookie=Печенье Bread=Хлеб Hay Bale=Стог сена Hay bales are decorative blocks made from wheat.=Стог сена - декоративный блок, сделанный из пшеницы. To carve a face into the pumpkin, use the shears on the side you want to carve.=Чтобы вырезать лицо на тыкве, примените ножницы к выбранной стороне тыквы. -Use the “Place” key on an animal to try to feed it wheat.=Нажмите клавишу “Разместить” на животном, чтобы попытаться покормить его пшеницей. -Grows on farmland=Прорастает(ют) на грядке +Use the “Place” key on an animal to try to feed it wheat.=Нажмите клавишу [Использовать] на животном, чтобы попытаться покормить его пшеницей. +Grows on farmland=Прорастает на грядке Turns block into farmland=Превращает блоки в грядки 60% chance of poisoning=Вероятность отравления: 60% Surface for crops=Поверхность для культур Can become wet=Может намокать -Uses: @1=Выдерживает: @1 использований(е,я) +Uses: @1=Выдерживает: @1 использований +Sweet Berry=Сладкая ягода +Sweet Berry Bush (Stage @1)=Куст сладкой ягоды (стадия @1) \ No newline at end of file diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt index 7359fefa6..6fc6660f5 100644 --- a/mods/ITEMS/mcl_farming/locale/template.txt +++ b/mods/ITEMS/mcl_farming/locale/template.txt @@ -97,3 +97,5 @@ Turns block into farmland= Surface for crops= Can become wet= Uses: @1= +Sweet Berry= +Sweet Berry Bush (Stage @1)= diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index b3e49a61f..91df5d919 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -7,7 +7,7 @@ minetest.register_craftitem("mcl_farming:melon_seeds", { _doc_items_longdesc = S("Grows into a melon stem which in turn grows melons. Chickens like melon seeds."), _doc_items_usagehelp = S("Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds."), stack_max = 64, - groups = { craftitem=1 }, + groups = { craftitem=1, compostability=30 }, inventory_image = "mcl_farming_melon_seeds.png", on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:melontige_1") @@ -21,7 +21,7 @@ local melon_base_def = { _doc_items_longdesc = S("A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices."), stack_max = 64, tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png"}, - groups = {handy=1,axey=1, plant=1,building_block=1,enderman_takable=1,dig_by_piston=1}, + groups = {handy=1,axey=1, plant=1,building_block=1,enderman_takable=1,dig_by_piston=1, compostability=65}, drop = { max_items = 1, items = { @@ -134,7 +134,7 @@ minetest.register_craftitem("mcl_farming:melon_item", { inventory_image = "farming_melon.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), - groups = { food = 2, eatable = 2 }, + groups = { food = 2, eatable = 2, compostability=50 }, _mcl_saturation = 1.2, }) diff --git a/mods/ITEMS/mcl_farming/potatoes.lua b/mods/ITEMS/mcl_farming/potatoes.lua index 79cd13115..a4f6a4360 100644 --- a/mods/ITEMS/mcl_farming/potatoes.lua +++ b/mods/ITEMS/mcl_farming/potatoes.lua @@ -91,7 +91,7 @@ minetest.register_craftitem("mcl_farming:potato_item", { _doc_items_longdesc = S("Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes."), _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), inventory_image = "farming_potato.png", - groups = { food = 2, eatable = 1 }, + groups = { food = 2, eatable = 1, compostability=65 }, _mcl_saturation = 0.6, stack_max = 64, on_secondary_use = minetest.item_eat(1), @@ -112,7 +112,7 @@ minetest.register_craftitem("mcl_farming:potato_item_baked", { inventory_image = "farming_potato_baked.png", on_place = minetest.item_eat(5), on_secondary_use = minetest.item_eat(5), - groups = { food = 2, eatable = 5 }, + groups = { food = 2, eatable = 5, compostability = 85 }, _mcl_saturation = 6.0, }) diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 1d9ca012c..72d0057dc 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -15,7 +15,7 @@ minetest.register_craftitem("mcl_farming:pumpkin_seeds", { _doc_items_usagehelp = S("Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds."), stack_max = 64, inventory_image = "mcl_farming_pumpkin_seeds.png", - groups = { craftitem=1 }, + groups = { craftitem=1, compostability=30 }, on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:pumpkin_1") end @@ -99,7 +99,7 @@ local pumpkin_base_def = { stack_max = 64, paramtype2 = "facedir", tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"}, - groups = {handy=1,axey=1, plant=1,building_block=1, dig_by_piston=1, enderman_takable=1}, + groups = {handy=1,axey=1, plant=1,building_block=1, dig_by_piston=1, enderman_takable=1, compostability=65}, sounds = mcl_sounds.node_sound_wood_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 1, @@ -129,7 +129,7 @@ if minetest.get_modpath("mcl_armor") then pumpkin_blur = player:hud_add({ hud_elem_type = "image", position = {x = 0.5, y = 0.5}, - scale = {x = -100, y = -100}, + scale = {x = -101, y = -101}, text = "mcl_farming_pumpkin_hud.png", z_index = -200 }), @@ -192,7 +192,7 @@ minetest.register_node("mcl_farming:pumpkin_face_light", { paramtype2 = "facedir", light_source = minetest.LIGHT_MAX, tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face_light.png"}, - groups = {handy=1,axey=1, building_block=1, dig_by_piston=1 }, + groups = {handy=1,axey=1, building_block=1, dig_by_piston=1, compostability=65 }, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) -- Attempt to spawn iron golem or snow golem @@ -230,7 +230,7 @@ minetest.register_craftitem("mcl_farming:pumpkin_pie", { wield_image = "mcl_farming_pumpkin_pie.png", on_place = minetest.item_eat(8), on_secondary_use = minetest.item_eat(8), - groups = { food = 2, eatable = 8 }, + groups = { food = 2, eatable = 8, compostability=100 }, _mcl_saturation = 4.8, }) diff --git a/mods/ITEMS/mcl_farming/sweet_berry.lua b/mods/ITEMS/mcl_farming/sweet_berry.lua index d74739aaa..f215851e3 100644 --- a/mods/ITEMS/mcl_farming/sweet_berry.lua +++ b/mods/ITEMS/mcl_farming/sweet_berry.lua @@ -31,7 +31,7 @@ minetest.register_craftitem("mcl_farming:sweet_berry", { inventory_image = "mcl_farming_sweet_berry.png", _mcl_saturation = 0.2, stack_max = 64, - groups = { food = 2, eatable = 1 }, + groups = { food = 2, eatable = 1, compostability=30 }, on_secondary_use = minetest.item_eat(1), on_place = function(itemstack, placer, pointed_thing) local new = mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_sweet_berry:sweet_berry_bush_0") diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry.png index 7c2349971..8323384fc 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_0.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_0.png index 6f8c0d833..1f4839b8e 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_0.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_0.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_1.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_1.png index 2ac3c205d..81c7eba94 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_1.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_1.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_2.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_2.png index 5e9a6dd14..e4905b6d9 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_2.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_2.png differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_3.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_3.png index a473882f4..14d3ed545 100644 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_3.png and b/mods/ITEMS/mcl_farming/textures/mcl_farming_sweet_berry_bush_3.png differ diff --git a/mods/ITEMS/mcl_farming/wheat.lua b/mods/ITEMS/mcl_farming/wheat.lua index da1b84b2d..0e81f42bf 100644 --- a/mods/ITEMS/mcl_farming/wheat.lua +++ b/mods/ITEMS/mcl_farming/wheat.lua @@ -9,7 +9,7 @@ minetest.register_craftitem("mcl_farming:wheat_seeds", { Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds. ]]), - groups = { craftitem=1 }, + groups = { craftitem=1, compostability=30 }, inventory_image = "mcl_farming_wheat_seeds.png", on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:wheat_1") @@ -104,7 +104,7 @@ minetest.register_craftitem("mcl_farming:wheat_item", { _doc_items_longdesc = S("Wheat is used in crafting. Some animals like wheat."), _doc_items_usagehelp = S("Use the “Place” key on an animal to try to feed it wheat."), inventory_image = "farming_wheat_harvested.png", - groups = { craftitem = 1 }, + groups = { craftitem = 1, compostability=65 }, }) minetest.register_craft({ @@ -125,7 +125,7 @@ minetest.register_craftitem("mcl_farming:cookie", { description = S("Cookie"), _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "farming_cookie.png", - groups = {food=2, eatable=2}, + groups = {food=2, eatable=2, compostability=85}, _mcl_saturation = 0.4, on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), @@ -136,7 +136,7 @@ minetest.register_craftitem("mcl_farming:bread", { description = S("Bread"), _doc_items_longdesc = S("This is a food item which can be eaten."), inventory_image = "farming_bread.png", - groups = {food=2, eatable=5}, + groups = {food=2, eatable=5, compostability=85}, _mcl_saturation = 6.0, on_place = minetest.item_eat(5), on_secondary_use = minetest.item_eat(5), @@ -156,8 +156,7 @@ minetest.register_node("mcl_farming:hay_block", { stack_max = 64, paramtype2 = "facedir", on_place = mcl_util.rotate_axis, - groups = {handy=1, hoey=1, flammable=2, fire_encouragement=60, - fire_flammability=20, building_block=1, fall_damage_add_percent=-80}, + groups = {handy=1, hoey=1, compostability=85, flammable=2, fire_encouragement=60, fire_flammability=20, building_block=1, fall_damage_add_percent=-80}, sounds = mcl_sounds.node_sound_leaves_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 0.5, diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr index ccfb86d95..3583b4830 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.fr.tr @@ -1,6 +1,6 @@ # textdomain: mcl_fences -Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Les barrières sont des structures qui bloquent le chemin. Les barrières se connecteront les unes aux autres et aux blocs solides. Ils ne peuvent pas être sautés par un simple saut. -Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Les portillions peuvent être ouvertes ou fermées et ne peuvent pas être sautées. Les barrières se connecteront bien aux portillions. +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Les barrières sont des structures qui bloquent le chemin. Les barrières se connecteront les unes aux autres et aux blocs solides. Elles ne peuvent pas être sautées par un simple saut. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Les portillions peuvent être ouverts ou fermés et ne peuvent pas être sautés. Les barrières se connecteront aux portillions. Right-click the fence gate to open or close it.=Cliquez avec le bouton droit sur le portillion pour l'ouvrir ou la fermer. Oak Fence=Barrière en bois de Chêne Oak Fence Gate=Portillion en bois de Chêne diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr index bafd9ba83..57aee8c2a 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr @@ -1,18 +1,18 @@ # textdomain: mcl_fences -Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Заборы это сооружения, преграждающие путь. Блоки заборов соединяются между собой и прикрепляются к твёрдым блокам. Через них нельзя перепрыгивать одиночным прыжком. -Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Калитки могут быть открытыми и закрытыми. Их нельзя перепрыгивать. -Right-click the fence gate to open or close it.=Кликните правой по калитке, чтобы открыть или закрыть её. +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Заборы это сооружения, преграждающие путь. Блоки заборов соединяются между собой и твёрдыми блоками. Через забор нельзя перепрыгнуть. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Калитки могут быть открыта и закрыта. Калитки нельзя перепрыгивать. +Right-click the fence gate to open or close it.=Кликните правой кнопкой мыши по калитке, чтобы открыть или закрыть её. Oak Fence=Дубовый забор Oak Fence Gate=Дубовая калитка Spruce Fence=Еловый забор Spruce Fence Gate=Еловая калитка Birch Fence=Берёзовый забор Birch Fence Gate=Берёзовая калитка -Jungle Fence=Забор из дерева джунглей -Jungle Fence Gate=Калитка из дерева джунглей +Jungle Fence=Забор из тропического дерева +Jungle Fence Gate=Калитка из тропического дерева Dark Oak Fence=Забор из тёмного дуба Dark Oak Fence Gate=Калитка из тёмного дуба Acacia Fence=Забор из акации Acacia Fence Gate=Калитка из акации Nether Brick Fence=Забор из адского кирпича -Openable by players and redstone power=Открываются игроками и сигналами редстоуна +Openable by players and redstone power=Открывается игроком и сигналом редстоуна diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index 5c33288f7..3afdbf759 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -47,7 +47,7 @@ minetest.register_craftitem("mcl_fire:fire_charge", { _on_dispense = function(stack, pos, droppos, dropnode, dropdir) -- Throw fire charge local shootpos = vector.add(pos, vector.multiply(dropdir, 0.51)) - local fireball = add_entity(shootpos, "mobs_mc:blaze_fireball") + local fireball = add_entity(shootpos, "mobs_mc:blaze_fireball_entity") local ent = fireball:get_luaentity() if ent then ent._shot_from_dispenser = true diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 9f1337a5d..ee06c6e20 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -37,7 +37,7 @@ local lava_fire= { x = 1, y = 1, z = 0}, { x = 1, y = 1, z = 1} } -local alldirs= +local adjacents = { { x =-1, y = 0, z = 0}, { x = 1, y = 0, z = 0}, @@ -87,7 +87,7 @@ else end local function fire_timer(pos) - minetest.get_node_timer(pos):start(math.random(3, 7)) + minetest.get_node_timer(pos):start(math.random(15, 45)) end local function spawn_fire(pos, age) @@ -95,6 +95,23 @@ local function spawn_fire(pos, age) minetest.check_single_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) end +local function shuffle_adjacents() + for i = #adjacents, 1, -1 do + local r = math.random(i) + adjacents[i], adjacents[r] = adjacents[r], adjacents[i] + end +end + +local function has_flammable(pos) + for k,v in pairs(adjacents) do + local p=vector.add(pos,v) + local n=minetest.get_node_or_nil(p) + if n and minetest.get_item_group(n.name, "flammable") ~= 0 then + return p + end + end +end + minetest.register_node("mcl_fire:fire", { description = S("Fire"), _doc_items_longdesc = fire_help, @@ -125,80 +142,12 @@ minetest.register_node("mcl_fire:fire", { end end, on_timer = function(pos) - local node = get_node(pos) - -- Age is a number from 0 to 15 and is increased every timer step. - -- "old" fire is more likely to be extinguished - local age = node.param2 - local flammables = find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"group:flammable"}) - local below = get_node({x=pos.x, y=pos.z-1, z=pos.z}) - local below_is_flammable = get_item_group(below.name, "flammable") > 0 - -- Extinguish fire - if (not fire_enabled) and (math.random(1,3) == 1) then - remove_node(pos) + local p=has_flammable(pos) + if not p or minetest.get_item_group(minetest.get_node(p).name, "flammable") == -1 then + minetest.remove_node(pos) return end - if age == 15 and not below_is_flammable then - remove_node(pos) - return - elseif age > 3 and #flammables == 0 and not below_is_flammable and math.random(1,4) == 1 then - remove_node(pos) - return - end - local age_add = 1 - -- If fire spread is disabled, we have to skip the "destructive" code - if (not fire_enabled) then - if age + age_add <= 15 then - node.param2 = age + age_add - set_node(pos, node) - end - -- Restart timer - fire_timer(pos) - return - end - -- Spawn fire to nearby flammable nodes - local is_next_to_flammable = find_node_near(pos, 2, {"group:flammable"}) ~= nil - if is_next_to_flammable and math.random(1,2) == 1 then - -- The fire we spawn copies the age of this fire. - -- This prevents fire from spreading infinitely far as the fire fire dies off - -- quicker the further it has spreaded. - local age_next = math.min(15, age + math.random(0, 1)) - -- Select random type of fire spread - local burntype = math.random(1,2) - if burntype == 1 then - -- Spawn fire in air - local nodes = find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) - while #nodes > 0 do - local r = math.random(1, #nodes) - if find_node_near(nodes[r], 1, {"group:flammable"}) then - spawn_fire(nodes[r], age_next) - break - else - table.remove(nodes, r) - end - end - else - -- Burn flammable block - local nodes = find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"group:flammable"}) - if #nodes > 0 then - local r = math.random(1, #nodes) - local nn = get_node(nodes[r]).name - local ndef = minetest.registered_nodes[nn] - local fgroup = get_item_group(nn, "flammable") - if ndef and ndef._on_burn then - ndef._on_burn(nodes[r]) - elseif fgroup ~= -1 then - spawn_fire(nodes[r], age_next) - end - end - end - end - -- Regular age increase - if age + age_add <= 15 then - node.param2 = age + age_add - set_node(pos, node) - end - -- Restart timer - fire_timer(pos) + return true --restart timer end, drop = "", sounds = {}, @@ -254,29 +203,8 @@ minetest.register_node("mcl_fire:eternal_fire", { minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end end, - on_timer = function(pos) - if fire_enabled then - local airs = find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+4, z=pos.z+1}, {"air"}) - while #airs > 0 do - local r = math.random(1, #airs) - if find_node_near(airs[r], 1, {"group:flammable"}) then - local node = get_node(airs[r]) - local age = node.param2 - local age_next = math.min(15, age + math.random(0, 1)) - spawn_fire(airs[r], age_next) - break - else - table.remove(airs, r) - end - end - end - -- Restart timer - fire_timer(pos) - end, - -- Start burning timer and light Nether portal (if possible) + -- light Nether portal (if possible) on_construct = function(pos) - fire_timer(pos) - if has_mcl_portals then --Calling directly minetest.get_modpath consumes 4x more compute time mcl_portals.light_nether_portal(pos) end @@ -421,21 +349,39 @@ minetest.register_abm({ end, }) +--- Fire spread logic --- Enable the following ABMs according to 'enable fire' setting +-- A fire that is not adjacent to any flammable block does not spread, even to another flammable block within the normal range. +-- A fire block can turn any air block that is adjacent to a flammable block into a fire block. This can happen at a distance of up to one block downward, one block sideways (including diagonals), and four blocks upward of the original fire block (not the block the fire is on/next to). +-- Fire spreads from a still lava block similarly: any air block one above and up to one block sideways (including diagonals) or two above and two blocks sideways (including diagonals) that is adjacent to a flammable block may be turned into a fire block. +-- https://minecraft.fandom.com/wiki/Fire#Spread -local function has_flammable(pos) - local npos, node - for n, v in ipairs(alldirs) do - npos = vector.add(pos, v) - node = get_node_or_nil(npos) - if node and node.name and get_item_group(node.name, "flammable") ~= 0 then - return npos - end +local function check_aircube(p1,p2) + local nds=minetest.find_nodes_in_area(p1,p2,{"air"}) + for k,v in pairs(nds) do + if has_flammable(v) then return v end end return false end +local function get_ignitable(pos) + return check_aircube(vector.add(pos,vector.new(-1,-1,-1)),vector.add(pos,vector.new(1,4,1))) +end + +local function get_ignitable_by_lava(pos) + return check_aircube(vector.add(pos,vector.new(-1,1,-1)),vector.add(pos,vector.new(1,1,1))) or check_aircube(vector.add(pos,vector.new(-2,2,-2)),vector.add(pos,vector.new(2,2,2))) or nil +end + +local function add_fire_particle(pos,f) + minetest.add_particle({ + pos = vector.new({x=pos.x, y=pos.y+0.5, z=pos.z}), + velocity={x=f.x-pos.x, y=math.max(f.y-pos.y,0.25), z=f.z-pos.z}, + expirationtime=1, size=1, collisiondetection=false, + glow=minetest.LIGHT_MAX, texture="mcl_particles_flame.png" + }) +end + +-- Enable the following ABMs according to 'enable fire' setting if not fire_enabled then -- Occasionally remove fire if fire disabled @@ -451,62 +397,70 @@ if not fire_enabled then else -- Fire enabled + minetest.register_abm({ + label = "Ignite flame", + nodenames ={"mcl_fire:fire","mcl_fire:eternal_fire"}, + interval = 7, + chance = 12, + catch_up = false, + action = function(pos) + local p = get_ignitable(pos) + if p then + add_fire_particle(p,pos) + spawn_fire(p) + shuffle_adjacents() + end + end + }) + + -- Set fire to air nodes minetest.register_abm({ label = "Ignite fire by lava", nodenames = {"group:lava"}, - neighbors = {"air"}, + nodenames = {"mcl_core:lava_source","mcl_nether:nether_lava_source"}, + neighbors = {"air","group:flammable"}, interval = 7, chance = 3, catch_up = false, action = function(pos) - local i, dir, target, node, i2, f - i = math.random(1,9) - dir = lava_fire[i] - target = {x=pos.x+dir.x, y=pos.y+dir.y, z=pos.z+dir.z} - node = get_node(target) - if not node or node.name ~= "air" then - i = ((i + math.random(0,7)) % 9) + 1 - dir = lava_fire[i] - target = {x=pos.x+dir.x, y=pos.y+dir.y, z=pos.z+dir.z} - node = get_node(target) - if not node or node.name ~= "air" then - return - end - end - i2 = math.random(1,15) - if i2 < 10 then - local dir2, target2, node2 - dir2 = lava_fire[i2] - target2 = {x=target.x+dir2.x, y=target.y+dir2.y, z=target.z+dir2.z} - node2 = get_node(target2) - if node2 and node2.name == "air" then - f = has_flammable(target2) - if f then - minetest.after(1, spawn_fire, {x=target2.x, y=target2.y, z=target2.z}) - minetest.add_particle({ - pos = vector.new({x=pos.x, y=pos.y+0.5, z=pos.z}), - velocity={x=f.x-pos.x, y=math.max(f.y-pos.y,0.7), z=f.z-pos.z}, - expirationtime=1, size=1.5, collisiondetection=false, - glow=minetest.LIGHT_MAX, texture="mcl_particles_flame.png" - }) - return - end - end - end - f = has_flammable(target) - if f then - minetest.after(1, spawn_fire, {x=target.x, y=target.y, z=target.z}) - minetest.add_particle({ - pos = vector.new({x=pos.x, y=pos.y+0.5, z=pos.z}), - velocity={x=f.x-pos.x, y=math.max(f.y-pos.y,0.25), z=f.z-pos.z}, - expirationtime=1, size=1, collisiondetection=false, - glow=minetest.LIGHT_MAX, texture="mcl_particles_flame.png" - }) + local p=get_ignitable_by_lava(pos) + if p then + add_fire_particle(p,pos) + spawn_fire(p) end end, }) + -- Remove flammable nodes around basic flame + minetest.register_abm({ + label = "Remove flammable nodes", + nodenames = {"mcl_fire:fire","mcl_fire:eternal_fire"}, + neighbors = {"group:flammable"}, + interval = 5, + chance = 18, + catch_up = false, + action = function(pos) + local p = has_flammable(pos) + if not p then + return + end + + local nn = minetest.get_node(p).name + local def = minetest.registered_nodes[nn] + local fgroup = minetest.get_item_group(nn, "flammable") + + if def and def._on_burn then + def._on_burn(p) + elseif fgroup ~= -1 then + add_fire_particle(p,pos) + spawn_fire(p) + fire_timer(p) + minetest.check_for_falling(p) + end + end + }) + end -- Set pointed_thing on (normal) fire. diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr index 60b6ffd0e..0e269f695 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.fr.tr @@ -1,16 +1,16 @@ # textdomain: mcl_fire Fire Charge=Boule de Feu -Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Les boules de feu sont principalement des projectiles qui peuvent être lancés à partir de distributeurs, ils voleront en ligne droite et éclateront en feu à l'impact. Alternativement, ils peuvent être utilisés pour allumer des incendies directement. -Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Mettez la boule de feu dans un distributeur et alimentez-la en redstone pour la lancer. Pour allumer un feu directement, placez simplement la charge de feu sur le sol, et utiliser le. +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Les boules de feu sont principalement des projectiles qui peuvent être lancés à partir de distributeurs, elles voleront en ligne droite et éclateront en feu à l'impact. Alternativement, elles peuvent être utilisés pour allumer des incendies directement. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Mettez la boule de feu dans un distributeur et alimentez-la en redstone pour la lancer. Pour allumer un feu directement, placez simplement la charge de feu sur le sol, et utiliser la. Flint and Steel=Briquet Flint and steel is a tool to start fires and ignite blocks.=Le Briquet est uo outil pour allumer un feu ou allumer des blocs. Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Cliquez avec le bouton droit sur la surface d'un bloc pour tenter d'allumer un feu devant lui ou d'allumer le bloc. Quelques blocs ont une réaction unique lorsqu'ils sont enflammés. -Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Le feu est un type de bloc dommageable et destructeur mais de courte durée. Il se détruira et se propagera vers des blocs proches de produits inflammables, mais le feu disparaîtra lorsqu'il n'y aura plus rien à brûler. Il sera éteint par l'eau et la pluie à proximité. Le feu peut être détruit en toute sécurité en le frappant, mais il est blessant si vous vous tenez directement dedans. Si un feu est déclenché au-dessus d'un netherrack ou d'un bloc de magma, il se transformera immédiatement en un feu éternel. -Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Le feu est un type de bloc éphémère mais non destructif de courte durée. Il disparaîtra en l'absence de bloc inflammable. Le feu ne détruit pas les blocs, du moins pas dans ce monde. Il sera éteint par l'eau et la pluie à proximité. Le feu peut être détruit en toute sécurité en le frappant, mais il est blessant si vous vous tenez directement dedans. Si un feu est déclenché au-dessus d'un netherrack ou d'un bloc de magma, il se transformera immédiatement en un feu éternel. -Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Le feu éternel est un bloc endommageant qui pourrait créer plus de feu. Il créera du feu autour de lui lorsque des blocs inflammables sont à proximité. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. À part le feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais ça fait mal si vous vous tenez à l'intérieur. -Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Le feu éternel est un bloc dommageable. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. À part le feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais ça fait mal si vous vous tenez à l'intérieur. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Le feu est un type de bloc dommageable et destructeur mais à courte durée de vie. Il se détruira et se propagera vers des blocs proches de produits inflammables, mais le feu disparaîtra lorsqu'il n'y aura plus rien à brûler. Il sera éteint par l'eau et la pluie à proximité. Le feu peut être détruit en toute sécurité en le frappant, mais il est blessant si vous vous tenez directement dedans. Si un feu est déclenché au-dessus d'un netherrack ou d'un bloc de magma, il se transformera immédiatement en un feu éternel. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Le feu est un type de bloc éphémère mais non destructif à courte durée de vie. Il disparaîtra en l'absence de bloc inflammable. Le feu ne détruit pas les blocs, du moins pas dans ce monde. Il sera éteint par l'eau et la pluie à proximité. Le feu peut être détruit en toute sécurité en le frappant, mais il est blessant si vous vous tenez directement dedans. Si un feu est déclenché au-dessus d'un netherrack ou d'un bloc de magma, il se transformera immédiatement en un feu éternel. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Le feu éternel est un bloc qui fait des dégats et peux créer plus de feu. Il créera du feu autour de lui lorsque des blocs inflammables sont à proximité. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. Contrairement au feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais si vous vous tenez à l'intérieur cela fait des dégats. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Le feu éternel est un bloc dommageable. Le feu éternel peut être éteint par des coups de poing et des blocs d'eau à proximité. Contrairement au feu (normal), le feu éternel ne s'éteint pas tout seul et continue de brûler sous la pluie. Frapper le feu éternel est sûr, mais si vous vous tenez à l'intérieur cela fait des dégats. @1 has been cooked crisp.=@1 a été cuit croustillant. -@1 felt the burn.=@1 sent le brûler. +@1 felt the burn.=@1 sent le brûlé. @1 died in the flames.=@1 est mort dans les flammes. @1 died in a fire.=@1 est mort dans un incendie. Fire=Feu diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr index 941a73aaa..ac2dc1993 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr @@ -1,19 +1,19 @@ # textdomain: mcl_fire Fire Charge=Огненный шар -Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Огненные шары это прежде всего снаряды, которые могут быть выпущены из диспенсеров, они полетят по прямой линии и превратятся в огонь при ударе. Они также могут быть использованы для непосредственного поджигания блоков. -Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Положите огненный шар в диспенсер и подайте на него энергию редстоуна для запуска. Чтобы непосредственно поджигать блоки, просто поместите его на поверхность. +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Огненные шары это снаряды, которые могут быть выпущены из раздатчика, они полетят по прямой линии и взорвутся при столкновении. Они также могут быть использованы для непосредственного поджигания блоков. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Положите огненный шар в раздатчик и подайте на него сигнал редстоуна для запуска. Чтобы непосредственно поджигать блоки, просто используйте его на поверхности блока. Flint and Steel=Огниво Flint and steel is a tool to start fires and ignite blocks.=Огниво это инструмент для добывания огня. -Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Кликните правой по поверхности блока, чтобы попытаться зажечь огонь перед ней либо поджечь блок. Некоторые блоки реагируют на поджигание индивидуально. -Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь - это повреждающий и разрушающий, но недолговечный блок. Он будет уничтожать и переходить на соседние легковоспламенимые блоки, но исчезнет, когда больше будет нечему гореть. Он будет погашен близлежащей водой или дождем. Его можно безопасно убрать, стукнув по нему, но если вы стоите прямо в нём, это причинит вам вред. Если огонь зажжён над адским камнем или блоком магмы, он мгновенно превращается в вечный огонь. -Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь - это повреждающий, но не разрушающий и недолговечный блок. Он исчезнет, когда вокруг не останется легковоспламенимых блоков. Огонь не уничтожает блоки, по крайней мере, в этом мире. Он будет погашен близлежащей водой или дождем. Его можно безопасно убрать, стукнув по нему, но если вы стоите прямо в нём, это причинит вам вред. Если огонь зажжён над адским камнем или блоком магмы, он мгновенно превращается в вечный огонь. -Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь - это повреждающий блок, который может создать больше огня. Он будет создавать огонь вокруг себя, если поблизости окажутся легковоспламенимые блоки. Вечный огонь можно потушить ударами и находящимися рядом водными блоками. В отличие от (обычного) огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет боль, если вы стоите внутри. -Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь - это повреждающий блок. Вечный огонь можно потушить ударами и находящимися рядом водными блоками. В отличие от (обычного) огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет боль, если вы стоите внутри. -@1 has been cooked crisp.=@1 был(а) заживо приготовлен(а). -@1 felt the burn.=@1 испытал(а) ожог. -@1 died in the flames.=@1 умер(ла) в пламени. -@1 died in a fire.=@1 умер(ла) в огне. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Кликните правой кнопкой мыши по поверхности блока, чтобы попытаться зажечь огонь перед ним, либо поджечь сам блок. Некоторые блоки реагируют на поджигание индивидуально. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь - это уничтожающий и поджигающий, но недолговечный блок. Он будет уничтожать и переходить на соседние легковоспламенимые блоки, но исчезнет, когда больше будет нечему гореть. Он будет погашен водой или дождем. Его можно безопасно убрать, ударив по нему, но если вы стоите прямо в огне, это причинит вам урон. Если огонь зажжён над адский каменем или блоком магмы, он превращается в вечный огонь. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь - это уничтожающий и поджигающий, но недолговечный блок. В этом мире огонь не уничтожает блоки. Он будет погашен водой или дождем. Его можно безопасно убрать, ударив по нему, но если вы стоите прямо в огне, это причинит вам урон. Если огонь зажжён над адский камнем или блоком магмы, он превращается в вечный огонь. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь - это поджигающий блок, который может создать еще больше огня. Он будет создавать огонь вокруг себя, если поблизости окажутся легковоспламенимые блоки. Вечный огонь можно потушить ударом или водой. В отличие от обычного огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет урон, если вы стоите внутри огня. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь - это поджигающий блок. В этом мире огонь не распространяется на соседние блоки. Вечный огонь можно потушить ударом или водой. В отличие от обычного огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет урон, если вы стоите внутри огня. +@1 has been cooked crisp.=@1 был(а) зажарен(а) до хрустящей корочки. +@1 felt the burn.=@1 сгорел(а). +@1 died in the flames.=@1 погиб(ла) в пламени. +@1 died in a fire.=@1 погиб(ла) в огне. Fire=Огонь Eternal Fire=Вечный огонь -Dispenser projectile=Диспенсер снаряда -Starts fires and ignites blocks=Высекает огонь, поджигает блоки +Dispenser projectile=Снаряд раздатчика +Starts fires and ignites blocks=Высекает огонь и поджигает блоки diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr index e66eb06a5..d985213b7 100644 --- a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr @@ -1,3 +1,3 @@ # textdomain: mcl_fireworks -Firework Rocket= -Flight Duration:= \ No newline at end of file +Firework Rocket=Фейерверк +Flight Duration:=Длительности полёта: \ No newline at end of file diff --git a/mods/ITEMS/mcl_fireworks/register.lua b/mods/ITEMS/mcl_fireworks/register.lua index 23066b663..f113a6678 100644 --- a/mods/ITEMS/mcl_fireworks/register.lua +++ b/mods/ITEMS/mcl_fireworks/register.lua @@ -10,7 +10,8 @@ local function register_rocket(n, duration, force) inventory_image = "mcl_fireworks_rocket.png", stack_max = 64, on_use = function(itemstack, user, pointed_thing) - local elytra = mcl_playerplus.elytra[user] + if not user:is_player() then return end + local elytra = mcl_playerplus.elytra[user:get_player_name()] if elytra.active and elytra.rocketing <= 0 then elytra.rocketing = duration if not minetest.is_creative_enabled(user:get_player_name()) then diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr index 9ed0e4f8d..1b0b21296 100644 --- a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr @@ -1,18 +1,18 @@ # textdomain: mcl_fishing Fishing Rod=Удочка -Fishing rods can be used to catch fish.=Удочка используется при ловле рыбы. -Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Кликните правой для запуска поплавка. Когда он потонет, кликните снова, чтобы вытащить ваш улов. Кстати, что вы собираетесь поймать? +Fishing rods can be used to catch fish.=Удочка используется для ловли рыбы. +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Кликните правой кнопкой мыши чтобы закинуть поплавок. Когда он потонет, кликните снова, чтобы вытащить ваш улов. Кто знает что вам может попасться? Raw Fish=Сырая рыба -Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырая рыба добывается при помощи удочки и это продукт, который можно безопасно есть. При приготовлении её питательная ценность растёт. +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырая рыба добывается при помощи удочки и это съедобнй продукт. После приготовлении её питательная ценность растёт. Cooked Fish=Приготовленная рыба -Mmh, fish! This is a healthy food item.=Ммм, рыба! Это продуктовый предмет здорового питания. +Mmh, fish! This is a healthy food item.=Ммм, рыба! Это съедобный продукт. Raw Salmon=Сырой лосось -Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырой лосось добывается при помощи удочки и это продукт, который можно безопасно есть. При приготовлении его питательная ценность растёт. +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырой лосось добывается при помощи удочки и это съедобный продукт. При приготовлении его питательная ценность растёт. Cooked Salmon=Приготовленный лосось -This is a healthy food item which can be eaten.=Это продуктовый предмет здорового питания. +This is a healthy food item which can be eaten.=Это съедобный продукт. Clownfish=Тропическая рыба -Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Тропическая рыба добывается при помощи удочки (и удачи) и это продукт, который можно безопасно есть. +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Тропическая рыба добывается при помощи удочки (и удачи) и это съедобный продукт. Pufferfish=Иглобрюх -Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Иглобрюхи - распространенный вид рыбы и могут быть пойманы на удочку. Технически их можно есть, но они очень вредны для людей. Употребление иглобрюха в пищу восстанавливает всего 1 очко голода, но отравит вас очень тяжело (несмертельно уменьшит ваше здоровье), вы получите серьёзное пищевое отравление (которое увеличивает голод). -Catches fish in water=Ловит рыбу в воде +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Иглобрюх - распространенный вид рыбы, который может быть пойман на удочку. Технически их можно есть, но они очень ядовиты. Употребление иглобрюха в пищу восстанавливает всего 1 очко голода, но сильно отравит вас (несмертельно уменьшит ваше здоровье) и даст сильное пищевое отравление (которое увеличивает голод). +Catches fish in water=Ловить рыбу в воде Very poisonous=Очень ядовит diff --git a/mods/ITEMS/mcl_flowerpots/init.lua b/mods/ITEMS/mcl_flowerpots/init.lua index 578553b31..951356928 100644 --- a/mods/ITEMS/mcl_flowerpots/init.lua +++ b/mods/ITEMS/mcl_flowerpots/init.lua @@ -214,3 +214,29 @@ mcl_flowerpots.register_potted_flower("mcl_core:deadbush", { desc = S("Dead Bush"), image = "default_dry_shrub.png", }) + +-- Add the possibility to pot nether fungi and roots, depend to mcl_mushroom + +mcl_flowerpots.register_potted_flower("mcl_mushroom:warped_fungus", { + name = "warped_fungus", + desc = S("Warped Fungus Mushroom"), + image = "farming_warped_fungus.png", +}) + +mcl_flowerpots.register_potted_flower("mcl_mushroom:crimson_fungus", { + name = "crimson_fungus", + desc = S("Crimson Fungus Mushroom"), + image = "farming_crimson_fungus.png", +}) + +mcl_flowerpots.register_potted_flower("mcl_mushroom:warped_roots", { + name = "warped_roots", + desc = S("Warped Roots"), + image = "warped_roots.png", +}) + +mcl_flowerpots.register_potted_flower("mcl_mushroom:crimson_roots", { + name = "crimson_roots", + desc = S("Crimson Roots"), + image = "crimson_roots.png", +}) \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr index a110d5ffc..2a57763d4 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr @@ -20,6 +20,10 @@ Birch Sapling Flower Pot=Blumentopf mit Birkensetzling Dead Bush Flower Pot=Blumentopf mit totem Busch Fern Flower Pot=Blumentopf mit Farn Cactus Flower Pot=Blumentopf mit Kaktus +Warped Fungus Mushroom Flower Pot= +Crimson Fungus Mushroom Flower Pot= +Warped Roots Flower Pot= +Crimson Roots Flower Pot= Flower Pot=Blumentopf Flower pots are decorative blocks in which flowers and other small plants can be placed.=Blumentöpfe sind dekorative Blöcke, in die Blumen und andere kleine Pflanzen platziert werden können. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Platzieren Sie einfach eine Pflanze auf den Blumentopf. Blumentöpfe können kleine Blumen (nicht höher als 1 Block), Setzlinge, Farne, tote Büsche, Pilze und Kakteen halten. Rechtsklicken Sie auf eine Topfpflanze, um sie zurück zu erhalten. diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr index fd12b1b4f..ff1de9e2b 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr @@ -20,6 +20,10 @@ Birch Sapling Flower Pot=Maceta con abedul Dead Bush Flower Pot=Maceta con arbusto muerto Fern Flower Pot=Maceta con helecho Cactus Flower Pot=Maceta con cactus +Warped Fungus Mushroom Flower Pot= +Crimson Fungus Mushroom Flower Pot= +Warped Roots Flower Pot= +Crimson Roots Flower Pot= Flower Pot=Maceta Flower pots are decorative blocks in which flowers and other small plants can be placed.=Las macetas son bloques decorativos en los que se pueden colocar flores y otras plantas pequeñas. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Simplemente coloque una planta en la maceta. Las macetas pueden contener flores pequeñas (no más de 1 bloque), árboles jóvenes, helechos, arbustos muertos, hongos y cactus. Haga clic derecho en una planta en maceta para recuperar la planta. diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr index d80497117..660aa38c1 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr @@ -20,6 +20,10 @@ Birch Sapling Flower Pot=Pousse de Bouleau en Pot Dead Bush Flower Pot=Arbuste Mort en Pot Fern Flower Pot=Fougère en Pot Cactus Flower Pot=Cactus en Pot +Warped Fungus Mushroom Flower Pot=Champignon Tordu en Pot +Crimson Fungus Mushroom Flower Pot=Champignon Ecarlate en Pot +Warped Roots Flower Pot=Racines Tordues en Pot +Crimson Roots Flower Pot=Racines Ecarlates en Pot Flower Pot=Pot de Fleurs Flower pots are decorative blocks in which flowers and other small plants can be placed.=Les pots de fleurs sont des blocs décoratifs dans lesquels des fleurs et d'autres petites plantes peuvent être placées. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Placez simplement une plante sur le pot de fleurs. Les pots de fleurs peuvent contenir de petites fleurs (pas plus d'un bloc), des pousses, des fougères, des buissons morts, des champignons et des cactus. Cliquez avec le bouton droit sur une plante en pot pour récupérer la plante. diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pl.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pl.tr index 4bc5e282a..86b5488eb 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pl.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pl.tr @@ -20,6 +20,10 @@ Birch Sapling Flower Pot=Doniczka z sadzonką brzozy Dead Bush Flower Pot=Doniczka z martwym buszem Fern Flower Pot=Doniczka z paprocią Cactus Flower Pot=Doniczka z kaktusem +Warped Fungus Mushroom Flower Pot= +Crimson Fungus Mushroom Flower Pot= +Warped Roots Flower Pot= +Crimson Roots Flower Pot= Flower Pot=Doniczka Flower pots are decorative blocks in which flowers and other small plants can be placed.=Doniczki są dekoracyjnymi blokami w których mogą zostać postawione kwiaty i inne małe rośliny. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Po prostu umieść roślinę w doniczce. Mogę one przechowywać małe kwiaty (nie większe niż 1 blok), sadzonki, paprocie, martwe busze, grzyby i kaktusy. Kliknij prawym przyciskiem w doniczkę aby odzyskać roślinę. diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr index 6bb6be923..3b6957e74 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr @@ -3,12 +3,12 @@ Dandelion Flower Pot=Одуванчик в горшке Poppy Flower Pot=Мак в горшке Blue Orchid Flower Pot=Голубая орхидея в горшке Allium Flower Pot=Лук в горшке -Azure Bluet Flower Pot=Хоустония Альба в горшке +Azure Bluet Flower Pot=Хаустония серая в горшке Red Tulip Flower Pot=Красный тюльпан в горшке Pink Tulip Flower Pot=Розовый тюльпан в горшке White Tulip Flower Pot=Белый тюльпан в горшке Orange Tulip Flower Pot=Оранжевый тюльпан в горшке -Oxeye Daisy Flower Pot=Нивяник обыкновенный в горшке +Oxeye Daisy Flower Pot=Нивяник в горшке Brown Mushroom Flower Pot=Коричневый гриб в горшке Red Mushroom Flower Pot=Красный гриб в горшке Oak Sapling Flower Pot=Саженец дуба в горшке @@ -18,9 +18,13 @@ Dark Oak Sapling Flower Pot=Саженец тёмного дуба в горшк Spruce Sapling Flower Pot=Саженец ели в горшке Birch Sapling Flower Pot=Саженец берёзы в горшке Dead Bush Flower Pot=Мёртвый куст в горшке -Fern Flower Pot=Цветок папоротника в горшке +Fern Flower Pot=Папоротник в горшке Cactus Flower Pot=Кактус в горшке +Warped Fungus Mushroom Flower Pot= +Crimson Fungus Mushroom Flower Pot= +Warped Roots Flower Pot= +Crimson Roots Flower Pot= Flower Pot=Цветочный горшок Flower pots are decorative blocks in which flowers and other small plants can be placed.=Цветочные горшки это декоративные блоки, в которые можно посадить цветы и другие небольшие растения. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Просто поместите растение в цветочный горшок. Цветочные горшки могут выдержать небольшие цветы (не выше 1 блока), саженцы, папоротники, мёртвые кусты, грибы и кактусы. Кликните правой по горшёчному растению, чтобы вытащить его из горшка. -Can hold a small flower or plant=Можно использовать для высадки небольшого растения или цветка +Can hold a small flower or plant=Можно использовать для посадки небольшого растения или цветка diff --git a/mods/ITEMS/mcl_flowerpots/locale/template.txt b/mods/ITEMS/mcl_flowerpots/locale/template.txt index fcdf7d21e..76e22788d 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/template.txt +++ b/mods/ITEMS/mcl_flowerpots/locale/template.txt @@ -20,6 +20,10 @@ Birch Sapling Flower Pot= Dead Bush Flower Pot= Fern Flower Pot= Cactus Flower Pot= +Warped Fungus Mushroom Flower Pot= +Crimson Fungus Mushroom Flower Pot= +Warped Roots Flower Pot= +Crimson Roots Flower Pot= Flower Pot= Flower pots are decorative blocks in which flowers and other small plants can be placed.= Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.= diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 14e0df5cb..9c04ebcf5 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -80,7 +80,7 @@ function mcl_flowers.register_simple_flower(name, def) walkable = false, stack_max = 64, drop = def.drop, - groups = {dig_immediate=3,flammable=2,fire_encouragement=60,fire_flammability=100,plant=1,flower=1,place_flowerlike=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1}, + groups = {dig_immediate=3,flammable=2,fire_encouragement=60,fire_flammability=100,plant=1,flower=1,place_flowerlike=1,non_mycelium_plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1, compostability=65}, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", on_place = on_place_flower, @@ -143,7 +143,7 @@ local def_tallgrass = { walkable = false, buildable_to = true, is_ground_content = true, - groups = {handy=1,shearsy=1, flammable=3,fire_encouragement=60,fire_flammability=100,attached_node=1,plant=1,place_flowerlike=2,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1}, + groups = {handy=1,shearsy=1, flammable=3,fire_encouragement=60,fire_flammability=100,attached_node=1,plant=1,place_flowerlike=2,non_mycelium_plant=1,dig_by_water=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = wheat_seed_drop, _mcl_shears_drop = true, @@ -163,6 +163,7 @@ def_fern._doc_items_longdesc = S("Ferns are small plants which occur naturally i def_fern.tiles = { "mcl_flowers_fern.png" } def_fern.inventory_image = "mcl_flowers_fern_inv.png" def_fern.wield_image = "mcl_flowers_fern_inv.png" +def_fern.groups.compostability=65 def_fern.selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, 5/16, 6/16 }, @@ -205,6 +206,13 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im bottom_groups.not_in_creative_inventory = 1 create_entry = false end + -- some special cases for the composter group + if name == "double_fern" or "peony" or "rose_bush" or "lilac" or "sunflower" then + bottom_groups.compostability = 65 + end + if name == "double_grass" then + bottom_groups.compostability = 50 + end -- Drop itself by default local drop_bottom, drop_top if not drop then @@ -410,7 +418,7 @@ minetest.register_node("mcl_flowers:waterlily", { liquids_pointable = true, walkable = true, sunlight_propagates = true, - groups = {dig_immediate = 3, plant=1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, deco_block=1, dig_by_boat=1}, + groups = {dig_immediate = 3, plant=1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, deco_block=1, dig_by_boat=1, compostability=65}, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", node_box = { diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr index 945a799e2..910b25384 100644 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr @@ -1,6 +1,6 @@ # textdomain: mcl_flowers This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Ceci est une petite fleur. Les petites fleurs sont principalement utilisées pour la production de teintures et peuvent également être mises en pot. -It can only be placed on a block on which it would also survive.=Elles ne peuvent être placées que sur un bloc sur lequel elles survivraient également. +It can only be placed on a block on which it would also survive.=Elles ne peuvent être placées que sur un bloc sur lequel elles peuvent survivre. Poppy=Coquelicot Dandelion=Pisselit Oxeye Daisy=Marguerite @@ -12,21 +12,21 @@ Allium=Allium Azure Bluet=Houstonie Bleue Blue Orchid=Orchidée Bleue Tall Grass=Hautes herbes -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=L'herbe haute est une petite plante qui se rencontre souvent à la surface des prairies. Il peut être récolté pour les graines de blé. En utilisant de la farine d'os, les hautes herbes peuvent être transformées en herbes hautes doubles de deux blocs de hauteur. +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=L'herbe haute est une petite plante qui se rencontre souvent dans les prairies. Elle peut être récoltée pour obtenir des graines de blé. En utilisant de la farine d'os, les hautes herbes peuvent être transformées en herbes hautes doubles de deux blocs de hauteur. Fern=Fougère -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Les fougères sont de petites plantes qui se produisent naturellement dans les jungles et les taigas. Ils peuvent être récoltés pour les graines de blé. En utilisant de la farine d'os, une fougère peut être transformée en une grande fougère haute de deux blocs. +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Les fougères sont de petites plantes apparaissent naturellement dans les jungles et les taigas. Elles peuvent être récoltées pour obtenir des graines de blé. En utilisant de la farine d'os, une fougère peut être transformée en une grande fougère haute de deux blocs. (Top Part)=(Partie supérieure) Peony=Pivoine -A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Une pivoine est une grande plante qui occupe deux blocs. Principalement utilisé dans la production de colorants. +A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Une pivoine est une grande plante qui occupe deux blocs. Principalement utilisée dans la production de colorants. Rose Bush=Rosier -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Un rosier est une grande plante qui occupe deux blocs. Il n'y a rien a craindre à le toucher. Les rosiers sont principalement utilisés dans la production de teinture. +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Un rosier est une grande plante qui occupe deux blocs. Il n'est pas dangereux de le toucher. Les rosiers sont principalement utilisés dans la production de teinture. Lilac=Lilas A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Un lilas est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la production de colorants. Sunflower=Tournesol A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Un tournesol est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la production de colorants. -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=La grande herbe haute une variante de l'herbe haute et occupe deux blocs. Elle peut être récoltée pour les graines de blé. -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=La grande fougère est une variante de la fougère et occupe deux blocs. Elle peut être récoltée pour les graines de blé. +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=La grande herbe haute une variante de l'herbe haute et occupe deux blocs. Elle peut être récoltée pour obtenir des graines de blé. +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=La grande fougère est une variante de la fougère et occupe deux blocs. Elle peut être récoltée pour obtenir des graines de blé. Double Tallgrass=Grande Herbe Large Fern=Grande Fougère Lily Pad=Nénuphar -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Un nénuphar est un bloc de plante plat sur lequel on peut marcher. Ils peuvent être placés sur des sources d'eau, de la glace et de la glace givrée. +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Un nénuphar est un bloc de plante plat sur lequel on peut marcher. Ils peuvent être placés sur des sources d'eau, de la glace ou de la glace givrée. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr index f5cb5e18d..98e2147fc 100644 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr @@ -1,15 +1,15 @@ # textdomain: mcl_flowers This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Это небольшой цветок. Такие цветы в основном используются для производства красителей. Их можно садить в горшки. -It can only be placed on a block on which it would also survive.=Его можно высаживать только на те блоки, на которых он может расти. +It can only be placed on a block on which it would also survive.=Это можно высаживать только на те блоки, на которых оно может расти. Poppy=Мак Dandelion=Одуванчик -Oxeye Daisy=Нивяник обыкновенный +Oxeye Daisy=Нивяник Orange Tulip=Оранжевый тюльпан Pink Tulip=Розовый тюльпан Red Tulip=Красный тюльпан White Tulip=Белый тюльпан Allium=Лук -Azure Bluet=Хоустония Альба +Azure Bluet=Хаустония серая Blue Orchid=Голубая орхидея Tall Grass=Высокая трава Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Высокая трава это маленькое растение, часто встречающееся на поверхности лугов. Их можно собирать, добывая семена пшеницы. С помощью костной муки высокая трава может быть превращена в двойную высокую траву (2 блока в высоту). @@ -28,5 +28,5 @@ Double tallgrass a variant of tall grass and occupies two blocks. It can be harv Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Большой папоротник - вид папоротника, занимающий два блока. Его можно собирать, добывая семена пшеницы. Double Tallgrass=Двойная высокая трава Large Fern=Большой папоротник -Lily Pad=Лилия -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Лилия это плоский растительный блок, по которому можно ходить. Он размещается на водных источниках, а также на льду и замороженном льду. +Lily Pad=Кувшинка +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Кувшинка это плоский растительный блок, по которому можно ходить. Он размещается на водных источниках, а также на льду и замороженном льду. diff --git a/mods/ITEMS/mcl_furnaces/README.md b/mods/ITEMS/mcl_furnaces/README.md index c7282124b..01ddc0a68 100644 --- a/mods/ITEMS/mcl_furnaces/README.md +++ b/mods/ITEMS/mcl_furnaces/README.md @@ -6,6 +6,7 @@ License of source code LGPLv2.1 Based on code from Minetest Game. Modified by Wuzzy. +Smokers and Blast Furnaces added and modified by PrairieWind and j45. License of media ---------------- diff --git a/mods/ITEMS/mcl_furnaces/blast_furnace.lua b/mods/ITEMS/mcl_furnaces/blast_furnace.lua new file mode 100644 index 000000000..4e14d9305 --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/blast_furnace.lua @@ -0,0 +1,548 @@ + +local S = minetest.get_translator(minetest.get_current_modname()) + +local LIGHT_ACTIVE_FURNACE = 13 + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + return "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Blast Furnace"))).."]".. + "list[context;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. + "list[context;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" +end + +local inactive_formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Blast Furnace"))).."]".. + "list[context;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. + "list[context;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" + +local receive_fields = function(pos, formname, fields, sender) + if fields.craftguide then + mcl_craftguide.show(sender:get_player_name()) + end +end + +local function give_xp(pos, player) + local meta = minetest.get_meta(pos) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + local xp = meta:get_int("xp") + if xp > 0 then + if player then + mcl_experience.add_xp(player, xp) + else + mcl_experience.throw_xp(vector.add(pos, dir), xp) + end + meta:set_int("xp", 0) + end +end + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + + -- Test stack with size 1 because we burn one fuel at a time + local teststack = ItemStack(stack) + teststack:set_count(1) + local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) + if output.time ~= 0 then + -- Only allow to place 1 item if fuel get replaced by recipe. + -- This is the case for lava buckets. + local replace_item = decremented_input.items[1] + if replace_item:is_empty() then + -- For most fuels, just allow to place everything + return stack:get_count() + else + if inv:get_stack(listname, index):get_count() == 0 then + return 1 + else + return 0 + end + end + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + return stack:get_count() +end + +local function on_metadata_inventory_take(pos, listname, index, stack, player) + -- Award smelting achievements + if listname == "dst" then + if stack:get_name() == "mcl_core:iron_ingot" then + awards.unlock(player:get_player_name(), "mcl:acquireIron") + end + give_xp(pos, player) + end +end + +local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if from_list == "dst" then + give_xp(pos, player) + end +end + +local function spawn_flames(pos, param2) + local minrelpos, maxrelpos + local dir = minetest.facedir_to_dir(param2) + if dir.x > 0 then + minrelpos = { x = -0.6, y = -0.05, z = -0.25 } + maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } + elseif dir.x < 0 then + minrelpos = { x = 0.55, y = -0.05, z = -0.25 } + maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } + elseif dir.z > 0 then + minrelpos = { x = -0.25, y = -0.05, z = -0.6 } + maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } + elseif dir.z < 0 then + minrelpos = { x = -0.25, y = -0.05, z = 0.55 } + maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } + else + return + end + mcl_particles.add_node_particlespawner(pos, { + amount = 4, + time = 0, + minpos = vector.add(pos, minrelpos), + maxpos = vector.add(pos, maxrelpos), + minvel = { x = -0.01, y = 0, z = -0.01 }, + maxvel = { x = 0.01, y = 0.1, z = 0.01 }, + minexptime = 0.3, + maxexptime = 0.6, + minsize = 0.4, + maxsize = 0.8, + texture = "mcl_particles_flame.png", + glow = LIGHT_ACTIVE_FURNACE, + }, "low") +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) + if name == "mcl_furnaces:blast_furnace_active" then + spawn_flames(pos, node.param2) + else + mcl_particles.delete_node_particlespawners(pos) + end +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local src_item = meta:get_string("src_item") or "" + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + + local cookable, cooked + local active = true + local fuel + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- Check if src item has been changed + if srclist[1]:get_name() ~= src_item then + -- Reset cooking progress in this case + src_time = 0 + src_item = srclist[1]:get_name() + end + + local update = true + local elapsed_game_time = mcl_time.get_irl_seconds_passed_at_pos_or_nil(pos) or elapsed + while elapsed_game_time > 0.00001 and update do + -- + -- Cooking + -- + + local el = elapsed_game_time + + -- Check if we have cookable content: cookable + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = false + cookableItems = {"mcl_raw_ores:raw_iron", "mcl_raw_ores:raw_gold", "mcl_copper:raw_copper", "mcl_nether:ancient_debris"} + cookable = false + --for _, item in ipairs(cookableItems) do + for _,item in ipairs(cookableItems) do + local stack = inv:get_stack("src",1) + if stack:get_name() == item then + cookable = true + end + end + if cookable then + -- Successful cooking requires space in dst slot and time + if not inv:room_for_item("dst", cooked.item) then + cookable = false + end + end + + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + + -- Check if we have enough fuel to burn + active = fuel_time < fuel_totaltime + if cookable and not active then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list -- stop + fuel_totaltime = 0 + src_time = 0 + update = false + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + fuel_time = 0 + fuel_totaltime = fuel.time + el = math.min(el, fuel_totaltime) + active = true + fuellist = inv:get_list("fuel") + end + elseif active then + el = math.min(el, fuel_totaltime - fuel_time) + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + el + end + + -- If there is a cookable item then check if it is ready yet + if cookable and active then + -- in the src_time variable, the *1.5 is the multiplication that makes the blast furnace work faster than a normal furnace. I (PrairieWind) have it at 1.5 times faster, but it can be OP and 2 times faster, or 1.2 times faster. All are good numbers. + src_time = (src_time + el)*1.5 + -- Place result in dst list if done + if src_time >= cooked.time then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + + srclist = inv:get_list("src") + src_time = 0 + + meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count + end + end + + elapsed_game_time = elapsed_game_time - el + end + + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist and srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec and node + -- + local formspec = inactive_formspec + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + end + + local result = false + + if active then + local fuel_percent = 0 + if fuel_totaltime > 0 then + fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + end + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "mcl_furnaces:blast_furnace_active") + -- make sure timer restarts automatically + result = true + else + swap_node(pos, "mcl_furnaces:blast_furnace") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + end + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + if srclist then + meta:set_string("src_item", src_item) + else + meta:set_string("src_item", "") + end + meta:set_string("formspec", formspec) + + return result +end + +local on_rotate, after_rotate_active +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple + after_rotate_active = function(pos) + local node = minetest.get_node(pos) + mcl_particles.delete_node_particlespawners(pos) + if node.name == "mcl_furnaces:blast_furnace" then + return + end + spawn_flames(pos, node.param2) + end +end + +minetest.register_node("mcl_furnaces:blast_furnace", { + description = S("Blast Furnace"), + _tt_help = S("Uses fuel to smelt or cook items"), + _doc_items_longdesc = S("Blast Furnaces cook or smelt several items, using a furnace fuel, into something else, but faster than a normal furnace."), + _doc_items_usagehelp = + S([[ + Use the furnace to open the furnace menu. + Place a furnace fuel in the lower slot and the source material in the upper slot. + The furnace will slowly use its fuel to smelt the item. + The result will be placed into the output slot at the right side. + ]]).."\n".. + S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), + _doc_items_hidden = false, + tiles = { + "blast_furnace_top.png", "blast_furnace_top.png", + "blast_furnace_side.png", "blast_furnace_side.png", + "blast_furnace_side.png", "blast_furnace_front.png" + }, + paramtype2 = "facedir", + groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + + on_timer = furnace_node_timer, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta:to_table() + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for _, listname in ipairs({"src", "dst", "fuel"}) do + local stack = inv:get_stack(listname, 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2) + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("fuel", 1) + inv:set_size("dst", 1) + end, + on_destruct = function(pos) + mcl_particles.delete_node_particlespawners(pos) + give_xp(pos) + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + minetest.get_node_timer(pos):start(1.0) + + on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + end, + on_metadata_inventory_put = function(pos) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + -- start timer function, it will helpful if player clears dst slot + minetest.get_node_timer(pos):start(1.0) + + on_metadata_inventory_take(pos, listname, index, stack, player) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = receive_fields, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + on_rotate = on_rotate, +}) + +minetest.register_node("mcl_furnaces:blast_furnace_active", { + description = S("Active Blast Furnace"), + _doc_items_create_entry = false, + tiles = { + "blast_furnace_top.png", "blast_furnace_top.png", + "blast_furnace_side.png", "blast_furnace_side.png", + "blast_furnace_side.png", {name = "blast_furnace_front_on.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48}}, + }, + paramtype2 = "facedir", + paramtype = "light", + light_source = LIGHT_ACTIVE_FURNACE, + drop = "mcl_furnaces:blast_furnace", + groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_timer = furnace_node_timer, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for _, listname in ipairs({"src", "dst", "fuel"}) do + local stack = inv:get_stack(listname, 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + + on_construct = function(pos) + local node = minetest.get_node(pos) + spawn_flames(pos, node.param2) + end, + on_destruct = function(pos) + mcl_particles.delete_node_particlespawners(pos) + give_xp(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_metadata_inventory_move = on_metadata_inventory_move, + on_metadata_inventory_take = on_metadata_inventory_take, + on_receive_fields = receive_fields, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + on_rotate = on_rotate, + after_rotate = after_rotate_active, +}) + +minetest.register_craft({ + output = "mcl_furnaces:blast_furnace", + recipe = { + { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, + { "mcl_core:iron_ingot", "mcl_furnaces:furnace", "mcl_core:iron_ingot" }, + { "mcl_core:stone_smooth", "mcl_core:stone_smooth", "mcl_core:stone_smooth" }, + } +}) + +-- Add entry alias for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_furnaces:blast_furnace", "nodes", "mcl_furnaces:blast_furnace_active") +end + +minetest.register_lbm({ + label = "Active furnace flame particles", + name = "mcl_furnaces:flames", + nodenames = {"mcl_furnaces:blast_furnace_active"}, + run_at_every_load = true, + action = function(pos, node) + spawn_flames(pos, node.param2) + end, +}) + +-- Legacy +minetest.register_lbm({ + label = "Update furnace formspecs (0.60.0)", + name = "mcl_furnaces:update_formspecs_0_60_0", + -- Only update inactive furnaces because active ones should update themselves + nodenames = { "mcl_furnaces:blast_furnace" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + end, +}) diff --git a/mods/ITEMS/mcl_furnaces/furnace.lua b/mods/ITEMS/mcl_furnaces/furnace.lua new file mode 100644 index 000000000..81bef41f7 --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/furnace.lua @@ -0,0 +1,558 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local LIGHT_ACTIVE_FURNACE = 13 + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + return "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. + "list[context;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. + "list[context;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" +end + +local inactive_formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. + "list[context;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. + "list[context;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" + +local receive_fields = function(pos, formname, fields, sender) + if fields.craftguide then + mcl_craftguide.show(sender:get_player_name()) + end +end + +local function give_xp(pos, player) + local meta = minetest.get_meta(pos) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + local xp = meta:get_int("xp") + if xp > 0 then + if player then + mcl_experience.add_xp(player, xp) + else + mcl_experience.throw_xp(vector.add(pos, dir), xp) + end + meta:set_int("xp", 0) + end +end + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + -- Special case: empty bucket (not a fuel, but used for sponge drying) + if stack:get_name() == "mcl_buckets:bucket_empty" then + if inv:get_stack(listname, index):get_count() == 0 then + return 1 + else + return 0 + end + end + + -- Test stack with size 1 because we burn one fuel at a time + local teststack = ItemStack(stack) + teststack:set_count(1) + local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) + if output.time ~= 0 then + -- Only allow to place 1 item if fuel get replaced by recipe. + -- This is the case for lava buckets. + local replace_item = decremented_input.items[1] + if replace_item:is_empty() then + -- For most fuels, just allow to place everything + return stack:get_count() + else + if inv:get_stack(listname, index):get_count() == 0 then + return 1 + else + return 0 + end + end + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + return stack:get_count() +end + +local function on_metadata_inventory_take(pos, listname, index, stack, player) + -- Award smelting achievements + if listname == "dst" then + if stack:get_name() == "mcl_core:iron_ingot" then + awards.unlock(player:get_player_name(), "mcl:acquireIron") + elseif stack:get_name() == "mcl_fishing:fish_cooked" then + awards.unlock(player:get_player_name(), "mcl:cookFish") + end + give_xp(pos, player) + end +end + +local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if from_list == "dst" then + give_xp(pos, player) + end +end + +local function spawn_flames(pos, param2) + local minrelpos, maxrelpos + local dir = minetest.facedir_to_dir(param2) + if dir.x > 0 then + minrelpos = { x = -0.6, y = -0.05, z = -0.25 } + maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } + elseif dir.x < 0 then + minrelpos = { x = 0.55, y = -0.05, z = -0.25 } + maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } + elseif dir.z > 0 then + minrelpos = { x = -0.25, y = -0.05, z = -0.6 } + maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } + elseif dir.z < 0 then + minrelpos = { x = -0.25, y = -0.05, z = 0.55 } + maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } + else + return + end + mcl_particles.add_node_particlespawner(pos, { + amount = 4, + time = 0, + minpos = vector.add(pos, minrelpos), + maxpos = vector.add(pos, maxrelpos), + minvel = { x = -0.01, y = 0, z = -0.01 }, + maxvel = { x = 0.01, y = 0.1, z = 0.01 }, + minexptime = 0.3, + maxexptime = 0.6, + minsize = 0.4, + maxsize = 0.8, + texture = "mcl_particles_flame.png", + glow = LIGHT_ACTIVE_FURNACE, + }, "low") +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) + if name == "mcl_furnaces:furnace_active" then + spawn_flames(pos, node.param2) + else + mcl_particles.delete_node_particlespawners(pos) + end +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local src_item = meta:get_string("src_item") or "" + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + + local cookable, cooked + local active = true + local fuel + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- Check if src item has been changed + if srclist[1]:get_name() ~= src_item then + -- Reset cooking progress in this case + src_time = 0 + src_item = srclist[1]:get_name() + end + + local update = true + local elapsed_game_time = mcl_time.get_irl_seconds_passed_at_pos_or_nil(pos) or elapsed + while elapsed_game_time > 0.00001 and update do + -- + -- Cooking + -- + + local el = elapsed_game_time + + -- Check if we have cookable content: cookable + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = cooked.time ~= 0 + if cookable then + -- Successful cooking requires space in dst slot and time + if not inv:room_for_item("dst", cooked.item) then + cookable = false + end + end + + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + + -- Check if we have enough fuel to burn + active = fuel_time < fuel_totaltime + if cookable and not active then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list -- stop + fuel_totaltime = 0 + src_time = 0 + update = false + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + fuel_time = 0 + fuel_totaltime = fuel.time + el = math.min(el, fuel_totaltime) + active = true + fuellist = inv:get_list("fuel") + end + elseif active then + el = math.min(el, fuel_totaltime - fuel_time) + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + el + end + + -- If there is a cookable item then check if it is ready yet + if cookable and active then + src_time = src_time + el + -- Place result in dst list if done + if src_time >= cooked.time then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + + -- Unique recipe: Pour water into empty bucket after cooking wet sponge successfully + if inv:get_stack("fuel", 1):get_name() == "mcl_buckets:bucket_empty" then + if srclist[1]:get_name() == "mcl_sponges:sponge_wet" then + inv:set_stack("fuel", 1, "mcl_buckets:bucket_water") + fuellist = inv:get_list("fuel") + -- Also for river water + elseif srclist[1]:get_name() == "mcl_sponges:sponge_wet_river_water" then + inv:set_stack("fuel", 1, "mcl_buckets:bucket_river_water") + fuellist = inv:get_list("fuel") + end + end + + srclist = inv:get_list("src") + src_time = 0 + + meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count + end + end + + elapsed_game_time = elapsed_game_time - el + end + + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist and srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec and node + -- + local formspec = inactive_formspec + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + end + + local result = false + + if active then + local fuel_percent = 0 + if fuel_totaltime > 0 then + fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + end + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "mcl_furnaces:furnace_active") + -- make sure timer restarts automatically + result = true + else + swap_node(pos, "mcl_furnaces:furnace") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + end + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + if srclist then + meta:set_string("src_item", src_item) + else + meta:set_string("src_item", "") + end + meta:set_string("formspec", formspec) + + return result +end + +local on_rotate, after_rotate_active +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple + after_rotate_active = function(pos) + local node = minetest.get_node(pos) + mcl_particles.delete_node_particlespawners(pos) + if node.name == "mcl_furnaces:furnace" then + return + end + spawn_flames(pos, node.param2) + end +end + +minetest.register_node("mcl_furnaces:furnace", { + description = S("Furnace"), + _tt_help = S("Uses fuel to smelt or cook items"), + _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), + _doc_items_usagehelp = + S([[ + Use the furnace to open the furnace menu. + Place a furnace fuel in the lower slot and the source material in the upper slot. + The furnace will slowly use its fuel to smelt the item. + The result will be placed into the output slot at the right side. + ]]).."\n".. + S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), + _doc_items_hidden = false, + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_front.png" + }, + paramtype2 = "facedir", + groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + + on_timer = furnace_node_timer, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta:to_table() + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for _, listname in ipairs({"src", "dst", "fuel"}) do + local stack = inv:get_stack(listname, 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2) + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("fuel", 1) + inv:set_size("dst", 1) + end, + on_destruct = function(pos) + mcl_particles.delete_node_particlespawners(pos) + give_xp(pos) + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + minetest.get_node_timer(pos):start(1.0) + + on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + end, + on_metadata_inventory_put = function(pos) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + -- start timer function, it will helpful if player clears dst slot + minetest.get_node_timer(pos):start(1.0) + + on_metadata_inventory_take(pos, listname, index, stack, player) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = receive_fields, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + on_rotate = on_rotate, +}) + +minetest.register_node("mcl_furnaces:furnace_active", { + description = S("Burning Furnace"), + _doc_items_create_entry = false, + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_front_active.png", + }, + paramtype2 = "facedir", + paramtype = "light", + light_source = LIGHT_ACTIVE_FURNACE, + drop = "mcl_furnaces:furnace", + groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_timer = furnace_node_timer, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for _, listname in ipairs({"src", "dst", "fuel"}) do + local stack = inv:get_stack(listname, 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + + on_construct = function(pos) + local node = minetest.get_node(pos) + spawn_flames(pos, node.param2) + end, + on_destruct = function(pos) + mcl_particles.delete_node_particlespawners(pos) + give_xp(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_metadata_inventory_move = on_metadata_inventory_move, + on_metadata_inventory_take = on_metadata_inventory_take, + on_receive_fields = receive_fields, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + on_rotate = on_rotate, + after_rotate = after_rotate_active, +}) + +minetest.register_craft({ + output = "mcl_furnaces:furnace", + recipe = { + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + { "mcl_core:cobble", "", "mcl_core:cobble" }, + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + } +}) + +-- Add entry alias for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_furnaces:furnace", "nodes", "mcl_furnaces:furnace_active") +end + +minetest.register_lbm({ + label = "Active furnace flame particles", + name = "mcl_furnaces:flames", + nodenames = {"mcl_furnaces:furnace_active"}, + run_at_every_load = true, + action = function(pos, node) + spawn_flames(pos, node.param2) + end, +}) + +-- Legacy +minetest.register_lbm({ + label = "Update furnace formspecs (0.60.0)", + name = "mcl_furnaces:update_formspecs_0_60_0", + -- Only update inactive furnaces because active ones should update themselves + nodenames = { "mcl_furnaces:furnace" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + end, +}) diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 9f836d161..adf8210cc 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -1,609 +1,6 @@ +-- Load files +local modpath = minetest.get_modpath(minetest.get_current_modname()) -local S = minetest.get_translator(minetest.get_current_modname()) - -local LIGHT_ACTIVE_FURNACE = 13 - --- --- Formspecs --- - -local function active_formspec(fuel_percent, item_percent) - return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-fuel_percent)..":default_furnace_fire_fg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" -end - -local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" - -local receive_fields = function(pos, formname, fields, sender) - if fields.craftguide then - mcl_craftguide.show(sender:get_player_name()) - end -end - -local function give_xp(pos, player) - local meta = minetest.get_meta(pos) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) - local xp = meta:get_int("xp") - if xp > 0 then - if player then - mcl_experience.add_xp(player, xp) - else - mcl_experience.throw_xp(vector.add(pos, dir), xp) - end - meta:set_int("xp", 0) - end -end - --- --- Node callback functions that are the same for active and inactive furnace --- - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - -- Special case: empty bucket (not a fuel, but used for sponge drying) - if stack:get_name() == "mcl_buckets:bucket_empty" then - if inv:get_stack(listname, index):get_count() == 0 then - return 1 - else - return 0 - end - end - - -- Test stack with size 1 because we burn one fuel at a time - local teststack = ItemStack(stack) - teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) - if output.time ~= 0 then - -- Only allow to place 1 item if fuel get replaced by recipe. - -- This is the case for lava buckets. - local replace_item = decremented_input.items[1] - if replace_item:is_empty() then - -- For most fuels, just allow to place everything - return stack:get_count() - else - if inv:get_stack(listname, index):get_count() == 0 then - return 1 - else - return 0 - end - end - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - return stack:get_count() -end - -local function on_metadata_inventory_take(pos, listname, index, stack, player) - -- Award smelting achievements - if listname == "dst" then - if stack:get_name() == "mcl_core:iron_ingot" then - awards.unlock(player:get_player_name(), "mcl:acquireIron") - elseif stack:get_name() == "mcl_fishing:fish_cooked" then - awards.unlock(player:get_player_name(), "mcl:cookFish") - end - give_xp(pos, player) - end -end - -local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if from_list == "dst" then - give_xp(pos, player) - end -end - -local function spawn_flames(pos, param2) - local minrelpos, maxrelpos - local dir = minetest.facedir_to_dir(param2) - if dir.x > 0 then - minrelpos = { x = -0.6, y = -0.05, z = -0.25 } - maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } - elseif dir.x < 0 then - minrelpos = { x = 0.55, y = -0.05, z = -0.25 } - maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } - elseif dir.z > 0 then - minrelpos = { x = -0.25, y = -0.05, z = -0.6 } - maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } - elseif dir.z < 0 then - minrelpos = { x = -0.25, y = -0.05, z = 0.55 } - maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } - else - return - end - mcl_particles.add_node_particlespawner(pos, { - amount = 4, - time = 0, - minpos = vector.add(pos, minrelpos), - maxpos = vector.add(pos, maxrelpos), - minvel = { x = -0.01, y = 0, z = -0.01 }, - maxvel = { x = 0.01, y = 0.1, z = 0.01 }, - minexptime = 0.3, - maxexptime = 0.6, - minsize = 0.4, - maxsize = 0.8, - texture = "mcl_particles_flame.png", - glow = LIGHT_ACTIVE_FURNACE, - }, "low") -end - -local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) - if name == "mcl_furnaces:furnace_active" then - spawn_flames(pos, node.param2) - else - mcl_particles.delete_node_particlespawners(pos) - end -end - -local function furnace_reset_delta_time(pos) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - if (time_speed < 0.1) then - return - end - local time_multiplier = 86400 / time_speed - local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - - -- TODO: Change meta:get/set_string() to get/set_float() for "last_gametime". - -- In Windows *_float() works OK but under Linux it returns rounded unusable values like 449540.000000000 - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 or math.abs(last_game_time - current_game_time) <= 1.5 then - return - end - - meta:set_string("last_gametime", tostring(current_game_time)) -end - -local function furnace_get_delta_time(pos, elapsed) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - local current_game_time - if (time_speed < 0.1) then - return meta, elapsed - else - local time_multiplier = 86400 / time_speed - current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - end - - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 then - last_game_time = current_game_time - 0.1 - elseif last_game_time == current_game_time then - current_game_time = current_game_time + 1.0 - end - - local elapsed_game_time = .0 + current_game_time - last_game_time - - meta:set_string("last_gametime", tostring(current_game_time)) - - return meta, elapsed_game_time -end - -local function furnace_node_timer(pos, elapsed) - -- - -- Inizialize metadata - -- - local meta, elapsed_game_time = furnace_get_delta_time(pos, elapsed) - - local fuel_time = meta:get_float("fuel_time") or 0 - local src_time = meta:get_float("src_time") or 0 - local src_item = meta:get_string("src_item") or "" - local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 - - local inv = meta:get_inventory() - local srclist, fuellist - - local cookable, cooked - local active = true - local fuel - - srclist = inv:get_list("src") - fuellist = inv:get_list("fuel") - - -- Check if src item has been changed - if srclist[1]:get_name() ~= src_item then - -- Reset cooking progress in this case - src_time = 0 - src_item = srclist[1]:get_name() - end - - local update = true - while elapsed_game_time > 0.00001 and update do - -- - -- Cooking - -- - - local el = elapsed_game_time - - -- Check if we have cookable content: cookable - local aftercooked - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - cookable = cooked.time ~= 0 - if cookable then - -- Successful cooking requires space in dst slot and time - if not inv:room_for_item("dst", cooked.item) then - cookable = false - end - end - - if cookable then -- fuel lasts long enough, adjust el to cooking duration - el = math.min(el, cooked.time - src_time) - end - - -- Check if we have enough fuel to burn - active = fuel_time < fuel_totaltime - if cookable and not active then - -- We need to get new fuel - local afterfuel - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - - if fuel.time == 0 then - -- No valid fuel in fuel list -- stop - fuel_totaltime = 0 - src_time = 0 - update = false - else - -- Take fuel from fuel list - inv:set_stack("fuel", 1, afterfuel.items[1]) - fuel_time = 0 - fuel_totaltime = fuel.time - el = math.min(el, fuel_totaltime) - active = true - fuellist = inv:get_list("fuel") - end - elseif active then - el = math.min(el, fuel_totaltime - fuel_time) - -- The furnace is currently active and has enough fuel - fuel_time = fuel_time + el - end - - -- If there is a cookable item then check if it is ready yet - if cookable and active then - src_time = src_time + el - -- Place result in dst list if done - if src_time >= cooked.time then - inv:add_item("dst", cooked.item) - inv:set_stack("src", 1, aftercooked.items[1]) - - -- Unique recipe: Pour water into empty bucket after cooking wet sponge successfully - if inv:get_stack("fuel", 1):get_name() == "mcl_buckets:bucket_empty" then - if srclist[1]:get_name() == "mcl_sponges:sponge_wet" then - inv:set_stack("fuel", 1, "mcl_buckets:bucket_water") - fuellist = inv:get_list("fuel") - -- Also for river water - elseif srclist[1]:get_name() == "mcl_sponges:sponge_wet_river_water" then - inv:set_stack("fuel", 1, "mcl_buckets:bucket_river_water") - fuellist = inv:get_list("fuel") - end - end - - srclist = inv:get_list("src") - src_time = 0 - - meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count - end - end - - elapsed_game_time = elapsed_game_time - el - end - - if fuel and fuel_totaltime > fuel.time then - fuel_totaltime = fuel.time - end - if srclist and srclist[1]:is_empty() then - src_time = 0 - end - - -- - -- Update formspec and node - -- - local formspec = inactive_formspec - local item_percent = 0 - if cookable then - item_percent = math.floor(src_time / cooked.time * 100) - end - - local result = false - - if active then - local fuel_percent = 0 - if fuel_totaltime > 0 then - fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) - end - formspec = active_formspec(fuel_percent, item_percent) - swap_node(pos, "mcl_furnaces:furnace_active") - -- make sure timer restarts automatically - result = true - else - swap_node(pos, "mcl_furnaces:furnace") - -- stop timer on the inactive furnace - minetest.get_node_timer(pos):stop() - end - - -- - -- Set meta values - -- - meta:set_float("fuel_totaltime", fuel_totaltime) - meta:set_float("fuel_time", fuel_time) - meta:set_float("src_time", src_time) - if srclist then - meta:set_string("src_item", src_item) - else - meta:set_string("src_item", "") - end - meta:set_string("formspec", formspec) - - return result -end - -local on_rotate, after_rotate_active -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple - after_rotate_active = function(pos) - local node = minetest.get_node(pos) - mcl_particles.delete_node_particlespawners(pos) - if node.name == "mcl_furnaces:furnace" then - return - end - spawn_flames(pos, node.param2) - end -end - -minetest.register_node("mcl_furnaces:furnace", { - description = S("Furnace"), - _tt_help = S("Uses fuel to smelt or cook items"), - _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), - _doc_items_usagehelp = - S([[ - Use the furnace to open the furnace menu. - Place a furnace fuel in the lower slot and the source material in the upper slot. - The furnace will slowly use its fuel to smelt the item. - The result will be placed into the output slot at the right side. - ]]).."\n".. - S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), - _doc_items_hidden = false, - tiles = { - "default_furnace_top.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_front.png" - }, - paramtype2 = "facedir", - groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - - on_timer = furnace_node_timer, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2) - end, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", inactive_formspec) - local inv = meta:get_inventory() - inv:set_size("src", 1) - inv:set_size("fuel", 1) - inv:set_size("dst", 1) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - -- Reset accumulated game time when player works with furnace: - furnace_reset_delta_time(pos) - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - end, - on_metadata_inventory_put = function(pos) - -- Reset accumulated game time when player works with furnace: - furnace_reset_delta_time(pos) - -- start timer function, it will sort out whether furnace can burn or not. - minetest.get_node_timer(pos):start(1.0) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - -- Reset accumulated game time when player works with furnace: - furnace_reset_delta_time(pos) - -- start timer function, it will helpful if player clears dst slot - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_take(pos, listname, index, stack, player) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_furnaces:furnace_active", { - description = S("Burning Furnace"), - _doc_items_create_entry = false, - tiles = { - "default_furnace_top.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_front_active.png", - }, - paramtype2 = "facedir", - paramtype = "light", - light_source = LIGHT_ACTIVE_FURNACE, - drop = "mcl_furnaces:furnace", - groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_timer = furnace_node_timer, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - - on_construct = function(pos) - local node = minetest.get_node(pos) - spawn_flames(pos, node.param2) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_metadata_inventory_move = on_metadata_inventory_move, - on_metadata_inventory_take = on_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, - after_rotate = after_rotate_active, -}) - -minetest.register_craft({ - output = "mcl_furnaces:furnace", - recipe = { - { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, - { "mcl_core:cobble", "", "mcl_core:cobble" }, - { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, - } -}) - --- Add entry alias for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_furnaces:furnace", "nodes", "mcl_furnaces:furnace_active") -end - -minetest.register_lbm({ - label = "Active furnace flame particles", - name = "mcl_furnaces:flames", - nodenames = {"mcl_furnaces:furnace_active"}, - run_at_every_load = true, - action = function(pos, node) - spawn_flames(pos, node.param2) - end, -}) - --- Legacy -minetest.register_lbm({ - label = "Update furnace formspecs (0.60.0)", - name = "mcl_furnaces:update_formspecs_0_60_0", - -- Only update inactive furnaces because active ones should update themselves - nodenames = { "mcl_furnaces:furnace" }, - run_at_every_load = false, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", inactive_formspec) - end, -}) +dofile(modpath.."/blast_furnace.lua") -- Load Blast Furnaces +dofile(modpath.."/furnace.lua") -- Load Furnaces +dofile(modpath.."/smoker.lua") -- Load Smokers \ No newline at end of file diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr index deec7981c..f7b37e537 100644 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr @@ -1,7 +1,7 @@ # textdomain: mcl_furnaces Furnace=Four -Furnaces cook or smelt several items, using a furnace fuel, into something else.=Les fours cuisent ou fondent plusieurs articles, en utilisant un combustible de four, dans quelque chose d'autre. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Utilisez le four pour ouvrir le menu du four. Placez un combustible de four dans la fente inférieure et le matériau source dans la fente supérieure. Le four utilisera lentement son combustible pour fondre l'article. Le résultat sera placé dans la fente de sortie du côté droit. +Furnaces cook or smelt several items, using a furnace fuel, into something else.=Les fours cuisent ou fondent plusieurs articles, en utilisant du combustible, en quelque chose d'autre. +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Utilisez le four pour ouvrir le menu du four. Placez du combustible dans la fente inférieure et le matériau source dans la fente supérieure. Le four utilisera lentement son combustible pour fondre l'article. Le résultat sera placé dans la fente de sortie du côté droit. Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Utilisez le livre de recettes pour voir ce que vous pouvez cuire, ce que vous pouvez utiliser comme carburant et combien de temps il brûlera. Burning Furnace=Four Allumé Recipe book=Livre de Recette diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr index 1ba8732df..999d39994 100644 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr @@ -1,7 +1,7 @@ # textdomain: mcl_furnaces Furnace=Печь -Furnaces cook or smelt several items, using a furnace fuel, into something else.=В печи готовят или переплавляют предметы, но для этого требуется загрузить топливо. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=[Используйте] печь, чтобы открыть её меню. Положите печное топливо в нижний отсек, а материал-источник в верхний. Печь будет понемногу расходовать топливо для переплавки предмета. Получившийся в результате предмет будет помещён в выходной отсек справа. +Furnaces cook or smelt several items, using a furnace fuel, into something else.=В печи готовят или переплавляют предметы, с помощью топлива. +Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Используйте печь, чтобы открыть её меню. Положите топливо в нижний слот, а материал в верхний. Печь будет понемногу расходовать топливо для переплавки предмета. Получившийся в результате предмет будет помещён в выходной слот справа. Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Используйте книгу рецептов, чтобы узнать, что вы можете переплавить в печи, что сгодится в качестве топлива и как долго будет идти процесс. Burning Furnace=Горящая печь Recipe book=Книга рецептов diff --git a/mods/ITEMS/mcl_furnaces/mod.conf b/mods/ITEMS/mcl_furnaces/mod.conf index fe0b9c208..b2dad2920 100644 --- a/mods/ITEMS/mcl_furnaces/mod.conf +++ b/mods/ITEMS/mcl_furnaces/mod.conf @@ -1,3 +1,3 @@ name = mcl_furnaces -depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles +depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles, mcl_time optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_furnaces/smoker.lua b/mods/ITEMS/mcl_furnaces/smoker.lua new file mode 100644 index 000000000..8e3cdcd42 --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/smoker.lua @@ -0,0 +1,547 @@ + +local S = minetest.get_translator(minetest.get_current_modname()) + +local LIGHT_ACTIVE_FURNACE = 13 + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + return "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Smoker"))).."]".. + "list[context;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. + "list[context;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" +end + +local inactive_formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Smoker"))).."]".. + "list[context;src;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;fuel;2.75,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. + "list[context;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" + +local receive_fields = function(pos, formname, fields, sender) + if fields.craftguide then + mcl_craftguide.show(sender:get_player_name()) + end +end + +local function give_xp(pos, player) + local meta = minetest.get_meta(pos) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + local xp = meta:get_int("xp") + if xp > 0 then + if player then + mcl_experience.add_xp(player, xp) + else + mcl_experience.throw_xp(vector.add(pos, dir), xp) + end + meta:set_int("xp", 0) + end +end + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + + -- Test stack with size 1 because we burn one fuel at a time + local teststack = ItemStack(stack) + teststack:set_count(1) + local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) + if output.time ~= 0 then + -- Only allow to place 1 item if fuel get replaced by recipe. + -- This is the case for lava buckets. + local replace_item = decremented_input.items[1] + if replace_item:is_empty() then + -- For most fuels, just allow to place everything + return stack:get_count() + else + if inv:get_stack(listname, index):get_count() == 0 then + return 1 + else + return 0 + end + end + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + return stack:get_count() +end + +local function on_metadata_inventory_take(pos, listname, index, stack, player) + -- Award smelting achievements + if listname == "dst" then + if stack:get_name() == "mcl_fishing:fish_cooked" then + awards.unlock(player:get_player_name(), "mcl:cookFish") + end + give_xp(pos, player) + end +end + +local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if from_list == "dst" then + give_xp(pos, player) + end +end + +local function spawn_flames(pos, param2) + local minrelpos, maxrelpos + local dir = minetest.facedir_to_dir(param2) + if dir.x > 0 then + minrelpos = { x = -0.6, y = -0.05, z = -0.25 } + maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } + elseif dir.x < 0 then + minrelpos = { x = 0.55, y = -0.05, z = -0.25 } + maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } + elseif dir.z > 0 then + minrelpos = { x = -0.25, y = -0.05, z = -0.6 } + maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } + elseif dir.z < 0 then + minrelpos = { x = -0.25, y = -0.05, z = 0.55 } + maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } + else + return + end + mcl_particles.add_node_particlespawner(pos, { + amount = 4, + time = 0, + minpos = vector.add(pos, minrelpos), + maxpos = vector.add(pos, maxrelpos), + minvel = { x = -0.01, y = 0, z = -0.01 }, + maxvel = { x = 0.01, y = 0.1, z = 0.01 }, + minexptime = 0.3, + maxexptime = 0.6, + minsize = 0.4, + maxsize = 0.8, + texture = "mcl_particles_flame.png", + glow = LIGHT_ACTIVE_FURNACE, + }, "low") +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) + if name == "mcl_furnaces:smoker_active" then + spawn_flames(pos, node.param2) + else + mcl_particles.delete_node_particlespawners(pos) + end +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local src_item = meta:get_string("src_item") or "" + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + + local cookable, cooked + local active = true + local fuel + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- Check if src item has been changed + if srclist[1]:get_name() ~= src_item then + -- Reset cooking progress in this case + src_time = 0 + src_item = srclist[1]:get_name() + end + + local update = true + local elapsed_game_time = mcl_time.get_irl_seconds_passed_at_pos_or_nil(pos) or elapsed + while elapsed_game_time > 0.00001 and update do + -- + -- Cooking + -- + + local el = elapsed_game_time + + -- Check if we have cookable content: cookable + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = false + cookableItems = {"mcl_fishing:fish_raw", "mcl_fishing:salmon_raw", "mcl_farming:potato_item", "mcl_mobitems:mutton", "mcl_mobitems:beef", "mcl_mobitems:chicken", "mcl_mobitems:porkchop", "mcl_mobitems:rabbit"} + --for _, item in ipairs(cookableItems) do + for _,item in ipairs(cookableItems) do + local stack = inv:get_stack("src",1) + if stack:get_name() == item then + cookable = true + end + end + if cookable then + -- Successful cooking requires space in dst slot and time + if not inv:room_for_item("dst", cooked.item) then + cookable = false + end + end + + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + + -- Check if we have enough fuel to burn + active = fuel_time < fuel_totaltime + if cookable and not active then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list -- stop + fuel_totaltime = 0 + src_time = 0 + update = false + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + fuel_time = 0 + fuel_totaltime = fuel.time + el = math.min(el, fuel_totaltime) + active = true + fuellist = inv:get_list("fuel") + end + elseif active then + el = math.min(el, fuel_totaltime - fuel_time) + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + el + end + + -- If there is a cookable item then check if it is ready yet + if cookable and active then + -- in the src_time variable, the *1.5 is the multiplication that makes the smoker work faster than a normal furnace. I (PrairieWind) have it at 1.5 times faster, but it can be OP and 2 times faster, or 1.2 times faster. All are good numbers. + src_time = (src_time + el)*1.5 + -- Place result in dst list if done + if src_time >= cooked.time then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + + srclist = inv:get_list("src") + src_time = 0 + + meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count + end + end + + elapsed_game_time = elapsed_game_time - el + end + + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist and srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec and node + -- + local formspec = inactive_formspec + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + end + + local result = false + + if active then + local fuel_percent = 0 + if fuel_totaltime > 0 then + fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + end + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "mcl_furnaces:smoker_active") + -- make sure timer restarts automatically + result = true + else + swap_node(pos, "mcl_furnaces:smoker") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + end + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + if srclist then + meta:set_string("src_item", src_item) + else + meta:set_string("src_item", "") + end + meta:set_string("formspec", formspec) + + return result +end + +local on_rotate, after_rotate_active +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple + after_rotate_active = function(pos) + local node = minetest.get_node(pos) + mcl_particles.delete_node_particlespawners(pos) + if node.name == "mcl_furnaces:smoker" then + return + end + spawn_flames(pos, node.param2) + end +end + +minetest.register_node("mcl_furnaces:smoker", { + description = S("Smoker"), + _tt_help = S("Uses fuel to smelt or cook items"), + _doc_items_longdesc = S("Smokers cook or smelt several items, using a furnace fuel, into something else, but faster than a normal furnace."), + _doc_items_usagehelp = + S([[ + Use the furnace to open the furnace menu. + Place a furnace fuel in the lower slot and the source material in the upper slot. + The furnace will slowly use its fuel to smelt the item. + The result will be placed into the output slot at the right side. + ]]).."\n".. + S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), + _doc_items_hidden = false, + tiles = { + "smoker_top.png", "smoker_top.png", + "smoker_side.png", "smoker_side.png", + "smoker_side.png", "smoker_front.png" + }, + paramtype2 = "facedir", + groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + + on_timer = furnace_node_timer, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta:to_table() + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for _, listname in ipairs({"src", "dst", "fuel"}) do + local stack = inv:get_stack(listname, 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2) + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("fuel", 1) + inv:set_size("dst", 1) + end, + on_destruct = function(pos) + mcl_particles.delete_node_particlespawners(pos) + give_xp(pos) + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + minetest.get_node_timer(pos):start(1.0) + + on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + end, + on_metadata_inventory_put = function(pos) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + -- Reset accumulated game time when player works with furnace: + mcl_time.touch(pos) + -- start timer function, it will helpful if player clears dst slot + minetest.get_node_timer(pos):start(1.0) + + on_metadata_inventory_take(pos, listname, index, stack, player) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = receive_fields, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + on_rotate = on_rotate, +}) + +minetest.register_node("mcl_furnaces:smoker_active", { + description = S("Burning Furnace"), + _doc_items_create_entry = false, + tiles = { + "smoker_top.png", "smoker_top.png", + "smoker_side.png", "smoker_side.png", + "smoker_side.png", {name = "smoker_front_on.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48}}, + }, + paramtype2 = "facedir", + paramtype = "light", + light_source = LIGHT_ACTIVE_FURNACE, + drop = "mcl_furnaces:smoker", + groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + on_timer = furnace_node_timer, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for _, listname in ipairs({"src", "dst", "fuel"}) do + local stack = inv:get_stack(listname, 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end + meta:from_table(meta2:to_table()) + end, + + on_construct = function(pos) + local node = minetest.get_node(pos) + spawn_flames(pos, node.param2) + end, + on_destruct = function(pos) + mcl_particles.delete_node_particlespawners(pos) + give_xp(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_metadata_inventory_move = on_metadata_inventory_move, + on_metadata_inventory_take = on_metadata_inventory_take, + on_receive_fields = receive_fields, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + on_rotate = on_rotate, + after_rotate = after_rotate_active, +}) + +minetest.register_craft({ + output = "mcl_furnaces:smoker", + recipe = { + { "", "group:tree", "" }, + { "group:tree", "mcl_furnaces:furnace", "group:tree" }, + { "", "group:tree", "" }, + } +}) + +-- Add entry alias for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mcl_furnaces:smoker", "nodes", "mcl_furnaces:smoker_active") +end + +minetest.register_lbm({ + label = "Active furnace flame particles", + name = "mcl_furnaces:flames", + nodenames = {"mcl_furnaces:smoker_active"}, + run_at_every_load = true, + action = function(pos, node) + spawn_flames(pos, node.param2) + end, +}) + +-- Legacy +minetest.register_lbm({ + label = "Update furnace formspecs (0.60.0)", + name = "mcl_furnaces:update_formspecs_0_60_0", + -- Only update inactive furnaces because active ones should update themselves + nodenames = { "mcl_furnaces:smoker" }, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) + end, +}) diff --git a/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front.png b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front.png new file mode 100644 index 000000000..02acd6d31 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on.png b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on.png new file mode 100644 index 000000000..712bac83f Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on_e.png b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on_e.png new file mode 100644 index 000000000..f154d47e1 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on_e.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on_e_s.png b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on_e_s.png new file mode 100644 index 000000000..4fdb90a4f Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_front_on_e_s.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/blast_furnace_side.png b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_side.png new file mode 100644 index 000000000..966b001e2 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_side.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/blast_furnace_top.png b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_top.png new file mode 100644 index 000000000..03ce91b5c Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/blast_furnace_top.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/smoker_bottom.png b/mods/ITEMS/mcl_furnaces/textures/smoker_bottom.png new file mode 100644 index 000000000..cccc5a697 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/smoker_bottom.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/smoker_front.png b/mods/ITEMS/mcl_furnaces/textures/smoker_front.png new file mode 100644 index 000000000..37f43c306 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/smoker_front.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/smoker_front_on.png b/mods/ITEMS/mcl_furnaces/textures/smoker_front_on.png new file mode 100644 index 000000000..502fdb983 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/smoker_front_on.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/smoker_front_on_e.png b/mods/ITEMS/mcl_furnaces/textures/smoker_front_on_e.png new file mode 100644 index 000000000..e571d18ed Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/smoker_front_on_e.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/smoker_front_on_e_s.png b/mods/ITEMS/mcl_furnaces/textures/smoker_front_on_e_s.png new file mode 100644 index 000000000..a1c6a9a31 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/smoker_front_on_e_s.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/smoker_side.png b/mods/ITEMS/mcl_furnaces/textures/smoker_side.png new file mode 100644 index 000000000..f1e57a751 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/smoker_side.png differ diff --git a/mods/ITEMS/mcl_furnaces/textures/smoker_top.png b/mods/ITEMS/mcl_furnaces/textures/smoker_top.png new file mode 100644 index 000000000..bc5a0dba7 Binary files /dev/null and b/mods/ITEMS/mcl_furnaces/textures/smoker_top.png differ diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.fr.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.fr.tr index 56436f519..0302240ba 100644 --- a/mods/ITEMS/mcl_heads/locale/mcl_heads.fr.tr +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.fr.tr @@ -1,11 +1,11 @@ # textdomain: mcl_heads Zombie Head=Tête de Zombie -A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Une tête de zombie est un petit bloc décoratif qui ressemble à la tête d'un zombie. Il peut également être porté comme un casque, ce qui réduit la plage de détection des zombies de 50%. +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Une tête de zombie est un petit bloc décoratif qui ressemble à la tête d'un zombie. Elle peut également être portée comme casque, ce qui réduit la plage de détection des zombies de 50%. Creeper Head=Tête de Creeper -A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Une tête de creepers est un petit bloc décoratif qui ressemble à la tête d'un creeper. Il peut également être porté comme un casque, ce qui réduit la plage de détection des creepers de 50%. +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Une tête de creeper est un petit bloc décoratif qui ressemble à la tête d'un creeper. Elle peut également être portée comme casque, ce qui réduit la plage de détection des creepers de 50%. Human Head=Tête de Joueur -A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Une tête de joueur est un petit bloc décoratif qui ressemble à la tête d'un humain (c'est-à-dire un personnage de joueur). Il peut également être porté comme un casque pour le plaisir, mais n'offre aucune protection. +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Une tête de joueur est un petit bloc décoratif qui ressemble à la tête d'un humain (c'est-à-dire un personnage de joueur). Elle peut également être portée comme casque pour le plaisir, mais n'offre aucune protection. Skeleton Skull=Crâne de Squelette -A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Un crâne squelette est un petit bloc décoratif qui ressemble au crâne d'un squelette. Il peut également être porté comme un casque, ce qui réduit la plage de détection des squelettes de 50%. +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Un crâne squelette est un petit bloc décoratif qui ressemble au crâne d'un squelette. Il peut également être porté comme casque, ce qui réduit la plage de détection des squelettes de 50%. Wither Skeleton Skull=Crâne de Squelette Wither -A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Un crâne squelette wither est un petit bloc décoratif qui ressemble au crâne d'un squelette wither. Il peut également être porté comme un casque pour le plaisir, mais n'offre aucune protection. +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Un crâne squelette wither est un petit bloc décoratif qui ressemble au crâne d'un squelette wither. Il peut également être porté comme casque pour le plaisir, mais n'offre aucune protection. diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr index 28f2de4ff..f802ae92d 100644 --- a/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr @@ -3,9 +3,9 @@ Zombie Head=Голова зомби A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Голова зомби это небольшой декоративный блок, немного похожий на голову зомби. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас зомби на 50%. Creeper Head=Голова крипера A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Голова крипера это небольшой декоративный блок, немного похожий на голову крипера. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас крипером на 50%. -Human Head=Голова человека -A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Голова человека это небольшой декоративный блок, немного похожий на голову человека (например, игрового персонажа). Его можно носить в качестве шлема просто для смеха, он не даёт никакой защиты. +Human Head=Голова игрока +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Голова игрока это небольшой декоративный блок, немного похожий на голову игрового персонажа. Его можно носить в качестве шлема просто для веселья, он не даёт никакой защиты. Skeleton Skull=Череп скелета A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Череп скелета это небольшой декоративный блок, немного похожий на череп скелета. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас скелетом на 50%. Wither Skeleton Skull=Череп скелета-иссушителя -A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Череп скелета-иссушителя это небольшой декоративный блок, немного похожий на череп скелета-иссушителя. Его можно носить в качестве шлема просто для смеха, он не даёт никакой защиты. +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Череп скелета-иссушителя это небольшой декоративный блок, немного похожий на череп скелета-иссушителя. Его можно носить в качестве шлема просто для веселья, он не даёт никакой защиты. diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr index 40795d09c..6239db903 100644 --- a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.fr.tr @@ -1,16 +1,16 @@ # textdomain: mcl_hoppers Hopper=Entonnoir -Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Les entonoirs sont des conteneurs avec 5 emplacements d'inventaire. Ils récupèrent les objets déposés par le haut, prennent les objets d'un conteneur au-dessus et tentent de les placer dans un conteneur adjacent. Les entonnoirs peuvent aller vers le bas ou sur le côté. Les entonnoirs interagissent avec les coffres, les compte-gouttes, les distributeurs, les boites de shulker, les fours et les entonnoirs. +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Les entonnoirs sont des conteneurs avec 5 emplacements d'inventaire. Ils récupèrent les objets déposés par le haut, prennent les objets d'un conteneur au-dessus et tentent de les placer dans un conteneur adjacent. Les entonnoirs peuvent aller vers le bas ou vers le côté. Les entonnoirs interagissent avec les coffres, droppers, les distributeurs, les boites de shulker, les fours et les entonnoirs. Hoppers interact with containers the following way:=Les entonnoirs interagissent avec les conteneurs de la manière suivante: -• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Fours: les entonoires d'en haut placent les objets dans l'emplacement source. Les entonoires d'en bas prennent les éléments de la fente de sortie. Ils prennent également des objets de la fente de carburant lorsqu'ils ne peuvent pas être utilisés comme carburant. Des entonaires latérales qui pointent vers le four mettent des objets dans la fente de combustible +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Fours: les entonnoirs d'en haut placent les objets dans l'emplacement d'entrée. Les entonnoirs d'en bas prennent les éléments de la fente de sortie. Ils prennent également des objets de la fente de carburant lorsqu'ils ne peuvent pas être utilisés comme carburant. Des entonnoirs latéraux qui pointent vers le four mettent des objets dans la fente de combustible • Ender chests: No interaction.=• Coffres Ender: Aucune interaction. • Other containers: Normal interaction.=• Autres conteneurs: interaction normale. -Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Les entonoires peuvent être désactivées lorsqu'elles sont alimentées en redstone. Les trémies désactivées ne déplacent pas les objets. -To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Pour placer un entonoire verticalement, placez-la au sol ou au plafond. Pour le placer sur le côté, placez-le sur le côté d'un bloc. Utilisez l'entonoire pour accéder à son inventaire. -Disabled Hopper=Entonoir Désactivé -Side Hopper=Entonoir Latéral -Disabled Side Hopper=Entonoir Latéral Désactivé +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Les entonnoirs peuvent être désactivés lorsqu'ils sont alimentés en redstone. Les entonnoirs désactivés ne déplacent pas les objets. +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Pour placer un entonnoir verticalement, placez-le au sol ou au plafond. Pour le placer sur le côté, placez-le sur le côté d'un bloc. Utilisez l'entonnoir pour accéder à son inventaire. +Disabled Hopper=Entonnoir Désactivé +Side Hopper=Entonnoir Latéral +Disabled Side Hopper=Entonnoir Latéral Désactivé Inventory=Inventaire 5 inventory slots=5 emplacements d'inventaire -Collects items from above, moves items to container below=Collecte les éléments d'en haut, déplace les éléments vers le conteneur ci-dessous +Collects items from above, moves items to container below=Collecte les éléments au-dessus, déplace les éléments vers le conteneur en-dessous Can be disabled with redstone power=Peut être désactivé par la puissance Redstone diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr index ac7e82b17..2a1887908 100644 --- a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr @@ -1,16 +1,16 @@ # textdomain: mcl_hoppers Hopper=Воронка -Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Воронка это контейнер с 5 отсеками инвентаря. Она может собирать предметы, брошенные сверху, брать предметы из контейнеров сверху, а также пытаться класть свои предметы в примыкающий контейнер. Воронки могут действовать вниз или вбок. Воронки взаимодействуют с сундуками, выбрасывателями, диспенсерами, ящиками шалкеров, печами и другими воронками. +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Воронка это контейнер с 5 слотами инвентаря. Она может собирать предметы, брошенные сверху, брать предметы из контейнеров сверху, а также пытаться положить свои предметы в примыкающий контейнер. Воронки могут действовать вниз или вбок. Воронки взаимодействуют с сундуками, выбрасывателями, раздатчиками, ящиками шалкеров, печами и другими воронками. Hoppers interact with containers the following way:=Воронка взаимодействует с контейнерами следующим образом: -• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Печи: размещённые выше воронки будут складывать предметы во входной отсек. Воронки, размещённые ниже, будут доставать предметы из выходного отсека. Они также может доставать предметы из топливного отсека, если эти предметы не могут использоваться в качестве топлива. Боковые воронки, нацеленные на печь, помещают предметы в топливный отсек. -• Ender chests: No interaction.=• Сундук Предела: не взаимодействует. -• Other containers: Normal interaction.=• Прочие контейнеры: взаимодействует обычно. -Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Воронки могут быть отключены, когда на них подаётся энергия редстоуна. +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Печи: размещённые наверху воронки будут складывать предметы во входной слот. Воронки, размещённые снизу, будут брать предметы из выходного слота печи. Они также может доставать предметы из топливного слота, если эти предметы не могут использоваться в качестве топлива. Воронки сбоку, присоединённые к печи, помещают предметы в топливный слот. +• Ender chests: No interaction.=• Сундук Края: не взаимодействует. +• Other containers: Normal interaction.=• Прочие контейнеры: взаимодействует как обычно. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Воронки могут быть отключены, когда на них подаётся сигнал редстоуна. To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Чтобы установить воронку вертикально, поместите её на пол или потолок. Чтобы установить воронку по направлению в сторону, разместите её на боковой стороне блока. Нажмите [Использовать] для доступа к инвентарю воронки. Disabled Hopper=Отключенная воронка Side Hopper=Боковая воронка Disabled Side Hopper=Отключенная боковая воронка Inventory=Инвентарь -5 inventory slots=5 отсеков инвентаря +5 inventory slots=5 слотов инвентаря Collects items from above, moves items to container below=Собирает предметы сверху, передаёт их в контейнер ниже Can be disabled with redstone power=Может быть отключена с помощью энергии редстоуна diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index d46a393b8..5dde560b7 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -33,6 +33,7 @@ minetest.register_entity("mcl_itemframes:item",{ end end, get_staticdata = function(self) + if not self then return end if self._nodename and self._texture then local ret = self._nodename .. ";" .. self._texture if self._scale then diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr index 7d3d90cc4..81902e716 100644 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_itemframes Item Frame=Рамка Item frames are decorative blocks in which items can be placed.=Рамки это декоративные блоки, в которые можно помещать предметы. -Just place any item on the item frame. Use the item frame again to retrieve the item.=Просто поместите в рамку любой предмет. Используйте рамку вновь, чтобы заполучить из неё предмет обратно. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Просто поместите в рамку любой предмет. Используйте рамку вновь, чтобы забрать из неё предмет обратно. Can hold an item=Может хранить предмет diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr index 1787ca229..e81d5d1e3 100644 --- a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr @@ -1,11 +1,11 @@ # textdomain: mcl_jukebox -Music Disc=Диск с музыкой -A music disc holds a single music track which can be used in a jukebox to play music.=Диск с музыкой содержит одну музыкальную запись, которую можно прослушивать при помощи проигрывателя. -Place a music disc into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Поместите диск в пустой проигрыватель, чтобы включить музыку. [Используйте] проигрыватель вновь, чтобы вытащить диск. Музыку слышите только вы, другие игроки не слышат. -Music Disc=Диск с музыкой +Music Disc=Пластинка +A music disc holds a single music track which can be used in a jukebox to play music.=Пластинка содержит один музыкальный трек, который можно прослушивать при помощи проигрывателя. +Place a music disc into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Поместите пластинку в пустой проигрыватель, чтобы включить музыку. Используйте проигрыватель снова, чтобы вытащить пластинку. Музыку слышите только вы, другие игроки не слышат. +Music Disc=Пластинка @1—@2=@1—@2 Jukebox=Проигрыватель -Jukeboxes play music when they're supplied with a music disc.=Проигрыватель воспроизводит музыку, если снабдить его музыкальным диском. -Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Поместите диск в пустой проигрыватель, диск окажется в проигрывателе и заиграет музыка. Если в проигрывателе уже есть диск, вы сначала извлечёте его. Музыку можете услышать только вы, другие игроки не услышат. +Jukeboxes play music when they're supplied with a music disc.=Проигрыватель воспроизводит музыку, если положить в него пластинку +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Поместите пластинку в пустой проигрыватель чтобы включить музыку. Если в проигрывателе уже есть пластинка, вы сначала извлечёте его. Музыку можете услышать только вы, другие игроки её не слышат. Now playing: @1—@2=Сейчас звучит: @1-@2 -Uses music discs to play music=Проигрывает музыку с дисков +Uses music discs to play music=Проигрывает музыку с пластинок diff --git a/mods/ITEMS/mcl_lanterns/init.lua b/mods/ITEMS/mcl_lanterns/init.lua new file mode 100644 index 000000000..e6707b075 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/init.lua @@ -0,0 +1,203 @@ +local S = minetest.get_translator("mcl_lanterns") +local modpath = minetest.get_modpath("mcl_lanterns") + +mcl_lanterns = {} + +--[[ +TODO: +- add lantern specific sounds +- remove the hack arround walmounted nodes +]] + +function mcl_lanterns.register_lantern(name, def) + local itemstring_floor = "mcl_lanterns:"..name.."_floor" + local itemstring_ceiling = "mcl_lanterns:"..name.."_ceiling" + + local sounds = mcl_sounds.node_sound_metal_defaults() + + minetest.register_node(itemstring_floor, { + description = def.description, + _doc_items_longdesc = def.longdesc, + drawtype = "mesh", + mesh = "mcl_lanterns_lantern_floor.obj", + inventory_image = def.texture_inv, + wield_image = def.texture_inv, + tiles = { + { + name = def.texture, + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + } + }, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + place_param2 = 1, + node_placement_prediction = "", + sunlight_propagates = true, + light_source = def.light_level, + groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.1875, 0.1875, -0.0625, 0.1875}, + {-0.125, -0.0625, -0.125, 0.125, 0.0625, 0.125}, + {-0.0625, -0.5, -0.0625, 0.0625, 0.1875, 0.0625}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.1875, 0.1875, -0.0625, 0.1875}, + {-0.125, -0.0625, -0.125, 0.125, 0.0625, 0.125}, + {-0.0625, -0.5, -0.0625, 0.0625, 0.1875, 0.0625}, + }, + }, + sounds = sounds, + on_place = function(itemstack, placer, pointed_thing) + local new_stack = mcl_util.call_on_rightclick(itemstack, placer, pointed_thing) + if new_stack then + return new_stack + end + + local under = pointed_thing.under + local above = pointed_thing.above + + local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above)) + local fakestack = itemstack + if wdir == 0 then + fakestack:set_name(itemstring_ceiling) + elseif wdir == 1 then + fakestack:set_name(itemstring_floor) + end + + local success + itemstack, success = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack:set_name(itemstring_floor) + + if success then + minetest.sound_play(sounds.place, {pos = under, gain = 1}, true) + end + + return itemstack + end, + on_rotate = false, + _mcl_hardness = 3.5, + _mcl_blast_resistance = 3.5, + }) + + minetest.register_node(itemstring_ceiling, { + description = def.description, + _doc_items_create_entry = false, + drawtype = "mesh", + mesh = "mcl_lanterns_lantern_ceiling.obj", + tiles = { + { + name = def.texture, + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + } + }, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + place_param2 = 0, + node_placement_prediction = "", + sunlight_propagates = true, + light_source = def.light_level, + groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1, not_in_creative_inventory = 1}, + drop = itemstring_floor, + selection_box = { + type = "fixed", + fixed = { + {-0.1875, 0, -0.1875, 0.1875, 0.4375, 0.1875}, + {-0.125, -0.125, -0.125, 0.125, 0, 0.125}, + {-0.0625, -0.5, -0.0625, 0.0625, -0.125, 0.0625}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.1875, 0, -0.1875, 0.1875, 0.4375, 0.1875}, + {-0.125, -0.125, -0.125, 0.125, 0, 0.125}, + {-0.0625, -0.5, -0.0625, 0.0625, -0.125, 0.0625}, + }, + }, + sounds = sounds, + on_rotate = false, + _mcl_hardness = 3.5, + _mcl_blast_resistance = 3.5, + }) +end + +minetest.register_node("mcl_lanterns:chain", { + description = S("Chain"), + _doc_items_longdesc = S("Chains are metallic decoration blocks."), + inventory_image = "mcl_lanterns_chain_inv.png", + tiles = {"mcl_lanterns_chain.png"}, + drawtype = "mesh", + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = "clip", + mesh = "mcl_lanterns_chain.obj", + is_ground_content = false, + sunlight_propagates = true, + collision_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, + } + }, + groups = {pickaxey = 1, deco_block = 1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:get_pos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y - 1 == p1.y then + param2 = 20 + elseif p0.x - 1 == p1.x then + param2 = 16 + elseif p0.x + 1 == p1.x then + param2 = 12 + elseif p0.z - 1 == p1.z then + param2 = 8 + elseif p0.z + 1 == p1.z then + param2 = 4 + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + _mcl_blast_resistance = 6, + _mcl_hardness = 5, +}) + +minetest.register_craft({ + output = "mcl_lanterns:chain", + recipe = { + {"mcl_core:iron_nugget"}, + {"mcl_core:iron_ingot"}, + {"mcl_core:iron_nugget"}, + }, +}) + +dofile(modpath.."/register.lua") \ No newline at end of file diff --git a/mods/ITEMS/mcl_lanterns/mod.conf b/mods/ITEMS/mcl_lanterns/mod.conf new file mode 100644 index 000000000..a9828806f --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/mod.conf @@ -0,0 +1,5 @@ +name = mcl_lanterns +description = Add lanterns and chains to MineClone2 +depends = mcl_sounds, mcl_blackstone +optional_depends = +author = AFCMS diff --git a/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_chain.obj b/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_chain.obj new file mode 100644 index 000000000..94a7b8971 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_chain.obj @@ -0,0 +1,24 @@ +# Blender v3.0.1 OBJ File: 'chain.blend' +# www.blender.org +o Plane +v 0.066291 0.500000 0.066291 +v 0.066291 -0.500000 0.066291 +v -0.066291 0.500000 -0.066291 +v -0.066291 -0.500000 -0.066291 +v -0.066291 0.500000 0.066291 +v -0.066291 -0.500000 0.066291 +v 0.066291 0.500000 -0.066291 +v 0.066291 -0.500000 -0.066291 +vt -0.000000 1.000000 +vt 0.000000 -0.000000 +vt 0.187500 0.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 -0.000000 +vt 0.375000 -0.000000 +vt 0.375000 1.000000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 5/5/2 6/6/2 8/7/2 7/8/2 diff --git a/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_lantern_ceiling.obj b/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_lantern_ceiling.obj new file mode 100644 index 000000000..7079aa7cb --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_lantern_ceiling.obj @@ -0,0 +1,104 @@ +# Blender v3.0.1 OBJ File: 'lantern.blend' +# www.blender.org +o Lantern_Ceiling +v 0.187500 -0.000000 0.187500 +v 0.187500 0.437500 0.187500 +v 0.187500 0.000000 -0.187500 +v 0.187500 0.437500 -0.187500 +v -0.187500 -0.000000 0.187500 +v -0.187500 0.437500 0.187500 +v -0.187500 0.000000 -0.187500 +v -0.187500 0.437500 -0.187500 +v 0.125000 -0.125000 0.125000 +v 0.125000 -0.000000 0.125000 +v 0.125000 -0.125000 -0.125000 +v 0.125000 0.000000 -0.125000 +v -0.125000 -0.125000 0.125000 +v -0.125000 -0.000000 0.125000 +v -0.125000 -0.125000 -0.125000 +v -0.125000 0.000000 -0.125000 +v 0.066291 -0.500000 -0.066291 +v 0.066291 -0.125000 -0.066291 +v -0.066291 -0.500000 0.066291 +v -0.066291 -0.125000 0.066291 +v -0.066291 -0.500000 -0.066291 +v -0.066291 -0.125000 -0.066291 +v 0.066291 -0.500000 0.066291 +v 0.066291 -0.125000 0.066291 +vt 0.000000 0.062500 +vt 0.375000 0.062500 +vt 0.375000 0.437500 +vt 0.000000 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt -0.000000 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt 0.000000 0.437500 +vt 0.000000 0.062500 +vt 0.375000 0.062500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt 0.000000 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt -0.000000 0.437500 +vt 0.062500 0.125000 +vt 0.312500 0.125000 +vt 0.312500 0.375000 +vt 0.062500 0.375000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.500000 0.770833 +vt 0.500000 0.770833 +vt 0.500000 0.770833 +vt 0.500000 0.770833 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.687500 0.625000 +vt 0.687500 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.625000 +vt 0.687500 1.000000 +vt 0.687500 0.625000 +vt 0.875000 0.625000 +vt 0.875000 1.000000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.7071 -0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 6/13/4 2/14/4 4/5/4 8/8/4 +f 2/15/5 1/16/5 3/17/5 4/18/5 +f 6/19/6 5/20/6 1/21/6 2/22/6 +f 9/23/1 13/24/1 15/25/1 11/26/1 +f 12/27/2 11/28/2 15/29/2 16/30/2 +f 16/31/3 15/32/3 13/33/3 14/34/3 +f 14/35/4 10/36/4 12/37/4 16/38/4 +f 10/39/5 9/40/5 11/41/5 12/42/5 +f 14/43/6 13/44/6 9/45/6 10/46/6 +f 17/47/7 18/48/7 20/49/7 19/50/7 +f 21/51/8 22/52/8 24/53/8 23/54/8 diff --git a/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_lantern_floor.obj b/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_lantern_floor.obj new file mode 100644 index 000000000..c90ece680 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/models/mcl_lanterns_lantern_floor.obj @@ -0,0 +1,104 @@ +# Blender v3.0.1 OBJ File: 'lantern.blend' +# www.blender.org +o Lantern_Floor +v 0.187500 -0.062500 -0.187500 +v 0.187500 -0.500000 -0.187500 +v 0.187500 -0.062500 0.187500 +v 0.187500 -0.500000 0.187500 +v -0.187500 -0.062500 -0.187500 +v -0.187500 -0.500000 -0.187500 +v -0.187500 -0.062500 0.187500 +v -0.187500 -0.500000 0.187500 +v 0.125000 0.062500 -0.125000 +v 0.125000 -0.062500 -0.125000 +v 0.125000 0.062500 0.125000 +v 0.125000 -0.062500 0.125000 +v -0.125000 0.062500 -0.125000 +v -0.125000 -0.062500 -0.125000 +v -0.125000 0.062500 0.125000 +v -0.125000 -0.062500 0.125000 +v 0.066291 0.187500 0.066291 +v 0.066291 0.062500 0.066291 +v -0.066291 0.187500 -0.066291 +v -0.066291 0.062500 -0.066291 +v -0.066291 0.187500 0.066291 +v -0.066291 0.062500 0.066291 +v 0.066291 0.187500 -0.066291 +v 0.066291 0.062500 -0.066291 +vt 0.000000 0.062500 +vt 0.375000 0.062500 +vt 0.375000 0.437500 +vt 0.000000 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt -0.000000 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt 0.000000 0.437500 +vt 0.000000 0.062500 +vt 0.375000 0.062500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt 0.000000 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.875000 +vt -0.000000 0.875000 +vt -0.000000 0.437500 +vt 0.062500 0.125000 +vt 0.312500 0.125000 +vt 0.312500 0.375000 +vt 0.062500 0.375000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.500000 0.770833 +vt 0.500000 0.770833 +vt 0.500000 0.770833 +vt 0.500000 0.770833 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.687500 0.937500 +vt 0.687500 0.812500 +vt 0.875000 0.812500 +vt 0.875000 0.937500 +vt 0.687500 0.937500 +vt 0.687500 0.812500 +vt 0.875000 0.812500 +vt 0.875000 0.937500 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 6/13/4 2/14/4 4/5/4 8/8/4 +f 2/15/5 1/16/5 3/17/5 4/18/5 +f 6/19/6 5/20/6 1/21/6 2/22/6 +f 9/23/1 13/24/1 15/25/1 11/26/1 +f 12/27/2 11/28/2 15/29/2 16/30/2 +f 16/31/3 15/32/3 13/33/3 14/34/3 +f 14/35/4 10/36/4 12/37/4 16/38/4 +f 10/39/5 9/40/5 11/41/5 12/42/5 +f 14/43/6 13/44/6 9/45/6 10/46/6 +f 17/47/7 18/48/7 20/49/7 19/50/7 +f 21/51/8 22/52/8 24/53/8 23/54/8 diff --git a/mods/ITEMS/mcl_lanterns/register.lua b/mods/ITEMS/mcl_lanterns/register.lua new file mode 100644 index 000000000..7cf03d0d5 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/register.lua @@ -0,0 +1,37 @@ +local S = minetest.get_translator("mcl_lanterns") + +mcl_lanterns.register_lantern("lantern", { + description = S("Lantern"), + longdesc = S("Lanterns are light sources which can be placed on the top or the bottom of most blocks."), + texture = "mcl_lanterns_lantern.png", + texture_inv = "mcl_lanterns_lantern_inv.png", + light_level = 14, +}) + +minetest.register_craft({ + output = "mcl_lanterns:lantern_floor", + recipe = { + {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"}, + {"mcl_core:iron_nugget", "mcl_torches:torch" , "mcl_core:iron_nugget"}, + {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"}, + }, +}) + +mcl_lanterns.register_lantern("soul_lantern", { + description = S("Soul Lantern"), + longdesc = S("Lanterns are light sources which can be placed on the top or the bottom of most blocks."), + texture = "mcl_lanterns_soul_lantern.png", + texture_inv = "mcl_lanterns_soul_lantern_inv.png", + light_level = 10, +}) + +minetest.register_craft({ + output = "mcl_lanterns:soul_lantern_floor", + recipe = { + {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"}, + {"mcl_core:iron_nugget", "mcl_blackstone:soul_torch", "mcl_core:iron_nugget"}, + {"mcl_core:iron_nugget", "mcl_core:iron_nugget", "mcl_core:iron_nugget"}, + }, +}) + +minetest.register_alias("mcl_blackstone:soul_lantern", "mcl_lanterns:soul_lantern_floor") \ No newline at end of file diff --git a/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_chain.png b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_chain.png new file mode 100644 index 000000000..01725114a Binary files /dev/null and b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_chain.png differ diff --git a/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_chain_inv.png b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_chain_inv.png new file mode 100644 index 000000000..a8c89dab4 Binary files /dev/null and b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_chain_inv.png differ diff --git a/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_lantern.png b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_lantern.png new file mode 100644 index 000000000..f9936e0fb Binary files /dev/null and b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_lantern.png differ diff --git a/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_lantern_inv.png b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_lantern_inv.png new file mode 100644 index 000000000..8bdc8095f Binary files /dev/null and b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_lantern_inv.png differ diff --git a/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_soul_lantern.png b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_soul_lantern.png new file mode 100644 index 000000000..6e20058ea Binary files /dev/null and b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_soul_lantern.png differ diff --git a/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_soul_lantern_inv.png b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_soul_lantern_inv.png new file mode 100644 index 000000000..55624c749 Binary files /dev/null and b/mods/ITEMS/mcl_lanterns/textures/mcl_lanterns_soul_lantern_inv.png differ diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index d2ff951ad..413e7382a 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -1,24 +1,12 @@ mcl_maps = {} -local modname = minetest.get_current_modname() -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) - -local math = math -local vector = vector -local table = table -local pairs = pairs - -local pos_to_string = minetest.pos_to_string -local string_to_pos = minetest.string_to_pos -local get_item_group = minetest.get_item_group -local dynamic_add_media = minetest.dynamic_add_media -local get_connected_players = minetest.get_connected_players - -local storage = minetest.get_mod_storage() +local S = minetest.get_translator("mcl_maps") +local modpath = minetest.get_modpath("mcl_maps") local worldpath = minetest.get_worldpath() local map_textures_path = worldpath .. "/mcl_maps/" ---local last_finished_id = storage:get_int("next_id") - 1 + +local math_min = math.min +local math_max = math.max minetest.mkdir(map_textures_path) @@ -40,17 +28,15 @@ local loaded_maps = {} local c_air = minetest.get_content_id("air") function mcl_maps.create_map(pos) - local minp = vector.multiply(vector.floor(vector.divide(pos, 128)), 128) - local maxp = vector.add(minp, vector.new(127, 127, 127)) + local minp = vector.subtract(vector.floor(pos), 64) + local maxp = vector.add(minp, 127) local itemstack = ItemStack("mcl_maps:filled_map") local meta = itemstack:get_meta() - local next_id = storage:get_int("next_id") - storage:set_int("next_id", next_id + 1) - local id = tostring(next_id) + local id = string.format("%.0f-%.0f", minetest.hash_node_position(minp), mcl_time.get_seconds_irl()) meta:set_string("mcl_maps:id", id) - meta:set_string("mcl_maps:minp", pos_to_string(minp)) - meta:set_string("mcl_maps:maxp", pos_to_string(maxp)) + meta:set_string("mcl_maps:minp", minetest.pos_to_string(minp)) + meta:set_string("mcl_maps:maxp", minetest.pos_to_string(maxp)) tt.reload_itemstack_description(itemstack) creating_maps[id] = true @@ -62,93 +48,114 @@ function mcl_maps.create_map(pos) local emin, emax = vm:read_from_map(minp, maxp) local data = vm:get_data() local param2data = vm:get_param2_data() - local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax}) + local offset_x, offset_y, offset_z = minp.x - emin.x, minp.y - emin.y, minp.z - emin.z + local dx = emax.x - emin.x + 1 + local dy = (emax.y - emin.y + 1) * dx + local offset = offset_z * dy + offset_y * dx + offset_x + local map_y_start = 64 * dx + local map_y_limit = 127 * dx + local pixels = {} local last_heightmap for x = 1, 128 do - local map_x = minp.x - 1 + x + local map_x = x + offset local heightmap = {} for z = 1, 128 do - local map_z = minp.z - 1 + z + local map_z = (z-1) * dy + map_x local color, height - for map_y = maxp.y, minp.y, -1 do - local index = area:index(map_x, map_y, map_z) - local c_id = data[index] - if c_id ~= c_air then - color = color_cache[c_id] - if color == nil then - local nodename = minetest.get_name_from_content_id(c_id) - local def = minetest.registered_nodes[nodename] - if def then - local texture - if def.palette then - texture = def.palette - elseif def.tiles then - texture = def.tiles[1] - if type(texture) == "table" then - texture = texture.name - end - end - if texture then - texture = texture:match("([^=^%^]-([^.]+))$"):split("^")[1] - end - if def.palette then - local palette = palettes[texture] - color = palette and {palette = palette} - else - color = texture_colors[texture] - end + + local map_y = map_z + map_y_start + local map_y_limit = map_z + map_y_limit + while data[map_y] ~= c_air and map_y < map_y_limit do + map_y = map_y + dx + end + while data[map_y] == c_air and map_y > map_z do + map_y = map_y - dx + end + local c_id = data[map_y] + color = color_cache[c_id] + if color == nil then + local nodename = minetest.get_name_from_content_id(c_id) + local def = minetest.registered_nodes[nodename] + if def then + local texture + if def.palette then + texture = def.palette + elseif def.tiles then + texture = def.tiles[1] + if type(texture) == "table" then + texture = texture.name end end - - if color and color.palette then - color = color.palette[param2data[index] + 1] + if texture then + texture = texture:match("([^=^%^]-([^.]+))$"):split("^")[1] + end + if def.palette then + local palette = palettes[texture] + color = palette and {palette = palette} else - color_cache[c_id] = color or false + color = texture_colors[texture] end - - if color and last_heightmap then - local last_height = last_heightmap[z] - if last_height < map_y then - color = { - math.min(255, color[1] + 16), - math.min(255, color[2] + 16), - math.min(255, color[3] + 16), - } - elseif last_height > map_y then - color = { - math.max(0, color[1] - 16), - math.max(0, color[2] - 16), - math.max(0, color[3] - 16), - } - end - end - height = map_y - break end end + + if color and color.palette then + color = color.palette[param2data[map_y] + 1] + else + color_cache[c_id] = color or false + end + + if color and last_heightmap then + local last_height = last_heightmap[z] + local y = map_y - map_z + if last_height < y then + color = { + math_min(255, color[1] + 16), + math_min(255, color[2] + 16), + math_min(255, color[3] + 16), + } + elseif last_height > y then + color = { + math_max(0, color[1] - 16), + math_max(0, color[2] - 16), + math_max(0, color[3] - 16), + } + end + end + height = map_y - map_z + heightmap[z] = height or minp.y - pixels[z] = pixels[z] or {} - pixels[z][x] = color or {0, 0, 0} + pixels[#pixels + 1] = color and {r = color[1], g = color[2], b = color[3]} or {r = 0, g = 0, b = 0} end last_heightmap = heightmap end - tga_encoder.image(pixels):save(map_textures_path .. "mcl_maps_map_texture_" .. id .. ".tga") + + local png = minetest.encode_png(128, 128, pixels) + local f = io.open(map_textures_path .. "mcl_maps_map_texture_" .. id .. ".png", "w") + if not f then return end + f:write(png) + f:close() creating_maps[id] = nil end) return itemstack end +local loading_maps = {} + function mcl_maps.load_map(id) - if id == "" or creating_maps[id] then + if id == "" or creating_maps[id] or loading_maps[id] then return end - local texture = "mcl_maps_map_texture_" .. id .. ".tga" + local texture = "mcl_maps_map_texture_" .. id .. ".png" if not loaded_maps[id] then - loaded_maps[id] = true - dynamic_add_media(map_textures_path .. texture, function() end) + loading_maps[id] = true + minetest.dynamic_add_media({filepath = map_textures_path .. texture, ephemeral = true}, function(player_name) + loaded_maps[id] = true + loading_maps[id] = nil + end) + return end return texture @@ -229,14 +236,14 @@ end local old_add_item = minetest.add_item function minetest.add_item(pos, stack) stack = ItemStack(stack) - if get_item_group(stack:get_name(), "filled_map") > 0 then + if minetest.get_item_group(stack:get_name(), "filled_map") > 0 then stack:set_name("mcl_maps:filled_map") end return old_add_item(pos, stack) end tt.register_priority_snippet(function(itemstring, _, itemstack) - if itemstack and get_item_group(itemstring, "filled_map") > 0 then + if itemstack and minetest.get_item_group(itemstring, "filled_map") > 0 then local id = itemstack:get_meta():get_string("mcl_maps:id") if id ~= "" then return "#" .. id, mcl_colors.GRAY @@ -262,7 +269,7 @@ minetest.register_craft({ local function on_craft(itemstack, player, old_craft_grid, craft_inv) if itemstack:get_name() == "mcl_maps:filled_map" then for _, stack in pairs(old_craft_grid) do - if get_item_group(stack:get_name(), "filled_map") > 0 then + if minetest.get_item_group(stack:get_name(), "filled_map") > 0 then itemstack:get_meta():from_table(stack:get_meta():to_table()) return itemstack end @@ -299,7 +306,7 @@ minetest.register_on_leaveplayer(function(player) end) minetest.register_globalstep(function(dtime) - for _, player in pairs(get_connected_players()) do + for _, player in pairs(minetest.get_connected_players()) do local wield = player:get_wielded_item() local texture = mcl_maps.load_map_item(wield) local hud = huds[player] @@ -319,8 +326,8 @@ minetest.register_globalstep(function(dtime) local pos = vector.round(player:get_pos()) local meta = wield:get_meta() - local minp = string_to_pos(meta:get_string("mcl_maps:minp")) - local maxp = string_to_pos(meta:get_string("mcl_maps:maxp")) + local minp = minetest.string_to_pos(meta:get_string("mcl_maps:minp")) + local maxp = minetest.string_to_pos(meta:get_string("mcl_maps:maxp")) local marker = "mcl_maps_player_arrow.png" diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr index 6c34007a9..a51da08ff 100644 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_maps Empty Map=Пустая карта -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Пустые карты не могут использоваться в качестве карт, но могут складываться в стопки, а также могут быть превращены в полноценные карты. -Rightclick to start using the map (which can't be stacked anymore).=Кликните правой, чтобы начать использовать карту (её больше нельзя будет уложить в стопку). +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Пустые карты не так полезны как карты, но могут складываться в стопки, а также могут быть превращены в полноценные карты. +Rightclick to start using the map (which can't be stacked anymore).=Кликните правой кнопкой мыши, чтобы начать использовать карту (её больше нельзя будет уложить в стопку). Map=Карта diff --git a/mods/ITEMS/mcl_maps/mod.conf b/mods/ITEMS/mcl_maps/mod.conf index e1f068963..efe1708dd 100644 --- a/mods/ITEMS/mcl_maps/mod.conf +++ b/mods/ITEMS/mcl_maps/mod.conf @@ -1,2 +1,2 @@ name = mcl_maps -depends = mcl_core, mcl_flowers, tga_encoder, tt, mcl_colors, mcl_skins, mcl_util +depends = mcl_core, mcl_flowers, tt, mcl_colors, mcl_skins, mcl_util, mcl_time diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr index d31632345..f5654bec7 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.fr.tr @@ -55,7 +55,7 @@ Wield the bone near wolves to attract them. Use the “Place” key on the wolf String=Ficelle Strings are used in crafting.=Les ficelles sont utilisées dans l'artisanat. Blaze Rod=Bâton de Blaze -This is a crafting component dropped from dead blazes.=Il s'agit d'un composant d'artisanat tombé des Blazes morts. +This is a crafting component dropped from dead blazes.=Il s'agit d'un composant d'artisanat lâché par des Blazes morts. Blaze Powder=Poudre de Blaze This item is mainly used for crafting.=Cet objet est principalement utilisé pour l'artisanat. Magma Cream=Crème de Magma @@ -76,19 +76,19 @@ Rabbit's Foot=Patte de Lapin Must be your lucky day! Place this item in an item frame for decoration.=Ce doit être votre jour de chance! Placez cet article dans un cadre d'article pour la décoration. Saddle=Selle Can be placed on animals to ride them=Peut être placé sur les animaux pour les monter -Saddles can be put on some animals in order to mount them.=Des selles peuvent être posées sur certains animaux afin de les monter. +Saddles can be put on some animals in order to mount them.=Les selles peuvent être posées sur certains animaux afin de les monter. Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=Utilisez la touche de placement avec la selle à la main pour essayer de mettre la selle. Les selles conviennent aux chevaux, mulets, ânes et cochons. Les chevaux, les mulets et les ânes doivent d'abord être apprivoisés, sinon ils rejetteront la selle. Les animaux sellés peuvent être montés en utilisant à nouveau la touche de placement. Rabbit Stew=Ragout de Lapin Rabbit stew is a very nutricious food item.=Le ragoût de lapin est un aliment très nutritif. Shulker Shell=Carapace de Shulker -Shulker shells are used in crafting. They are dropped from dead shulkers.=Les carapaces Shulker sont utilisés dans l'artisanat. Ils sont lâchés de shulkers morts. +Shulker shells are used in crafting. They are dropped from dead shulkers.=Les carapaces Shulker sont utilisés dans l'artisanat. Elles sont lâchées par des shulkers morts. Slimeball=Boule de Slime -Slimeballs are used in crafting. They are dropped from slimes.=Les boules de slime sont utilisées dans l'artisanat. Ils sont lâchés par les Slimes. +Slimeballs are used in crafting. They are dropped from slimes.=Les boules de slime sont utilisées dans l'artisanat. Elles sont lâchése par les Slimes. Gunpowder=Poudre à canon Carrot on a Stick=Carotte sur un Batôn Lets you ride a saddled pig=Vous permet de monter un cochon sellé A carrot on a stick can be used on saddled pigs to ride them.=Une carotte sur un bâton peut être utilisée sur les porcs sellés pour les monter. -Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Placez-le sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton. \ No newline at end of file +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Placez-la sur un cochon sellé pour le monter. Vous pouvez maintenant monter le cochon comme un cheval. Les porcs marcheront également vers vous lorsque vous brandirez la carotte sur un bâton. \ No newline at end of file diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr index f51e4f562..25008d7ae 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr @@ -1,95 +1,70 @@ # textdomain: mcl_mobitems Rotten Flesh=Гнилое мясо 80% chance of food poisoning=Вероятность отравления 80% - -Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=БУЭ! Этот кусок гнили явно знавал лучшие времена. Если вы отчаялись, то можете съесть его, восстановив несколько очков голода, но с вероятностью 80% вы получите пищевое отравление, которое усилит ваш голод на некоторое время. - +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=Буэ! Этот кусок гнили явно знавал лучшие времена. Если вы отчаялись, то можете съесть его, восстановив несколько очков голода, но с вероятностью 80% вы получите пищевое отравление, которое усилит ваш голод на некоторое время. Raw Mutton=Сырая баранина - Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая баранина это мясо овцы, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. - Cooked Mutton=Жареная баранина -Cooked mutton is the cooked flesh from a sheep and is used as food.=Жареная баранина это запечённое мясо овцы, употребляемое в пищу. +Cooked mutton is the cooked flesh from a sheep and is used as food.=Жареная баранина это приготовленное мясо овцы, это съедобный продукт. Raw Beef=Сырая говядина - Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая говядина это мясо коровы, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. - -Steak=Стейк -Steak is cooked beef from cows and can be eaten.=Стейк это приготовленное мясо коровы, его можно есть. +Steak=Жареная говядина +Steak is cooked beef from cows and can be eaten.=Жареная говядина это приготовленное мясо коровы, это съедобный продукт. Raw Chicken=Сырая курица 30% chance of food poisoning=Вероятность отравления 30% - -Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Сырая курица это продуктовый предмет, небезопасный для употребления. Вы можете его съесть для восстановления нескольких очков голода, но с вероятностью 30% вы пострадаете от пищевого отравление, которое усилит ваш голод на некоторое время. Приготовление сырой курицы сделает её безопасной для еды, значительно увеличив питательную ценность. - -Cooked Chicken=Жареный цыплёнок -A cooked chicken is a healthy food item which can be eaten.=Жареный цыплёнок это здоровый питательный продукт, его можно есть. +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Сырая курица это съедобный предмет, небезопасный для употребления. Вы можете его съесть для восстановления нескольких очков голода, но с вероятностью 30% вы пострадаете от пищевого отравление, которое усилит ваш голод на некоторое время. Приготовление сырой курицы сделает её безопасной для еды, значительно увеличив питательную ценность. +Cooked Chicken=Жареная курица +A cooked chicken is a healthy food item which can be eaten.=Жареная курица это съедобный продукт. Raw Porkchop=Сырая свинина - A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая свинина это мясо свиньи, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. - -Cooked Porkchop=Свиная отбивная -Cooked porkchop is the cooked flesh of a pig and is used as food.=Свиная отбивная это приготовленное мясо свиньи, его можно есть. +Cooked Porkchop=Жареная свинина +Cooked porkchop is the cooked flesh of a pig and is used as food.=Жареная свинина это приготовленное мясо свиньи, это съедобный продукт. Raw Rabbit=Сырая крольчатина - Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Сырая крольчатина это мясо кролика, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. - -Cooked Rabbit=Приготовленный кролик -This is a food item which can be eaten.=Это пищевой продукт, его можно есть. +Cooked Rabbit=Приготовленная крольчатина +This is a food item which can be eaten.=Приготовленная крольчатина это съедобный продукт. Milk=Молоко Removes all status effects=Убирает все эффекты состояния - -Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Молоко отлично освежает, его можно получить, применив ведро к корове. Выпив молока, вы избавитесь от всех эффектов состояния, но не восстановите очков голода. - -Use the placement key to drink the milk.=Используйте клавишу размещения, чтобы выпить молоко. +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Молоко отлично освежает, его можно получить, использовав ведро на корове. Выпив молока, вы избавитесь от всех эффектов, но не восстановите очков голода. +Use the placement key to drink the milk.=Используйте правую кнопку мыши, чтобы выпить молоко. Spider Eye=Паучий глаз Poisonous=Ядовито - -Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Паучьи глаза в основном используются для крафтинга. Если вы отчаялись, то можете съесть их, но они вас на некоторое время отравят. - +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Паучьи глаза в основном используются для крафта. Если вы отчаялись, то можете съесть их, но они вас на некоторое время отравят. Bone=Кость - Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Кости можно использовать для приручения волков, чтобы они защищали вас. - -Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Положите кость рядом с волками, чтобы привлечь их. Используйте клавишу “Разместить” на волке, чтобы дать ему кость и приручить его. Вы можете командовать приручёнными волками с помощью клавиши “Разместить”. - -String=Нити -Strings are used in crafting.=Нити используются для крафтинга +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Возьмите в руку кость рядом с волками, чтобы привлечь их. Используйте кость на волке, чтобы приручить его. Вы можете командовать приручёнными волками с помощи правой кнопки мыши. +String=Нить +Strings are used in crafting.=Нить используются для крафта Blaze Rod=Огненный стержень -This is a crafting component dropped from dead blazes.=Это крафтинговый ингредиент, отбрасываемый ифритом +This is a crafting component dropped from dead blazes.=Это материал для крафта, выпадающий из ифрита. Blaze Powder=Огненный порошок -This item is mainly used for crafting.=Этот предмет в основном используется для крафтинга. +This item is mainly used for crafting.=Огненный порошок это материал для крафта и топливо для варочной стойки. Magma Cream=Лавовый крем -Magma cream is a crafting component.=Лавовый крем это крафтинговый компонент. +Magma cream is a crafting component.=Лавовый крем это материал для крафта. Ghast Tear=Слеза гаста Place this item in an item frame as decoration.=Поместите это в рамку как украшение. Nether Star=Звезда Ада - -A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Звезда Ада выбрасывается при смерти иссушителя. Поместите её в рамку, чтобы показать миру ваше величие! Либо просто как украшение. - +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Звезда Ада выбрасывается при смерти иссушителя. Поместите её в рамку, чтобы показать миру ваше величие! Leather=Кожа -Leather is a versatile crafting component.=Кожа это универсальный крафт-компонент. +Leather is a versatile crafting component.=Кожа это универсальный материал для крафта. Feather=Перо -Feathers are used in crafting and are dropped from chickens.=Перо используется для крафтинга и выпадает из кур. +Feathers are used in crafting and are dropped from chickens.=Перо выпадает из кур и используется для крафта. Rabbit Hide=Кроличья шкурка Rabbit hide is used to create leather.=Кроличья шкурка используется для создания кожи. Rabbit's Foot=Кроличья лапка Must be your lucky day! Place this item in an item frame for decoration.=У вас счастливый день! Поместите этот предмет в рамку как украшение. Saddle=Седло Can be placed on animals to ride them=Можно устанавливать на животных, чтобы ездить на них -Saddles can be put on some animals in order to mount them.=Седло можно поставить на некоторых животных, чтобы закрепляться на них. - -Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=Используйте клавишу размещения, держа седло в руке, чтобы попытаться надеть его. Сёдла подходят для лошадей, мулов, осликов и свиней. Лошади, мулы и ослики должны быть предварительно приручены, иначе они откажутся от седла. На осёдланных животных можно сесть, снова нажав на них клавишу размещения. - +Saddles can be put on some animals in order to mount them.=Седло можно поставить на некоторых животных, чтобы сесть на них. +Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=Используйте седло на животном, чтобы попытаться надеть его. Сёдла подходят для лошадей, мулов, ослов и свиней. Лошади, мулы и ослы должны быть предварительно приручены, иначе они откажутся от седла. На осёдланных животных можно сесть, снова нажав на них кнопку использования. Rabbit Stew=Рагу из кролика -Rabbit stew is a very nutricious food item.=Рагу из кролика это очень питательный продукт. +Rabbit stew is a very nutricious food item.=Рагу из кролика это очень питательный съедобный продукт. Shulker Shell=Панцирь шалкера -Shulker shells are used in crafting. They are dropped from dead shulkers.=Панцирь шалкера используется для крафтинга. Он выпадает из мёртвого шалкера. +Shulker shells are used in crafting. They are dropped from dead shulkers.=Панцирь шалкера используется для крафта. Он выпадает из мёртвого шалкера. Slimeball=Слизь -Slimeballs are used in crafting. They are dropped from slimes.=Слизь используется для крафтинга. Она выпадает из слизняков. +Slimeballs are used in crafting. They are dropped from slimes.=Слизь используется для крафта. Она выпадает из слизняков. Gunpowder=Порох Carrot on a Stick=Удочка с морковью Lets you ride a saddled pig=Позволяет вам ездить на осёдланной свинье A carrot on a stick can be used on saddled pigs to ride them.=Удочку с морковью можно использовать, чтобы оседлать свинью и поехать на ней. - -Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Поместите это на осёдланную свинью, чтобы закрепиться на ней. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью. - +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Поместите это на осёдланную свинью, чтобы сесть на неё. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью. diff --git a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png index ff85a30df..ee7b5af7f 100644 Binary files a/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png and b/mods/ITEMS/mcl_mobitems/textures/mcl_mobitems_carrot_on_a_stick.png differ diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 0795fb611..11339e1a4 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -317,7 +317,12 @@ minetest.register_node("mcl_mobspawners:spawner", { if obj then obj:remove() end - mcl_experience.throw_xp(pos, math.random(15, 43)) + + --Make sure the player is not in creative mode before + --giving them xp + if not minetest.is_creative_enabled(name) then + mcl_experience.throw_xp(pos, math.random(15, 43)) + end end, on_punch = function(pos) @@ -347,7 +352,7 @@ local doll_def = { } doll_def.get_staticdata = function(self) - return self._mob + return self and self._mob end doll_def.on_activate = function(self, staticdata, dtime_s) diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.fr.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.fr.tr index f008ad836..85349a580 100644 --- a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.fr.tr +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.fr.tr @@ -1,5 +1,5 @@ # textdomain: mcl_mobspawners Mob Spawner=Générateur de Mob -A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Un générateur de mob fait régulièrement apparaître des mobs autour de lui tandis qu'un joueur est à proximité. Certains générateurs de mob sont désactivés lorsqu'ils sont en lumière. +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Un générateur de mob fait régulièrement apparaître des mobs autour de lui tandis qu'un joueur est à proximité. Certains générateurs de mob sont désactivés lorsqu'ils sont éclairés. If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Si vous avez un oeuf d'apparition, vous pouvez l'utiliser pour changer le mob qui apparait. Placez simplement l'objet sur le générateur de mob. Les générateurs de mobs créés par les joueurs engendrent toujours des mobs quel que soit le niveau de lumière. -Makes mobs appear=Fait apparaître les mobs +Makes mobs appear=Fait apparaître des mobs diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr index c018167c0..83cb4fd25 100644 --- a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_mobspawners -Mob Spawner=Спаунер (порождатель) мобов -A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Спаунер постоянно вызывает появление мобов вокруг себя, пока поблизости находится игрок. Некоторые спаунеры отключаются под действием света. -If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Если у вас есть порождающее яйцо, вы можете использовать его, чтобы выбрать моба, который будет появляться. Просто поместите этот предмет на спаунер. Настроенные игроками спаунеры работают всегда, независимо от уровня освещения. +Mob Spawner=Спавнер мобов +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Спавнер постоянно вызывает появление мобов вокруг себя, пока поблизости находится игрок. Некоторые спаунеры отключаются под действием света. +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Если у вас есть яйцо спавна, вы можете использовать его на спавнере, чтобы выбрать моба, который будет появляться. Настроенные игроками спаунеры работают всегда, независимо от уровня освещения. Makes mobs appear=Создаёт мобов diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr index 6902b610f..a196ac306 100644 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr @@ -1,9 +1,9 @@ # textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Блок с икрой - это блок, из которого вылетает чешуйница, если его сломать. Выглядит идентично своему обычному аналогу. -Infested Stone=Камень с икрой -Infested Cobblestone=Булыжник с икрой -Infested Stone Bricks=Каменные блоки с икрой -Infested Cracked Stone Bricks=Треснутые каменные блоки с икрой -Infested Mossy Stone Bricks=Мшистый каменный блок с икрой -Infested Chiseled Stone Bricks=Точёный каменный блок с икрой -Hides a silverfish=Скрывает чешуйницу +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого из него появляется чешуйница. Блок выглядит идентично своему нормальному варианту. +Infested Stone=Заражённый камень +Infested Cobblestone=Заражённый булыжник +Infested Stone Bricks=Заражённые каменные кирпичи +Infested Cracked Stone Bricks=Заражённые треснутые каменные кирпичи +Infested Mossy Stone Bricks=Заражённые замшелые каменные кирпичи +Infested Chiseled Stone Bricks=Заражённые резные каменные кирпичи +Hides a silverfish=Прячет в себе чешуйницу \ No newline at end of file diff --git a/mods/ITEMS/mcl_mushroom/init.lua b/mods/ITEMS/mcl_mushroom/init.lua index c5243c88a..9e44fdcf3 100644 --- a/mods/ITEMS/mcl_mushroom/init.lua +++ b/mods/ITEMS/mcl_mushroom/init.lua @@ -32,7 +32,7 @@ minetest.register_node("mcl_mushroom:warped_fungus", { sunlight_propagates = true, paramtype = "light", walkable = false, - groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1}, + groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, compostability=65}, light_source = 1, selection_box = { @@ -67,7 +67,7 @@ minetest.register_node("mcl_mushroom:twisting_vines", { walkable = false, climbable = true, buildable_to = true, - groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1}, + groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1, compostability=50}, selection_box = { type = "fixed", fixed = { -3/16, -0.5, -3/16, 3/16, 0.5, 3/16 }, @@ -108,7 +108,7 @@ minetest.register_node("mcl_mushroom:nether_sprouts", { paramtype = "light", walkable = false, buildable_to = true, - groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1}, + groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1, compostability=50}, selection_box = { type = "fixed", fixed = { -4/16, -0.5, -4/16, 4/16, 0, 4/16 }, @@ -130,7 +130,7 @@ minetest.register_node("mcl_mushroom:warped_roots", { paramtype = "light", walkable = false, buildable_to = true, - groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1}, + groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1, compostability=65}, selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, -4/16, 6/16 }, @@ -144,7 +144,7 @@ minetest.register_node("mcl_mushroom:warped_roots", { minetest.register_node("mcl_mushroom:warped_wart_block", { description = S("Warped Wart Block"), tiles = {"warped_wart_block.png"}, - groups = {handy=1,hoe=7,swordy=1, deco_block=1, }, + groups = {handy=1,hoe=7,swordy=1, compostability=85, deco_block=1, }, stack_max = 64, _mcl_hardness = 2, }) @@ -152,7 +152,7 @@ minetest.register_node("mcl_mushroom:warped_wart_block", { minetest.register_node("mcl_mushroom:shroomlight", { description = S("Shroomlight"), tiles = {"shroomlight.png"}, - groups = {handy=1,hoe=7,swordy=1, leaves=1, deco_block=1, }, + groups = {handy=1,hoe=7,swordy=1, leaves=1, deco_block=1, compostability=65, }, stack_max = 64, _mcl_hardness = 2, -- this is 15 in Minecraft @@ -305,7 +305,7 @@ minetest.register_node("mcl_mushroom:crimson_fungus", { sunlight_propagates = true, paramtype = "light", walkable = false, - groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1}, + groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1, compostability=65}, light_source = 1, selection_box = { @@ -339,7 +339,7 @@ minetest.register_node("mcl_mushroom:crimson_roots", { paramtype = "light", walkable = false, buildable_to = true, - groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1}, + groups = {dig_immediate=3,vines=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,deco_block=1, shearsy = 1, compostability=65}, selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, -4/16, 6/16 }, @@ -470,8 +470,8 @@ minetest.register_abm({ }) function generate_warped_tree(pos) - breakgrow = false - breakgrow2 = false + local breakgrow = false + local breakgrow2 = false -- Baumgenerator -- erste und zweite Etage for x = pos.x - 2,pos.x + 2 do @@ -547,8 +547,8 @@ function generate_warped_tree(pos) end function generate_crimson_tree(pos) - breakgrow = false - breakgrow2 = false + local breakgrow = false + local breakgrow2 = false -- Baumgenerator -- erste und zweite Etage for x = pos.x - 2,pos.x + 2 do diff --git a/mods/ITEMS/mcl_mushroom/locale/mcl_mushrooms.de.tr b/mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.de.tr similarity index 100% rename from mods/ITEMS/mcl_mushroom/locale/mcl_mushrooms.de.tr rename to mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.de.tr diff --git a/mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.fr.tr b/mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.fr.tr new file mode 100644 index 000000000..e301a8b8a --- /dev/null +++ b/mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.fr.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_mushroom + +Warped Fungus Mushroom=Champignon tordu +Twisting Vines=Liane tordue +Nether Sprouts=Racines du nether +Warped Roots=Racines tordues +Warped Wart Block=Bloc de verrues tordu +Shroomlight=Champilampe +Warped Hyphae=Tige tordue +Warped Nylium=Nylium tordu +Warped Checknode - only to check!=Bloc de vérification tordu - seulement pour vérifier ! +Warped Hyphae Wood=Planches tordues +Warped Stair=Escalier tordu +Warped Slab=Dalle tordue +Crimson Fungus Mushroom=Champignon écarlate +Crimson Roots=Racines écarlates +Crimson Hyphae=Tige écarlate +Crimson Hyphae Wood=Planches écarlates +Crimson Stair=Escalier écarlate +Crimson Slab=Dalle écarlate +Double Crimson Slab=Dalle double écarlate +Crimson Nylium=Nylium écarlate +Crimson Checknode - only to check!=Bloc de vérification écarlate - seulement pour vérifier ! \ No newline at end of file diff --git a/mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.ru.tr b/mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.ru.tr new file mode 100644 index 000000000..71a48d60d --- /dev/null +++ b/mods/ITEMS/mcl_mushroom/locale/mcl_mushroom.ru.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_mushroom + +Warped Fungus Mushroom=Искажённый огромный грибок +Twisting Vines=Извилистые лианы +Nether Sprouts=Адские ростки +Warped Roots=Искажённые корни +Warped Wart Block=Искажённый блок адского нароста +Shroomlight=Грибосвет +Warped Hyphae=Искажённая ножка +Warped Nylium=Искажённый нилий +Warped Checknode - only to check!=Искажённый тестовый блок +Warped Hyphae Wood=Искажённые доски +Warped Stair=Искажённые ступени +Warped Slab=Искажённая плита +Double Warped Slab=Двойная искажённая плита +Crimson Fungus Mushroom=Багровый огромный грибок +Crimson Roots=Багровые корни +Crimson Hyphae=Багровая ножка +Crimson Hyphae Wood=Багровые доски +Crimson Stair=Багровые ступени +Crimson Slab=Багровая плита +Double Crimson Slab=Двойная багровая плита +Crimson Nylium=Багровый нилий +Crimson Checknode - only to check!=Багровый тестовый блок diff --git a/mods/ITEMS/mcl_mushroom/textures/farming_crimson_fungus.png b/mods/ITEMS/mcl_mushroom/textures/farming_crimson_fungus.png index 86180a8dd..ab1771b95 100644 Binary files a/mods/ITEMS/mcl_mushroom/textures/farming_crimson_fungus.png and b/mods/ITEMS/mcl_mushroom/textures/farming_crimson_fungus.png differ diff --git a/mods/ITEMS/mcl_mushrooms/huge.lua b/mods/ITEMS/mcl_mushrooms/huge.lua index 617f12810..83bc6a910 100644 --- a/mods/ITEMS/mcl_mushrooms/huge.lua +++ b/mods/ITEMS/mcl_mushrooms/huge.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local vector = vector local template = { - groups = {handy=1,axey=1, building_block = 1, material_wood = 1, flammable = -1 }, + groups = {handy=1,axey=1, building_block = 1, material_wood = 1, flammable = -1, compostability=85 }, sounds = mcl_sounds.node_sound_wood_defaults(), is_ground_content = true, _mcl_blast_resistance = 0.2, @@ -51,6 +51,7 @@ local function register_mushroom(color, species_id, template, d_cap, d_stem, d_s stem_full.tiles = { "mcl_mushrooms_mushroom_block_skin_stem.png" } stem_full.groups.huge_mushroom = species_id stem_full.groups.huge_mushroom_stem = 2 + stem_full.groups.compostability=65 minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem_full", stem_full) -- Stem @@ -60,6 +61,7 @@ local function register_mushroom(color, species_id, template, d_cap, d_stem, d_s stem.tiles = { "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_inside.png", "mcl_mushrooms_mushroom_block_skin_stem.png" } stem.groups.huge_mushroom = species_id stem.groups.huge_mushroom_stem = 1 + stem.groups.compostability=65 minetest.register_node("mcl_mushrooms:"..color.."_mushroom_block_stem", stem) -- Mushroom block (cap) diff --git a/mods/ITEMS/mcl_mushrooms/init.lua b/mods/ITEMS/mcl_mushrooms/init.lua index 1360eabe7..64368fdf8 100644 --- a/mods/ITEMS/mcl_mushrooms/init.lua +++ b/mods/ITEMS/mcl_mushrooms/init.lua @@ -1,5 +1,6 @@ dofile(minetest.get_modpath("mcl_mushrooms").."/small.lua") dofile(minetest.get_modpath("mcl_mushrooms").."/huge.lua") +dofile(minetest.get_modpath("mcl_mushrooms").."/suspicious_stew.lua") -- Aliases for old MCL2 versions minetest.register_alias("mcl_farming:mushroom_red", "mcl_mushrooms:mushroom_red") diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.fr.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.fr.tr index 647b36443..1a1f6a999 100644 --- a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.fr.tr +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.fr.tr @@ -1,11 +1,11 @@ # textdomain: mcl_mushrooms This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Ce bloc décoratif ressemble à une tige de champignon géant, mais avec la texture de la tige de tous les côtés. -Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Blocs de champignons rouges géants sont les parties du chapeau d'énormes champignons rouges. Il se compose d'une peau rouge et peut avoir des pores sur chacun de ses côtés. -The stem part of a huge red mushroom.=La partie tige d'un énorme champignon rouge. +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Les blocs de champignons rouges géants sont les parties du chapeau d'énormes champignons rouges. Ils se composent d'une peau rouge et peuvent avoir des pores sur chacun de leurs côtés. +The stem part of a huge red mushroom.=La tige d'un énorme champignon rouge. Huge Red Mushroom Block=Bloc de Champignon Rouge Géant Huge Red Mushroom Stem=Tige de Champignon Rouge Géant Huge Red Mushroom All-Faces Stem=Tige de Champignon Rouge Géant avec Pores -Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=D'énormes blocs de champignons bruns sont les parties du chapeau d'énormes champignons bruns. Il se compose d'une peau brune et peut avoir des pores sur chacun de ses côtés. +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=D'énormes blocs de champignons bruns sont les parties du chapeau d'énormes champignons bruns. Ils se composent d'une peau brune et peuvent avoir des pores sur chacun de leurs côtés. The stem part of a huge brown mushroom.=La partie tige d'un énorme champignon brun. Huge Brown Mushroom Block=Bloc de Champignon Marron Géant Huge Brown Mushroom Stem=Tige de Champignon Marron Géant @@ -18,7 +18,7 @@ This mushroom can be placed on mycelium and podzol at any light level. It can al Brown Mushroom=Champignon Marron Red Mushroom=Champignon Rouge Mushroom Stew=Ragoût de Champignon -Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Le ragoût de champignons est une soupe saine qui peut être consommée pour restaurer certains points de faim. +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Le ragoût de champignons est une soupe saine qui peut être consommée pour restaurer quelques points de faim. By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=En plaçant d'énormes blocs de champignons de la même espèce les uns à côté des autres, les côtés qui se touchent se transformeront en pores de façon permanente. -Grows on podzol, mycelium and other blocks=Pousse sur podzol, mycélium et autres blocs +Grows on podzol, mycelium and other blocks=Pousse sur le podzol, mycélium et d'autres blocs Spreads in darkness=Se propage dans l'obscurité diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr index ba3cb171e..1a92cfc79 100644 --- a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr @@ -1,24 +1,24 @@ # textdomain: mcl_mushrooms -This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Этот декоративный блок похож на огромную ножку гриба, но имеет структуру ножки с каждой стороны. -Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Блоки огромных красных грибов это части шляпок огромных красных грибов. Они состоят из красной кожицы и могут иметь поры на каждой стороне. -The stem part of a huge red mushroom.=Часть ножки огромного красного гриба. -Huge Red Mushroom Block=Блок огромного красного гриба -Huge Red Mushroom Stem=Ножка огромного красного гриба -Huge Red Mushroom All-Faces Stem=Многоликая ножка огромного красного гриба -Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=Блоки огромных коричневых грибов это части шляпок огромных коричневых грибов. Они состоят из коричневой кожицы и могут иметь поры на каждой стороне. -The stem part of a huge brown mushroom.=Часть ножки огромного коричневого гриба. -Huge Brown Mushroom Block=Блок огромного коричневого гриба -Huge Brown Mushroom Stem=Ножка огромного коричневого гриба -Huge Brown Mushroom All-Faces Stem=Многоликая ножка огромного коричневого гриба -Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Коричневые грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления продуктов питания. -Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Красные грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления продуктов питания. -A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Одиночный гриб этого вида со временем будет медленно распространяться в направлении случайного твердого непрозрачного блока при уровне освещённости 12 и ниже пределах куба 3×3×3 вокруг себя. Он перестает распространяться, когда будет уже 5 и более грибов одного и того же вида на участке 9×3×9 блоков вокруг гриба. -Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Грибы вымирают при уровне света 12 и выше. Но на мицелии и подзоле они выживают и распространяются при любом уровне освещенности. -This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Этот гриб можно высадить на мицелий и подзол при любом уровне света. Его также можно размещать на плотных непрозрачных блоках, если уровень освещенности в дневное время не превышает 12. +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Этот декоративный блок похож на большую ножку гриба, но имеет текстуру ножки с каждой стороны. +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Блоки больших красных грибов это части шляпок больших красных грибов. Они состоят из красной кожицы и могут иметь поры на каждой стороне. +The stem part of a huge red mushroom.=Часть ножки большого красного гриба. +Huge Red Mushroom Block=Блок большого красного гриба +Huge Red Mushroom Stem=Ножка большого красного гриба +Huge Red Mushroom All-Faces Stem=Ножка большого красного гриба +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=Блоки больших коричневых грибов это части шляпок больших коричневых грибов. Они состоят из коричневой кожицы и могут иметь поры на каждой стороне. +The stem part of a huge brown mushroom.=Часть ножки большого коричневого гриба. +Huge Brown Mushroom Block=Блок большого коричневого гриба +Huge Brown Mushroom Stem=Ножка большого коричневого гриба +Huge Brown Mushroom All-Faces Stem=Ножка большого коричневого гриба +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Коричневые грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления съедобных продуктов. +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Красные грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления съедобных продуктов. +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Одиночный гриб этого вида со временем будет медленно распространяться в направлении случайного твёрдого непрозрачного блока при уровне освещённости 12 и ниже, в пределах куба 3×3×3 вокруг себя. Он перестает распространяться, когда будет уже 5 и более грибов одного и того же вида на участке 9×3×9 блоков вокруг гриба. +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Грибы погибают при уровне света 12 и выше. Но на мицелии и подзоле они выживают и распространяются при любом уровне освещенности. +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Этот гриб можно высадить на мицелий и подзол при любом уровне света. Его также можно размещать на твёрдых непрозрачных блоках, если уровень освещенности в дневное время не превышает 12. Brown Mushroom=Коричневый гриб Red Mushroom=Красный гриб -Mushroom Stew=Грибная похлёбка -Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Грибная похлёбка - это полезный суп, который можно употребить в пищу для восстановления нескольких очков голода. -By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=Если поместить блоки огромных грибов одного и того же вида рядом друг с другом, стороны, которыми они соприкасаются друг с другом, сразу превратятся в поры. -Grows on podzol, mycelium and other blocks=Растёт на подзолах, мицелии и других блоках +Mushroom Stew=Тушёные грибы +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Тушёные грибы - это полезный суп, который можно употребить в пищу для восстановления нескольких очков голода. +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=Если поместить блоки больших грибов одного и того же вида рядом друг с другом, стороны, которыми они соприкасаются друг с другом, сразу превратятся в поры. +Grows on podzol, mycelium and other blocks=Растёт на подзоле, мицелии и других блоках Spreads in darkness=Распространяется в темноте diff --git a/mods/ITEMS/mcl_mushrooms/mod.conf b/mods/ITEMS/mcl_mushrooms/mod.conf index 20f7bef16..b3ed9b130 100644 --- a/mods/ITEMS/mcl_mushrooms/mod.conf +++ b/mods/ITEMS/mcl_mushrooms/mod.conf @@ -1,3 +1,3 @@ name = mcl_mushrooms -depends = mcl_sounds, mcl_util +depends = mcl_sounds, mcl_util, mcl_core, mcl_flowers, mcl_potions, mcl_hunger optional_depends = doc diff --git a/mods/ITEMS/mcl_mushrooms/small.lua b/mods/ITEMS/mcl_mushrooms/small.lua index c6d7edcdc..6fdc80c16 100644 --- a/mods/ITEMS/mcl_mushrooms/small.lua +++ b/mods/ITEMS/mcl_mushrooms/small.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_mushrooms:mushroom_brown", { sunlight_propagates = true, paramtype = "light", walkable = false, - groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1}, + groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1, compostability=65}, sounds = mcl_sounds.node_sound_leaves_defaults(), light_source = 1, selection_box = { @@ -62,7 +62,7 @@ minetest.register_node("mcl_mushrooms:mushroom_red", { sunlight_propagates = true, paramtype = "light", walkable = false, - groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1}, + groups = {dig_immediate=3,mushroom=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,enderman_takable=1,deco_block=1, compostability=65}, sounds = mcl_sounds.node_sound_leaves_defaults(), selection_box = { type = "fixed", diff --git a/mods/ITEMS/mcl_mushrooms/suspicious_stew.lua b/mods/ITEMS/mcl_mushrooms/suspicious_stew.lua new file mode 100644 index 000000000..2106ab8ab --- /dev/null +++ b/mods/ITEMS/mcl_mushrooms/suspicious_stew.lua @@ -0,0 +1,131 @@ + +-- ____________________________ +--_________________________________________/ Variables & Functions \_________ + +local eat = minetest.item_eat(6, "mcl_core:bowl") --6 hunger points, player receives mcl_core:bowl after eating + + + +local function poison(itemstack, placer, pointed_thing) + local hunger = mcl_hunger.get_hunger(placer) + if hunger < 20 then + mcl_potions.poison_func(placer, 1, 12) + return eat(itemstack, placer, pointed_thing) + end +end + +local function hunger(itemstack, placer, pointed_thing, player) + local hunger = mcl_hunger.get_hunger(placer) + if hunger < 20 then + return eat(itemstack, placer, pointed_thing) + end +end + +local function jump_boost(itemstack, placer, pointed_thing) + local hunger = mcl_hunger.get_hunger(placer) + if hunger < 20 then + mcl_potions.leaping_func(placer, 1, 6) + return eat(itemstack, placer, pointed_thing) + end +end + +local function regeneration(itemstack, placer, pointed_thing) + local hunger = mcl_hunger.get_hunger(placer) + if hunger < 20 then + mcl_potions.regeneration_func(placer, 1, 8) + return eat(itemstack, placer, pointed_thing) + end +end + +local function night_vision(itemstack, placer, pointed_thing) + local hunger = mcl_hunger.get_hunger(placer) + if hunger < 20 then + mcl_potions.night_vision_func(placer, 1, 5) + return eat(itemstack, placer, pointed_thing) + end +end + + +-- ________________________ +--_________________________________________/ Item Regestration \_________________ +minetest.register_craftitem("mcl_mushrooms:poison_stew",{ + description = "Suspicious Stew", + inventory_image = "suspicious_stew.png", + stack_max = 1, + on_place = poison, + groups = { food = 2, eatable = 4, not_in_creative_inventory=1,}, + _mcl_saturation = 7.2, +}) + +minetest.register_craftitem("mcl_mushrooms:hunger_stew",{ + description = "Suspicious Stew", + inventory_image = "suspicious_stew.png", + stack_max = 1, + on_place = hunger, + groups = { food = 2, eatable = 4, not_in_creative_inventory=1,}, + _mcl_saturation = 7.2, +}) + +minetest.register_craftitem("mcl_mushrooms:jump_boost_stew",{ + description = "Suspicious Stew", + inventory_image = "suspicious_stew.png", + stack_max = 1, + on_place = jump_boost, + groups = { food = 2, eatable = 4, not_in_creative_inventory=1,}, + _mcl_saturation = 7.2, +}) + +minetest.register_craftitem("mcl_mushrooms:regneration_stew",{ + description = "Suspicious Stew", + inventory_image = "suspicious_stew.png", + stack_max = 1, + on_place = regeneration, + groups = { food = 2, eatable = 4, not_in_creative_inventory=1,}, + _mcl_saturation = 7.2, +}) + +minetest.register_craftitem("mcl_mushrooms:night_vision_stew",{ + description = "Suspicious Stew", + inventory_image = "suspicious_stew.png", + stack_max = 1, + on_place = night_vision, + groups = { food = 2, eatable = 4, not_in_creative_inventory=1,}, + _mcl_saturation = 7.2, +}) + +-- ____________________________ +--______________________________________/ Using mcl_hunger API \______________________ +mcl_hunger.register_food("mcl_mushrooms:hunger_stew",6, "mcl_core:bowl", 3.5, 0, 100) -- Register it using mcl_hunger so i can use its poison feature + +-- ______________ +--_________________________________________/ Crafts \________________________________ + +minetest.register_craft({ + output = "mcl_mushrooms:poison_stew", + recipe = { {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}, {"mcl_core:bowl", "mcl_flowers:tulip_white"} }, +}) + +minetest.register_craft({ + output = "mcl_mushrooms:hunger_stew", + recipe = { {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}, {"mcl_core:bowl", "mcl_flowers:blue_orchid"} }, +}) + +minetest.register_craft({ + output = "mcl_mushrooms:hunger_stew", + recipe = { {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}, {"mcl_core:bowl", "mcl_flowers:dandelion"} }, +}) + +minetest.register_craft({ + output = "mcl_mushrooms:jump_boost_stew", + recipe = { {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}, {"mcl_core:bowl", "mcl_flowers:peony"} }, +}) + +minetest.register_craft({ + output = "mcl_mushrooms:regeneration_stew", + recipe = { {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}, {"mcl_core:bowl", "mcl_flowers:oxeye_daisy"} }, +}) + +minetest.register_craft({ + output = "mcl_mushrooms:night_vision_stew", + recipe = { {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"}, {"mcl_core:bowl", "mcl_flowers:poppy"} }, +}) \ No newline at end of file diff --git a/mods/ITEMS/mcl_mushrooms/textures/suspicious_stew.png b/mods/ITEMS/mcl_mushrooms/textures/suspicious_stew.png new file mode 100644 index 000000000..3580c35aa Binary files /dev/null and b/mods/ITEMS/mcl_mushrooms/textures/suspicious_stew.png differ diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index c5e39f753..35da05553 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -167,7 +167,6 @@ minetest.register_node("mcl_nether:soul_sand", { sounds = mcl_sounds.node_sound_sand_defaults(), _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, - -- Movement handling is done in mcl_playerplus mod }) minetest.register_node("mcl_nether:nether_brick", { @@ -203,7 +202,7 @@ minetest.register_node("mcl_nether:nether_wart_block", { stack_max = 64, tiles = {"mcl_nether_nether_wart_block.png"}, is_ground_content = false, - groups = {handy=1, hoey=1, building_block=1}, + groups = {handy=1, hoey=1, building_block=1, compostability=85}, sounds = mcl_sounds.node_sound_leaves_defaults( { footstep={name="default_dirt_footstep", gain=0.7}, @@ -418,3 +417,23 @@ minetest.register_craft({ dofile(minetest.get_modpath(minetest.get_current_modname()).."/nether_wart.lua") dofile(minetest.get_modpath(minetest.get_current_modname()).."/lava.lua") + +local bubble_generation_schema = { + ["mcl_nether:soul_sand"] = "mcl_core:bubble_column_source", + ["mcl_nether:magma"] = "mcl_core:whirlpool_source", +} + +minetest.register_abm({ + label = "Make whirlpools and bubble columns", + nodenames = {"mcl_nether:soul_sand", "mcl_nether:magma"}, + neighbors = {"mcl_core:water_source"}, + interval = 2, + chance = 1, + action = function(pos, node) + local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} + local above_node_name = minetest.get_node(pos_above).name + if above_node_name ~= "mcl_core:water_source" then return end + local new_above_node_name = bubble_generation_schema[node.name] + minetest.swap_node(pos_above, {name = new_above_node_name}) + end, +}) diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr index 3e3583355..ade56c167 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr @@ -1,39 +1,39 @@ # textdomain: mcl_nether Glowstone=Pierre Lumineuse -Glowstone is a naturally-glowing block which is home to the Nether.=La Pierre Lumineuse est un bloc naturellement brillant qui abrite le Nether. +Glowstone is a naturally-glowing block which is home to the Nether.=La Pierre Lumineuse est un bloc naturellement brillant originaire du Nether. Nether Quartz Ore=Minerai de quartz du Nether -Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Le minerai de quartz du Nether est un minerai contenant du quartz du Nether. Il se trouve généralement autour du Néantrack dans le Nether. +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Le minerai de quartz du Nether est un minerai contenant du quartz du Nether. Il se trouve généralement autour de la netherrack dans le Nether. Netherrack=Netherrack -Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Netherrack est un bloc de pierre qui abrite le Nether. Démarrer un feu sur ce bloc créera un feu éternel. +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=La netherrack est un bloc de pierre originaire du Nether. Démarrer un feu sur ce bloc créera un feu éternel. Magma Block=Bloc de Magma -Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Les blocs de magma sont des blocs solides chauds qui blessent quiconque s'y tient, à moins qu'ils n'aient une résistance au feu. Démarrer un feu sur ce bloc créera un feu éternel. +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Les blocs de magma sont des blocs solides chauds qui blessent quiconque s'y tient, à moins d'avoir une résistance au feu. Démarrer un feu sur ce bloc créera un feu éternel. @1 stood too long on a magma block.=@1 s'est tenu trop longtemps sur un bloc de magma. Soul Sand=Sable des âmes -Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Le sable de l'âme est un bloc du Nether. On ne peut que marcher lentement sur le sable de l'âme. L'effet de ralentissement est amplifié lorsque le sable de l'âme est au-dessus de la glace, de la glace tassée ou d'un bloc de slime. +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Le sable de l'âme est un bloc du Nether. On ne peut marcher que lentement sur le sable de l'âme. L'effet de ralentissement est amplifié lorsque le sable de l'âme est au-dessus de la glace, de la glace tassée ou d'un bloc de slime. Nether Brick Block=Bloc de Briques du Nether Red Nether Brick Block=Bloc de Briques Rouges du Nether Nether Wart Block=Bloc de Verrues du Nether -A nether wart block is a purely decorative block made from nether wart.=Un bloc de verrues du Nether est un bloc purement décoratif fabriqué à partir de verrue du Nether. +A nether wart block is a purely decorative block made from nether wart.=Un bloc de verrues du Nether est un bloc purement décoratif fabriqué à partir de verrues du Nether. Block of Quartz=Bloc de Quartz Chiseled Quartz Block=Bloc de Quartz sculpté Pillar Quartz Block=Bloc de Quartz rayé Smooth Quartz=Quartz Lisse Glowstone Dust=Poudre Lumineuse -Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=La poudre lumineuse est la poussière qui sort des pierres incandescentes brisées. Il est principalement utilisé dans l'artisanat. +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=La poudre lumineuse est la poussière qui sort des pierres lumineuses brisées. Elle est principalement utilisée dans l'artisanat. Nether Quartz=Quartz du Nether Nether quartz is a versatile crafting ingredient.=Le quartz du Nether est un ingrédient artisanal polyvalent. Nether Brick=Brique du Nether Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Les briques du Nether sont le principal ingrédient pour la fabrication de blocs de briques et de clôtures du Nether. Nether Lava Source=Source de Lave du Nether -Flowing Nether Lava=Lave du Nether en Mouvement +Flowing Nether Lava=Lave du Nether en mouvement Premature Nether Wart (Stage 1)=Verrue du Néant prématurée (étape 1) -A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Une verrue du Nether prématurée vient d'être plantée sur du sable d'âme. La verrue du Nether pousse lentement sur le sable de l'âme en 4 étapes (les deuxième et troisième étapes semblent identiques). Bien que la verrue du Nether habite le Nether, elle se développe dans toutes les dimensions. -Premature Nether Wart (Stage 2)=Verrue du Néant prématurée (étape 2) -Premature Nether Wart (Stage 3)=Verrue du Néant prématurée (étape 3) -Mature Nether Wart=Verrue du Néant Mature -The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=La verrue du Nether mature est une plante du Nether qui a atteint sa taille maximale et ne poussera plus. Il est prêt à être récolté pour ses articles. +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Une verrue du Nether prématurée vient d'être plantée sur du sable d'âme. La verrue du Nether pousse lentement sur le sable de l'âme en 4 étapes (les deuxième et troisième étapes semblent identiques). Bien que la verrue du Nether soit originaire du Nether, elle se développe dans toutes les dimensions. +Premature Nether Wart (Stage 2)=Verrue du Nether prématurée (étape 2) +Premature Nether Wart (Stage 3)=Verrue du Nether prématurée (étape 3) +Mature Nether Wart=Verrue du Nether Mature +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=La verrue du Nether mature est une plante du Nether qui a atteint sa taille maximale et ne poussera plus. Elle est prête à être récoltée. Nether Wart=Verrues du Nether -Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Les verrues du Nether sont des plantes qui habitent le Nether. Ils peuvent être plantés sur du sable d'âme et se développer en 4 étapes. +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Les verrues du Nether sont des plantes originaires du Nether. Elles peuvent être plantées sur du sable d'âme et se développer en 4 étapes. Place this item on soul sand to plant it and watch it grow.=Placez cet article sur du sable d'âme pour le planter et regardez-le grandir. Burns your feet=Vous brûle les pieds Grows on soul sand=Pousse sur le sable de l'âme diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr index f546d16ca..55282d19b 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr @@ -1,40 +1,43 @@ # textdomain: mcl_nether -Glowstone=Светящийся камень -Glowstone is a naturally-glowing block which is home to the Nether.=Светящийся камень это природный источник света, блок, встречающийся в Аду. +Glowstone=Светокамень +Glowstone is a naturally-glowing block which is home to the Nether.=Светокамень это природный светящийся блок, встречающийся в Нижнем мире. Nether Quartz Ore=Кварцевая руда -Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Кварцевая руда это порода, содержащая адский кварц. Часто встречается в Аду вокруг адского камня. +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Кварцевая руда это порода, содержащая кварц. Часто встречается в Нижнем мире вокруг незерита. Netherrack=Адский камень -Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Адский камень это блок, выглядящий как камень, домом которого является Ад. Разжигание огня на этом блоке создаст вечный огонь. +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Адский камень это блок, выглядящий как камень, домом которого является Нижний мир. Разжигание огня на этом блоке создаст вечный огонь. Magma Block=Блок магмы -Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Блоки магмы это горячие твёрдые блоки, причиняющие боль тем, кто на них стоит, если у них нет защиты от огня. Разжигание огня на таком блоке создаст вечный огонь. -@1 stood too long on a magma block.=@1 слишком долго стоял(а) на магмовом блоке. +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Блоки магмы это горячие твёрдые блоки, причиняющие урон тем, кто на них стоит, если у них нет защиты от огня. Разжигание огня на таком блоке создаст вечный огонь. +@1 stood too long on a magma block.=@1 слишком долго стоял на магмовом блоке. Soul Sand=Песок душ -Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Песок душ это блок из Ада. Идти по нему можно только медленно. Замедляющий эффект усиливается, если песок душ лежит на льду, упакованном льду или блоке слизи. +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Песок душ это блок из Нижнего мира. Идти по нему можно только медленно. Замедляющий эффект усиливается, если песок душ стоит на льду, плотном льду или блоке слизи. Nether Brick Block=Блок адского кирпича -Red Nether Brick Block=Красный блок адского кирпича +Red Nether Brick Block=Блок красного адского кирпича Nether Wart Block=Блок адского нароста -A nether wart block is a purely decorative block made from nether wart.=Блок адского нароста это чисто декоративный блок, сделанный из адского нароста. +A nether wart block is a purely decorative block made from nether wart.=Блок адского нароста это декоративный блок, сделанный из адского нароста. Block of Quartz=Кварцевый блок -Chiseled Quartz Block=Точёный кварцевый блок -Pillar Quartz Block=Кварцевый столб +Chiseled Quartz Block=Резной кварцевый блок +Pillar Quartz Block=Кварцевая колонна Smooth Quartz=Гладкий кварц -Glowstone Dust=Светящаяся пыль -Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=Светящаяся пыль это пыль, которая получается из сломанного светящегося камня. -Nether Quartz=Адский кварц -Nether quartz is a versatile crafting ingredient.=Адский кварц это универсальный ингредиент для крафтинга. +Glowstone Dust=Светопыль +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=Светопыль это пыль, которая получается из сломанного светящегося камня. +Nether Quartz=Кварц Нижнего мира +Nether quartz is a versatile crafting ingredient.=Кварц Нижнего мира это универсальный материал для крафта. Nether Brick=Адский кирпич -Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Адские кирпичи это главный ингредиент для создания блоков адских кирпичей. +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Адские кирпичи это главный материал для создания блоков адских кирпичей. Nether Lava Source=Адский источник лавы Flowing Nether Lava=Текущая адская лава Premature Nether Wart (Stage 1)=Саженец адского нароста (стадия 1) -A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Саженец адского нароста был недавно высажен на песке душ. Его медленный рост происходит 4 стадии (вторая и третья стадии неотличимы на глаз). Хотя домом адского нароста является Ад, он растёт в любом измерении. +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Саженец адского нароста был недавно посажен на песке душ. Его медленный рост происходит 4 стадии (вторая и третья стадии неотличимы на глаз). Хотя домом адского нароста является Ад, он растёт в любом измерении. Premature Nether Wart (Stage 2)=Саженец адского нароста (стадия 2) Premature Nether Wart (Stage 3)=Саженец адского нароста (стадия 3) Mature Nether Wart=Зрелый адский нарост -The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=Зрелый адский нарост это растение Ада, достигшее своего полного размера, дальше расти оно уже не будет. Оно готово к сбору в качестве предметов. +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=Зрелый адский нарост это растение Нижнего мира, достигшее своего полного размера, дальше расти оно уже не будет. Оно готово к сбору в качестве предметов. Nether Wart=Адский нарост -Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Адские наросты это растения, домом которых является Ад. Их можно высаживать на песке душ, и они растут в 4 стадии. -Place this item on soul sand to plant it and watch it grow.=Поместите этот предмет на песок душ, чтобы посадить его и наблюдать за его ростом. +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Адские наросты это растения, домом которых является Нижний мир. Их можно высаживать на песке душ, и они растут в 4 стадии. +Place this item on soul sand to plant it and watch it grow.=Поместите этот предмет на песок душ, чтобы посадить его для выращивания. Burns your feet=Обжигает ваши ноги Grows on soul sand=Растёт на песке душ Reduces walking speed=Уменьшает скорость ходьбы +Netherite Scrap=Осколок незерита +Netherite Ingot=Незеритовый слиток +Ancient Debris=Древние обломки \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt index 0e69ad520..58aabd72d 100644 --- a/mods/ITEMS/mcl_nether/locale/template.txt +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -37,4 +37,7 @@ Nether warts are plants home to the Nether. They can be planted on soul sand and Place this item on soul sand to plant it and watch it grow.= Burns your feet= Grows on soul sand= -Reduces walking speed= \ No newline at end of file +Reduces walking speed= +Netherite Scrap= +Netherite Ingot= +Ancient Debris= diff --git a/mods/ITEMS/mcl_nether/mod.conf b/mods/ITEMS/mcl_nether/mod.conf index f5ffa61ac..55f635d2c 100644 --- a/mods/ITEMS/mcl_nether/mod.conf +++ b/mods/ITEMS/mcl_nether/mod.conf @@ -1,3 +1,3 @@ name = mcl_nether -depends = mcl_core, mcl_sounds, mcl_util, walkover, doc_items, mcl_colors +depends = mcl_core, mcl_sounds, mcl_util, walkover, doc_items, mcl_colors, mcl_time optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_nether/nether_wart.lua b/mods/ITEMS/mcl_nether/nether_wart.lua index 41b23f662..e7452a211 100644 --- a/mods/ITEMS/mcl_nether/nether_wart.lua +++ b/mods/ITEMS/mcl_nether/nether_wart.lua @@ -2,6 +2,10 @@ local S = minetest.get_translator(minetest.get_current_modname()) local table = table +local interval = 35 +local chance = 11 +local max_interval = interval * chance + minetest.register_node("mcl_nether:nether_wart_0", { description = S("Premature Nether Wart (Stage 1)"), _doc_items_longdesc = S("A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension."), @@ -22,6 +26,7 @@ minetest.register_node("mcl_nether:nether_wart_0", { }, groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), + on_construct = mcl_time.touch, }) minetest.register_node("mcl_nether:nether_wart_1", { @@ -44,6 +49,7 @@ minetest.register_node("mcl_nether:nether_wart_1", { }, groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), + on_construct = mcl_time.touch, }) minetest.register_node("mcl_nether:nether_wart_2", { @@ -66,6 +72,7 @@ minetest.register_node("mcl_nether:nether_wart_2", { }, groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), + on_construct = mcl_time.touch, }) minetest.register_node("mcl_nether:nether_wart", { @@ -143,45 +150,68 @@ minetest.register_craftitem("mcl_nether:nether_wart_item", { end end end, - groups = { craftitem = 1, brewitem=1 }, + groups = { craftitem = 1, brewitem=1, compostability=30 }, }) local names = {"mcl_nether:nether_wart_0", "mcl_nether:nether_wart_1", "mcl_nether:nether_wart_2"} +local function grow(pos, node) + local step = nil + local node = node or minetest.get_node(pos) + for i, name in ipairs(names) do + if name == node.name then + step = i + break + end + end + if not step then return end + local new_node = {name = names[step + 1]} + if not new_node.name then + new_node.name = "mcl_nether:nether_wart" + end + new_node.param = node.param + new_node.param2 = node.param2 + minetest.set_node(pos, new_node) +end + minetest.register_abm({ label = "Nether wart growth", nodenames = {"mcl_nether:nether_wart_0", "mcl_nether:nether_wart_1", "mcl_nether:nether_wart_2"}, neighbors = {"group:soil_nether_wart"}, - interval = 35, - chance = 11, + interval = interval, + chance = 1, action = function(pos, node) pos.y = pos.y-1 if minetest.get_item_group(minetest.get_node(pos).name, "soil_nether_wart") == 0 then return end pos.y = pos.y+1 - local step = nil - for i,name in ipairs(names) do - if name == node.name then - step = i - break - end + + for i = 1, mcl_time.get_number_of_times_at_pos(pos, interval, chance) do + grow(pos) end - if step == nil then + end +}) + +minetest.register_lbm({ + label = "Nether wart growth update", + name = "mcl_nether:growth_warts", + nodenames = {"mcl_nether:nether_wart_0", "mcl_nether:nether_wart_1", "mcl_nether:nether_wart_2"}, + run_at_every_load = true, + action = function(pos, node) + pos.y = pos.y-1 + if minetest.get_item_group(minetest.get_node(pos).name, "soil_nether_wart") == 0 then return end - local new_node = {name=names[step+1]} - if new_node.name == nil then - new_node.name = "mcl_nether:nether_wart" + pos.y = pos.y+1 + for i = 1, mcl_time.get_number_of_times_at_pos(pos, interval, chance) do + grow(pos) end - new_node.param = node.param - new_node.param2 = node.param2 - minetest.set_node(pos, new_node) end }) if minetest.get_modpath("doc") then - for i=1,2 do + for i=1, 2 do doc.add_entry_alias("nodes", "mcl_nether:nether_wart_0", "nodes", "mcl_nether:nether_wart_"..i) end end diff --git a/mods/ITEMS/mcl_ocean/kelp.lua b/mods/ITEMS/mcl_ocean/kelp.lua index 422f475ac..fbdb12448 100644 --- a/mods/ITEMS/mcl_ocean/kelp.lua +++ b/mods/ITEMS/mcl_ocean/kelp.lua @@ -741,7 +741,7 @@ minetest.register_craftitem("mcl_ocean:kelp", { inventory_image = "mcl_ocean_kelp_item.png", wield_image = "mcl_ocean_kelp_item.png", on_place = kelp.kelp_on_place, - groups = { deco_block = 1 }, + groups = { deco_block = 1, compostability=30 }, }) if mod_doc then @@ -756,7 +756,7 @@ minetest.register_craftitem("mcl_ocean:dried_kelp", { _doc_items_longdesc = S("Dried kelp is a food item."), inventory_image = "mcl_ocean_dried_kelp.png", wield_image = "mcl_ocean_dried_kelp.png", - groups = { food = 2, eatable = 1 }, + groups = { food = 2, eatable = 1, compostability=30 }, on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), _mcl_saturation = 0.6, @@ -773,7 +773,7 @@ minetest.register_node("mcl_ocean:dried_kelp_block", { description = S("Dried Kelp Block"), _doc_items_longdesc = S("A decorative block that serves as a great furnace fuel."), tiles = { "mcl_ocean_dried_kelp_top.png", "mcl_ocean_dried_kelp_bottom.png", "mcl_ocean_dried_kelp_side.png" }, - groups = { handy = 1, hoey = 1, building_block = 1, flammable = 2, fire_encouragement = 30, fire_flammability = 60 }, + groups = { handy = 1, hoey = 1, building_block = 1, flammable = 2, fire_encouragement = 30, fire_flammability = 60, compostability=50 }, sounds = mcl_sounds.node_sound_leaves_defaults(), paramtype2 = "facedir", on_place = mcl_util.rotate_axis, diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr index a1b3f0b77..cc58aa898 100644 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr @@ -1,8 +1,8 @@ # textdomain: mcl_ocean Sea Lantern=Lanterne aquatique -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Les lanternes marines sont des sources lumineuses décoratives qui ont fière allure sous l'eau mais peuvent être placées n'importe où. +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Les lanternes aquatiques sont des sources lumineuses décoratives qui ont fière allure sous l'eau mais peuvent être placées n'importe où. Prismarine=Prismarine -Prismarine is used as a building block. It slowly changes its color.=La prismarine est utilisée comme bloc de construction. Il change lentement de couleur. +Prismarine is used as a building block. It slowly changes its color.=La prismarine est utilisée comme bloc de construction. Elle change lentement de couleur. Prismarine Bricks=Prismarine Taillée Dark Prismarine=Prismarine Sombre Prismarine Crystals=Cristaux de Prismarine @@ -41,12 +41,12 @@ Dead Tube Coral Fan=Gorgone de Corail Tubulaire Mort Dead Tube Coral=Corail Tubulaire Mort Seagrass=Herbe aquatique Kelp=Algue -Kelp grows inside water on top of dirt, sand or gravel.=Les Algues pousse à l'intérieur de l'eau sur la terre, le sable ou le gravier. +Kelp grows inside water on top of dirt, sand or gravel.=Les algues poussent à l'intérieur de l'eau sur la terre, le sable ou le gravier. Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Les blocs de corail vivent dans les océans et ont besoin d'une source d'eau à côté d'eux pour survivre. Sans eau, ils meurent. Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Les coraux se développent au-dessus des blocs de corail et doivent être à l'intérieur d'une source d'eau pour survivre. Sans eau, il mourra, ainsi que le bloc de corail en dessous. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Les gorgones de coraux se développent au-dessus des blocs de corail et doivent être à l'intérieur d'une source d'eau pour survivre. Sans eau, il mourra, ainsi que le bloc de corail en dessous. -Seagrass grows inside water on top of dirt, sand or gravel.=Les herbiers aquatique poussent à l'intérieur de l'eau sur la terre, le sable ou le gravier. -A decorative block that serves as a great furnace fuel.=Un bloc décoratif qui sert de bon combustible pour le four. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Les gorgones de coraux se développent au-dessus des blocs de corail et doivent être à l'intérieur d'une source d'eau pour survivre. Sans eau, elle mourra, ainsi que le bloc de corail en dessous. +Seagrass grows inside water on top of dirt, sand or gravel.=Les herbes aquatique poussent à l'intérieur de l'eau sur la terre, le sable ou le gravier. +A decorative block that serves as a great furnace fuel.=Un bloc décoratif qui est un bon combustible pour le four. Dried kelp is a food item.=L'algue séchée est un aliment. Grows on coral block of same species=Pousse sur un bloc de corail de la même espèce Needs water to live=A besoin d'eau pour vivre @@ -55,5 +55,5 @@ Glows in the water=Brille dans l'eau 4 possible sizes=4 tailles possibles Grows on dead brain coral block=Pousse sur un bloc de corail mort Sea Pickle=Cornichon de mer -Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Les cornichons de mer poussent sur des blocs de corail morts et fournissent de la lumière lorsqu'ils sont sous l'eau. Ils viennent en 4 tailles qui varient en luminosité. -It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Il ne peut être placé que sur des blocs de corail morts. Placer un cornichon sur un autre cornichon le rendra plus brillant et plus brillant. \ No newline at end of file +Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Les cornichons de mer poussent sur des blocs de corail morts et fournissent de la lumière lorsqu'ils sont sous l'eau. Ils existent en 4 tailles qui varient en luminosité. +It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Il ne peut être placé que sur des blocs de corail morts. Placer un cornichon sur un autre cornichon le rendra de plus en plus brillant. \ No newline at end of file diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr index e7e5a12e3..fb05de2cf 100644 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr @@ -1,59 +1,59 @@ # textdomain: mcl_ocean -Sea Lantern=Морской светильник -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Морской светильник это декоративный источник света. Он отлично смотрится под водой, но размещать его можно в любых местах. +Sea Lantern=Морской фонарь +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Морской фонарь это декоративный источник света. Он отлично смотрится под водой, но размещать его можно в любых местах. Prismarine=Призмарин -Prismarine is used as a building block. It slowly changes its color.=Призмарин хорош как строительный блок. Он медленно меняет свой цвет. +Prismarine is used as a building block. It slowly changes its color.=Призмарин это строительный блок. Он медленно меняет свой цвет. Prismarine Bricks=Призмариновые кирпичи Dark Prismarine=Тёмный призмарин -Prismarine Crystals=Призмариновые кристаллы +Prismarine Crystals=Призмариновый кристалл Prismarine Shard=Осколок призмарина Dried Kelp=Сушёная ламинария -Dried Kelp Block=Блок сухой ламинарии -Brain Coral Block=Блок мозгового коралла -Brain Coral Fan=Вентилятор мозгового коралла +Dried Kelp Block=Блок сушёной ламинарии +Brain Coral Block=Мозговой коралловый блок +Brain Coral Fan=Мозговой веерный коралл Brain Coral=Мозговой коралл -Bubble Coral Block=Блок пузыристого коралла -Bubble Coral Fan=Вентилятор пузыристого коралла -Bubble Coral=Пузыристый коралл -Fire Coral Block=Блок огненного коралла -Fire Coral Fan=Вентилятор огненного коралла +Bubble Coral Block=Пузырчатый коралловый блок +Bubble Coral Fan=Пузырчатый веерный коралл +Bubble Coral=Пузырчатый коралл +Fire Coral Block=Огненный коралловый блок +Fire Coral Fan=Огненный веерный коралл Fire Coral=Огненный коралл -Horn Coral Block=Блок рожкового коралла -Horn Coral Fan=Вентилятор рожкового коралла -Horn Coral=Рожковый коралл -Tube Coral Block=Блок трубного коралла -Tube Coral Fan=Вентилятор трубного коралла -Tube Coral=Трубный коралл -Dead Brain Coral Block=Блок мёртвого мозгового коралла -Dead Brain Coral Fan=Вентилятор мёртвого мозгового коралла +Horn Coral Block=Роговый коралловый блок +Horn Coral Fan=Роговый веерный коралл +Horn Coral=Роговый коралл +Tube Coral Block=Трубчатый коралловый блок +Tube Coral Fan=Трубчатый веерный коралл +Tube Coral=Трубчатый коралл +Dead Brain Coral Block=Мёртвый мозговой коралловый блок +Dead Brain Coral Fan=Мёртвый веерный мозговой коралл Dead Brain Coral=Мёртвый мозговой коралл -Dead Bubble Coral Block=Блок мёртвого пузыристого коралла -Dead Bubble Coral Fan=Вентилятор мёртвого пузыристого коралла -Dead Bubble Coral=Мёртвый пузыристый коралл -Dead Fire Coral Block=Блок мёртвого огненного коралла -Dead Fire Coral Fan=Вентилятор мёртвого огненного коралла +Dead Bubble Coral Block=Мёртвый пузырчатый коралловый блок +Dead Bubble Coral Fan=Мёртвый веерный пузырчатый коралл +Dead Bubble Coral=Мёртвый пузырчатый коралл +Dead Fire Coral Block=Мёртвый огненный коралловый блок +Dead Fire Coral Fan=Мёртвый веерный огненный коралл Dead Fire Coral=Мёртвый огненный коралл -Dead Horn Coral Block=Блок мёртвого рожкового коралла -Dead Horn Coral Fan=Вентилятор мёртвого рожкового коралла -Dead Horn Coral=Мёртвый рожковый коралл -Dead Tube Coral Block=Блок мёртвого трубного коралла -Dead Tube Coral Fan=Вентилятор мёртвого трубного коралла -Dead Tube Coral=Мёртвый трубный коралл +Dead Horn Coral Block=Мёртвый роговый коралловый блок +Dead Horn Coral Fan=Мёртвый веерный роговый коралл +Dead Horn Coral=Мёртвый роговый коралл +Dead Tube Coral Block=Мёртвый трубчатый коралловый блок +Dead Tube Coral Fan=Мёртвый веерный трубчатый коралл +Dead Tube Coral=Мёртвый трубчатый коралл Seagrass=Водоросли Kelp=Ламинария -Kelp grows inside water on top of dirt, sand or gravel.=Водоросли растут в воде поверх грязи, песка или гравия. +Kelp grows inside water on top of dirt, sand or gravel.=Ламинария растет под водой на земле, песке или гравии. Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Коралловые блоки живут в океанах и нуждаются в источниках воды рядом с ними, чтобы выжить. Без воды они умирают. -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллы растут на вершинах коралловых блоков и должны быть внутри источника воды, чтобы жить. Без воды они умирают, как и коралловые блоки внизу. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллов вентиляторы растут на вершинах коралловых блоков и должны быть внутри источника воды, чтобы выжить. Без воды они умирают, как и коралловые блоки внизу. -Seagrass grows inside water on top of dirt, sand or gravel.=Водоросли растут в воде поверх грязи, песка или гравия. +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллы растут на коралловых блоках и должны быть внутри источника воды, чтобы жить. Без воды они умирают, как и коралловые блоки внизу. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Веерные кораллы растут на коралловых блоках и должны быть внутри источника воды, чтобы выжить. Без воды они умирают, как и коралловые блоки внизу. +Seagrass grows inside water on top of dirt, sand or gravel.=Водоросли растут под водой на земле, песке или гравии. A decorative block that serves as a great furnace fuel.=Декоративный блок, служащий отличным топливом для печи. -Dried kelp is a food item.=Сушеная ламинария - это продуктовый предмет. +Dried kelp is a food item.=Сушёная ламинария - это съедобный продукт. Grows on coral block of same species=Растет на коралловом блоке того же вида Needs water to live=Нуждается в воде, чтобы жить -Grows in water on dirt, sand, gravel=Растёт в воде на грязи, песке, гравии +Grows in water on dirt, sand, gravel=Растёт под водой на земле, песке, гравии Glows in the water=Светится в воде 4 possible sizes=4 возможных размера Grows on dead brain coral block=Растёт на блоке мёртвого коралла Sea Pickle=Морской огурец -Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Морские огурцы растут на мертвых коралловых блоках и дают свет под водой. Они бывают четырёх размеров, которые различаются по яркости. -It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Это можно помещать только на верхушку блока мертвого мозгового коралла. Помещение морского огурца на другой морской огурец приведёт к тому, что он вырастет и станет ярче. +Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Морские огурцы растут на мертвых коралловых блоках и излучают свет под водой. Они бывают четырёх размеров, которые отличаются яркости. +It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Морской огурец можно помещать только на мёртвый мозговой коралловый блок. Помещение морского огурца на другой морской огурец приведёт к тому, что он вырастет и станет светить ярче. diff --git a/mods/ITEMS/mcl_ocean/sea_pickle.lua b/mods/ITEMS/mcl_ocean/sea_pickle.lua index d215fd3b3..435dc10f0 100644 --- a/mods/ITEMS/mcl_ocean/sea_pickle.lua +++ b/mods/ITEMS/mcl_ocean/sea_pickle.lua @@ -106,7 +106,7 @@ for s=1,4 do }, inventory_image = img, wield_image = img, - groups = { dig_immediate = 3, deco_block = 1, sea_pickle=1, not_in_creative_inventory=nici }, + groups = { dig_immediate = 3, deco_block = 1, sea_pickle=1, not_in_creative_inventory=nici, compostability=65 }, -- Light level: 6 at size 1, +3 for each additional stage light_source = math.min(6 + (s-1)*3, minetest.LIGHT_MAX), selection_box = { diff --git a/mods/ITEMS/mcl_ocean/seagrass.lua b/mods/ITEMS/mcl_ocean/seagrass.lua index 5fd382775..52c506f81 100644 --- a/mods/ITEMS/mcl_ocean/seagrass.lua +++ b/mods/ITEMS/mcl_ocean/seagrass.lua @@ -85,7 +85,7 @@ minetest.register_craftitem("mcl_ocean:seagrass", { inventory_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", wield_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", on_place = seagrass_on_place, - groups = { deco_block = 1 }, + groups = { deco_block = 1, compostability=30 }, }) -- Seagrass nodes: seagrass on a surface node diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr index 4b2598b13..fac73b324 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr @@ -1,15 +1,15 @@ # textdomain: mcl_portals End Portal=Portail de l'End -An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Un portail de l'End téléporte des créatures et des objets dans la mystérieuse dimension End (et vice-versa!). +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Un portail de l'End téléporte des créatures et des objets dans la mystérieuse dimension de l'End (et les ramène !). Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Sautez dans le portail pour vous téléporter. Entrer dans un portail d'End dans l'Overworld vous téléporte à une position fixe dans la dimension d'End et crée une plate-forme d'obsidienne 5×5 à votre destination. Les portails de l'End à la fin vous ramèneront à votre point d'apparition dans l'Overworld. End Portal Frame=Cadre de Portail de l'End -End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Les portiques d'End sont utilisés dans la construction de portails d'End. Chaque bloc a une prise pour un oeil d'ender. +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Les cadres de portail de l'End sont utilisés dans la construction de portails d'End. Chaque bloc a un emplacement pour un oeil d'ender. NOTE: The End dimension is currently incomplete and might change in future versions.=REMARQUE: la dimension d'End est actuellement incomplète et pourrait changer dans les futures versions. End Portal Frame with Eye of Ender=Cadre de portail de l'End avec Oeil d'Ender Nether Portal=Portail du Nether -A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk! +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Un portail du Nether téléporte des créatures et des objets dans la dimension brûlante et dangereuse du Nether (et les ramène !). Entrez à vos risques et périls ! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'Overworld. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruit, ou s'il a été pris dans une explosion. -Obsidian is also used as the frame of Nether portals.=Obsidian is also used as the frame of Nether portals. -To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'une largeur d'au moins 4 blocs et d'une hauteur de 5 blocs, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre d'obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether. +Obsidian is also used as the frame of Nether portals.=L'obsidienne est également utilisée comme cadre des portails du Nether. +To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'au moins 4 blocs de largeur et 5 blocs de hauteur, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre d'obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether. Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'ender ne peut pas être repris. Used to construct end portals=Utilisé pour construire des portails d'End \ No newline at end of file diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr index 8b6310793..469c36977 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr @@ -1,15 +1,15 @@ # textdomain: mcl_portals -End Portal=Портал Предела -An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Портал Предела телепортирует создания и объекты в загадочное измерение Предел (и обратно!) -Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Прыгайте в портал, чтобы телепортироваться. Вход в портал Предела в Верхнем мире телепортирует вас в определённое место в измерении Предела и создаёт обсидиановую платформу 5×5 в пункте вашего назначения. Портал предела в Пределе перебросит вас в вашу точку возрождения в Верхнем мире. -End Portal Frame=Рамка портала Предела -End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Рамка портала Предела используется для построения порталов Предела. Каждый блок имеет отсек для ока Предела. -NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Предел в данный момент не завершено и может измениться в будущих версиях. -End Portal Frame with Eye of Ender=Рамка портала Предела с оком Предела +End Portal=Портал Края +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Портал Края телепортирует существ и объекты в загадочное измерение Края (и обратно!) +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Прыгайте в портал, чтобы телепортироваться. Портал Края в Верхнем мире телепортирует вас в определённое место в измерении Края и создаёт обсидиановую платформу 5×5 в пункте вашего назначения. Портал Края в измерении Края телепортирует вас в вашу точку возрождения в Верхнем мире. +End Portal Frame=Рамка портала Края +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Рамка портала Края используется для построения порталов Края. Каждый блок имеет слот для ока Края. +NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Края в данный момент не завершено и может измениться в будущих версиях. +End Portal Frame with Eye of Ender=Рамка портала Края с оком Края Nether Portal=Адский портал -A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Адский портал переносит создания и объекты в горячее и опасное измерение Ад (и обратно!). Используйте на свой страх и риск! -Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Стойте в портале несколько секунд для запуска телепортации. Вход в портал Ада в первый раз приведёт к созданию аналогичного портала в другом измерении. Если Адский портал создан в Аду, он ведёт в Верхний мир. Портал Ада уничтожается, если уничтожается любой блок обсидиана из окружающих его, либо при задевании взрывом. -Obsidian is also used as the frame of Nether portals.=Обсидиан также используется в качестве рамки портала Ада -To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Чтобы открыть портал Ада, постройте рамку из обсидиана шириной не менее 4 блоков и высото не менее 5, оставляя в центре лишь воздух. После создания обсидиановой рамки зажгите в ней огонь. Адские порталы работают только в Верхнем мире и в Аду. -Once placed, an eye of ender can not be taken back.=Однажды размещённое, око Предела нельзя взять обратно. -Used to construct end portals=Используется для создания порталов Предела +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Адский портал переносит создания и объекты в горячее и опасное измерение Нижнего мира (и обратно!). Используйте на свой страх и риск! +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Стойте в портале несколько секунд для запуска телепортации. Вход в портал Нижнего мира в первый раз приведёт к созданию аналогичного портала в другом измерении. Если Адский портал создан в Нижнем мире, он приведёт в Верхний мир. Адский портал уничтожается, если уничтожается любой блок обсидиана из окружающих его, либо при задевании взрывом. +Obsidian is also used as the frame of Nether portals.=Обсидиан также используется в качестве рамки Адского портала +To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Чтобы открыть Адский портал, постройте рамку из обсидиана шириной не менее 4 блоков и высотой не менее 5, оставляя в центре рамки лишь воздух. После создания обсидиановой рамки зажгите в ней огонь. Адские порталы работают только в Верхнем мире и в Нижнем мире. +Once placed, an eye of ender can not be taken back.=Размещенное око Края нельзя забрать обратно. +Used to construct end portals=Используется для создания порталов Края diff --git a/mods/ITEMS/mcl_portals/mod.conf b/mods/ITEMS/mcl_portals/mod.conf index 610b590c6..d4b82cc58 100644 --- a/mods/ITEMS/mcl_portals/mod.conf +++ b/mods/ITEMS/mcl_portals/mod.conf @@ -1,4 +1,4 @@ name = mcl_portals description = Adds buildable portals to the Nether and End dimensions. -depends = mcl_nether, mcl_end, mcl_particles, mcl_spawn, mcl_credits +depends = mcl_mapgen, mcl_nether, mcl_end, mcl_particles, mcl_spawn, mcl_credits, mcl_structures optional_depends = awards, doc diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index e4982c39b..9e1a67a75 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -6,12 +6,6 @@ local math = math local has_doc = minetest.get_modpath("doc") --- Parameters ---local SPAWN_MIN = mcl_vars.mg_end_min+70 ---local SPAWN_MAX = mcl_vars.mg_end_min+98 - ---local mg_name = minetest.get_mapgen_setting("mg_name") - local function destroy_portal(pos) local neighbors = { { x=1, y=0, z=0 }, @@ -184,7 +178,7 @@ function mcl_portals.end_teleport(obj, pos) -- Teleport to the End at a fixed position and generate a -- 5×5 obsidian platform below. - local platform_pos = mcl_vars.mg_end_platform_pos + local platform_pos = mcl_mapgen.end_.platform_pos -- force emerge of target1 area minetest.get_voxel_manip():read_from_map(platform_pos, platform_pos) if not minetest.get_node_or_nil(platform_pos) then diff --git a/mods/ITEMS/mcl_portals/portal_gateway.lua b/mods/ITEMS/mcl_portals/portal_gateway.lua index ca15a61d5..505935105 100644 --- a/mods/ITEMS/mcl_portals/portal_gateway.lua +++ b/mods/ITEMS/mcl_portals/portal_gateway.lua @@ -29,9 +29,15 @@ local gateway_positions = { local path_gateway_portal = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_gateway_portal.mts" local function spawn_gateway_portal(pos, dest_str) - return mcl_structures.place_schematic(vector.add(pos, vector.new(-1, -2, -1)), path_gateway_portal, "0", nil, true, nil, dest_str and function() - minetest.get_meta(pos):set_string("mcl_portals:gateway_destination", dest_str) - end) + return mcl_structures.place_schematic({ + pos = vector.add(pos, vector.new(-1, -2, -1)), + schematic = path_gateway_portal, + rotation = "0", + force_placement = true, + on_placed = dest_str and function() + minetest.get_meta(pos):set_string("mcl_portals:gateway_destination", dest_str) + end, + }) end function mcl_portals.spawn_gateway_portal() diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 838c1be95..7390bbb2f 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -19,7 +19,7 @@ local W_MIN, W_MAX = 4, 23 local H_MIN, H_MAX = 5, 23 local N_MIN, N_MAX = 6, (W_MAX-2) * (H_MAX-2) local TRAVEL_X, TRAVEL_Y, TRAVEL_Z = 8, 1, 8 -local LIM_MIN, LIM_MAX = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max +local LIM_MIN, LIM_MAX = mcl_mapgen.EDGE_MIN, mcl_mapgen.EDGE_MAX local PLAYER_COOLOFF, MOB_COOLOFF = 3, 14 -- for this many seconds they won't teleported again local TOUCH_CHATTER_TIME = 1 -- prevent multiple teleportation attempts caused by multiple portal touches, for this number of seconds local CHATTER_US = TOUCH_CHATTER_TIME * 1000000 @@ -27,8 +27,8 @@ local DELAY = 3 -- seconds before teleporting in Nether portal in Survival mo local DISTANCE_MAX = 128 local PORTAL = "mcl_portals:portal" local OBSIDIAN = "mcl_core:obsidian" -local O_Y_MIN, O_Y_MAX = max(mcl_vars.mg_overworld_min, -31), min(mcl_vars.mg_overworld_max, 2048) -local N_Y_MIN, N_Y_MAX = mcl_vars.mg_bedrock_nether_bottom_min, mcl_vars.mg_bedrock_nether_top_min - H_MIN +local O_Y_MIN, O_Y_MAX = max(mcl_mapgen.overworld.min, -31), min(mcl_mapgen.overworld.max, 2048) +local N_Y_MIN, N_Y_MAX = mcl_mapgen.nether.bedrock_bottom_min, mcl_mapgen.nether.bedrock_top_min - H_MIN -- Alpha and particles local node_particles_allowed = minetest.settings:get("mcl_node_particles") or "none" @@ -66,7 +66,7 @@ minetest.register_on_shutdown(function() storage:set_string("nether_exits_keys", minetest.serialize(keys)) end) -local get_node = mcl_vars.get_node +local get_node = mcl_mapgen.get_far_node local set_node = minetest.set_node local registered_nodes = minetest.registered_nodes local is_protected = minetest.is_protected @@ -209,39 +209,6 @@ local function get_target(p) end end --- Destroy portal if pos (portal frame or portal node) got destroyed -local function destroy_nether_portal(pos, node) - if not node then return end - local nn, orientation = node.name, node.param2 - local obsidian = nn == OBSIDIAN - - local function check_remove(pos, orientation) - local node = get_node(pos) - if node and (node.name == PORTAL and (orientation == nil or (node.param2 == orientation))) then - minetest.remove_node(pos) - remove_exit(pos) - end - end - if obsidian then -- check each of 6 sides of it and destroy every portal: - check_remove({x = pos.x - 1, y = pos.y, z = pos.z}, 0) - check_remove({x = pos.x + 1, y = pos.y, z = pos.z}, 0) - check_remove({x = pos.x, y = pos.y, z = pos.z - 1}, 1) - check_remove({x = pos.x, y = pos.y, z = pos.z + 1}, 1) - check_remove({x = pos.x, y = pos.y - 1, z = pos.z}) - check_remove({x = pos.x, y = pos.y + 1, z = pos.z}) - return - end - if orientation == 0 then - check_remove({x = pos.x - 1, y = pos.y, z = pos.z}, 0) - check_remove({x = pos.x + 1, y = pos.y, z = pos.z}, 0) - else - check_remove({x = pos.x, y = pos.y, z = pos.z - 1}, 1) - check_remove({x = pos.x, y = pos.y, z = pos.z + 1}, 1) - end - check_remove({x = pos.x, y = pos.y - 1, z = pos.z}) - check_remove({x = pos.x, y = pos.y + 1, z = pos.z}) -end - local on_rotate if minetest.get_modpath("screwdriver") then on_rotate = screwdriver.disallow @@ -295,7 +262,6 @@ minetest.register_node(PORTAL, { }, groups = { creative_breakable = 1, portal = 1, not_in_creative_inventory = 1 }, sounds = mcl_sounds.node_sound_glass_defaults(), - after_destruct = destroy_nether_portal, on_rotate = on_rotate, _mcl_hardness = -1, @@ -355,7 +321,7 @@ function build_nether_portal(pos, width, height, orientation, name, clear_before return pos end -function mcl_portals.spawn_nether_portal(pos, rot, pr, name) +function mcl_portals.spawn_nether_portal(pos, rot, pr, placer) if not pos then return end local o = 0 if rot then @@ -365,6 +331,10 @@ function mcl_portals.spawn_nether_portal(pos, rot, pr, name) o = random(0,1) end end + local name + if placer and placer:is_player() then + name = placer:get_player_name() + end build_nether_portal(pos, nil, nil, o, name, true) end @@ -437,7 +407,7 @@ local function create_portal_2(pos1, name, obj) end local exit = build_nether_portal(pos1, W_MIN-2, H_MIN-2, orientation, name) finalize_teleport(obj, exit) - local cn = mcl_vars.get_chunk_number(pos1) + local cn = mcl_mapgen.get_chunk_number(pos1) chunks[cn] = nil if queue[cn] then for next_obj, _ in pairs(queue[cn]) do @@ -451,9 +421,9 @@ end local function get_lava_level(pos, pos1, pos2) if pos.y > -1000 then - return max(min(mcl_vars.mg_lava_overworld_max, pos2.y-1), pos1.y+1) + return max(min(mcl_mapgen.overworld.lava_max, pos2.y-1), pos1.y+1) end - return max(min(mcl_vars.mg_lava_nether_max, pos2.y-1), pos1.y+1) + return max(min(mcl_mapgen.nether.lava_max, pos2.y-1), pos1.y+1) end local function ecb_scan_area_2(blockpos, action, calls_remaining, param) @@ -532,7 +502,7 @@ local function ecb_scan_area_2(blockpos, action, calls_remaining, param) end local function create_portal(pos, limit1, limit2, name, obj) - local cn = mcl_vars.get_chunk_number(pos) + local cn = mcl_mapgen.get_chunk_number(pos) if chunks[cn] then local q = queue[cn] or {} q[obj] = true @@ -545,8 +515,8 @@ local function create_portal(pos, limit1, limit2, name, obj) -- so we'll emerge single chunk only: 5x5x5 blocks, 80x80x80 nodes maximum -- and maybe one more chunk from below if (SCAN_2_MAP_CHUNKS = true) - local pos1 = add(mul(mcl_vars.pos_to_chunk(pos), mcl_vars.chunk_size_in_nodes), mcl_vars.central_chunk_offset_in_nodes) - local pos2 = add(pos1, mcl_vars.chunk_size_in_nodes - 1) + local pos1 = add(mul(mcl_mapgen.pos_to_chunk(pos), mcl_mapgen.CS_NODES), mcl_mapgen.OFFSET_NODES) + local pos2 = add(pos1, mcl_mapgen.CS_NODES - 1) if not SCAN_2_MAP_CHUNKS then if limit1 and limit1.x and limit1.y and limit1.z then @@ -560,8 +530,8 @@ local function create_portal(pos, limit1, limit2, name, obj) end -- Basically the copy of code above, with minor additions to continue the search in single additional chunk below: - local next_chunk_1 = {x = pos1.x, y = pos1.y - mcl_vars.chunk_size_in_nodes, z = pos1.z} - local next_chunk_2 = add(next_chunk_1, mcl_vars.chunk_size_in_nodes - 1) + local next_chunk_1 = {x = pos1.x, y = pos1.y - mcl_mapgen.CS_NODES, z = pos1.z} + local next_chunk_2 = add(next_chunk_1, mcl_mapgen.CS_NODES - 1) local next_pos = {x = pos.x, y=max(next_chunk_2.y, limit1.y), z = pos.z} if limit1 and limit1.x and limit1.y and limit1.z then pos1 = {x = max(min(limit1.x, pos.x), pos1.x), y = max(min(limit1.y, pos.y), pos1.y), z = max(min(limit1.z, pos.z), pos1.z)} @@ -692,6 +662,7 @@ local function teleport_no_delay(obj, pos) finalize_teleport(obj, exit) else dim = dimension_to_teleport[dim] + if not dim then return end -- need to create arrival portal create_portal(target, limits[dim].pmin, limits[dim].pmax, name, obj) end @@ -753,13 +724,50 @@ local function teleport(obj, portal_pos) minetest.after(DELAY, teleport_no_delay, obj, portal_pos) end +mcl_structures.register_structure({name = "nether_portal", place_function = mcl_portals.spawn_nether_portal}) + minetest.register_abm({ label = "Nether portal teleportation and particles", nodenames = {PORTAL}, - interval = 1, - chance = 1, + interval = 0.8, + chance = 3, action = function(pos, node) + -- Don't use call stack! + local upper_node_name = get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name + if upper_node_name ~= PORTAL and upper_node_name ~= OBSIDIAN then + minetest.remove_node(pos) + remove_exit(pos) + return + end + local lower_node_name = get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name + if lower_node_name ~= PORTAL and lower_node_name ~= OBSIDIAN then + minetest.remove_node(pos) + remove_exit(pos) + return + end + + if lower_node_name == OBSIDIAN and pos.y >= mcl_mapgen.overworld.min and random(1, 750) == 19 then + local pigman_obj = minetest.add_entity(pos, "mobs_mc:pigman") + if pigman_obj then + teleport_cooloff(pigman_obj) + end + end + local o = node.param2 -- orientation + + local closer_node_name = get_node({x = pos.x - 1 + o, y = pos.y, z = pos.z - o}).name + if closer_node_name ~= PORTAL and closer_node_name ~= OBSIDIAN then + minetest.remove_node(pos) + remove_exit(pos) + return + end + local further_node_name = get_node({x = pos.x + 1 - o, y = pos.y, z = pos.z + o}).name + if further_node_name ~= PORTAL and further_node_name ~= OBSIDIAN then + minetest.remove_node(pos) + remove_exit(pos) + return + end + local d = random(0, 1) -- direction local time = random() * 1.9 + 0.5 local velocity, acceleration @@ -822,7 +830,6 @@ local usagehelp = S("To open a Nether portal, place an upright frame of obsidian minetest.override_item(OBSIDIAN, { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, - after_destruct = destroy_nether_portal, _on_ignite = function(user, pointed_thing) local x, y, z = pointed_thing.under.x, pointed_thing.under.y, pointed_thing.under.z -- Check empty spaces around obsidian and light all frames found: diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr index f3850a7b6..085aa40ec 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr @@ -13,7 +13,7 @@ Liquid container=Récipient de liquide A glass bottle is used as a container for liquids and can be used to collect water directly.=Une bouteille en verre est utilisée comme récipient pour les liquides et peut être utilisée pour collecter l'eau directement. -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Pour collecter l'eau, poser la sur un chaudron avec de l'eau (qui enlève un niveau d'eau) ou toute source d'eau (qui n'enlève pas d'eau). +To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Pour collecter l'eau, poser la sur un chaudron avec de l'eau (ce qui enlève un niveau d'eau) ou toute source d'eau (ce qui n'enlève pas d'eau). Water Bottle=Bouteille d'eau Water bottles can be used to fill cauldrons. Drinking water has no effect.=Les bouteilles d'eau peuvent être utilisées pour remplir les chaudrons. L'eau potable n'a aucun effet. @@ -21,11 +21,11 @@ Water bottles can be used to fill cauldrons. Drinking water has no effect.=Les b Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Utilisez la touche "Utiliser" pour boire. Placez cet article sur un chaudron pour verser l'eau dans le chaudron. River Water Bottle=Bouteille d'eau de rivière -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Les bouteilles d'eau de rivière peuvent être utilisées pour remplir les chaudrons. Le boire n'a aucun effet. +River water bottles can be used to fill cauldrons. Drinking it has no effect.=Les bouteilles d'eau de rivière peuvent être utilisées pour remplir les chaudrons. Les boire n'a aucun effet. Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Utilisez la touche "Utiliser" pour boire. Placez cet objet sur un chaudron pour verser l'eau de la rivière dans le chaudron. -Splash Water Bottle=Bouteille d'eau jetable +Splash Water Bottle=Bouteille d'eau éclaboussante Extinguishes fire and hurts some mobs=Éteint le feu et blesse certains mobs A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Une bouteille d'eau jetable qui se brisera à l'impact, où elle éteint le feu à proximité et blesse les mobs vulnérables à l'eau. @@ -46,29 +46,29 @@ Drinking a potion gives you a particular effect.=Boire une potion vous donne un 1 HP/@1s | @2=1 HP/@1s | @2 @1 HP=@1 HP @1 Potion=Potion @1 -Splash @1 Potion=Potion @1 jetable +Splash @1 Potion=Potion @1 éclaboussante Lingering @1 Potion=Potion @1 persistante Arrow of @1=Flêche de @1 II= II IV= IV @1 Potion@2=@1 Potion@2 -Splash @1@2 Potion=Potion @1@2 jetable +Splash @1@2 Potion=Potion @1@2 éclaboussante Lingering @1@2 Potion=Potion @1@2 persistante Arrow of @1@2=Flêche de @1@2 @1 + Potion=@1 + Potion -Splash @1 + Potion=Potion @1 + jetable +Splash @1 + Potion=Potion @1 + éclaboussante Lingering @1 + Potion=Potion @1 + persistante Arrow of @1 +=Flêche de @1 + Awkward Potion=Potion étrange -Awkward Splash Potion=Potion étrange jetable +Awkward Splash Potion=Potion étrange éclaboussante Awkward Lingering Potion=Potion étrange persistante Has an awkward taste and is used for brewing potions.=A un goût étrange et est utilisé pour préparer des potions. Mundane Potion=Potion banale -Mundane Splash Potion=Potion banale jetable +Mundane Splash Potion=Potion banale éclaboussante Mundane Lingering Potion=Potion banale persistante Has a terrible taste and is not useful for brewing potions.=A un goût terrible et n'est pas utile pour préparer des potions. Thick Potion=Potion épaisse -Thick Splash Potion=Potion épaisse jetable +Thick Splash Potion=Potion épaisse éclaboussante Thick Lingering Potion=Potion épaisse persistante Has a bitter taste and is not useful for brewing potions.=A un goût amer et n'est pas utile pour préparer des potions. Dragon's Breath=Souffle du dragon diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr index 2bc4380ec..0ff847066 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr @@ -1,75 +1,75 @@ # textdomain: mcl_potions - []=<эффект> <длительность> [<фактор>] + []=<эффект> <длительность> [<сила>] -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Добавляет вам эффект состояния. Параметры: <эффект> - название эффекта состояния, например, poison (отравление). <Длительность> - длительность в секундах. <Фактор> - коэффициент силы эффекта (1 @= 100%) +Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Добавляет вам эффект. Параметры: <эффект> - название эффекта , например, poison. <Длительность> - длительность в секундах. <Сила> - коэффициент силы эффекта (1 @= 100%) Missing effect parameter!=Отсутствует параметр эффекта! Missing or invalid duration parameter!=Отсутствует либо неправильно задан параметр длительности! -Invalid factor parameter!=Отсутствует параметр фактора! -@1 is not an available status effect.=@1 не является допустимым эффектом состояния. -Fermented Spider Eye=Прокисший паучий глаз -Glass Bottle=Стеклянная бутылка +Invalid factor parameter!=Отсутствует параметр силы! +@1 is not an available status effect.=@1 не является допустимым эффектом. +Fermented Spider Eye=Приготовленный паучий глаз +Glass Bottle=Пузырёк Liquid container=Контейнер для жидкостей -A glass bottle is used as a container for liquids and can be used to collect water directly.=Стеклянная бутылка используется для хранения жидкостей, её также можно использовать для сбора воды. +A glass bottle is used as a container for liquids and can be used to collect water directly.=Стеклянный пузырёк используется для хранения жидкостей, её также можно использовать для сбора воды. -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Воду в бутылку можно набрать из котла с помощью команды [Использовать] (это уменьшает уровень воды в котле) или из другого источника (уровень которого не уменьшится). +To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Воду в пузырёк можно набрать из котла (это уменьшает уровень воды в котле) или из другого источника (уровень которого не уменьшится). -Water Bottle=Бутылка с водой -Water bottles can be used to fill cauldrons. Drinking water has no effect.=Бутылки с водой можно использовать для наполнения котлов. Выпивание воды не даст никакого эффекта. +Water Bottle=Пузырёк с водой +Water bottles can be used to fill cauldrons. Drinking water has no effect.=Пузырёк с водой можно использовать для наполнения котла. Выпивание воды не даст никакого эффекта. -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Используйте клавишу “Разместить”, чтобы выпить это. Поместите этот предмет на котёл, чтобы вылить воду в котёл. +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Используйте правую кнопку мыши, чтобы выпить. Используйте этот предмет на котле, чтобы вылить воду в котёл. -River Water Bottle=Бутылка с речной водой -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Бутылки с речной водой можно использовать для наполнения котлов. Выпивание воды не даст никакого эффекта. +River Water Bottle=Пузырёк с речной водой +River water bottles can be used to fill cauldrons. Drinking it has no effect.=Пузырёк с речной водой можно использовать для наполнения котла. Выпивание воды не даст никакого эффекта. -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Используйте клавишу “Разместить”, чтобы выпить это. Поместите этот предмет на котёл, чтобы вылить речную воду в котёл. +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Используйте правую кнопку мыши, чтобы выпить. Используйте этот предмет на котле, чтобы вылить речную воду в котёл. -Splash Water Bottle=Бутылка со взрывающейся водой +Splash Water Bottle=Взрывное зелье Extinguishes fire and hurts some mobs=Тушит огонь и ранит некоторых мобов -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Бутылка с водой, которую можно метать. Она разбивается при ударе, тушит ближайший огонь и ранит мобов, уязвимых к воде. +A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Пузырёк с водой, который можно метать. Он разбивается при ударе, тушит ближайший огонь и ранит мобов, уязвимых к воде. -Lingering Water Bottle=Бутылка с оседающей водой +Lingering Water Bottle=Туманное зелье -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Бутылка с водой, которую можно метать. Она разбивается при ударе, образуя облако пара, которое оседает на землю через некоторое время. Это облако тушит огонь и ранит мобов, уязвимых к воде. +A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Пузырёк с водой, который можно метать. Он разбивается при ударе, образуя облако пара, которое оседает на землю через некоторое время. Это облако тушит огонь и ранит мобов, уязвимых к воде. -Glistering Melon=Искрящаяся дыня +Glistering Melon=Сверкающий ломтик арбуза -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Искрящаяся дыня полна маленьких золотых самородков и может отлично смотреться в рамке. Она несъедобна и не годится больше ни для чего. +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Сверкающий ломтик арбуза содержит в себе золотые самородки и может отлично смотреться в рамке. Ломтик не съедобен. A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.=Зелье, которое можно метать. При ударе оно разбивается, создавая волшебное облако, которое задерживается на некоторое время. Любой игрок или моб внутри облака получит эффект зелья, возможно, неоднократно. Use the “Punch” key to throw it.=Нажмите [Ударить] для метания. -Use the “Place” key to drink it.=Нажмите [Разместить] для выпивания. -Drinking a potion gives you a particular effect.=Выпивание зелья даёт вам особый эффект. +Use the “Place” key to drink it.=Нажмите [Разместить] чтобы выпить. +Drinking a potion gives you a particular effect.=Выпивание зелья даёт вам определённый эффект. 1 HP/@1s | @2=1 HP/@1с | @2 @1 HP=@1 HP @1 Potion=Зелье @1 -Splash @1 Potion=Взрывающееся зелье @1 -Lingering @1 Potion=Оседающее зелье @1 +Splash @1 Potion=Взрывное зелье @1 +Lingering @1 Potion=Туманное зелье @1 Arrow of @1=Стрела @1 II= II IV= IV @1 Potion@2=Зелье @1 @2 -Splash @1@2 Potion=Взрывающееся зелье @1@2 -Lingering @1@2 Potion=Оседающее зелье @1@2 +Splash @1@2 Potion=Взрывное зелье @1@2 +Lingering @1@2 Potion=Туманное зелье @1@2 Arrow of @1@2=Стрела @1@2 @1 + Potion=Зелье @1+ -Splash @1 + Potion=Взрывающееся зелье @1+ -Lingering @1 + Potion=Оседающее зелье @1+ -Arrow of @1 +=Стрела @1+ -Awkward Potion=Невкусное зелье -Awkward Splash Potion=Невкусное взрывающееся зелье -Awkward Lingering Potion=Невкусное оседающее зелье +Splash @1 + Potion=Взрывное зелье @1+ +Lingering @1 + Potion=Туманное зелье @1+ +Arrow of @1 +=Стрела @1 + +Awkward Potion=Грубое зелье +Awkward Splash Potion=Взрывное грубое зелье +Awkward Lingering Potion=Туманное грубое зелье Has an awkward taste and is used for brewing potions.=Имеет неприятный вкус и используется для приготовления других зелий. -Mundane Potion=Успокоительное зелье -Mundane Splash Potion=Успокоительное взрывающееся зелье -Mundane Lingering Potion=Успокоительное оседающее зелье +Mundane Potion=Непримечательное зелье +Mundane Splash Potion=Взрывное непримечательное взрывное зелье +Mundane Lingering Potion=Туманное непримечательное зелье Has a terrible taste and is not useful for brewing potions.=Имеет отвратительный вкус и используется для приготовления других зелий. Thick Potion=Густое зелье -Thick Splash Potion=Густое взрывающееся зелье -Thick Lingering Potion=Густое оседающее зелье +Thick Splash Potion=Взрывное густое зелье +Thick Lingering Potion=Туманное густое зелье Has a bitter taste and is not useful for brewing potions.=Имеет горький вкус и используется для приготовления других зелий. Dragon's Breath=Дыхание дракона @@ -78,14 +78,14 @@ This item is used in brewing and can be combined with splash potions to create l Healing=исцеления +4 HP=+4 HP +8 HP=+8 HP -Instantly heals.=Лечит мгновенно +Instantly heals.=Мгновенно исцеляет. Harming=урона -6 HP=-6 HP -12 HP=-12 HP -Instantly deals damage.=Вызывает мгновенную смерть. +Instantly deals damage.=Наносит мгновенный урон. Night Vision=ночного зрения -Increases the perceived brightness of light under a dark sky.=Усиливает восприятие яркости освещения под тёмным небом. -Swiftness=ускорения +Increases the perceived brightness of light under a dark sky.=Усиливает восприятие яркости освещения в тёмных местах. +Swiftness=стремительности Increases walking speed.=Увеличивает скорость ходьбы Slowness=замедления Decreases walking speed.=Уменьшает скорость ходьбы @@ -93,24 +93,24 @@ Leaping=прыгучести Increases jump strength.=Увеличивает силу прыжка Poison=отравления Applies the poison effect which deals damage at a regular interval.=Наносит эффект яда, который вызывает урон через равные промежутки времени. -Regeneration=восстановления +Regeneration=регенерации Regenerates health over time.=Восстанавливает здоровье со временем. Invisibility=невидимости Grants invisibility.=Делает невидимым. Water Breathing=подводного дыхания -Grants limitless breath underwater.=Даёт возможность неограниченно дышать под водой. +Grants limitless breath underwater.=Даёт возможность дышать под водой. Fire Resistance=огнестойкости Grants immunity to damage from heat sources like fire.=Делает невосприимчивым к урону от источников тепла, например, от огня. -Weakness=Слабость -Weakness +=Слабость + -Strength=Сила -Strength II=Сила II -Strength +=Сила + +Weakness=слабости + +Weakness +=слабости + +Strength=силы +Strength II=силы II +Strength +=силы + Try different combinations to create potions.=Пробуйте разные сочетания для приготовления зелий. -No effect=Не оказывает эффекта +No effect=Без эффекта -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Зелье, которое можно метать. Оно разбивается при ударе и он дает всем ближайшим игрокам и мобам эффект состояния. +A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Метательное зелье разобьется при столкновении и даст ближайшим игрокам и мобам эффект. -This particular arrow is tipped and will give an effect when it hits a player or mob.=Эта необычная стрела с обработанным наконечником даёт эффект при попадании в игрока или моба. +This particular arrow is tipped and will give an effect when it hits a player or mob.=Эта стрела с обмакнутым в зелье наконечником даёт эффект при попадании в игрока или моба. diff --git a/mods/ITEMS/mcl_potions/tipped_arrow.lua b/mods/ITEMS/mcl_potions/tipped_arrow.lua index 1717533a8..907580aef 100644 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ b/mods/ITEMS/mcl_potions/tipped_arrow.lua @@ -391,6 +391,7 @@ function mcl_potions.register_arrow(name, desc, color, def) end function ARROW_ENTITY.get_staticdata(self) + if not self then return end local out = { lastpos = self._lastpos, startpos = self._startpos, diff --git a/mods/ITEMS/mcl_raw_ores/init.lua b/mods/ITEMS/mcl_raw_ores/init.lua index 9725249b2..eca70004e 100644 --- a/mods/ITEMS/mcl_raw_ores/init.lua +++ b/mods/ITEMS/mcl_raw_ores/init.lua @@ -1,18 +1,20 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + local function register_raw_ore(description, n) local ore = description:lower() local n = n or "" local raw_ingot = "mcl_raw_ores:raw_"..ore local texture = "mcl_raw_ores_raw_"..ore minetest.register_craftitem(raw_ingot, { - description = ("Raw "..description), - _doc_items_longdesc = ("Raw "..ore..". Mine a"..n.." "..ore.." ore to get it."), + description = S("Raw "..description), + _doc_items_longdesc = S("Raw "..ore..". Mine a"..n.." "..ore.." ore to get it."), inventory_image = texture..".png", stack_max = 64, groups = { craftitem = 1 }, }) minetest.register_node(raw_ingot.."_block", { - description = ("Block of Raw "..description), - _doc_items_longdesc = ("A block of raw "..ore.." is mostly a decorative block but also useful as a compact storage of raw "..ore.."."), + description = S("Block of Raw "..description), + _doc_items_longdesc = S("A block of raw "..ore.." is mostly a decorative block but also useful as a compact storage of raw "..ore.."."), tiles = { texture.."_block.png" }, is_ground_content = false, stack_max = 64, diff --git a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ru.tr b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ru.tr new file mode 100644 index 000000000..ec2c60756 --- /dev/null +++ b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ru.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_raw_ores +Raw Iron=Необработанное железо +Raw Gold=Необработанное золото +Raw iron. Mine an iron ore to get it.=Необработанное железо. Добудьте железную руду чтобы получить это. +Raw gold. Mine a gold ore to get it.=Необработанное золото. Добудьте золотую руду чтобы получить это. +Block of Raw Iron=Блок необработанного железа +Block of Raw Gold=Блок необработанного золота +A block of raw iron is mostly a decorative block but also useful as a compact storage of raw iron.=Блок необработанного железа. Декоративный блок, но также подходит для компактного хранения необработанного железа. +A block of raw gold is mostly a decorative block but also useful as a compact storage of raw gold.=Блок необработанного золота. Декоративный блок, но также подходит для компактного хранения необработанного золота. \ No newline at end of file diff --git a/mods/ITEMS/mcl_raw_ores/locale/template.txt b/mods/ITEMS/mcl_raw_ores/locale/template.txt new file mode 100644 index 000000000..af375fef4 --- /dev/null +++ b/mods/ITEMS/mcl_raw_ores/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: mcl_raw_ores +Raw Iron= +Raw Gold= +Raw Iron. Mine an Iron ore to get it.= +Raw Gold. Mine a Gold ore to get it.= diff --git a/mods/ITEMS/mcl_shields/init.lua b/mods/ITEMS/mcl_shields/init.lua new file mode 100644 index 000000000..feff76cd8 --- /dev/null +++ b/mods/ITEMS/mcl_shields/init.lua @@ -0,0 +1,476 @@ +local minetest, math, vector = minetest, math, vector +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +mcl_shields = { + types = { + mob = true, + player = true, + arrow = true, + generic = true, + explosion = true, -- ghasts don't work + dragon_breath = true, + }, + enchantments = {"mending", "unbreaking"}, + players = {}, +} + +local interact_priv = minetest.registered_privileges.interact +interact_priv.give_to_singleplayer = false +interact_priv.give_to_admin = false + +local overlay = mcl_enchanting.overlay +local hud = "mcl_shield_hud.png" + +local is_player = mcl_util.is_player + +minetest.register_tool("mcl_shields:shield", { + description = S("Shield"), + _doc_items_longdesc = S("A shield is a tool used for protecting the player against attacks."), + inventory_image = "mcl_shield.png", + stack_max = 1, + groups = { + shield = 1, + weapon = 1, + enchantability = 1, + no_wieldview = 1, + offhand_item = 1, + }, + sound = {breaks = "default_tool_breaks"}, + _repair_material = "group:wood", + wield_scale = vector.new(2, 2, 2), +}) + +local function wielded_item(obj, i) + local itemstack = obj:get_wielded_item() + if i == 1 then + itemstack = obj:get_inventory():get_stack("offhand", 1) + end + return itemstack:get_name() +end + +function mcl_shields.wielding_shield(obj, i) + return wielded_item(obj, i):find("mcl_shields:shield") +end + +local function shield_is_enchanted(obj, i) + return mcl_enchanting.is_enchanted(wielded_item(obj, i)) +end + +minetest.register_entity("mcl_shields:shield_entity", { + initial_properties = { + visual = "mesh", + mesh = "mcl_shield.obj", + physical = false, + pointable = false, + collide_with_objects = false, + textures = {"mcl_shield_base_nopattern.png"}, + visual_size = vector.new(1, 1, 1), + }, + _blocking = false, + _shield_number = 2, + on_step = function(self, dtime, moveresult) + local player = self.object:get_attach() + if player then + local shield_texture = "mcl_shield_base_nopattern.png" + local i = self._shield_number + local item = wielded_item(player, i) + + if item ~= "mcl_shields:shield" and item ~= "mcl_shields:shield_enchanted" then + local itemstack = player:get_wielded_item() + if i == 1 then + itemstack = player:get_inventory():get_stack("offhand", 1) + end + local meta_texture = itemstack:get_meta():get_string("mcl_shields:shield_custom_pattern_texture") + if meta_texture ~= "" then + shield_texture = meta_texture + else + local color = minetest.registered_items[item]._shield_color + if color then + shield_texture = "mcl_shield_base_nopattern.png^(mcl_shield_pattern_base.png^[colorize:" .. color .. ")" + end + + end + end + + if shield_is_enchanted(player, i) then + shield_texture = shield_texture .. overlay + end + + self.object:set_properties({textures = {shield_texture}}) + else + self.object:remove() + end + end, +}) + +for _, e in pairs(mcl_shields.enchantments) do + mcl_enchanting.enchantments[e].secondary.shield = true +end + +function mcl_shields.is_blocking(obj) + if not mcl_util or not mcl_util.is_player(obj) then return end + local blocking = mcl_shields.players[obj].blocking + if blocking > 0 then + local shieldstack = obj:get_wielded_item() + if blocking == 1 then + shieldstack = obj:get_inventory():get_stack("offhand", 1) + end + return blocking, shieldstack + end +end + +mcl_damage.register_modifier(function(obj, damage, reason) + local type = reason.type + local damager = reason.direct + local blocking, shieldstack = mcl_shields.is_blocking(obj) + if is_player(obj) and blocking and mcl_shields.types[type] and damager then + local entity = damager:get_luaentity() + if entity and (type == "arrow" or type == "generic") then + damager = entity._shooter + end + if vector.dot(obj:get_look_dir(), vector.subtract(damager:get_pos(), obj:get_pos())) >= 0 then + local durability = 336 + local unbreaking = mcl_enchanting.get_enchantment(shieldstack, mcl_shields.enchantments[2]) + if unbreaking > 0 then + durability = durability * (unbreaking + 1) + end + if not minetest.is_creative_enabled(obj:get_player_name()) and damage >= 3 then + shieldstack:add_wear(65535 / durability) + if blocking == 2 then + obj:set_wielded_item(shieldstack) + else + obj:get_inventory():set_stack("offhand", 1, shieldstack) + mcl_inventory.update_inventory_formspec(obj) + end + end + minetest.sound_play({name = "mcl_block"}) + return 0 + end + end +end) + +local function modify_shield(player, vpos, vrot, i) + local arm = "Right" + if i == 1 then + arm = "Left" + end + local player_data = mcl_shields.players[player] + if not player_data then return end + local shields = player_data.shields + if not shields then return end + local shield = shields[i] + if not shield then return end + shield:set_attach(player, "Arm_" .. arm, vpos, vrot, false) +end + +local function set_shield(player, block, i) + if block then + if i == 1 then + modify_shield(player, vector.new(-9, 4, 0.5), vector.new(80, 100, 0), i) -- TODO + else + modify_shield(player, vector.new(-8, 4, -2.5), vector.new(80, 80, 0), i) + end + else + if i == 1 then + modify_shield(player, vector.new(-3, -5, 0), vector.new(0, 180, 0), i) + else + modify_shield(player, vector.new(3, -5, 0), vector.new(0, 0, 0), i) + end + end + local shield = mcl_shields.players[player].shields[i] + if not shield then return end + local luaentity = shield:get_luaentity() + if not luaentity then return end + luaentity._blocking = block +end + +local function set_interact(player, interact) + local player_name = player:get_player_name() + local privs = minetest.get_player_privs(player_name) + if privs.interact ~= interact then + local meta = player:get_meta() + if meta:get_int("interact_revoked") ~= 1 then + privs.interact = interact + minetest.set_player_privs(player_name, privs) + end + end +end + +local shield_hud = {} + +local function remove_shield_hud(player) + if shield_hud[player] then + player:hud_remove(shield_hud[player]) + shield_hud[player] = nil + set_shield(player, false, 1) + set_shield(player, false, 2) + end + + local hf=player:hud_get_flags() + if not hf.wielditem then + player:hud_set_flags({wielditem = true}) + end + + playerphysics.remove_physics_factor(player, "speed", "shield_speed") + set_interact(player, true) +end + +local function add_shield_entity(player, i) + local shield = minetest.add_entity(player:get_pos(), "mcl_shields:shield_entity") + shield:get_luaentity()._shield_number = i + mcl_shields.players[player].shields[i] = shield + set_shield(player, false, i) +end + +local function remove_shield_entity(player, i) + local shields = mcl_shields.players[player].shields + if shields[i] then + shields[i]:remove() + shields[i] = nil + end +end + +local function handle_blocking(player) + local player_shield = mcl_shields.players[player] + local rmb = player:get_player_control().RMB + if rmb then + local shield_in_offhand = mcl_shields.wielding_shield(player, 1) + local shield_in_hand = mcl_shields.wielding_shield(player) + local not_blocking = player_shield.blocking == 0 + + local pos = player:get_pos() + if shield_in_hand then + if not_blocking then + minetest.after(0.25, function() + if (not_blocking or not shield_in_offhand) and shield_in_hand and rmb then + player_shield.blocking = 2 + set_shield(player, true, 2) + end + end) + elseif not shield_in_offhand then + player_shield.blocking = 2 + end + elseif shield_in_offhand then + local offhand_can_block = (wielded_item(player) == "" or not mcl_util.get_pointed_thing(player)) + if offhand_can_block then + if not_blocking then + minetest.after(0.25, function() + if (not_blocking or not shield_in_hand) and shield_in_offhand and rmb and offhand_can_block then + player_shield.blocking = 1 + set_shield(player, true, 1) + end + end) + elseif not shield_in_hand then + player_shield.blocking = 1 + end + end + else + player_shield.blocking = 0 + end + else + player_shield.blocking = 0 + end +end + +local function update_shield_entity(player, blocking, i) + local shield = mcl_shields.players[player].shields[i] + if mcl_shields.wielding_shield(player, i) then + if not shield then + add_shield_entity(player, i) + else + if blocking == i then + if shield:get_luaentity() and not shield:get_luaentity()._blocking then + set_shield(player, true, i) + end + else + set_shield(player, false, i) + end + end + elseif shield then + remove_shield_entity(player, i) + end +end + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do if is_player(player) then + handle_blocking(player) + + local blocking, shieldstack = mcl_shields.is_blocking(player) + + if blocking then + local shieldhud = shield_hud[player] + if not shieldhud then + local texture = hud + if mcl_enchanting.is_enchanted(shieldstack:get_name()) then + texture = texture .. overlay + end + local offset = 100 + if blocking == 1 then + texture = texture .. "^[transform4" + offset = -100 + else + player:hud_set_flags({wielditem = false}) + end + shield_hud[player] = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 0.5}, + scale = {x = -101, y = -101}, + offset = {x = offset, y = 0}, + text = texture, + z_index = -200, + }) + playerphysics.add_physics_factor(player, "speed", "shield_speed", 0.5) + set_interact(player, nil) + else + local wielditem = player:hud_get_flags().wielditem + if blocking == 1 then + if not wielditem then + player:hud_change(shieldhud, "text", hud .. "^[transform4") + player:hud_change(shieldhud, "offset", {x = -100, y = 0}) + player:hud_set_flags({wielditem = true}) + end + else + if wielditem then + player:hud_change(shieldhud, "text", hud) + player:hud_change(shieldhud, "offset", {x = 100, y = 0}) + player:hud_set_flags({wielditem = false}) + end + end + + local image = player:hud_get(shieldhud).text + local enchanted = hud .. overlay + local enchanted1 = image == enchanted + local enchanted2 = image == enchanted .. "^[transform4" + if mcl_enchanting.is_enchanted(shieldstack:get_name()) then + if not enchanted1 and not enchanted2 then + if blocking == 1 then + player:hud_change(shieldhud, "text", hud .. overlay .. "^[transform4") + else + player:hud_change(shieldhud, "text", hud .. overlay) + end + end + elseif enchanted1 or enchanted2 then + if blocking == 1 then + player:hud_change(shieldhud, "text", hud .. "^[transform4") + else + player:hud_change(shieldhud, "text", hud) + end + end + end + else + remove_shield_hud(player) + end + + for i = 1, 2 do + update_shield_entity(player, blocking, i) + end + end end +end) + +minetest.register_on_dieplayer(function(player) + remove_shield_hud(player) + if not minetest.settings:get_bool("mcl_keepInventory") then + remove_shield_entity(player, 1) + remove_shield_entity(player, 2) + end +end) + +minetest.register_on_leaveplayer(function(player) + shield_hud[player] = nil + mcl_shields.players[player] = nil +end) + +minetest.register_craft({ + output = "mcl_shields:shield", + recipe = { + {"group:wood", "mcl_core:iron_ingot", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"", "group:wood", ""}, + } +}) + +for _, colortab in pairs(mcl_banners.colors) do + minetest.register_tool("mcl_shields:shield_" .. colortab[1], { + description = S(colortab[6] .. " Shield"), + _doc_items_longdesc = S("A shield is a tool used for protecting the player against attacks."), + inventory_image = "mcl_shield.png^(mcl_shield_item_overlay.png^[colorize:" .. colortab[4] ..")", + stack_max = 1, + groups = { + shield = 1, + weapon = 1, + enchantability = 1, + no_wieldview = 1, + not_in_creative_inventory = 1, + offhand_item = 1, + }, + sound = {breaks = "default_tool_breaks"}, + _repair_material = "group:wood", + wield_scale = vector.new(2, 2, 2), + _shield_color = colortab[4], + }) + + local banner = "mcl_banners:banner_item_" .. colortab[1] + minetest.register_craft({ + type = "shapeless", + output = "mcl_shields:shield_" .. colortab[1], + recipe = {"mcl_shields:shield", banner}, + }) +end + +local function to_shield_texture(banner_texture) + return banner_texture + :gsub("mcl_banners_base_inverted.png", "mcl_shield_base_nopattern.png^mcl_shield_pattern_base.png") + :gsub("mcl_banners_banner_base.png", "mcl_shield_base_nopattern.png^mcl_shield_pattern_base.png") + :gsub("mcl_banners_base", "mcl_shield_pattern_base") + :gsub("mcl_banners", "mcl_shield_pattern") +end + +local function craft_banner_on_shield(itemstack, player, old_craft_grid, craft_inv) + if string.find(itemstack:get_name(), "mcl_shields:shield_") then + local shield_stack + for i = 1, player:get_inventory():get_size("craft") do + local stack = old_craft_grid[i] + local name = stack:get_name() + if name == "mcl_shields:shield" then + shield_stack = stack + break + end + end + for i = 1, player:get_inventory():get_size("craft") do + local banner_stack = old_craft_grid[i] + local banner_name = banner_stack:get_name() + if string.find(banner_name, "mcl_banners:banner") and shield_stack then + local banner_meta = banner_stack:get_meta() + local layers_meta = banner_meta:get_string("layers") + local new_shield_meta = itemstack:get_meta() + if layers_meta ~= "" then + local color = mcl_banners.color_reverse(banner_name) + local layers = minetest.deserialize(layers_meta) + local texture = mcl_banners.make_banner_texture(color, layers) + new_shield_meta:set_string("description", mcl_banners.make_advanced_banner_description(itemstack:get_description(), layers)) + new_shield_meta:set_string("mcl_shields:shield_custom_pattern_texture", to_shield_texture(texture)) + end + itemstack:set_wear(shield_stack:get_wear()) + break + end + end + end + return itemstack +end + +minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv) + return craft_banner_on_shield(itemstack, player, old_craft_grid, craft_inv) +end) + +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + return craft_banner_on_shield(itemstack, player, old_craft_grid, craft_inv) +end) + +minetest.register_on_joinplayer(function(player) + mcl_shields.players[player] = { + shields = {}, + blocking = 0, + } + remove_shield_hud(player) +end) diff --git a/mods/ITEMS/mcl_shields/locale/mcl_shields.de.tr b/mods/ITEMS/mcl_shields/locale/mcl_shields.de.tr new file mode 100644 index 000000000..2a4deccc0 --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/mcl_shields.de.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield=Schild +A shield is a tool used for protecting the player against attacks.=Der Schild ist eine Schutzwaffe, die den Spieler vor Angriffen schützt. +White Shield=Weißer Schild +Grey Shield=Grauer Schild +Light Grey Shield=Hellgrauer Schild +Black Shield=Schwarzer Schild +Red Shield=Roter Schild +Yellow Shield=Gelber Schild +Green Shield=Grüner Schild +Cyan Shield=Türkiser Schild +Blue Shield=Blauer Schild +Magenta Shield=Magenta Schild +Orange Shield=Oranger Schild +Purple Shield=Violetter Schild +Brown Shield=Brauner Schild +Pink Shield=Rosa Schild +Lime Shield=Hellgrüner Schild +Light Blue Shield=Hellblauer Schild diff --git a/mods/ITEMS/mcl_shields/locale/mcl_shields.fr.tr b/mods/ITEMS/mcl_shields/locale/mcl_shields.fr.tr new file mode 100644 index 000000000..ad2bf0902 --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/mcl_shields.fr.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield=Bouclier +A shield is a tool used for protecting the player against attacks.=Le bouclier est un outil utilisé pour protéger le joueur contre les attaques. +White Shield=Bouclier blanc +Grey Shield=Bouclier gris +Light Grey Shield=Bouclier gris clair +Black Shield=Bouclier noir +Red Shield=Bouclier rouge +Yellow Shield=Bouclier jaune +Green Shield=Bouclier vert +Cyan Shield=Bouclier cyan +Blue Shield=Bouclier bleu +Magenta Shield=Bouclier magenta +Orange Shield=Bouclier orange +Purple Shield=Bouclier violet +Brown Shield=Bouclier marron +Pink Shield=Bouclier rose +Lime Shield=Bouclier vert clair +Light Blue Shield=Bouclier bleu clair \ No newline at end of file diff --git a/mods/ITEMS/mcl_shields/locale/mcl_shields.ru.tr b/mods/ITEMS/mcl_shields/locale/mcl_shields.ru.tr new file mode 100644 index 000000000..005a264fe --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/mcl_shields.ru.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield=Щит +A shield is a tool used for protecting the player against attacks.=Щит это инструмент, используемый для защиты игрока от атак +White Shield=Белый щит +Grey Shield=Серый щит +Light Grey Shield=Светло-серый щит +Black Shield=Чёрный щит +Red Shield=Красный щит +Yellow Shield=Жёлтый щит +Green Shield=Зелёный щит +Cyan Shield=Бирюзовый щит +Blue Shield=Синий щит +Magenta Shield=Сиреневый щит +Orange Shield=Оранжевый щит +Purple Shield=Фиолетовый щит +Brown Shield=Коричневый щит +Pink Shield=Розовый щит +Lime Shield=Лаймовый щит +Light Blue Shield=Голубой щит diff --git a/mods/ITEMS/mcl_shields/locale/template.txt b/mods/ITEMS/mcl_shields/locale/template.txt new file mode 100644 index 000000000..bcf7b1b54 --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/template.txt @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield= +A shield is a tool used for protecting the player against attacks.= +White Shield= +Grey Shield= +Light Grey Shield= +Black Shield= +Red Shield= +Yellow Shield= +Green Shield= +Cyan Shield= +Blue Shield= +Magenta Shield= +Orange Shield= +Purple Shield= +Brown Shield= +Pink Shield= +Lime Shield= +Light Blue Shield= diff --git a/mods/ITEMS/mcl_shields/mod.conf b/mods/ITEMS/mcl_shields/mod.conf new file mode 100644 index 000000000..8aded6a62 --- /dev/null +++ b/mods/ITEMS/mcl_shields/mod.conf @@ -0,0 +1,3 @@ +name = mcl_shields +author = NO11 +depends = mcl_damage, mcl_enchanting, mcl_banners, mcl_util, playerphysics diff --git a/mods/ITEMS/mcl_shields/models/mcl_shield.obj b/mods/ITEMS/mcl_shields/models/mcl_shield.obj new file mode 100644 index 000000000..b1cf77c28 --- /dev/null +++ b/mods/ITEMS/mcl_shields/models/mcl_shield.obj @@ -0,0 +1,88 @@ +# Blender v3.0.0 OBJ File: '' +# www.blender.org +mtllib mcl_shield.mtl +o Cube.002_Cube.003 +v 4.663009 11.096291 6.387994 +v 4.663009 4.596560 5.241916 +v 5.213008 4.596560 5.241916 +v 5.213008 11.096291 6.387994 +v 5.213007 13.197435 -5.528180 +v 5.213007 6.697705 -6.674258 +v 4.663008 6.697705 -6.674258 +v 4.663008 13.197435 -5.528180 +v 4.663008 8.641873 -1.863572 +v 4.663008 8.068833 1.386293 +v 1.363008 8.068833 1.386294 +v 1.363008 8.641873 -1.863572 +v 1.363008 9.152122 1.577307 +v 1.363008 9.725162 -1.672559 +v 4.663008 9.152122 1.577306 +v 4.663008 9.725162 -1.672559 +vt 0.015625 0.984375 +vt 0.203125 0.984375 +vt 0.203125 1.000000 +vt 0.015625 1.000000 +vt 0.203125 0.640625 +vt 0.203125 0.984375 +vt 0.015625 0.984375 +vt 0.015625 0.640625 +vt 0.015625 0.984375 +vt 0.015625 0.640625 +vt -0.000000 0.640625 +vt -0.000000 0.984375 +vt 0.203125 0.984375 +vt 0.390625 0.984375 +vt 0.390625 1.000000 +vt 0.203125 1.000000 +vt 0.203125 0.984375 +vt 0.203125 0.640625 +vt 0.218750 0.640625 +vt 0.218750 0.984375 +vt 0.406250 0.640625 +vt 0.406250 0.984375 +vt 0.218750 0.984375 +vt 0.218750 0.640625 +vt 0.531250 0.812500 +vt 0.625000 0.812500 +vt 0.625000 0.906250 +vt 0.531250 0.906250 +vt 0.500000 0.906250 +vt 0.500000 0.812500 +vt 0.531250 0.812500 +vt 0.531250 0.906250 +vt 0.406250 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.906250 +vt 0.406250 0.906250 +vt 0.625000 0.812500 +vt 0.656250 0.812500 +vt 0.656250 0.906250 +vt 0.625000 0.906250 +vt 0.562500 1.000000 +vt 0.531250 1.000000 +vt 0.531250 0.906250 +vt 0.562500 0.906250 +vt 0.531250 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.906250 +vt 0.531250 0.906250 +vn 0.0000 -0.1736 0.9848 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.9848 -0.1736 +vn 0.0000 0.1736 -0.9848 +vn 0.0000 0.9848 0.1736 +vn -1.0000 -0.0000 0.0000 +usemtl Material.002 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 4/6/2 3/7/2 6/8/2 +f 6/9/3 3/10/3 2/11/3 7/12/3 +f 7/13/4 8/14/4 5/15/4 6/16/4 +f 8/17/5 1/18/5 4/19/5 5/20/5 +f 7/21/6 2/22/6 1/23/6 8/24/6 +f 9/25/3 10/26/3 11/27/3 12/28/3 +f 12/29/6 11/30/6 13/31/6 14/32/6 +f 14/33/5 13/34/5 15/35/5 16/36/5 +f 16/37/2 15/38/2 10/39/2 9/40/2 +f 12/41/4 14/42/4 16/43/4 9/44/4 +f 13/45/1 11/46/1 10/47/1 15/48/1 diff --git a/mods/ITEMS/mcl_shields/sounds/mcl_block.ogg b/mods/ITEMS/mcl_shields/sounds/mcl_block.ogg new file mode 100644 index 000000000..3af7f04b4 Binary files /dev/null and b/mods/ITEMS/mcl_shields/sounds/mcl_block.ogg differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield.png b/mods/ITEMS/mcl_shields/textures/mcl_shield.png new file mode 100644 index 000000000..7391636e9 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_base_nopattern.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_base_nopattern.png new file mode 100644 index 000000000..8146632bb Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_base_nopattern.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_hud.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_hud.png new file mode 100644 index 000000000..4286d3e83 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_hud.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_item_overlay.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_item_overlay.png new file mode 100644 index 000000000..3e7953609 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_item_overlay.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_base.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_base.png new file mode 100644 index 000000000..268445b36 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_base.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_border.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_border.png new file mode 100644 index 000000000..e128218e6 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_border.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_bricks.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_bricks.png new file mode 100644 index 000000000..f1ddd716b Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_bricks.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_circle.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_circle.png new file mode 100644 index 000000000..8ff66b8c8 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_circle.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_creeper.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_creeper.png new file mode 100644 index 000000000..5b30dc76b Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_creeper.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_cross.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_cross.png new file mode 100644 index 000000000..40a6624ae Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_cross.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_curly_border.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_curly_border.png new file mode 100644 index 000000000..9f8c21773 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_curly_border.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_left.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_left.png new file mode 100644 index 000000000..a04a6fdc0 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_left.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_right.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_right.png new file mode 100644 index 000000000..309f711bf Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_right.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_up_left.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_up_left.png new file mode 100644 index 000000000..c5f4399a0 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_up_left.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_up_right.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_up_right.png new file mode 100644 index 000000000..59dd957dd Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_diagonal_up_right.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_flower.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_flower.png new file mode 100644 index 000000000..fe7ca826f Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_flower.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_gradient.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_gradient.png new file mode 100644 index 000000000..29a98c704 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_gradient.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_gradient_up.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_gradient_up.png new file mode 100644 index 000000000..09effb26a Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_gradient_up.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_horizontal.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_horizontal.png new file mode 100644 index 000000000..5187803b3 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_horizontal.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_horizontal_bottom.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_horizontal_bottom.png new file mode 100644 index 000000000..515e6ddfe Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_horizontal_bottom.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_vertical.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_vertical.png new file mode 100644 index 000000000..9a56804da Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_vertical.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_vertical_right.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_vertical_right.png new file mode 100644 index 000000000..4a5af61fb Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_half_vertical_right.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_rhombus.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_rhombus.png new file mode 100644 index 000000000..13b502289 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_rhombus.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_skull.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_skull.png new file mode 100644 index 000000000..4e0c7c1f5 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_skull.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_small_stripes.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_small_stripes.png new file mode 100644 index 000000000..f125ba2fb Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_small_stripes.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_bottom_left.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_bottom_left.png new file mode 100644 index 000000000..a5c4e00c0 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_bottom_left.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_bottom_right.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_bottom_right.png new file mode 100644 index 000000000..ca2c53692 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_bottom_right.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_top_left.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_top_left.png new file mode 100644 index 000000000..2123cba15 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_top_left.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_top_right.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_top_right.png new file mode 100644 index 000000000..3f7a759a8 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_square_top_right.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_straight_cross.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_straight_cross.png new file mode 100644 index 000000000..dc861f048 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_straight_cross.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_bottom.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_bottom.png new file mode 100644 index 000000000..859ad11d1 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_bottom.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_center.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_center.png new file mode 100644 index 000000000..8d1e2404c Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_center.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_downleft.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_downleft.png new file mode 100644 index 000000000..c0a93cd4f Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_downleft.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_downright.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_downright.png new file mode 100644 index 000000000..09580857c Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_downright.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_left.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_left.png new file mode 100644 index 000000000..6e5bcb02e Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_left.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_middle.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_middle.png new file mode 100644 index 000000000..af5ebc12a Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_middle.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_right.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_right.png new file mode 100644 index 000000000..dcb911b68 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_right.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_top.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_top.png new file mode 100644 index 000000000..a1e10be46 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_stripe_top.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_thing.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_thing.png new file mode 100644 index 000000000..43b2a1d49 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_thing.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangle_bottom.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangle_bottom.png new file mode 100644 index 000000000..87d1aa95b Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangle_bottom.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangle_top.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangle_top.png new file mode 100644 index 000000000..94d652878 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangle_top.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangles_bottom.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangles_bottom.png new file mode 100644 index 000000000..3e4851abb Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangles_bottom.png differ diff --git a/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangles_top.png b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangles_top.png new file mode 100644 index 000000000..0ae85d6d1 Binary files /dev/null and b/mods/ITEMS/mcl_shields/textures/mcl_shield_pattern_triangles_top.png differ diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index b6bfb3fe8..c3c779356 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -537,6 +537,7 @@ minetest.register_entity("mcl_signs:text", { self.object:set_armor_groups({ immortal = 1 }) end, get_staticdata = function(self) + if not self then return end local out = { _signnodename = self._signnodename } return minetest.serialize(out) end, diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr index 158640dae..e37e06f47 100644 --- a/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.fr.tr @@ -1,6 +1,6 @@ # textdomain: mcl_signs Sign=Panneau -Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=Les panneaux peuvent être écrits et se déclinent en deux variantes: panneau mural et panneau sur poteau. Des panneaux peuvent être placés en haut et sur les côtés des autres blocs, mais pas en dessous. +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=Les panneaux peuvent afficher des inscriptions et se déclinent en deux variantes: panneau mural et panneau sur poteau. Des panneaux peuvent être placés en haut et sur les côtés des autres blocs, mais pas en dessous. After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.=Après avoir placé le panneau, vous pouvez écrire quelque chose dessus. Vous avez 4 lignes de texte avec jusqu'à 15 caractères pour chaque ligne; tout ce qui dépasse ces limites est perdu. Tous les caractères ne sont pas pris en charge. Le texte ne peut pas être modifié une fois qu'il a été écrit; vous devez casser et placer à nouveau le panneau. Enter sign text:=Saisir le texte du panneau: Maximum line length: 15=Longueur maximum des lignes: 15 diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr index 354e556a8..d84862532 100644 --- a/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr @@ -1,9 +1,9 @@ # textdomain: mcl_signs Sign=Табличка -Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=На табличках можно писать. Таблички бывают двух видов: настенные и отдельно стоящие. Таблички можно размещать на верхушках и сторонах блоков, но не под блоками. -After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.=После установки таблички вы можете написать на ней что-то. Вам доступны 4 строки текста, до 15 символов в каждой; всё, что вы напишете сверх лимита, потеряется. Поддерживаются не все символы. Текст нельзя изменить. Чтобы изменить его, вам придётся сломать табличку и подписать её снова. -Enter sign text:=Текст на табличке: +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=На табличках можно писать. Таблички бывают двух видов: настенные и стоящие отдельно. Таблички можно размещать сверху и сбоку на блоках, но не под блоками. +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again.=После установки таблички вы можете написать на ней что-нибудь. Вам доступны 4 строки текста, до 15 символов в каждой; всё, что вы напишете сверх лимита, потеряется. Поддерживаются не все символы. Текст на уже подписанной табличке нельзя изменить. Чтобы изменить его, вам придётся сломать табличку и подписать её снова. +Enter sign text:=Введите текст таблички: Maximum line length: 15=Максимальная длина строки: 15 Maximum lines: 4=Максимум строк: 4 Done=Готово -Can be written=Может быть подписана +Can be written=На ней можно писать diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.ru.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.ru.tr new file mode 100644 index 000000000..808643f9c --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_smithing_table +Inventory=Инвентарь +Upgrade Gear=Улучшить +Smithing table=Кузнечный стол \ No newline at end of file diff --git a/mods/ITEMS/mcl_smithing_table/locale/template.txt b/mods/ITEMS/mcl_smithing_table/locale/template.txt new file mode 100644 index 000000000..6133a22db --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: mcl_smithing_table +Inventory= +Upgrade Gear= +Smithing table= diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.fr.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.fr.tr index 58dd74bee..723c12333 100644 --- a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.fr.tr +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.fr.tr @@ -4,7 +4,7 @@ Sponges are blocks which remove water around them when they are placed or come i Waterlogged Sponge=Éponge gorgée d'eau A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Une éponge gorgée d'eau peut être séchée dans le four pour la transformer en éponge (sèche). Lorsqu'il y a un seau vide dans la fente de combustible d'un four, l'eau se déversera dans le seau. Riverwaterlogged Sponge=Éponge gorgée d'eau de rivière -This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Il s'agit d'une éponge trempée d'eau de rivière. Elle peut être séché dans le four pour le transformer en éponge (sèche). Lorsqu'il y a un seau vide dans la fente de combustible du four, l'eau de la rivière se déversera dans le seau. +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Il s'agit d'une éponge gorgée d'eau de rivière. Elle peut être séchée dans le four pour la transformer en éponge (sèche). Lorsqu'il y a un seau vide dans la fente de combustible du four, l'eau de la rivière se déversera dans le seau. A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Une éponge devient gorgée d'eau de rivière (au lieu d'être gorgée d'eau) si elle aspire plus d'eau de rivière que d'eau (normale). Removes water on contact=Élimine l'eau au contact -Can be dried in furnace=Peut être séché au four +Can be dried in furnace=Peut être séchée au four diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr index c3b1749d6..b323abc70 100644 --- a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr @@ -1,10 +1,10 @@ # textdomain: mcl_sponges Sponge=Губка -Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Губки это блоки, которые убирают воду вокруг себя, превращаясь в намокшие губки. -Waterlogged Sponge=Намокшая губка -A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Намокшая губка может быть высушена в печи, тогда она превратится обратно в (сухую) губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится водой. +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Губка это блок, который убирает воду вокруг себя, превращаясь в мокрую губку. +Waterlogged Sponge=Мокрая губка +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Мокрая губка может быть высушена в печи, тогда она превратится обратно в сухую губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится водой. Riverwaterlogged Sponge=Губка с речной водой -This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Это губка, пропитанная речной водой. Она может быть высушена в печи, тогда она превратится обратно в (сухую) губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится речной водой. -A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Губка становится губкой с речной водой, если она втягивает в себя больше речной воды, чем обыкновенной. -Removes water on contact=Убирает воду при контакте +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Это губка, пропитанная речной водой. Она может быть высушена в печи, тогда она превратится обратно в сухую губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится речной водой. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Губка становится мокрой губкой с речной водой, если она втягивает в себя больше речной воды, чем обыкновенной. +Removes water on contact=Убирает воду вблизи Can be dried in furnace=Может быть просушена в печи diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index 1a1f4529d..0fa9a680e 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -1,6 +1,8 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + minetest.register_tool("mcl_spyglass:spyglass",{ - description = ("Spyglass"), - _doc_items_longdesc = ("A spyglass is an item that can be used for zooming in on specific locations."), + description = S("Spyglass"), + _doc_items_longdesc = S("A spyglass is an item that can be used for zooming in on specific locations."), inventory_image = "mcl_spyglass.png", stack_max = 1, _mcl_toollike_wield = true, diff --git a/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.ru.tr b/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.ru.tr new file mode 100644 index 000000000..32b7fa96a --- /dev/null +++ b/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_spyglass +Spyglass=Подзорная труба +A spyglass is an item that can be used for zooming in on specific locations.=Подзорная труба это предмет который позволяет смотреть вдаль. \ No newline at end of file diff --git a/mods/ITEMS/mcl_spyglass/locale/template.txt b/mods/ITEMS/mcl_spyglass/locale/template.txt new file mode 100644 index 000000000..606b46455 --- /dev/null +++ b/mods/ITEMS/mcl_spyglass/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_spyglass +Spyglass= +A spyglass is an item that can be used for zooming in on specific locations.= diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr index 4892122f6..049e2f990 100644 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr +++ b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr @@ -1,7 +1,7 @@ # textdomain: mcl_stairs Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Les escaliers sont utiles pour atteindre des endroits plus élevés en marchant dessus; le saut n'est pas obligatoire. Placer les escaliers dans un motif d'angle créera des escaliers d'angle. Les escaliers placés au plafond ou dans la moitié supérieure du côté d'un bloc seront placés à l'envers. Double @1=Double @1 -Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Les dalles sont deux fois moins hautes que leurs homologues de bloc complet et occupent la partie inférieure ou supérieure d'un bloc, selon la façon dont il a été placé. Les dalles peuvent être facilement franchies sans avoir à sauter. Lorsqu'une dalle est placée sur une autre dalle du même type, une double dalle est créée. +Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Les dalles sont deux fois moins hautes que leurs équivalent bloc complet et occupent la partie inférieure ou supérieure d'un bloc, selon la façon dont elle a été placée. Les dalles peuvent être facilement franchies sans avoir à sauter. Lorsqu'une dalle est placée sur une autre dalle du même type, une double dalle est créée. Upper @1=@1 Supérieur Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Les dalles doubles sont des blocs entiers qui sont créés en plaçant deux dalles du même type l'une sur l'autre. Oak Wood Stairs=Escalier en Bois de Chêne @@ -30,9 +30,9 @@ Double Polished Stone Slab=Double Dalle en Pierre Polie Andesite Stairs=Escalier en Andésite Andesite Slab=Dalle en Andésite Double Andesite Slab=Double Dalle en Andésite -Granite Stairs=Escalier en Granit -Granite Slab=Dalle en Granit -Double Granite Slab=Double Dalle en Granit +Granite Stairs=Escalier en Granite +Granite Slab=Dalle en Granite +Double Granite Slab=Double Dalle en Granite Diorite Stairs=Escalier en Diorite Diorite Slab=Dalle en Diorite Double Diorite Slab=Double Dalle en Diorite @@ -90,9 +90,9 @@ Double Dark Prismarine Slab=Double Dalle en Prismarine Sombre Polished Andesite Slab=Dalle en Andésite Polie Double Polished Andesite Slab=Double Dalle en Andésite Polie Polished Andesite Stairs=Escalier en Andésite Polie -Polished Granite Slab=Dalle en Granit Poli -Double Polished Granite Slab=Double Dalle en Granit Poli -Polished Granite Stairs=Escalier en Granit Poli +Polished Granite Slab=Dalle en Granite Poli +Double Polished Granite Slab=Double Dalle en Granite Poli +Polished Granite Stairs=Escalier en Granite Poli Polished Diorite Slab=Dalle en Diorite Polie Double Polished Diorite Slab=Double Dalle en Diorite Polie Polished Diorite Stairs=Escalier en Diorite Polie diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr index 10d470fce..b07180fb3 100644 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr +++ b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr @@ -1,101 +1,101 @@ # textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Ступеньки полезны, чтобы подниматься к высоким местам, идя по ним; прыжки при этом не требуются. Размещение ступенек по углам будет создавать угловые ступеньки. Ступеньки, устанавливаемые на потолке или в верхней половине боковой части блока, будет перевёрнуты вверх ногами. +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Ступени нужны для подъема; по ним можно идти, прыгать не обязательно. Размещение ступенек на углах будет создавать угловые ступени. Ступени, устанавливаемые на потолке или на верхней половине боковой части блока, будет перевёрнуты вверх ногами. Double @1=Двойная @1 Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Плиты в два раза ниже, чем их блочные аналоги, и занимают либо нижнюю, либо верхнюю часть блока, в зависимости от того, как они размещались. На плиты можно легко подниматься без необходимости прыгать. Когда плита помещается на другую плиту того же типа, создается двойная плита. Upper @1=Верхняя @1 Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Двойные плиты это целые блоки, которые создаются путем размещения двух плит одного вида друг на друге. -Oak Wood Stairs=Дубовые ступеньки +Oak Wood Stairs=Дубовые ступени Oak Wood Slab=Дубовая плита Double Oak Wood Slab=Двойная дубовая плита -Jungle Wood Stairs=Ступеньки из дерева джунглей -Jungle Wood Slab=Плита из дерева джунглей -Double Jungle Wood Slab=Двойная плита из дерева джунглей -Acacia Wood Stairs=Ступеньки из акации +Jungle Wood Stairs=Ступени из тропического дерева +Jungle Wood Slab=Плита из тропического дерева +Double Jungle Wood Slab=Двойная плита из тропического дерева +Acacia Wood Stairs=Ступени из акации Acacia Wood Slab=Плита из акации Double Acacia Wood Slab=Двойная плита из акации -Spruce Wood Stairs=Еловые ступеньки +Spruce Wood Stairs=Еловые ступени Spruce Wood Slab=Еловая плита Double Spruce Wood Slab=Двойная еловая плита -Birch Wood Stairs=Берёзовые ступеньки +Birch Wood Stairs=Берёзовые ступени Birch Wood Slab=Берёзовая плита Double Birch Wood Slab=Двойная берёзовая плита -Dark Oak Wood Stairs=Ступеньки из тёмного дуба +Dark Oak Wood Stairs=Ступени из тёмного дуба Dark Oak Wood Slab=Плита из тёмного дуба Double Dark Oak Wood Slab=Двойная плита из тёмного дуба -Stone Stairs=Каменные ступеньки +Stone Stairs=Каменные ступени Stone Slab=Каменная плита Double Stone Slab=Двойная каменная плита Polished Stone Slab=Плита из гладкого камня Double Polished Stone Slab=Двойная плита из гладкого камня -Andesite Stairs=Андезитовые ступеньки +Andesite Stairs=Андезитовые ступени Andesite Slab=Андезитовая плита Double Andesite Slab=Двойная андезитовая плита -Granite Stairs=Гранитные ступеньки +Granite Stairs=Гранитные ступени Granite Slab=Гранитная плита Double Granite Slab=Двойная гранитная плита -Diorite Stairs=Диоритовые ступеньки +Diorite Stairs=Диоритовые ступени Diorite Slab=Диоритовая плита Double Diorite Slab=Двойная диоритовая плита -Cobblestone Stairs=Ступеньки из булыжника +Cobblestone Stairs=Ступени из булыжника Cobblestone Slab=Плита из булыжника Double Cobblestone Slab=Двойная плита из булыжника -Mossy Cobblestone Stairs=Ступеньки из мшистого булыжника -Mossy Cobblestone Slab=Плита из мшистого булыжника -Double Mossy Cobblestone Slab=Двойная плита из мшистого булыжника -Brick Stairs=Кирпичные ступеньки +Mossy Cobblestone Stairs=Ступени из замшелого булыжника +Mossy Cobblestone Slab=Плита из замшелого булыжника +Double Mossy Cobblestone Slab=Двойная плита из замшелого булыжника +Brick Stairs=Кирпичные ступени Brick Slab=Кирпичная плита Double Brick Slab=Двойная кирпичная плита -Sandstone Stairs=Ступеньки из песчаника +Sandstone Stairs=Ступени из песчаника Sandstone Slab=Плита из песчаника Double Sandstone Slab=Двойная плита из песчаника -Smooth Sandstone Stairs=Ступеньки из гладкого песчаника +Smooth Sandstone Stairs=Ступени из гладкого песчаника Smooth Sandstone Slab=Плита из гладкого песчаника Double Smooth Sandstone Slab=Двойная плита из гладкого песчаника -Red Sandstone Stairs=Ступеньки из красного песчаника +Red Sandstone Stairs=Ступени из красного песчаника Red Sandstone Slab=Плита из красного песчаника Double Red Sandstone Slab=Двойная плита из красного песчаника -Smooth Red Sandstone Stairs=Ступеньки из гладкого красного песчаника +Smooth Red Sandstone Stairs=Ступени из гладкого красного песчаника Smooth Red Sandstone Slab=Плита из гладкого красного песчаника Double Smooth Red Sandstone Slab=Двойная плита из гладкого красного песчаника -Stone Bricks Stairs=Ступеньки из каменных блоков -Stone Bricks Slab=Плита из каменных блоков -Double Stone Bricks Slab=Двойная плита из каменных блоков -Quartz Stairs=Кварцевые ступеньки +Stone Bricks Stairs=Ступени из каменных кирпичей +Stone Bricks Slab=Плита из каменных кирпичей +Double Stone Bricks Slab=Двойная плита из каменных кирпичей +Quartz Stairs=Кварцевые ступени Quartz Slab=Кварцевая плита Double Quartz Slab=Двойная кварцевая плита -Smooth Quartz Stairs=Ступеньки из гладкого кварца +Smooth Quartz Stairs=Ступени из гладкого кварца Smooth Quartz Slab=Плита из гладкого кварца Double Smooth Quartz Slab=Двойная плита из гладкого кварца -Nether Brick Stairs=Ступеньки из адского кирпича +Nether Brick Stairs=Ступени из адского кирпича Nether Brick Slab=Плита из адского кирпича Double Nether Brick Slab=Двойная плита из адского кирпича -Red Nether Brick Stairs=Ступеньки из красного адского кирпича +Red Nether Brick Stairs=Ступени из красного адского кирпича Red Nether Brick Slab=Плита из красного адского кирпича Double Red Nether Brick Slab=Двойная из красного адского кирпича -End Stone Brick Stairs=Ступеньки из камня Предела -End Stone Brick Slab=Плита из камня Предела -Double End Stone Brick Slab=Двойная плита из камня Предела -Purpur Stairs=Пурпурные ступеньки +End Stone Brick Stairs=Ступени из камня Края +End Stone Brick Slab=Плита из камня Края +Double End Stone Brick Slab=Двойная плита из камня Края +Purpur Stairs=Пурпурные ступени Purpur Slab=Пурпурная плита Double Purpur Slab=Двойная пурпурная плита -Prismarine Stairs=Призмариновые ступеньки +Prismarine Stairs=Призмариновые ступени Prismarine Slab=Призмариновая плита Double Prismarine Slab=Двойная призмариновая плита -Prismarine Brick Stairs=Ступеньки из призмаринового кирпича +Prismarine Brick Stairs=Ступени из призмаринового кирпича Prismarine Brick Slab=Плита из призмаринового кирпича Double Prismarine Brick Slab=Двойная плита из призмаринового кирпича -Dark Prismarine Stairs=Ступеньки из тёмного призмарина +Dark Prismarine Stairs=Ступени из тёмного призмарина Dark Prismarine Slab=Плита из тёмного призмарина Double Dark Prismarine Slab=Двойная плита из тёмного призмарина Polished Andesite Slab=Плита из гладкого андезита Double Polished Andesite Slab=Двойная плита из гладкого андезита -Polished Andesite Stairs=Ступеньки из гладкого андезита +Polished Andesite Stairs=Ступени из гладкого андезита Polished Granite Slab=Плита из гладкого гранита Double Polished Granite Slab=Двойная плита из гладкого гранита -Polished Granite Stairs=Ступеньки из гладкого гранита +Polished Granite Stairs=Ступени из гладкого гранита Polished Diorite Slab=Плита из гладкого диорита Double Polished Diorite Slab=Двойная плита из гладкого диорита -Polished Diorite Stairs=Ступеньки из гладкого диорита -Mossy Stone Brick Stairs=Ступеньки из мшистого каменного блока -Mossy Stone Brick Slab=Плита из мшистого каменного блока -Double Mossy Stone Brick Slab=Двойная плита из мшистого каменного блока +Polished Diorite Stairs=Ступени из гладкого диорита +Mossy Stone Brick Stairs=Ступени из замшелых каменных кирпичей +Mossy Stone Brick Slab=Плита из замшелых каменных кирпичей +Double Mossy Stone Brick Slab=Двойная плита из замшелых каменных кирпичей diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index c468946dd..88c69a3f3 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -57,6 +57,7 @@ end -- Staticdata handling because objects may want to be reloaded function mcl_throwing.get_staticdata(self) + if not self then return end local thrower -- Only save thrower if it's a player name if type(self._thrower) == "string" then diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.fr.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.fr.tr index bd78c031e..b08066a4b 100644 --- a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.fr.tr +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.fr.tr @@ -2,11 +2,11 @@ @1 used the ender pearl too often.=@1 a utilisé la perle ender trop souvent. Use the punch key to throw.=Utilisez la touche frapper pour lancer. Snowball=Boule de Neige -Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Les boules de neige peuvent être lancées ou lancées à partir d'un distributeur pour le plaisir. Toucher quelque chose avec une boule de neige ne fait rien. +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Les boules de neige peuvent être lancées à la main ou à partir d'un distributeur pour le plaisir. Toucher quelque chose avec une boule de neige ne fait rien. Egg=Oeuf Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Les œufs peuvent être jetés ou lancés à partir d'un distributeur et se cassent à l'impact. Il y a une petite chance que 1 ou même 4 poussins sortent de l'oeuf. -Ender Pearl=Ender Perle -An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Une Perle d'Ender est un objet qui peut être utilisé pour la téléportation au détriment de la santé. Il peut être lancé et téléporter le lanceur vers son emplacement d'impact lorsqu'il frappe un bloc solide ou une plante. Chaque téléportation blesse l'utilisateur de 5 points de vie. +Ender Pearl=Perle d'Ender +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Une Perle d'Ender est un objet qui peut être utilisé pour la téléportation au détriment de la santé. Elle peut être lancée et téléporter le lanceur vers son emplacement d'atterissage lorsqu'elle frappe un bloc solide ou une plante. Chaque téléportation blesse l'utilisateur de 5 points de vie. Throwable=Jetable Chance to hatch chicks when broken=Possibilité d'éclosion de poussins lorsqu'ils sont brisés -Teleports you on impact for cost of 5 HP=Vous téléporte sur l'impact pour un coût de 5 PV +Teleports you on impact for cost of 5 HP=Vous téléporte au point d'impact pour un coût de 5 PV diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr index 7670f729c..a58f8da92 100644 --- a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr @@ -1,12 +1,12 @@ # textdomain: mcl_throwing -@1 used the ender pearl too often.=@1 использовал(а) жемчужину Предела слишком часто. -Use the punch key to throw.=Используй клавишу удара для броска. +@1 used the ender pearl too often.=@1 использовал(а) жемчуг Края слишком часто. +Use the punch key to throw.=Используйте клавишу удара для броска. Snowball=Снежок -Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Снежки можно бросать или запускать из диспенсера для веселья. Попадание снежком в кого-либо ни к чему не приводит. +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Снежки можно бросать или запускать из раздатчика для веселья. Попадание снежком в кого-либо ничего не делает. Egg=Яйцо -Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Яйца можно бросать или запускать из диспенсера, они ломаются при ударе. Есть небольшой шанс вылупления 1 или даже 4 цыплят из яйца. -Ender Pearl=Жемчужина Предела -An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Жемчужина Предела это предмет, который можно использовать для телепортации за счёт единиц вашего здоровья. Его можно бросить, и это телепортирует бросившего в место удара, когда он попадает в сплошной блок или растение. Каждая телепортация ранит пользователя на 5 очков здоровья (HP). +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Яйца можно бросать или запускать из раздатчика, они ломаются при столкновении. Есть небольшой шанс вылупления 1 или даже 4 цыплят из яйца. +Ender Pearl=Жемчуг Края +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Жемчуг Края это предмет, который можно использовать для телепортации за счёт единиц вашего здоровья. Его можно бросить, и это телепортирует бросившего в то место, куда упадает жемчуг. Каждая телепортация ранит игрока на 5 очков здоровья. Throwable=Можно бросать Chance to hatch chicks when broken=Шанс вылупления цыплят при разбитии -Teleports you on impact for cost of 5 HP=Телепортирует вас при ударе за счёт 5 HP +Teleports you on impact for cost of 5 HP=Телепортирует вас; урон 5 HP от столкновения diff --git a/mods/ITEMS/mcl_throwing/register.lua b/mods/ITEMS/mcl_throwing/register.lua index ec11f86c7..605ee1386 100644 --- a/mods/ITEMS/mcl_throwing/register.lua +++ b/mods/ITEMS/mcl_throwing/register.lua @@ -139,6 +139,7 @@ local function egg_on_step(self, dtime) -- Turn given object into a child local function make_child(object) + if not object then return end local ent = object:get_luaentity() object:set_properties({ visual_size = { x = ent.base_size.x/2, y = ent.base_size.y/2 }, diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.fr.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.fr.tr index b5cba53bf..bef9f0db1 100644 --- a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.fr.tr +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.fr.tr @@ -3,6 +3,6 @@ TNT=TNT An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Un engin explosif. Quand il explose, il blessera les êtres vivants et détruira les blocs autour de lui. La TNT a un rayon d'explosion de @1. Avec une petite chance, les blocs peuvent tomber comme un objet (comme s'ils étaient minés) plutôt que d'être détruits. La TNT peut être enflammée par des outils, des explosions, des feux d'incendie, de la lave et de la redstone. An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Un engin explosif. Quand elle explose, elle blessera les êtres vivants. La TNT a un rayon d'explosion de @1. La TNT peut être enflammée par des outils, des explosions, des feux d'incendie, de la lave et de la redstone. -Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Placez la TNT et allumez-la avec l'une des méthodes ci-dessus. Déplacez-vous rapidement à une distance de sécurité. La TNT commencera à être affecté par la gravité et explose en 4 secondes. +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Placez la TNT et allumez-la avec l'une des méthodes ci-dessus. Déplacez-vous rapidement à une distance de sécurité. La TNT commencera à être affectée par la gravité et explose en 4 secondes. Ignited by tools, explosions, fire, lava, redstone power=Enflammé par les outils, les explosions, le feu, la lave, la redstone Explosion radius: @1=Rayon d'explosion: @1 diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr index 9724c7552..19a685754 100644 --- a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr @@ -1,8 +1,8 @@ # textdomain: mcl_tnt -@1 was caught in an explosion.=@1 попал в радиус действия взрыва. -TNT=Тротил -An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывное устройство. Когда оно взрывается, то причиняет вред живым существам и разрушает блоки вокруг себя. Тротил имеет радиус взрыва @1. С небольшой вероятностью блоки могут выпадать в качестве предметов (как при добыче), а не уничтожаться. Тротил может быть подорван инструментами, взрывами, огнём, лавой и сигналами редстоуна. -An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывное устройство. Когда оно взрывается, то причиняет вред живым существам и разрушает блоки вокруг себя. Тротил имеет радиус взрыва @1. Тротил может быть подорван инструментами, взрывами, огнём, лавой и сигналами редстоуна. -Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Разместите тротил, зажгите его одним из методов, описанных выше. Отбегите на безопасное расстояние. Тротил начнет подвергаться воздействию силы тяжести и взорвётся через 4 секунды. -Ignited by tools, explosions, fire, lava, redstone power=Зажигается инструментами, взрывами, огнём, лавой, энергией редстоуна +@1 was caught in an explosion.=@1 попал(а) во взрыв. +TNT=ТНТ +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывчатка. Когда она взрывается, то причиняет вред живым существам и разрушает блоки вокруг себя. ТНТ имеет радиус взрыва @1. С небольшой вероятностью блоки могут выпадать в качестве предметов (как при добыче), а не уничтожаться. ТНТ может быть подорван инструментами, взрывом, огнём, лавой и сигналом редстоуна. +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывчатка. Когда она взрывается, то причиняет вред живым существам. ТНТ имеет радиус взрыва @1. ТНТ может быть подорван инструментами, взрывом, огнём, лавой и сигналом редстоуна. +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Разместите ТНТ, зажгите его одним из методов, описанных выше. Отбегите на безопасное расстояние. ТНТ начнет подвергаться воздействию силы тяжести и взорвётся через 4 секунды. +Ignited by tools, explosions, fire, lava, redstone power=Зажигается инструментами, взрывом, огнём, лавой, сигналом редстоуна Explosion radius: @1=Радиус взрыва: @1 diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 3e6695c7e..565ca9c12 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -25,11 +25,11 @@ local groupcaps, hand_range, hand_groups if minetest.is_creative_enabled("") then -- Instant breaking in creative mode groupcaps = { creative_breakable = { times = {0}, uses = 0 } } - hand_range = 10 + hand_range = 5 hand_groups = { dig_speed_class = 7 } else groupcaps = {} - hand_range = 4 + hand_range = 4.5 hand_groups = { dig_speed_class = 1 } end minetest.register_tool(":", { diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr index 02cd7f2bd..a30f8c0a1 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.fr.tr @@ -1,14 +1,14 @@ # textdomain: mcl_tools -You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Vous utilisez votre main nue lorsque vous ne portez aucun objet. Avec votre main, vous pouvez miner la plupart des blocs, mais c'est la méthode la plus lente et seuls les blocs les plus faibles produiront un élément utile. La main inflige également des dégâts mineurs en frappant. L'utilisation de la main est souvent un dernier recours, car les outils et les armes d'extraction appropriés sont bien meilleurs. +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Vous utilisez votre main nue lorsque vous ne portez aucun objet. Avec votre main, vous pouvez miner la plupart des blocs, mais c'est la méthode la plus lente et seuls les blocs les plus faibles donneront des éléments utiles. La main inflige également des dégâts mineurs en frappant. L'utilisation de la main est souvent un dernier recours, car les outils et les armes d'extraction appropriées sont bien meilleures. When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Lorsque vous maniez un objet qui n'est ni un outil d'extraction ni une arme, il se comportera comme s'il s'agissait de la main lorsque vous commencez à extraire ou à frapper. In Creative Mode, the hand is able to break all blocks instantly.=En mode créatif, la main est capable de briser tous les blocs instantanément. Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Les pioches sont des outils d'extraction pour extraire des blocs durs, comme la pierre. Une pioche peut également être utilisée comme arme, mais elle est plutôt inefficace. An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Une hache est votre outil de choix pour abattre des arbres, des blocs à base de bois et d'autres blocs. Les haches infligent également beaucoup de dégâts, mais elles sont plutôt lentes. Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Les épées sont excellentes en combat de mêlée, car elles sont rapides, infligent des dégâts élevés et peuvent supporter d'innombrables batailles. Les épées peuvent également être utilisées pour couper quelques blocs particuliers, tels que les toiles d'araignées. -Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Les pelles sont des outils pour creuser des blocs grossiers, tels que la terre, le sable et le gravier. Ils peuvent également être utilisés pour transformer des blocs d'herbe en chemins de terre. Les pelles peuvent être utilisées comme armes, mais elles sont très faibles. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Les pelles sont des outils pour creuser des blocs grossiers, tels que la terre, le sable et le gravier. Elles peuvent également être utilisées pour transformer des blocs d'herbe en chemins de terre. Les pelles peuvent être utilisées comme armes, mais elles sont très faibles. To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Pour transformer un bloc d'herbe en chemin de terre, tenez la pelle dans votre main, puis utilisez (clic droit) le haut ou le côté d'un bloc d'herbe. Cela ne fonctionne que lorsqu'il y a de l'air au-dessus du bloc d'herbe. Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Les cisailles sont des outils pour tondre les moutons et pour extraire quelques types de blocs. Les cisailles sont un outil d'extraction spécial et peuvent être utilisées pour obtenir l'élément d'origine à partir d'herbe, de feuilles et de blocs similaires qui nécessitent une coupe. -To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Pour tondre des moutons ou tailler des citrouilles sans visage, utilisez la touche "placer" dessus. Les visages ne peuvent être sculptés que sur le côté des citrouilles sans visage. L'exploitation minière fonctionne comme d'habitude, mais les éléments sont différentes pour quelques blocs. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Pour tondre des moutons ou tailler des citrouilles sans visage, utilisez la touche "placer" dessus. Les visages ne peuvent être sculptés que sur le côté des citrouilles sans visage. L'exploitation minière fonctionne comme d'habitude, mais les éléments obtenus sont différentes pour quelques blocs. Wooden Pickaxe=Pioche en Bois Stone Pickaxe=Pioche en Pierre Iron Pickaxe=Pioche en Fer diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr index e82fa15ef..c19e368fc 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr @@ -1,32 +1,36 @@ # textdomain: mcl_tools -You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Вы используете пустую руку, если не держите в ней никакого предмета. Пустой рукой вашей стороны вы можете добывать большинство блоков, но это самый медленный метод, который позволит добыть что-то полезное только из самых слабых блоков Рука также наносит небольшой урон при ударе. Использование пустой руки часто является последним средством, поскольку гораздо предпочтительнее использовать правильные подобранные инструменты и оружие. -When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Когда вы держите предмет, не являющийся инструментом майнинга или оружием, то при майнинге или ударах он будет вести себя так, как если бы это была пустая рука. -In Creative Mode, the hand is able to break all blocks instantly.=В творческом режиме пустая рука мгновенно ломает любой блок. -Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Кирка это инструмент для добычи тяжёлых блоков - камней и т. п. Кирка также может использоваться в качестве оружия, но не особо эффективного. -An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Топор это ваш лучший выбор для рубки деревьев, деревянных и других блоков. Топор также причиняет высокий урон, но бьёт довольно медленно. -Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Меч это оружие ближнего боя, он быстр, он наносит высокий урон и может выдержать множество битв. Меч также можно использовать для разрубания специфических блоков, например, паутины. -Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Лопата - инструмент для выкапывания заборных блоков, таких как грязь, песок и гравий. Их также можно использовать, чтобы превращать блоки травы в тропинки. Лопату можно использовать и в качестве оружия, но очень слабого. -To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Чтобы превратить блок травы в тропинку, кликните правой по верхней его стороне, держа лопату в руке. Это сработает, только если над блоком травы есть воздух. -Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Ножницы это инструмент для стрижки овец, ими также можно добыть несколько других блоков. Ножницы это специальный инструмент, которым можно добывать оригинальные предметы травы, листьев и тому подобных, требующих стрижки. -To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Чтобы остричь овцу или вырезать безликую тыкву, нажмите клавишу “Разместить” на вашей цели. Лица могут быть вырезаны только на сторонах безликих тыкв. Добыча работает как обычно, но полученные предметы будут различаться для нескольких разных блоков. +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Вы используете руку, если не держите в ней никакого предмета. Пустой рукой вы можете добывать большинство блоков, но это самый медленный метод, который позволит добыть что-то полезное только из самых слабых блоков. Рука также наносит небольшой урон при ударе. Использование руки часто является последним средством, поскольку гораздо предпочтительнее использовать правильные подобранные инструменты и оружие. +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Когда вы держите предмет, не являющийся инструментом добычи или оружием, то при добыче или ударах он будет вести себя так, как если бы это была пустая рука. +In Creative Mode, the hand is able to break all blocks instantly.=В творческом режиме рука мгновенно ломает любой блок. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Кирка это инструмент для добычи твёрдых блоков - камней и т. п. Кирка также может использоваться в качестве оружия, но не особо эффективного. +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Топор это лучший выбор для рубки деревьев, деревянных и подобных блоков. Топор также причиняет высокий урон, но бьёт довольно медленно. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Меч это оружие ближнего боя, он быстр, наносит высокий урон и может выдержать множество сражений. Меч также можно использовать для разрубания специфических блоков, например, паутины. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Лопата - инструмент для выкапывания рыхлых блоков, таких как земля, песок и гравий. Лопату также можно использовать, чтобы превращать дёрн в тропинки. Лопату можно использовать и в качестве оружия, но очень слабого. +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Чтобы превратить блок дёрна в тропинку, кликните правой кнопкой мыши по его верхней стороне, держа лопату в руке. Это сработает, только если над блоком травы есть воздух. +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Ножницы это инструмент для стрижки овец, но ими также можно добыть несколько блоков. Ножницы это специальный инструмент, которым можно добывать траву, листьея и тому подобные. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Чтобы остричь овцу или вырезать тыкву, нажмите правую кнопку мыши на вашей цели. Лица могут быть вырезаны только по бокам тыквы. Добывание работает как обычно, но полученные предметы будут различаться для нескольких разных блоков. Wooden Pickaxe=Деревянная кирка Stone Pickaxe=Каменная кирка Iron Pickaxe=Железная кирка Golden Pickaxe=Золотая кирка Diamond Pickaxe=Алмазная кирка +Netherite Pickaxe=Незеритовая кирка Wooden Shovel=Деревянная лопата Stone Shovel=Каменная лопата Iron Shovel=Железная лопата Golden Shovel=Золотая лопата Diamond Shovel=Алмазная лопата +Netherite Shovel=Незеритовая лопата Wooden Axe=Деревянный топор Stone Axe=Каменный топор Iron Axe=Железный топор Golden Axe=Золотой топор Diamond Axe=Алмазный топор +Netherite Axe=Незеритовый топор Wooden Sword=Деревянный меч Stone Sword=Каменный меч Iron Sword=Железный меч Golden Sword=Золотой меч Diamond Sword=Алмазный меч +Netherite Sword=Незеритовый меч Shears=Ножницы diff --git a/mods/ITEMS/mcl_tools/locale/template.txt b/mods/ITEMS/mcl_tools/locale/template.txt index ecb94105f..2f5830312 100644 --- a/mods/ITEMS/mcl_tools/locale/template.txt +++ b/mods/ITEMS/mcl_tools/locale/template.txt @@ -14,19 +14,23 @@ Stone Pickaxe= Iron Pickaxe= Golden Pickaxe= Diamond Pickaxe= +Netherite Pickaxe= Wooden Shovel= Stone Shovel= Iron Shovel= Golden Shovel= Diamond Shovel= +Netherite Shovel= Wooden Axe= Stone Axe= Iron Axe= Golden Axe= Diamond Axe= +Netherite Axe= Wooden Sword= Stone Sword= Iron Sword= Golden Sword= Diamond Sword= +Netherite Sword= Shears= diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr index c3812eaad..a10f21acb 100644 --- a/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr @@ -1,3 +1,3 @@ # textdomain: mcl_torches Torch=Факел -Torches are light sources which can be placed at the side or on the top of most blocks.=Факелы это источники света, которые можно вешать на стены или ставить на верхние части большинства блоков. +Torches are light sources which can be placed at the side or on the top of most blocks.=Факел это источник света, который можно поставить на большинство блоков сверху или сбоку. \ No newline at end of file diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index b11e68df7..7a45ea58f 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -12,6 +12,14 @@ mcl_damage.register_modifier(function(obj, damage, reason) local hp = obj:get_hp() if hp - damage <= 0 then local wield = obj:get_wielded_item() + local in_offhand = false + if not (wield:get_name() == "mobs_mc:totem") then + local inv = obj:get_inventory() + if inv then + wield = obj:get_inventory():get_stack("offhand", 1) + in_offhand = true + end + end if wield:get_name() == "mobs_mc:totem" then local ppos = obj:get_pos() local pnname = minetest.get_node(ppos).name @@ -28,7 +36,12 @@ mcl_damage.register_modifier(function(obj, damage, reason) if not minetest.is_creative_enabled(obj:get_player_name()) then wield:take_item() - obj:set_wielded_item(wield) + if in_offhand then + obj:get_inventory():set_stack("offhand", 1, wield) + mcl_inventory.update_inventory_formspec(obj) + else + obj:set_wielded_item(wield) + end end -- Effects diff --git a/mods/ITEMS/mcl_tridents/README.md b/mods/ITEMS/mcl_tridents/README.md index 4aea50d58..480f77198 100644 --- a/mods/ITEMS/mcl_tridents/README.md +++ b/mods/ITEMS/mcl_tridents/README.md @@ -1,3 +1,3 @@ -# mcl_tridents by j45 +# mcl_tridents by j45, model by epCode -Adds tridents to MineClone2. \ No newline at end of file +Adds tridents to MineClone 2/5 diff --git a/mods/ITEMS/mcl_tridents/locale/mcl_tridents.ru.tr b/mods/ITEMS/mcl_tridents/locale/mcl_tridents.ru.tr new file mode 100644 index 000000000..4a9b1cc4e --- /dev/null +++ b/mods/ITEMS/mcl_tridents/locale/mcl_tridents.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_tridents +Trident=Трезубец +Launches a trident when you rightclick and it is in your hand=Щелкните правой кнопкой мыши чтобы метнуть трезубец \ No newline at end of file diff --git a/mods/ITEMS/mcl_tridents/locale/template.txt b/mods/ITEMS/mcl_tridents/locale/template.txt new file mode 100644 index 000000000..0825911ff --- /dev/null +++ b/mods/ITEMS/mcl_tridents/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_tridents +Trident= +Launches a trident when you rightclick and it is in your hand= diff --git a/mods/ITEMS/mcl_tridents/mod.conf b/mods/ITEMS/mcl_tridents/mod.conf new file mode 100644 index 000000000..829c43be7 --- /dev/null +++ b/mods/ITEMS/mcl_tridents/mod.conf @@ -0,0 +1,2 @@ +name = mcl_tridents +author = j45, epCode diff --git a/mods/ITEMS/mcl_tridents/models/mcl_trident.obj b/mods/ITEMS/mcl_tridents/models/mcl_trident.obj index 32af51ed6..69822d67f 100644 --- a/mods/ITEMS/mcl_tridents/models/mcl_trident.obj +++ b/mods/ITEMS/mcl_tridents/models/mcl_trident.obj @@ -1,10854 +1,782 @@ -# Blender v2.82 (sub 7) OBJ File: 'trident.blend' +# Blender v3.0.0 OBJ File: '' # www.blender.org -mtllib trident.mtl -o Cylinder -v -7.194370 -0.000000 0.363753 -v -7.194370 -0.036636 0.367362 -v -7.194370 -0.071864 0.378048 -v -7.194370 -0.104331 0.395402 -v -7.194370 -0.132788 0.418756 -v -7.194370 -0.156142 0.447213 -v -7.194370 -0.173496 0.479680 -v -7.194370 -0.184182 0.514908 -v -7.194370 -0.187791 0.551544 -v -7.194370 -0.184183 0.588180 -v -7.194370 -0.173496 0.623409 -v -7.194370 -0.156142 0.655875 -v -7.194370 -0.132788 0.684332 -v -7.194370 -0.104331 0.707687 -v -7.194370 -0.071864 0.725040 -v -7.194370 -0.036636 0.735727 -v -7.194370 0.000000 0.739335 -v -7.194370 0.036636 0.735727 -v -7.194370 0.071864 0.725040 -v -7.194370 0.104331 0.707687 -v -7.194370 0.132788 0.684332 -v -7.194370 0.156142 0.655875 -v -7.194370 0.173496 0.623408 -v -7.194370 0.184182 0.588180 -v -7.194370 0.187791 0.551544 -v -7.194370 0.184182 0.514908 -v -7.194370 0.173496 0.479680 -v -7.194370 0.156142 0.447213 -v -7.194370 0.132788 0.418756 -v -7.194370 0.104331 0.395402 -v -7.194370 0.071864 0.378048 -v -7.194370 0.036636 0.367362 -v 1.937123 0.000002 0.363752 -v 1.937123 -0.036634 0.367361 -v 1.937123 -0.071862 0.378047 -v 1.937123 -0.104329 0.395401 -v 1.937123 -0.132786 0.418755 -v 1.937123 -0.156140 0.447212 -v 1.937123 -0.173494 0.479679 -v 1.937123 -0.184180 0.514907 -v 1.937123 -0.187789 0.551543 -v 1.937123 -0.184180 0.588179 -v 1.937123 -0.173494 0.623407 -v 1.937123 -0.156140 0.655874 -v 1.937123 -0.132786 0.684331 -v 1.937123 -0.104329 0.707685 -v 1.937123 -0.071862 0.725039 -v 1.937123 -0.036634 0.735725 -v 1.937123 0.000002 0.739334 -v 1.937123 0.036639 0.735725 -v 1.937123 0.071867 0.725039 -v 1.937123 0.104333 0.707685 -v 1.937123 0.132791 0.684331 -v 1.937123 0.156145 0.655874 -v 1.937123 0.173498 0.623407 -v 1.937123 0.184185 0.588179 -v 1.937123 0.187793 0.551543 -v 1.937123 0.184185 0.514907 -v 1.937123 0.173498 0.479678 -v 1.937123 0.156144 0.447212 -v 1.937123 0.132790 0.418755 -v 1.937123 0.104333 0.395400 -v 1.937123 0.071866 0.378047 -v 1.937123 0.036638 0.367360 -v -10.250076 -0.036639 0.367363 -v -10.250076 -0.000002 0.363755 -v -10.250076 -0.071867 0.378049 -v -10.250076 -0.104333 0.395403 -v -10.250076 -0.132791 0.418757 -v -10.250076 -0.156145 0.447214 -v -10.250076 -0.173498 0.479681 -v -10.250076 -0.184185 0.514909 -v -10.250076 -0.187793 0.551545 -v -10.250076 -0.184185 0.588182 -v -10.250076 -0.173498 0.623410 -v -10.250076 -0.156145 0.655876 -v -10.250076 -0.132791 0.684334 -v -10.250076 -0.104333 0.707688 -v -10.250076 -0.071867 0.725042 -v -10.250076 -0.036638 0.735728 -v -10.250076 -0.000002 0.739336 -v -10.250076 0.036634 0.735728 -v -10.250076 0.071862 0.725041 -v -10.250076 0.104329 0.707688 -v -10.250076 0.132786 0.684333 -v -10.250076 0.156140 0.655876 -v -10.250076 0.173494 0.623410 -v -10.250076 0.184180 0.588181 -v -10.250076 0.187788 0.551545 -v -10.250076 0.184180 0.514909 -v -10.250076 0.173494 0.479681 -v -10.250076 0.156140 0.447214 -v -10.250076 0.132786 0.418757 -v -10.250076 0.104328 0.395403 -v -10.250076 0.071862 0.378049 -v -10.250076 0.036634 0.367363 -v -10.614231 -0.046042 0.320092 -v -10.614231 -0.000003 0.315557 -v -10.614231 -0.090311 0.333521 -v -10.614231 -0.131111 0.355328 -v -10.614231 -0.166872 0.384677 -v -10.614231 -0.196220 0.420437 -v -10.614231 -0.218027 0.461237 -v -10.614231 -0.231456 0.505506 -v -10.614231 -0.235991 0.551545 -v -10.614231 -0.231456 0.597584 -v -10.614231 -0.218027 0.641854 -v -10.614231 -0.196220 0.682654 -v -10.614231 -0.166872 0.718414 -v -10.614231 -0.131111 0.747763 -v -10.614231 -0.090311 0.769570 -v -10.614231 -0.046042 0.782999 -v -10.614231 -0.000003 0.787534 -v -10.614231 0.046036 0.782999 -v -10.614231 0.090306 0.769570 -v -10.614231 0.131106 0.747762 -v -10.614231 0.166866 0.718414 -v -10.614231 0.196215 0.682653 -v -10.614231 0.218022 0.641854 -v -10.614231 0.231451 0.597584 -v -10.614231 0.235986 0.551545 -v -10.614231 0.231451 0.505506 -v -10.614231 0.218022 0.461236 -v -10.614231 0.196214 0.420437 -v -10.614231 0.166866 0.384676 -v -10.614231 0.131105 0.355328 -v -10.614231 0.090306 0.333521 -v -10.614231 0.046036 0.320092 -v -11.151556 -0.025116 0.425290 -v -11.151556 -0.000003 0.422816 -v -11.151556 -0.049265 0.432615 -v -11.151556 -0.071521 0.444511 -v -11.151556 -0.091028 0.460520 -v -11.151556 -0.107037 0.480027 -v -11.151556 -0.118933 0.502283 -v -11.151556 -0.126259 0.526432 -v -11.151556 -0.128732 0.551546 -v -11.151556 -0.126259 0.576659 -v -11.151556 -0.118933 0.600808 -v -11.151556 -0.107037 0.623064 -v -11.151556 -0.091028 0.642571 -v -11.151556 -0.071521 0.658580 -v -11.151556 -0.049265 0.670476 -v -11.151556 -0.025116 0.677802 -v -11.151556 -0.000003 0.680275 -v -11.151556 0.025111 0.677801 -v -11.151556 0.049260 0.670476 -v -11.151556 0.071516 0.658580 -v -11.151556 0.091023 0.642571 -v -11.151556 0.107032 0.623064 -v -11.151556 0.118928 0.600808 -v -11.151556 0.126253 0.576659 -v -11.151556 0.128727 0.551545 -v -11.151556 0.126253 0.526432 -v -11.151556 0.118928 0.502283 -v -11.151556 0.107032 0.480027 -v -11.151556 0.091023 0.460520 -v -11.151556 0.071516 0.444511 -v -11.151556 0.049260 0.432615 -v -11.151556 0.025111 0.425290 -v -11.239233 -0.000002 0.551546 -v -7.530121 0.071863 0.725041 -v -7.530121 0.104330 0.707687 -v -7.530121 0.132787 0.684333 -v -7.530121 0.156141 0.655876 -v -7.530121 0.173495 0.623409 -v -7.530121 0.184181 0.588181 -v -7.530121 0.187790 0.551545 -v -7.530121 0.184181 0.514908 -v -7.530121 0.173495 0.479680 -v -7.530121 0.156141 0.447214 -v -7.530121 -0.000001 0.363754 -v -7.530121 -0.036637 0.367362 -v -7.530121 0.132787 0.418756 -v -7.530121 -0.071866 0.378049 -v -7.530121 0.104330 0.395402 -v -7.530121 -0.104332 0.395402 -v -7.530121 0.071863 0.378049 -v -7.530121 -0.132789 0.418757 -v -7.530121 0.036635 0.367362 -v -7.530121 -0.156144 0.447214 -v -7.530121 -0.173497 0.479680 -v -7.530121 -0.184184 0.514909 -v -7.530121 -0.187792 0.551545 -v -7.530121 -0.184184 0.588181 -v -7.530121 -0.173497 0.623409 -v -7.530121 -0.156144 0.655876 -v -7.530121 -0.132789 0.684333 -v -7.530121 -0.104332 0.707687 -v -7.530121 -0.071866 0.725041 -v -7.530121 -0.036637 0.735727 -v -7.530121 -0.000001 0.739336 -v -7.530121 0.036635 0.735727 -v -8.553731 0.071863 0.725041 -v -8.553731 -0.000001 0.363754 -v -8.553731 0.104330 0.707687 -v -8.553731 0.132787 0.684333 -v -8.553731 0.156141 0.655876 -v -8.553731 0.173495 0.623409 -v -8.553731 0.184181 0.588181 -v -8.553731 0.187789 0.551545 -v -8.553731 0.184181 0.514909 -v -8.553731 0.173495 0.479680 -v -8.553731 0.156141 0.447214 -v -8.553731 -0.036638 0.367362 -v -8.553731 0.132787 0.418757 -v -8.553731 -0.071866 0.378049 -v -8.553731 0.104329 0.395402 -v -8.553731 -0.104332 0.395403 -v -8.553731 0.071863 0.378049 -v -8.553731 -0.132790 0.418757 -v -8.553731 0.036634 0.367362 -v -8.553731 -0.156144 0.447214 -v -8.553731 -0.173498 0.479680 -v -8.553731 -0.184184 0.514909 -v -8.553731 -0.187792 0.551545 -v -8.553731 -0.184184 0.588181 -v -8.553731 -0.173498 0.623409 -v -8.553731 -0.156144 0.655876 -v -8.553731 -0.132790 0.684333 -v -8.553731 -0.104332 0.707687 -v -8.553731 -0.071866 0.725041 -v -8.553731 -0.036638 0.735727 -v -8.553731 -0.000001 0.739336 -v -8.553731 0.036635 0.735727 -v -8.474993 0.123192 0.735917 -v -8.391620 0.097399 0.697315 -v -8.322146 0.097399 0.697315 -v -8.234142 0.097399 0.697315 -v -8.164668 0.097399 0.697315 -v -8.076663 0.097399 0.697315 -v -8.007189 0.097399 0.697315 -v -7.919184 0.097399 0.697315 -v -7.849711 0.097399 0.697315 -v -7.761706 0.097399 0.697315 -v -7.692232 0.097399 0.697315 -v -7.608860 0.123192 0.735917 -v -8.474993 0.156794 0.708340 -v -8.391620 0.123966 0.675512 -v -8.322146 0.123966 0.675512 -v -8.234142 0.123966 0.675512 -v -8.164668 0.123966 0.675512 -v -8.076663 0.123966 0.675512 -v -8.007189 0.123966 0.675512 -v -7.919184 0.123966 0.675512 -v -7.849711 0.123966 0.675512 -v -7.761706 0.123966 0.675512 -v -7.692232 0.123966 0.675512 -v -7.608860 0.156795 0.708340 -v -8.474993 0.184371 0.674738 -v -8.391620 0.145769 0.648945 -v -8.322146 0.145769 0.648945 -v -8.234142 0.145769 0.648945 -v -8.164668 0.145769 0.648945 -v -8.076663 0.145769 0.648945 -v -8.007189 0.145769 0.648945 -v -7.919184 0.145769 0.648945 -v -7.849711 0.145769 0.648945 -v -7.761706 0.145769 0.648945 -v -7.692232 0.145769 0.648945 -v -7.608860 0.184371 0.674738 -v -8.474993 0.204862 0.636402 -v -8.391620 0.161970 0.618635 -v -8.322146 0.161970 0.618635 -v -8.234142 0.161970 0.618635 -v -8.164668 0.161970 0.618635 -v -8.076663 0.161970 0.618635 -v -8.007189 0.161970 0.618635 -v -7.919184 0.161970 0.618635 -v -7.849711 0.161970 0.618635 -v -7.761706 0.161970 0.618635 -v -7.692232 0.161970 0.618635 -v -7.608860 0.204862 0.636402 -v -8.474993 0.217480 0.594805 -v -8.391620 0.171946 0.585747 -v -8.322146 0.171946 0.585747 -v -8.234142 0.171946 0.585747 -v -8.164668 0.171946 0.585747 -v -8.076663 0.171946 0.585747 -v -8.007189 0.171946 0.585747 -v -7.919184 0.171946 0.585747 -v -7.849711 0.171946 0.585747 -v -7.761706 0.171946 0.585747 -v -7.692232 0.171946 0.585747 -v -7.608860 0.217481 0.594804 -v -8.474993 0.221741 0.551545 -v -8.391620 0.175315 0.551545 -v -8.322146 0.175315 0.551545 -v -8.234142 0.175315 0.551545 -v -8.164668 0.175315 0.551545 -v -8.076663 0.175315 0.551545 -v -8.007189 0.175315 0.551545 -v -7.919184 0.175315 0.551545 -v -7.849711 0.175315 0.551545 -v -7.761706 0.175315 0.551545 -v -7.692232 0.175315 0.551545 -v -7.608860 0.221741 0.551545 -v -8.474993 0.217480 0.508285 -v -8.391620 0.171946 0.517342 -v -8.322146 0.171946 0.517342 -v -8.234142 0.171946 0.517342 -v -8.164668 0.171946 0.517342 -v -8.076663 0.171946 0.517342 -v -8.007189 0.171946 0.517342 -v -7.919184 0.171946 0.517342 -v -7.849711 0.171946 0.517342 -v -7.761706 0.171946 0.517342 -v -7.692232 0.171946 0.517342 -v -7.608860 0.217481 0.508285 -v -8.474993 0.204862 0.466688 -v -8.391620 0.161969 0.484454 -v -8.322146 0.161969 0.484454 -v -8.234142 0.161969 0.484454 -v -8.164668 0.161969 0.484454 -v -8.076663 0.161969 0.484454 -v -8.007189 0.161970 0.484454 -v -7.919184 0.161970 0.484454 -v -7.849711 0.161970 0.484454 -v -7.761706 0.161970 0.484454 -v -7.692232 0.161970 0.484454 -v -7.608860 0.204862 0.466687 -v -8.474993 0.184371 0.428351 -v -8.391620 0.145768 0.454144 -v -8.322146 0.145768 0.454144 -v -8.234142 0.145768 0.454144 -v -8.164668 0.145768 0.454144 -v -8.076663 0.145769 0.454144 -v -8.007189 0.145769 0.454144 -v -7.919184 0.145769 0.454144 -v -7.849711 0.145769 0.454144 -v -7.761706 0.145769 0.454144 -v -7.692232 0.145769 0.454144 -v -7.608860 0.184371 0.428351 -v -8.474993 -0.043261 0.334063 -v -8.391620 -0.034204 0.379597 -v -8.322146 -0.034204 0.379597 -v -8.234142 -0.034204 0.379597 -v -8.164668 -0.034204 0.379597 -v -8.076663 -0.034204 0.379597 -v -8.007189 -0.034204 0.379597 -v -7.919184 -0.034204 0.379597 -v -7.849711 -0.034204 0.379597 -v -7.761706 -0.034204 0.379597 -v -7.692232 -0.034204 0.379597 -v -7.608860 -0.043261 0.334063 -v -8.474993 0.156794 0.394749 -v -8.391620 0.123966 0.427578 -v -8.322146 0.123966 0.427578 -v -8.234142 0.123966 0.427578 -v -8.164668 0.123966 0.427578 -v -8.076663 0.123966 0.427578 -v -8.007189 0.123966 0.427578 -v -7.919184 0.123966 0.427578 -v -7.849711 0.123966 0.427577 -v -7.761706 0.123966 0.427577 -v -7.692232 0.123966 0.427577 -v -7.608860 0.156794 0.394749 -v -8.474993 -0.084859 0.346682 -v -8.391620 -0.067092 0.389574 -v -8.322146 -0.067092 0.389574 -v -8.234142 -0.067092 0.389574 -v -8.164668 -0.067092 0.389574 -v -8.076663 -0.067092 0.389574 -v -8.007189 -0.067092 0.389574 -v -7.919184 -0.067092 0.389574 -v -7.849711 -0.067092 0.389574 -v -7.761706 -0.067092 0.389574 -v -7.692232 -0.067092 0.389574 -v -7.608860 -0.084858 0.346681 -v -8.474993 0.123192 0.367173 -v -8.391620 0.097399 0.405775 -v -8.322146 0.097399 0.405775 -v -8.234142 0.097399 0.405775 -v -8.164668 0.097399 0.405775 -v -8.076663 0.097399 0.405775 -v -8.007189 0.097399 0.405775 -v -7.919184 0.097399 0.405775 -v -7.849711 0.097399 0.405775 -v -7.761706 0.097399 0.405775 -v -7.692232 0.097399 0.405775 -v -7.608860 0.123192 0.367173 -v -8.474993 -0.123195 0.367173 -v -8.391620 -0.097402 0.405775 -v -8.322146 -0.097402 0.405775 -v -8.234142 -0.097402 0.405775 -v -8.164668 -0.097402 0.405775 -v -8.076663 -0.097402 0.405775 -v -8.007189 -0.097402 0.405775 -v -7.919184 -0.097402 0.405775 -v -7.849711 -0.097402 0.405775 -v -7.761706 -0.097402 0.405775 -v -7.692232 -0.097402 0.405775 -v -7.608860 -0.123195 0.367173 -v -8.474993 0.084855 0.346681 -v -8.391620 0.067089 0.389574 -v -8.322146 0.067089 0.389574 -v -8.234142 0.067089 0.389574 -v -8.164668 0.067089 0.389574 -v -8.076663 0.067089 0.389574 -v -8.007189 0.067089 0.389574 -v -7.919184 0.067089 0.389574 -v -7.849711 0.067089 0.389574 -v -7.761706 0.067089 0.389574 -v -7.692232 0.067089 0.389574 -v -7.608860 0.084856 0.346681 -v -8.474993 -0.156797 0.394749 -v -8.391620 -0.123969 0.427578 -v -8.322146 -0.123969 0.427578 -v -8.234142 -0.123968 0.427578 -v -8.164668 -0.123968 0.427578 -v -8.076663 -0.123968 0.427578 -v -8.007189 -0.123968 0.427578 -v -7.919184 -0.123968 0.427578 -v -7.849711 -0.123968 0.427578 -v -7.761706 -0.123968 0.427578 -v -7.692232 -0.123968 0.427578 -v -7.608860 -0.156797 0.394749 -v -8.474993 0.043258 0.334063 -v -8.391620 0.034201 0.379597 -v -8.322146 0.034201 0.379597 -v -8.234142 0.034201 0.379597 -v -8.164668 0.034201 0.379597 -v -8.076663 0.034201 0.379597 -v -8.007189 0.034201 0.379597 -v -7.919184 0.034201 0.379597 -v -7.849711 0.034201 0.379597 -v -7.761706 0.034201 0.379597 -v -7.692232 0.034201 0.379597 -v -7.608860 0.043258 0.334063 -v -8.474993 -0.184374 0.428351 -v -8.391620 -0.145771 0.454145 -v -8.322146 -0.145771 0.454145 -v -8.234142 -0.145771 0.454145 -v -8.164668 -0.145771 0.454145 -v -8.076663 -0.145771 0.454144 -v -8.007189 -0.145771 0.454144 -v -7.919184 -0.145771 0.454144 -v -7.849711 -0.145771 0.454144 -v -7.761706 -0.145771 0.454144 -v -7.692232 -0.145771 0.454144 -v -7.608860 -0.184373 0.428351 -v -8.474993 -0.204865 0.466688 -v -8.391620 -0.161972 0.484454 -v -8.322146 -0.161972 0.484454 -v -8.234142 -0.161972 0.484454 -v -8.164668 -0.161972 0.484454 -v -8.076663 -0.161972 0.484454 -v -8.007189 -0.161972 0.484454 -v -7.919184 -0.161972 0.484454 -v -7.849711 -0.161972 0.484454 -v -7.761706 -0.161972 0.484454 -v -7.692232 -0.161972 0.484454 -v -7.608860 -0.204864 0.466688 -v -8.474993 -0.217483 0.508285 -v -8.391620 -0.171949 0.517342 -v -8.322146 -0.171949 0.517342 -v -8.234142 -0.171949 0.517342 -v -8.164668 -0.171949 0.517342 -v -8.076663 -0.171949 0.517342 -v -8.007189 -0.171949 0.517342 -v -7.919184 -0.171949 0.517342 -v -7.849711 -0.171949 0.517342 -v -7.761706 -0.171949 0.517342 -v -7.692232 -0.171949 0.517342 -v -7.608860 -0.217483 0.508285 -v -8.474993 -0.221744 0.551545 -v -8.391620 -0.175317 0.551545 -v -8.322146 -0.175317 0.551545 -v -8.234142 -0.175317 0.551545 -v -8.164668 -0.175317 0.551545 -v -8.076663 -0.175317 0.551545 -v -8.007189 -0.175317 0.551545 -v -7.919184 -0.175317 0.551545 -v -7.849711 -0.175317 0.551545 -v -7.761706 -0.175317 0.551545 -v -7.692232 -0.175317 0.551545 -v -7.608860 -0.221744 0.551545 -v -8.474993 -0.217483 0.594805 -v -8.391620 -0.171949 0.585747 -v -8.322146 -0.171949 0.585747 -v -8.234142 -0.171949 0.585747 -v -8.164668 -0.171949 0.585747 -v -8.076663 -0.171949 0.585747 -v -8.007189 -0.171949 0.585747 -v -7.919184 -0.171949 0.585747 -v -7.849711 -0.171949 0.585747 -v -7.761706 -0.171949 0.585747 -v -7.692232 -0.171949 0.585747 -v -7.608860 -0.217483 0.594805 -v -8.474993 -0.204865 0.636402 -v -8.391620 -0.161972 0.618635 -v -8.322146 -0.161972 0.618635 -v -8.234142 -0.161972 0.618635 -v -8.164668 -0.161972 0.618635 -v -8.076663 -0.161972 0.618635 -v -8.007189 -0.161972 0.618635 -v -7.919184 -0.161972 0.618635 -v -7.849711 -0.161972 0.618635 -v -7.761706 -0.161972 0.618635 -v -7.692232 -0.161972 0.618635 -v -7.608860 -0.204864 0.636402 -v -8.474993 -0.184374 0.674738 -v -8.391620 -0.145771 0.648945 -v -8.322146 -0.145771 0.648945 -v -8.234142 -0.145771 0.648945 -v -8.164668 -0.145771 0.648945 -v -8.076663 -0.145771 0.648945 -v -8.007189 -0.145771 0.648945 -v -7.919184 -0.145771 0.648945 -v -7.849711 -0.145771 0.648945 -v -7.761706 -0.145771 0.648945 -v -7.692232 -0.145771 0.648945 -v -7.608860 -0.184373 0.674738 -v -8.474993 -0.156797 0.708341 -v -8.391620 -0.123969 0.675512 -v -8.322146 -0.123969 0.675512 -v -8.234142 -0.123968 0.675512 -v -8.164668 -0.123968 0.675512 -v -8.076663 -0.123968 0.675512 -v -8.007189 -0.123968 0.675512 -v -7.919184 -0.123968 0.675512 -v -7.849711 -0.123968 0.675512 -v -7.761706 -0.123968 0.675512 -v -7.692232 -0.123968 0.675512 -v -7.608860 -0.156797 0.708340 -v -8.474993 -0.123195 0.735917 -v -8.391620 -0.097402 0.697315 -v -8.322146 -0.097402 0.697315 -v -8.234142 -0.097402 0.697315 -v -8.164668 -0.097402 0.697315 -v -8.076663 -0.097402 0.697315 -v -8.007189 -0.097402 0.697315 -v -7.919184 -0.097402 0.697315 -v -7.849711 -0.097402 0.697315 -v -7.761706 -0.097402 0.697315 -v -7.692232 -0.097402 0.697315 -v -7.608860 -0.123195 0.735917 -v -8.474993 -0.084859 0.756408 -v -8.391620 -0.067092 0.713516 -v -8.322146 -0.067092 0.713516 -v -8.234142 -0.067092 0.713516 -v -8.164668 -0.067092 0.713516 -v -8.076663 -0.067092 0.713516 -v -8.007189 -0.067092 0.713516 -v -7.919184 -0.067092 0.713516 -v -7.849711 -0.067092 0.713516 -v -7.761706 -0.067092 0.713516 -v -7.692232 -0.067092 0.713516 -v -7.608860 -0.084858 0.756408 -v -8.474993 -0.043261 0.769027 -v -8.391620 -0.034204 0.723492 -v -8.322146 -0.034204 0.723492 -v -8.234142 -0.034204 0.723492 -v -8.164668 -0.034204 0.723492 -v -8.076663 -0.034204 0.723492 -v -8.007189 -0.034204 0.723492 -v -7.919184 -0.034204 0.723492 -v -7.849711 -0.034204 0.723492 -v -7.761706 -0.034204 0.723492 -v -7.692232 -0.034204 0.723492 -v -7.608860 -0.043261 0.769027 -v -8.474993 -0.000001 0.773287 -v -8.391620 -0.000001 0.726861 -v -8.322146 -0.000001 0.726861 -v -8.234142 -0.000001 0.726861 -v -8.164668 -0.000001 0.726861 -v -8.076663 -0.000001 0.726861 -v -8.007189 -0.000001 0.726861 -v -7.919184 -0.000001 0.726861 -v -7.849711 -0.000001 0.726861 -v -7.761706 -0.000001 0.726861 -v -7.692232 -0.000001 0.726861 -v -7.608860 -0.000001 0.773287 -v -8.474993 0.043258 0.769027 -v -8.391620 0.034201 0.723492 -v -8.322146 0.034201 0.723492 -v -8.234142 0.034201 0.723492 -v -8.164668 0.034201 0.723492 -v -8.076663 0.034201 0.723492 -v -8.007189 0.034201 0.723492 -v -7.919184 0.034201 0.723492 -v -7.849711 0.034201 0.723492 -v -7.761706 0.034201 0.723492 -v -7.692232 0.034201 0.723492 -v -7.608860 0.043259 0.769027 -v -7.608860 0.084856 0.756408 -v -7.692232 0.067089 0.713516 -v -7.761706 0.067089 0.713516 -v -7.849711 0.067089 0.713516 -v -7.919185 0.067089 0.713516 -v -8.007190 0.067089 0.713516 -v -8.076663 0.067089 0.713516 -v -8.164668 0.067089 0.713516 -v -8.234142 0.067089 0.713516 -v -8.322147 0.067089 0.713516 -v -8.391620 0.067089 0.713516 -v -8.474993 0.084856 0.756408 -v -7.608860 -0.000001 0.329802 -v -7.692232 -0.000001 0.376229 -v -7.761706 -0.000001 0.376229 -v -7.849711 -0.000001 0.376229 -v -7.919185 -0.000001 0.376229 -v -8.007190 -0.000001 0.376229 -v -8.076663 -0.000001 0.376229 -v -8.164668 -0.000001 0.376229 -v -8.234142 -0.000001 0.376229 -v -8.322147 -0.000001 0.376229 -v -8.391620 -0.000001 0.376229 -v -8.474993 -0.000001 0.329802 -v -8.199405 0.111421 0.718300 -v -8.199405 0.141812 0.693358 -v -8.199405 0.166754 0.662967 -v -8.199405 0.185287 0.628294 -v -8.199405 0.196699 0.590671 -v -8.199405 0.200553 0.551545 -v -8.199405 0.196699 0.512418 -v -8.199405 0.185287 0.474796 -v -8.199405 0.166753 0.440123 -v -8.199405 -0.039128 0.354844 -v -8.199405 0.141812 0.409731 -v -8.199405 -0.076750 0.366257 -v -8.199405 0.111420 0.384790 -v -8.199405 -0.111423 0.384790 -v -8.199405 0.076747 0.366257 -v -8.199405 -0.141815 0.409732 -v -8.199405 0.039125 0.354844 -v -8.199405 -0.166756 0.440123 -v -8.199405 -0.185289 0.474796 -v -8.199405 -0.196702 0.512419 -v -8.199405 -0.200556 0.551545 -v -8.199405 -0.196702 0.590671 -v -8.199405 -0.185289 0.628294 -v -8.199405 -0.166756 0.662967 -v -8.199405 -0.141815 0.693358 -v -8.199405 -0.111423 0.718300 -v -8.199405 -0.076750 0.736833 -v -8.199405 -0.039127 0.748246 -v -8.199405 -0.000001 0.752099 -v -8.199405 0.039125 0.748246 -v -8.199405 0.076748 0.736833 -v -8.199405 -0.000001 0.350991 -v -8.041925 0.111421 0.718300 -v -8.041925 0.141812 0.693358 -v -8.041925 0.166754 0.662967 -v -8.041925 0.185287 0.628294 -v -8.041925 0.196699 0.590671 -v -8.041925 0.200553 0.551545 -v -8.041925 0.196699 0.512418 -v -8.041925 0.185287 0.474796 -v -8.041925 0.166753 0.440123 -v -8.041925 -0.039127 0.354844 -v -8.041925 0.141812 0.409731 -v -8.041925 -0.076750 0.366257 -v -8.041925 0.111420 0.384790 -v -8.041925 -0.111423 0.384790 -v -8.041925 0.076747 0.366257 -v -8.041925 -0.141815 0.409732 -v -8.041925 0.039125 0.354844 -v -8.041925 -0.166756 0.440123 -v -8.041925 -0.185289 0.474796 -v -8.041925 -0.196702 0.512419 -v -8.041925 -0.200556 0.551545 -v -8.041925 -0.196702 0.590671 -v -8.041925 -0.185289 0.628294 -v -8.041925 -0.166756 0.662967 -v -8.041925 -0.141815 0.693358 -v -8.041925 -0.111423 0.718300 -v -8.041925 -0.076750 0.736833 -v -8.041925 -0.039127 0.748245 -v -8.041925 -0.000001 0.752099 -v -8.041925 0.039125 0.748245 -v -8.041927 0.076748 0.736833 -v -8.041927 -0.000001 0.350991 -v -7.884447 0.111421 0.718300 -v -7.884447 0.141812 0.693358 -v -7.884447 0.166754 0.662967 -v -7.884447 0.185287 0.628294 -v -7.884447 0.196700 0.590671 -v -7.884447 0.200553 0.551545 -v -7.884447 0.196699 0.512418 -v -7.884447 0.185287 0.474796 -v -7.884447 0.166753 0.440123 -v -7.884447 -0.039127 0.354844 -v -7.884447 0.141812 0.409731 -v -7.884447 -0.076750 0.366257 -v -7.884447 0.111421 0.384790 -v -7.884447 -0.111423 0.384790 -v -7.884447 0.076747 0.366257 -v -7.884447 -0.141815 0.409732 -v -7.884447 0.039125 0.354844 -v -7.884447 -0.166756 0.440123 -v -7.884447 -0.185289 0.474796 -v -7.884447 -0.196702 0.512419 -v -7.884447 -0.200556 0.551545 -v -7.884447 -0.196702 0.590671 -v -7.884447 -0.185289 0.628294 -v -7.884447 -0.166756 0.662967 -v -7.884447 -0.141815 0.693358 -v -7.884447 -0.111423 0.718300 -v -7.884447 -0.076750 0.736833 -v -7.884447 -0.039127 0.748245 -v -7.884447 -0.000001 0.752099 -v -7.884447 0.039125 0.748245 -v -7.884448 0.076748 0.736833 -v -7.884448 -0.000001 0.350991 -v -1.638910 0.184184 0.514907 -v -1.638910 0.187792 0.551543 -v -1.638910 0.173497 0.479679 -v -1.638910 0.156144 0.447212 -v -1.638910 -0.036635 0.367361 -v -1.638910 0.000001 0.363753 -v -1.638910 0.132789 0.418755 -v -1.638910 -0.071863 0.378047 -v -1.638910 0.104332 0.395401 -v -1.638910 -0.104330 0.395401 -v -1.638910 0.071866 0.378047 -v -1.638910 -0.132787 0.418755 -v -1.638910 0.036637 0.367361 -v -1.638910 -0.156141 0.447212 -v -1.638910 -0.173495 0.479679 -v -1.638910 -0.184181 0.514907 -v -1.638910 -0.187789 0.551543 -v -1.638910 -0.184181 0.588180 -v -1.638910 -0.173495 0.623408 -v -1.638910 -0.156141 0.655874 -v -1.638910 -0.132787 0.684332 -v -1.638910 -0.104330 0.707686 -v -1.638910 -0.071863 0.725040 -v -1.638910 -0.036635 0.735726 -v -1.638910 0.000001 0.739334 -v -1.638910 0.036638 0.735726 -v -1.638910 0.071866 0.725040 -v -1.638910 0.104332 0.707686 -v -1.638910 0.132790 0.684332 -v -1.638910 0.156144 0.655874 -v -1.638910 0.173498 0.623408 -v -1.638910 0.184184 0.588179 -v -0.727585 0.184184 0.514907 -v -0.727585 0.173498 0.479679 -v -0.727585 0.156144 0.447212 -v -0.727585 -0.036635 0.367361 -v -0.727585 0.132790 0.418755 -v -0.727585 -0.071863 0.378047 -v -0.727585 0.104332 0.395401 -v -0.727585 -0.104329 0.395401 -v -0.727585 0.071866 0.378047 -v -0.727585 -0.132787 0.418755 -v -0.727585 0.036637 0.367361 -v -0.727585 -0.156141 0.447212 -v -0.727585 -0.173494 0.479679 -v -0.727585 -0.184181 0.514907 -v -0.727585 -0.187789 0.551543 -v -0.727585 -0.184181 0.588179 -v -0.727585 -0.173495 0.623408 -v -0.727585 -0.156141 0.655874 -v -0.727585 -0.132787 0.684331 -v -0.727585 -0.104329 0.707686 -v -0.727585 -0.071863 0.725039 -v -0.727585 -0.036635 0.735726 -v -0.727585 0.000002 0.739334 -v -0.727585 0.036638 0.735726 -v -0.727585 0.071866 0.725039 -v -0.727585 0.104333 0.707686 -v -0.727585 0.132790 0.684331 -v -0.727585 0.156144 0.655874 -v -0.727585 0.173498 0.623408 -v -0.727585 0.184184 0.588179 -v -0.727585 0.187792 0.551543 -v -0.727585 0.000002 0.363753 -v -0.766329 0.220916 0.551543 -v -0.885448 0.188261 0.551543 -v -1.004568 0.188261 0.551543 -v -1.123686 0.188261 0.551543 -v -1.242805 0.188261 0.551543 -v -1.361924 0.188261 0.551543 -v -1.481043 0.188261 0.551543 -v -1.600163 0.220916 0.551543 -v -0.766329 0.000002 0.330629 -v -0.885448 0.000002 0.363284 -v -1.004568 0.000002 0.363284 -v -1.123686 0.000001 0.363284 -v -1.242805 0.000001 0.363284 -v -1.361924 0.000001 0.363284 -v -1.481043 0.000001 0.363284 -v -1.600163 0.000001 0.330629 -v -1.600163 0.216671 0.508445 -v -1.481043 0.184644 0.514816 -v -1.361925 0.184644 0.514816 -v -1.242805 0.184644 0.514816 -v -1.123686 0.184644 0.514816 -v -1.004568 0.184644 0.514816 -v -0.885449 0.184644 0.514816 -v -0.766329 0.216671 0.508445 -v -1.600163 0.204100 0.467003 -v -1.481043 0.173931 0.479499 -v -1.361925 0.173931 0.479499 -v -1.242805 0.173931 0.479499 -v -1.123686 0.173931 0.479499 -v -1.004568 0.173931 0.479499 -v -0.885449 0.173931 0.479499 -v -0.766329 0.204100 0.467003 -v -1.600163 0.183685 0.428810 -v -1.481043 0.156534 0.446952 -v -1.361925 0.156534 0.446952 -v -1.242805 0.156534 0.446952 -v -1.123686 0.156534 0.446952 -v -1.004568 0.156534 0.446952 -v -0.885449 0.156534 0.446952 -v -0.766329 0.183685 0.428810 -v -1.600163 -0.043097 0.334874 -v -1.481043 -0.036726 0.366901 -v -1.361925 -0.036726 0.366901 -v -1.242805 -0.036726 0.366901 -v -1.123686 -0.036726 0.366901 -v -1.004568 -0.036726 0.366901 -v -0.885449 -0.036726 0.366901 -v -0.766329 -0.043097 0.334874 -v -1.600163 0.156211 0.395333 -v -1.481043 0.133121 0.418424 -v -1.361925 0.133121 0.418424 -v -1.242805 0.133121 0.418423 -v -1.123686 0.133121 0.418423 -v -1.004568 0.133121 0.418423 -v -0.885449 0.133121 0.418423 -v -0.766329 0.156212 0.395333 -v -1.600163 -0.084539 0.347445 -v -1.481043 -0.072043 0.377614 -v -1.361925 -0.072042 0.377614 -v -1.242805 -0.072042 0.377614 -v -1.123686 -0.072042 0.377614 -v -1.004568 -0.072042 0.377614 -v -0.885449 -0.072042 0.377614 -v -0.766329 -0.084539 0.347445 -v -1.600163 0.122735 0.367860 -v -1.481043 0.104593 0.395011 -v -1.361925 0.104593 0.395011 -v -1.242805 0.104593 0.395011 -v -1.123686 0.104593 0.395011 -v -1.004568 0.104593 0.395011 -v -0.885449 0.104593 0.395011 -v -0.766329 0.122735 0.367860 -v -1.600163 -0.122732 0.367860 -v -1.481043 -0.104590 0.395011 -v -1.361925 -0.104590 0.395011 -v -1.242805 -0.104590 0.395011 -v -1.123686 -0.104590 0.395011 -v -1.004568 -0.104590 0.395011 -v -0.885449 -0.104590 0.395011 -v -0.766329 -0.122732 0.367860 -v -1.600163 0.084541 0.347445 -v -1.481043 0.072045 0.377614 -v -1.361925 0.072045 0.377614 -v -1.242805 0.072045 0.377614 -v -1.123686 0.072045 0.377614 -v -1.004568 0.072045 0.377614 -v -0.885449 0.072045 0.377614 -v -0.766329 0.084542 0.347445 -v -1.600163 -0.156209 0.395333 -v -1.481043 -0.133118 0.418424 -v -1.361925 -0.133118 0.418424 -v -1.242805 -0.133118 0.418424 -v -1.123686 -0.133118 0.418424 -v -1.004568 -0.133118 0.418424 -v -0.885449 -0.133118 0.418424 -v -0.766329 -0.156209 0.395333 -v -1.600163 0.043099 0.334874 -v -1.481043 0.036729 0.366901 -v -1.361925 0.036729 0.366901 -v -1.242805 0.036729 0.366901 -v -1.123686 0.036729 0.366901 -v -1.004568 0.036729 0.366901 -v -0.885449 0.036729 0.366901 -v -0.766329 0.043100 0.334874 -v -1.600163 -0.183682 0.428810 -v -1.481043 -0.156531 0.446952 -v -1.361925 -0.156531 0.446952 -v -1.242805 -0.156531 0.446952 -v -1.123686 -0.156531 0.446952 -v -1.004568 -0.156531 0.446952 -v -0.885449 -0.156531 0.446952 -v -0.766329 -0.183682 0.428810 -v -1.600163 -0.204097 0.467003 -v -1.481043 -0.173928 0.479500 -v -1.361925 -0.173928 0.479500 -v -1.242805 -0.173928 0.479500 -v -1.123686 -0.173928 0.479500 -v -1.004568 -0.173928 0.479499 -v -0.885449 -0.173928 0.479499 -v -0.766329 -0.204097 0.467003 -v -1.600163 -0.216668 0.508445 -v -1.481043 -0.184641 0.514816 -v -1.361925 -0.184641 0.514816 -v -1.242805 -0.184641 0.514816 -v -1.123686 -0.184641 0.514816 -v -1.004568 -0.184641 0.514816 -v -0.885449 -0.184641 0.514816 -v -0.766329 -0.216668 0.508445 -v -1.600163 -0.220913 0.551543 -v -1.481043 -0.188258 0.551543 -v -1.361925 -0.188258 0.551543 -v -1.242805 -0.188258 0.551543 -v -1.123686 -0.188258 0.551543 -v -1.004568 -0.188258 0.551543 -v -0.885449 -0.188258 0.551543 -v -0.766329 -0.220913 0.551543 -v -1.600163 -0.216668 0.594642 -v -1.481043 -0.184641 0.588271 -v -1.361925 -0.184641 0.588271 -v -1.242805 -0.184641 0.588271 -v -1.123686 -0.184641 0.588271 -v -1.004568 -0.184641 0.588271 -v -0.885449 -0.184641 0.588271 -v -0.766329 -0.216668 0.594642 -v -1.600163 -0.204097 0.636084 -v -1.481043 -0.173928 0.623587 -v -1.361925 -0.173928 0.623587 -v -1.242805 -0.173928 0.623587 -v -1.123686 -0.173928 0.623587 -v -1.004568 -0.173928 0.623587 -v -0.885449 -0.173928 0.623587 -v -0.766329 -0.204097 0.636084 -v -1.600163 -0.183682 0.674277 -v -1.481043 -0.156531 0.656135 -v -1.361925 -0.156531 0.656135 -v -1.242805 -0.156531 0.656135 -v -1.123686 -0.156531 0.656135 -v -1.004568 -0.156531 0.656135 -v -0.885449 -0.156531 0.656135 -v -0.766329 -0.183682 0.674277 -v -1.600163 -0.156209 0.707754 -v -1.481043 -0.133118 0.684663 -v -1.361925 -0.133118 0.684663 -v -1.242805 -0.133118 0.684663 -v -1.123686 -0.133118 0.684663 -v -1.004568 -0.133118 0.684663 -v -0.885449 -0.133118 0.684663 -v -0.766329 -0.156209 0.707753 -v -1.600163 -0.122732 0.735227 -v -1.481043 -0.104590 0.708076 -v -1.361925 -0.104590 0.708076 -v -1.242805 -0.104590 0.708076 -v -1.123686 -0.104590 0.708076 -v -1.004568 -0.104590 0.708076 -v -0.885449 -0.104590 0.708076 -v -0.766329 -0.122732 0.735227 -v -1.600163 -0.084539 0.755642 -v -1.481043 -0.072042 0.725473 -v -1.361925 -0.072042 0.725473 -v -1.242805 -0.072042 0.725473 -v -1.123686 -0.072042 0.725473 -v -1.004568 -0.072042 0.725473 -v -0.885449 -0.072042 0.725473 -v -0.766329 -0.084539 0.755642 -v -1.600163 -0.043097 0.768213 -v -1.481043 -0.036726 0.736186 -v -1.361925 -0.036726 0.736186 -v -1.242805 -0.036726 0.736186 -v -1.123686 -0.036726 0.736186 -v -1.004568 -0.036726 0.736186 -v -0.885449 -0.036726 0.736186 -v -0.766329 -0.043097 0.768213 -v -1.600163 0.000001 0.772458 -v -1.481043 0.000001 0.739803 -v -1.361925 0.000001 0.739803 -v -1.242805 0.000002 0.739803 -v -1.123686 0.000002 0.739803 -v -1.004568 0.000002 0.739803 -v -0.885449 0.000002 0.739803 -v -0.766329 0.000002 0.772458 -v -1.600163 0.043100 0.768213 -v -1.481043 0.036729 0.736186 -v -1.361925 0.036729 0.736186 -v -1.242805 0.036729 0.736186 -v -1.123686 0.036729 0.736186 -v -1.004568 0.036729 0.736186 -v -0.885449 0.036729 0.736186 -v -0.766329 0.043100 0.768213 -v -1.600163 0.084542 0.755642 -v -1.481043 0.072045 0.725473 -v -1.361925 0.072045 0.725473 -v -1.242805 0.072045 0.725473 -v -1.123686 0.072045 0.725473 -v -1.004568 0.072045 0.725473 -v -0.885449 0.072046 0.725473 -v -0.766329 0.084542 0.755642 -v -1.600163 0.122735 0.735227 -v -1.481043 0.104593 0.708076 -v -1.361925 0.104593 0.708076 -v -1.242805 0.104593 0.708076 -v -1.123686 0.104593 0.708076 -v -1.004568 0.104593 0.708076 -v -0.885449 0.104593 0.708076 -v -0.766329 0.122735 0.735227 -v -1.600163 0.156212 0.707753 -v -1.481043 0.133121 0.684663 -v -1.361925 0.133121 0.684663 -v -1.242805 0.133121 0.684663 -v -1.123686 0.133121 0.684663 -v -1.004568 0.133121 0.684663 -v -0.885449 0.133121 0.684663 -v -0.766329 0.156212 0.707753 -v -1.600163 0.183685 0.674277 -v -1.481043 0.156534 0.656135 -v -1.361925 0.156534 0.656135 -v -1.242805 0.156534 0.656135 -v -1.123686 0.156534 0.656135 -v -1.004568 0.156534 0.656135 -v -0.885449 0.156534 0.656135 -v -0.766329 0.183685 0.674277 -v -1.600163 0.204100 0.636084 -v -1.481043 0.173931 0.623587 -v -1.361925 0.173931 0.623587 -v -1.242805 0.173931 0.623587 -v -1.123686 0.173931 0.623587 -v -1.004568 0.173931 0.623587 -v -0.885449 0.173931 0.623587 -v -0.766329 0.204100 0.636083 -v -1.600163 0.216671 0.594642 -v -1.481043 0.184644 0.588271 -v -1.361925 0.184644 0.588271 -v -1.242805 0.184644 0.588271 -v -1.123686 0.184644 0.588271 -v -1.004568 0.184644 0.588271 -v -0.885449 0.184644 0.588271 -v -0.766329 0.216671 0.594641 -v -1.064126 0.231022 0.551543 -v -1.064126 0.000002 0.320523 -v -1.064127 0.226583 0.506473 -v -1.064127 0.213436 0.463136 -v -1.064127 0.192088 0.423195 -v -1.064127 -0.045068 0.324962 -v -1.064127 0.163357 0.388187 -v -1.064127 -0.088406 0.338108 -v -1.064127 0.128349 0.359457 -v -1.064127 -0.128347 0.359457 -v -1.064127 0.088409 0.338108 -v -1.064127 -0.163355 0.388187 -v -1.064127 0.045071 0.324962 -v -1.064127 -0.192085 0.423195 -v -1.064127 -0.213433 0.463136 -v -1.064127 -0.226580 0.506474 -v -1.064127 -0.231019 0.551543 -v -1.064127 -0.226580 0.596613 -v -1.064127 -0.213433 0.639951 -v -1.064127 -0.192085 0.679891 -v -1.064127 -0.163355 0.714899 -v -1.064127 -0.128347 0.743630 -v -1.064127 -0.088406 0.764978 -v -1.064127 -0.045068 0.778125 -v -1.064127 0.000002 0.782564 -v -1.064127 0.045071 0.778125 -v -1.064127 0.088409 0.764978 -v -1.064127 0.128350 0.743630 -v -1.064127 0.163358 0.714899 -v -1.064127 0.192088 0.679891 -v -1.064127 0.213437 0.639951 -v -1.064127 0.226583 0.596613 -v -1.302365 0.231022 0.551543 -v -1.302365 0.000001 0.320523 -v -1.302365 0.226583 0.506473 -v -1.302365 0.213436 0.463136 -v -1.302365 0.192088 0.423195 -v -1.302365 -0.045068 0.324962 -v -1.302365 0.163357 0.388187 -v -1.302365 -0.088406 0.338108 -v -1.302365 0.128349 0.359457 -v -1.302365 -0.128347 0.359457 -v -1.302365 0.088409 0.338108 -v -1.302365 -0.163355 0.388187 -v -1.302365 0.045071 0.324962 -v -1.302365 -0.192085 0.423195 -v -1.302365 -0.213434 0.463136 -v -1.302365 -0.226580 0.506474 -v -1.302365 -0.231019 0.551543 -v -1.302365 -0.226580 0.596613 -v -1.302365 -0.213434 0.639951 -v -1.302365 -0.192085 0.679891 -v -1.302365 -0.163355 0.714899 -v -1.302365 -0.128347 0.743630 -v -1.302365 -0.088406 0.764978 -v -1.302365 -0.045068 0.778125 -v -1.302365 0.000002 0.782564 -v -1.302365 0.045071 0.778125 -v -1.302365 0.088409 0.764978 -v -1.302365 0.128350 0.743630 -v -1.302365 0.163358 0.714899 -v -1.302365 0.192088 0.679891 -v -1.302365 0.213437 0.639951 -v -1.302365 0.226583 0.596613 -v 3.396374 0.000002 0.431068 -v 3.396374 -0.023501 0.433383 -v 3.396374 -0.046101 0.440238 -v 3.396374 -0.066930 0.451371 -v 3.396374 -0.085186 0.466354 -v 3.396374 -0.100169 0.484610 -v 3.396374 -0.111302 0.505439 -v 3.396374 -0.118158 0.528039 -v 3.396374 -0.120473 0.551543 -v 3.396374 -0.118158 0.575046 -v 3.396374 -0.111302 0.597647 -v 3.396374 -0.100169 0.618475 -v 3.396374 -0.085186 0.636732 -v 3.396374 -0.066930 0.651714 -v 3.396374 -0.046101 0.662847 -v 3.396374 -0.023501 0.669703 -v 3.396374 0.000003 0.672018 -v 3.396374 0.023506 0.669703 -v 3.396374 0.046106 0.662847 -v 3.396374 0.066935 0.651714 -v 3.396374 0.085191 0.636731 -v 3.396374 0.100174 0.618475 -v 3.396374 0.111307 0.597646 -v 3.396374 0.118163 0.575046 -v 3.396374 0.120478 0.551543 -v 3.396374 0.118163 0.528039 -v 3.396374 0.111307 0.505439 -v 3.396374 0.100174 0.484610 -v 3.396374 0.085191 0.466354 -v 3.396374 0.066935 0.451371 -v 3.396374 0.046106 0.440238 -v 3.396374 0.023506 0.433383 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.670595 0.000001 0.551542 -v 5.072026 0.050647 0.530565 -v 5.072026 0.053766 0.540848 -v 5.072026 -0.030453 0.597121 -v 5.072026 -0.038760 0.590304 -v 5.072026 0.045581 0.521087 -v 5.072026 -0.020976 0.602187 -v 5.072026 -0.010692 0.497778 -v 5.072026 0.000002 0.496725 -v 5.072026 0.038764 0.512781 -v 5.072026 -0.010692 0.605307 -v 5.072026 -0.020976 0.500898 -v 5.072026 0.030457 0.505963 -v 5.072026 0.000002 0.606360 -v 5.072026 -0.030453 0.505963 -v 5.072026 0.020980 0.500898 -v 5.072026 0.010696 0.605307 -v 5.072026 -0.038760 0.512781 -v 5.072026 0.010696 0.497778 -v 5.072026 0.020980 0.602187 -v 5.072026 -0.045577 0.521088 -v 5.072026 0.030457 0.597121 -v 5.072026 -0.050643 0.530565 -v 5.072026 0.038764 0.590304 -v 5.072026 -0.053762 0.540848 -v 5.072026 0.045581 0.581997 -v 5.072026 -0.054815 0.551542 -v 5.072026 0.050647 0.572520 -v 5.072026 -0.053762 0.562237 -v 5.072026 0.053766 0.562237 -v 5.072026 -0.050643 0.572520 -v 5.072026 0.054819 0.551542 -v 5.072026 -0.045577 0.581997 -v 5.201908 0.076179 0.519988 -v 5.201908 -0.045808 0.620101 -v 5.201908 0.068560 0.505733 -v 5.201908 -0.031552 0.627720 -v 5.201908 -0.016084 0.470672 -v 5.201908 0.058305 0.493238 -v 5.201908 -0.016084 0.632412 -v 5.201908 -0.031552 0.475365 -v 5.201908 0.045811 0.482984 -v 5.201908 0.000002 0.633997 -v 5.201908 -0.045808 0.482984 -v 5.201908 0.031555 0.475365 -v 5.201908 0.016088 0.632412 -v 5.201908 -0.058302 0.493238 -v 5.201908 0.016087 0.470672 -v 5.201908 0.031555 0.627720 -v 5.201908 -0.068557 0.505733 -v 5.201908 0.045811 0.620101 -v 5.201908 -0.076176 0.519989 -v 5.201908 0.058306 0.609846 -v 5.201908 -0.080868 0.535456 -v 5.201908 0.068560 0.597351 -v 5.201908 -0.082453 0.551542 -v 5.201908 0.076179 0.583096 -v 5.201908 -0.080868 0.567628 -v 5.201908 0.080872 0.567628 -v 5.201908 -0.076176 0.583096 -v 5.201908 0.082456 0.551542 -v 5.201908 -0.068557 0.597352 -v 5.201908 0.080871 0.535456 -v 5.201908 -0.058302 0.609846 -v 5.201908 0.000002 0.469088 -v 3.268884 0.184185 0.514906 -v 3.268884 0.187794 0.551543 -v 3.268884 -0.132785 0.684331 -v 3.268884 -0.156140 0.655874 -v 3.268884 0.173499 0.479678 -v 3.268884 -0.104328 0.707685 -v 3.268884 0.156145 0.447212 -v 3.268884 -0.071862 0.725039 -v 3.268884 -0.036633 0.367360 -v 3.268884 0.000003 0.363752 -v 3.268884 0.132791 0.418754 -v 3.268884 -0.036633 0.735725 -v 3.268884 -0.071862 0.378047 -v 3.268884 0.104334 0.395400 -v 3.268884 0.000003 0.739334 -v 3.268884 -0.104328 0.395400 -v 3.268884 0.071867 0.378047 -v 3.268884 0.036639 0.735725 -v 3.268884 -0.132785 0.418755 -v 3.268884 0.036639 0.367360 -v 3.268884 0.071867 0.725039 -v 3.268884 -0.156140 0.447212 -v 3.268884 0.104334 0.707685 -v 3.268884 -0.173493 0.479678 -v 3.268884 0.132791 0.684331 -v 3.268884 -0.184180 0.514907 -v 3.268884 0.156145 0.655874 -v 3.268884 -0.187788 0.551543 -v 3.268884 0.173499 0.623407 -v 3.268884 -0.184180 0.588179 -v 3.268884 0.184185 0.588179 -v 3.268884 -0.173493 0.623407 -v 3.992743 0.083075 0.535018 -v 3.992743 -0.059890 0.611435 -v 3.992743 0.000002 0.466843 -v 3.992743 0.078255 0.519129 -v 3.992743 -0.047055 0.621968 -v 3.992743 0.070428 0.504486 -v 3.992743 -0.032411 0.629795 -v 3.992743 -0.016522 0.468470 -v 3.992743 0.059894 0.491651 -v 3.992743 -0.016522 0.634615 -v 3.992743 -0.032411 0.473290 -v 3.992743 0.047059 0.481117 -v 3.992743 0.000002 0.636243 -v 3.992743 -0.047055 0.481117 -v 3.992743 0.032415 0.473290 -v 3.992743 0.016526 0.634615 -v 3.992743 -0.059890 0.491651 -v 3.992743 0.016526 0.468470 -v 3.992743 0.032416 0.629795 -v 3.992743 -0.070423 0.504486 -v 3.992743 0.047059 0.621968 -v 3.992743 -0.078250 0.519129 -v 3.992743 0.059894 0.611435 -v 3.992743 -0.083070 0.535018 -v 3.992743 0.070428 0.598599 -v 3.992743 -0.084698 0.551543 -v 3.992743 0.078255 0.583956 -v 3.992743 -0.083070 0.568067 -v 3.992743 0.083075 0.568067 -v 3.992743 -0.078250 0.583956 -v 3.992743 0.084702 0.551543 -v 3.992743 -0.070423 0.598599 -v 4.797544 0.053151 0.529527 -v 4.797544 -0.031959 0.599375 -v 4.797544 0.047835 0.519582 -v 4.797544 -0.022013 0.604691 -v 4.797544 -0.011221 0.495120 -v 4.797544 0.040680 0.510864 -v 4.797544 -0.011221 0.607965 -v 4.797544 -0.022013 0.498394 -v 4.797544 0.031963 0.503710 -v 4.797544 0.000002 0.609070 -v 4.797544 -0.031959 0.503710 -v 4.797544 0.022017 0.498394 -v 4.797544 0.011225 0.607965 -v 4.797544 -0.040676 0.510864 -v 4.797544 0.011225 0.495120 -v 4.797544 0.022017 0.604691 -v 4.797544 -0.047831 0.519582 -v 4.797544 0.031963 0.599375 -v 4.797544 -0.053147 0.529528 -v 4.797544 0.040680 0.592221 -v 4.797544 -0.056421 0.540319 -v 4.797544 0.047835 0.583503 -v 4.797544 -0.057526 0.551543 -v 4.797544 0.053151 0.573557 -v 4.797544 -0.056421 0.562766 -v 4.797544 0.056425 0.562766 -v 4.797544 -0.053147 0.573557 -v 4.797544 0.057530 0.551542 -v 4.797544 -0.047831 0.583503 -v 4.797544 0.056425 0.540319 -v 4.797544 -0.040676 0.592221 -v 4.797544 0.000002 0.494015 -v 4.684866 0.100623 0.531528 -v 4.640315 0.125171 0.526645 -v 4.595768 0.100623 0.531528 -v 4.551219 0.125171 0.526645 -v 4.506669 0.100623 0.531528 -v 4.461956 0.124635 0.527181 -v 4.417573 0.100623 0.531528 -v 4.373023 0.125171 0.526645 -v 4.328474 0.100623 0.531528 -v 4.283925 0.125171 0.526645 -v 4.239376 0.100623 0.531528 -v 4.194828 0.079277 0.535774 -v 4.684866 -0.072542 0.624086 -v 4.640315 -0.090240 0.641784 -v 4.595768 -0.072542 0.624086 -v 4.551219 -0.090240 0.641784 -v 4.506669 -0.072542 0.624086 -v 4.461956 -0.090776 0.642321 -v 4.417573 -0.072542 0.624086 -v 4.373023 -0.090240 0.641784 -v 4.328474 -0.072542 0.624086 -v 4.283925 -0.090240 0.641784 -v 4.239376 -0.072541 0.624086 -v 4.194828 -0.057152 0.608697 -v 4.684866 0.000002 0.448950 -v 4.640315 0.000002 0.423921 -v 4.595768 0.000002 0.448950 -v 4.551219 0.000002 0.423921 -v 4.506669 0.000002 0.448950 -v 4.461956 -0.000534 0.424458 -v 4.417573 0.000002 0.448950 -v 4.373023 0.000002 0.423921 -v 4.328474 0.000002 0.448950 -v 4.283925 0.000002 0.423921 -v 4.239376 0.000002 0.448950 -v 4.194828 0.000002 0.470714 -v 4.194828 0.074678 0.520611 -v 4.239376 0.094785 0.512282 -v 4.283925 0.117909 0.502704 -v 4.328474 0.094785 0.512282 -v 4.373023 0.117909 0.502704 -v 4.417573 0.094785 0.512282 -v 4.461957 0.117372 0.503240 -v 4.506669 0.094785 0.512282 -v 4.551219 0.117909 0.502704 -v 4.595768 0.094785 0.512282 -v 4.640318 0.117909 0.502704 -v 4.684866 0.094785 0.512282 -v 4.194828 -0.044904 0.618749 -v 4.239376 -0.056995 0.636845 -v 4.283925 -0.070900 0.657656 -v 4.328474 -0.056995 0.636845 -v 4.373023 -0.070900 0.657656 -v 4.417573 -0.056995 0.636845 -v 4.461957 -0.071437 0.658192 -v 4.506669 -0.056995 0.636845 -v 4.551219 -0.070900 0.657656 -v 4.595768 -0.056995 0.636845 -v 4.640318 -0.070900 0.657656 -v 4.684866 -0.056995 0.636845 -v 4.194828 0.067208 0.506637 -v 4.239376 0.085304 0.494545 -v 4.283925 0.106115 0.480640 -v 4.328474 0.085304 0.494545 -v 4.373023 0.106115 0.480640 -v 4.417573 0.085304 0.494545 -v 4.461957 0.105579 0.481176 -v 4.506669 0.085304 0.494545 -v 4.551219 0.106115 0.480640 -v 4.595768 0.085304 0.494545 -v 4.640318 0.106115 0.480640 -v 4.684866 0.085304 0.494545 -v 4.194828 -0.030929 0.626218 -v 4.239376 -0.039258 0.646325 -v 4.283925 -0.048836 0.669449 -v 4.328474 -0.039258 0.646325 -v 4.373023 -0.048836 0.669449 -v 4.417573 -0.039258 0.646325 -v 4.461957 -0.049373 0.669985 -v 4.506669 -0.039258 0.646325 -v 4.551219 -0.048836 0.669449 -v 4.595768 -0.039258 0.646325 -v 4.640318 -0.048836 0.669449 -v 4.684866 -0.039258 0.646325 -v 4.194828 -0.015767 0.472267 -v 4.239376 -0.020013 0.450922 -v 4.283925 -0.024895 0.426374 -v 4.328474 -0.020013 0.450922 -v 4.373023 -0.024896 0.426374 -v 4.417573 -0.020013 0.450922 -v 4.461957 -0.025432 0.426910 -v 4.506669 -0.020013 0.450922 -v 4.551219 -0.024896 0.426374 -v 4.595768 -0.020013 0.450922 -v 4.640318 -0.024896 0.426374 -v 4.684866 -0.020013 0.450922 -v 4.194828 0.057156 0.494388 -v 4.239376 0.072546 0.478999 -v 4.283925 0.090244 0.461301 -v 4.328474 0.072546 0.478999 -v 4.373023 0.090244 0.461301 -v 4.417573 0.072546 0.478999 -v 4.461957 0.089707 0.461837 -v 4.507077 0.073144 0.479622 -v 4.551219 0.090244 0.461301 -v 4.595768 0.072546 0.478999 -v 4.640318 0.090244 0.461301 -v 4.684866 0.072546 0.478999 -v 4.194828 -0.015767 0.630818 -v 4.239376 -0.020013 0.652164 -v 4.283925 -0.024895 0.676711 -v 4.328474 -0.020013 0.652164 -v 4.373023 -0.024895 0.676711 -v 4.417573 -0.020013 0.652164 -v 4.461957 -0.025432 0.677248 -v 4.506669 -0.020013 0.652164 -v 4.551219 -0.024896 0.676711 -v 4.595768 -0.020013 0.652164 -v 4.640318 -0.024896 0.676711 -v 4.684866 -0.020013 0.652164 -v 4.194828 -0.030930 0.476867 -v 4.239376 -0.039258 0.456760 -v 4.283925 -0.048836 0.433636 -v 4.328474 -0.039258 0.456760 -v 4.373023 -0.048836 0.433636 -v 4.417573 -0.039258 0.456760 -v 4.461957 -0.049373 0.434172 -v 4.506669 -0.039258 0.456760 -v 4.551219 -0.048836 0.433636 -v 4.595768 -0.039258 0.456760 -v 4.640318 -0.048836 0.433636 -v 4.684866 -0.039258 0.456760 -v 4.194828 0.044908 0.484336 -v 4.239376 0.056999 0.466240 -v 4.283925 0.070905 0.445429 -v 4.328474 0.056999 0.466240 -v 4.373023 0.070904 0.445429 -v 4.417573 0.056999 0.466240 -v 4.461957 0.070368 0.445966 -v 4.506669 0.056999 0.466240 -v 4.551219 0.070904 0.445429 -v 4.595768 0.056999 0.466240 -v 4.640318 0.070904 0.445429 -v 4.684866 0.056999 0.466240 -v 4.194828 0.000002 0.632371 -v 4.239376 0.000002 0.654135 -v 4.283925 0.000002 0.679164 -v 4.328474 0.000002 0.654135 -v 4.373023 0.000002 0.679164 -v 4.417573 0.000002 0.654135 -v 4.461957 -0.000534 0.679700 -v 4.506669 0.000002 0.654135 -v 4.551219 0.000002 0.679164 -v 4.595768 0.000002 0.654135 -v 4.640318 0.000002 0.679164 -v 4.684866 0.000002 0.654135 -v 4.194828 -0.044904 0.484336 -v 4.239376 -0.056995 0.466240 -v 4.283925 -0.070900 0.445430 -v 4.328474 -0.056995 0.466240 -v 4.373023 -0.070900 0.445430 -v 4.417573 -0.056995 0.466240 -v 4.461957 -0.071437 0.445966 -v 4.506669 -0.056995 0.466240 -v 4.551219 -0.070900 0.445430 -v 4.595768 -0.056995 0.466240 -v 4.640318 -0.070900 0.445429 -v 4.684866 -0.056995 0.466240 -v 4.194828 0.030934 0.476867 -v 4.239376 0.039262 0.456760 -v 4.283925 0.048840 0.433636 -v 4.328474 0.039262 0.456760 -v 4.373023 0.048840 0.433636 -v 4.417573 0.039262 0.456760 -v 4.461957 0.048304 0.434172 -v 4.506669 0.039262 0.456760 -v 4.551219 0.048840 0.433636 -v 4.595768 0.039262 0.456760 -v 4.640318 0.048840 0.433636 -v 4.684866 0.039262 0.456760 -v 4.194828 0.015771 0.630818 -v 4.239376 0.020017 0.652164 -v 4.283925 0.024900 0.676711 -v 4.328474 0.020017 0.652164 -v 4.373023 0.024900 0.676711 -v 4.417573 0.020017 0.652164 -v 4.461957 0.024364 0.677248 -v 4.506669 0.020017 0.652164 -v 4.551219 0.024900 0.676711 -v 4.595768 0.020017 0.652164 -v 4.640318 0.024900 0.676711 -v 4.684866 0.020017 0.652164 -v 4.194828 -0.057152 0.494388 -v 4.239376 -0.072541 0.478999 -v 4.283925 -0.090240 0.461301 -v 4.328474 -0.072542 0.478999 -v 4.373023 -0.090240 0.461301 -v 4.417573 -0.072542 0.478999 -v 4.461957 -0.090776 0.461837 -v 4.506669 -0.072542 0.478999 -v 4.551219 -0.090240 0.461301 -v 4.595768 -0.072542 0.478999 -v 4.640318 -0.090240 0.461301 -v 4.684866 -0.072542 0.478999 -v 4.194828 0.015771 0.472267 -v 4.239376 0.020017 0.450922 -v 4.283925 0.024900 0.426374 -v 4.328474 0.020017 0.450922 -v 4.373023 0.024900 0.426374 -v 4.417573 0.020017 0.450922 -v 4.461957 0.024363 0.426910 -v 4.506669 0.020017 0.450922 -v 4.551219 0.024900 0.426374 -v 4.595768 0.020017 0.450922 -v 4.640318 0.024900 0.426374 -v 4.684866 0.020017 0.450922 -v 4.194828 0.030934 0.626218 -v 4.239376 0.039263 0.646325 -v 4.283925 0.048841 0.669449 -v 4.328474 0.039263 0.646325 -v 4.373023 0.048841 0.669449 -v 4.417573 0.039263 0.646325 -v 4.461957 0.048304 0.669985 -v 4.506669 0.039263 0.646325 -v 4.551219 0.048841 0.669449 -v 4.595768 0.039262 0.646325 -v 4.640318 0.048841 0.669449 -v 4.684866 0.039262 0.646325 -v 4.194828 -0.067204 0.506637 -v 4.239376 -0.085300 0.494545 -v 4.283925 -0.106111 0.480640 -v 4.328474 -0.085300 0.494545 -v 4.373023 -0.106111 0.480640 -v 4.417573 -0.085300 0.494545 -v 4.461957 -0.106647 0.481176 -v 4.506669 -0.085300 0.494545 -v 4.551219 -0.106111 0.480640 -v 4.595768 -0.085300 0.494545 -v 4.640318 -0.106111 0.480640 -v 4.684866 -0.085300 0.494545 -v 4.194828 0.044908 0.618749 -v 4.239376 0.056999 0.636845 -v 4.283925 0.070905 0.657656 -v 4.328474 0.056999 0.636845 -v 4.373023 0.070905 0.657656 -v 4.417573 0.056999 0.636845 -v 4.461957 0.070368 0.658192 -v 4.506669 0.056999 0.636845 -v 4.551219 0.070905 0.657656 -v 4.595768 0.056999 0.636845 -v 4.640318 0.070905 0.657656 -v 4.684866 0.056999 0.636845 -v 4.194828 -0.074674 0.520611 -v 4.239376 -0.094781 0.512282 -v 4.283925 -0.117904 0.502704 -v 4.328474 -0.094781 0.512282 -v 4.373023 -0.117904 0.502704 -v 4.417573 -0.094781 0.512282 -v 4.461957 -0.118441 0.503240 -v 4.506669 -0.094781 0.512282 -v 4.551219 -0.117904 0.502704 -v 4.595768 -0.094781 0.512282 -v 4.640318 -0.117904 0.502704 -v 4.684866 -0.094781 0.512282 -v 4.194828 0.057157 0.608697 -v 4.239376 0.072546 0.624086 -v 4.283925 0.090244 0.641784 -v 4.328474 0.072546 0.624086 -v 4.373023 0.090244 0.641784 -v 4.417573 0.072546 0.624086 -v 4.461957 0.089708 0.642321 -v 4.506669 0.072546 0.624086 -v 4.551219 0.090244 0.641784 -v 4.595768 0.072546 0.624086 -v 4.640318 0.090244 0.641784 -v 4.684866 0.072546 0.624086 -v 4.194828 -0.079273 0.535774 -v 4.239376 -0.100619 0.531528 -v 4.283925 -0.125167 0.526645 -v 4.328474 -0.100619 0.531528 -v 4.373023 -0.125167 0.526645 -v 4.417573 -0.100619 0.531528 -v 4.461957 -0.125703 0.527181 -v 4.506669 -0.100619 0.531528 -v 4.551219 -0.125167 0.526645 -v 4.595768 -0.100619 0.531528 -v 4.640318 -0.125167 0.526645 -v 4.684866 -0.100619 0.531528 -v 4.194828 0.067209 0.596448 -v 4.239376 0.085305 0.608540 -v 4.283925 0.106115 0.622445 -v 4.328474 0.085305 0.608540 -v 4.373023 0.106115 0.622445 -v 4.417573 0.085304 0.608540 -v 4.461957 0.105579 0.622981 -v 4.506669 0.085304 0.608540 -v 4.551219 0.106115 0.622445 -v 4.595768 0.085304 0.608540 -v 4.640318 0.106115 0.622445 -v 4.684866 0.085304 0.608540 -v 4.194828 -0.080826 0.551543 -v 4.239376 -0.102590 0.551543 -v 4.283925 -0.127619 0.551543 -v 4.328474 -0.102590 0.551543 -v 4.373023 -0.127619 0.551543 -v 4.417573 -0.102590 0.551543 -v 4.461957 -0.128155 0.552079 -v 4.506669 -0.102590 0.551543 -v 4.551219 -0.127619 0.551543 -v 4.595768 -0.102590 0.551543 -v 4.640318 -0.127619 0.551543 -v 4.684866 -0.102590 0.551543 -v 4.194828 0.074678 0.582474 -v 4.239376 0.094785 0.590803 -v 4.283925 0.117909 0.600381 -v 4.328474 0.094785 0.590803 -v 4.373023 0.117909 0.600381 -v 4.417573 0.094785 0.590803 -v 4.461957 0.117372 0.600917 -v 4.506669 0.094785 0.590803 -v 4.551219 0.117909 0.600381 -v 4.595768 0.094785 0.590803 -v 4.640318 0.117909 0.600381 -v 4.684866 0.094785 0.590803 -v 4.194828 -0.079273 0.567311 -v 4.239376 -0.100619 0.571557 -v 4.283925 -0.125167 0.576440 -v 4.328474 -0.100619 0.571557 -v 4.373023 -0.125167 0.576440 -v 4.417573 -0.100619 0.571557 -v 4.461957 -0.125703 0.576977 -v 4.506669 -0.100619 0.571557 -v 4.551219 -0.125167 0.576440 -v 4.595768 -0.100619 0.571557 -v 4.640318 -0.125167 0.576440 -v 4.684866 -0.100619 0.571557 -v 4.194828 0.079278 0.567311 -v 4.239376 0.100623 0.571557 -v 4.283925 0.125171 0.576440 -v 4.328474 0.100623 0.571557 -v 4.373023 0.125171 0.576440 -v 4.417573 0.100623 0.571557 -v 4.461957 0.124635 0.576976 -v 4.506669 0.100623 0.571557 -v 4.551219 0.125171 0.576440 -v 4.595768 0.100623 0.571557 -v 4.640318 0.125171 0.576440 -v 4.684866 0.100623 0.571557 -v 4.194828 -0.074674 0.582474 -v 4.239376 -0.094781 0.590803 -v 4.283925 -0.117904 0.600381 -v 4.328474 -0.094781 0.590803 -v 4.373023 -0.117904 0.600381 -v 4.417573 -0.094781 0.590803 -v 4.461957 -0.118441 0.600917 -v 4.506669 -0.094781 0.590803 -v 4.551219 -0.117904 0.600381 -v 4.595768 -0.094781 0.590803 -v 4.640318 -0.117904 0.600381 -v 4.684866 -0.094781 0.590803 -v 4.194828 0.080831 0.551543 -v 4.239376 0.102594 0.551543 -v 4.283925 0.127623 0.551542 -v 4.328474 0.102594 0.551542 -v 4.373023 0.127623 0.551542 -v 4.417573 0.102594 0.551542 -v 4.461957 0.127087 0.552079 -v 4.506669 0.102594 0.551542 -v 4.551219 0.127623 0.551542 -v 4.595768 0.102594 0.551542 -v 4.640318 0.127623 0.551542 -v 4.684866 0.102594 0.551542 -v 4.194828 -0.067204 0.596448 -v 4.239376 -0.085300 0.608540 -v 4.283925 -0.106111 0.622445 -v 4.328474 -0.085300 0.608540 -v 4.373023 -0.106111 0.622445 -v 4.417573 -0.085300 0.608540 -v 4.461957 -0.106647 0.622981 -v 4.506669 -0.085300 0.608540 -v 4.551219 -0.106111 0.622445 -v 4.595768 -0.085300 0.608540 -v 4.640318 -0.106111 0.622445 -v 4.684866 -0.085300 0.608540 -v 3.587242 -0.000000 -0.145895 -v 3.989225 0.000000 -0.186209 -v 3.587242 -0.021885 -0.143739 -v 3.989225 -0.014454 -0.184785 -v 3.587242 -0.042928 -0.137356 -v 3.989225 -0.028353 -0.180569 -v 3.587242 -0.062322 -0.126990 -v 3.989225 -0.041162 -0.173722 -v 3.587242 -0.079321 -0.113039 -v 3.989225 -0.052389 -0.164508 -v 3.587242 -0.093272 -0.096040 -v 3.989225 -0.061603 -0.153281 -v 3.587242 -0.103638 -0.076646 -v 3.989225 -0.068449 -0.140472 -v 3.587242 -0.110022 -0.055603 -v 3.989225 -0.072665 -0.126574 -v 3.587242 -0.112177 -0.033718 -v 3.989225 -0.074089 -0.112120 -v 3.587242 -0.110022 -0.011833 -v 3.989225 -0.072665 -0.097666 -v 3.587242 -0.103638 0.009210 -v 3.989225 -0.068449 -0.083767 -v 3.587242 -0.093272 0.028604 -v 3.989225 -0.061603 -0.070958 -v 3.587242 -0.079321 0.045603 -v 3.989225 -0.052389 -0.059731 -v 3.587242 -0.062322 0.059554 -v 3.989225 -0.041162 -0.050517 -v 3.587242 -0.042928 0.069920 -v 3.989225 -0.028353 -0.043670 -v 3.587242 -0.021885 0.076304 -v 3.989225 -0.014454 -0.039454 -v 3.587242 0.000000 0.078459 -v 3.989225 0.000000 -0.038031 -v 3.587242 0.021885 0.076304 -v 3.989225 0.014454 -0.039454 -v 3.587242 0.042928 0.069920 -v 3.989225 0.028353 -0.043670 -v 3.587242 0.062322 0.059554 -v 3.989225 0.041162 -0.050517 -v 3.587242 0.079321 0.045603 -v 3.989225 0.052389 -0.059731 -v 3.587242 0.093272 0.028604 -v 3.989225 0.061603 -0.070958 -v 3.587242 0.103638 0.009210 -v 3.989225 0.068449 -0.083767 -v 3.587242 0.110022 -0.011833 -v 3.989225 0.072665 -0.097666 -v 3.587242 0.112177 -0.033718 -v 3.989225 0.074089 -0.112120 -v 3.587242 0.110022 -0.055603 -v 3.989225 0.072665 -0.126574 -v 3.587242 0.103638 -0.076646 -v 3.989225 0.068449 -0.140472 -v 3.587242 0.093272 -0.096040 -v 3.989225 0.061603 -0.153281 -v 3.587242 0.079321 -0.113039 -v 3.989225 0.052389 -0.164508 -v 3.587242 0.062322 -0.126990 -v 3.989225 0.041162 -0.173722 -v 3.587242 0.042928 -0.137356 -v 3.989225 0.028353 -0.180569 -v 3.587242 0.021884 -0.143740 -v 3.989225 0.014454 -0.184785 -v 4.637677 -0.014454 -0.106383 -v 4.637677 0.000000 -0.107807 -v 4.637677 -0.028353 -0.102167 -v 4.637677 -0.041162 -0.095321 -v 4.637677 -0.052389 -0.086107 -v 4.637677 -0.061603 -0.074880 -v 4.637677 -0.068449 -0.062070 -v 4.637677 -0.072665 -0.048172 -v 4.637677 -0.074089 -0.033718 -v 4.637677 -0.072665 -0.019264 -v 4.637677 -0.068449 -0.005365 -v 4.637677 -0.061603 0.007444 -v 4.637677 -0.052389 0.018671 -v 4.637677 -0.041162 0.027885 -v 4.637677 -0.028353 0.034731 -v 4.637677 -0.014454 0.038948 -v 4.637677 0.000000 0.040371 -v 4.637677 0.014454 0.038948 -v 4.637677 0.028353 0.034731 -v 4.637677 0.041162 0.027885 -v 4.637677 0.052389 0.018671 -v 4.637677 0.061603 0.007444 -v 4.637677 0.068449 -0.005365 -v 4.637677 0.072665 -0.019264 -v 4.637677 0.074089 -0.033718 -v 4.637677 0.072665 -0.048172 -v 4.637677 0.068449 -0.062071 -v 4.637677 0.061603 -0.074880 -v 4.637677 0.052389 -0.086107 -v 4.637677 0.041162 -0.095321 -v 4.637677 0.028353 -0.102167 -v 4.637677 0.014454 -0.106383 -v 5.273666 0.000001 -0.033718 -v 3.179720 -0.053726 0.036675 -v 3.188101 -0.077999 0.043213 -v 3.199381 -0.099273 0.052010 -v 3.213126 -0.116733 0.062730 -v 3.228806 -0.129707 0.074960 -v 3.245822 -0.137696 0.088231 -v 3.263516 -0.140394 0.102031 -v 3.281211 -0.137696 0.115832 -v 3.298226 -0.129707 0.129103 -v 3.313907 -0.116733 0.141333 -v 3.327652 -0.099273 0.152053 -v 3.338932 -0.077998 0.160850 -v 3.347313 -0.053726 0.167388 -v 3.352474 -0.027389 0.171413 -v 3.354218 0.000000 0.172772 -v 3.352474 0.027389 0.171413 -v 3.347313 0.053726 0.167388 -v 3.338932 0.077999 0.160850 -v 3.327652 0.099273 0.152053 -v 3.313908 0.116733 0.141333 -v 3.298226 0.129707 0.129103 -v 3.281211 0.137696 0.115832 -v 3.263516 0.140394 0.102031 -v 3.245822 0.137696 0.088231 -v 3.228806 0.129707 0.074960 -v 3.213126 0.116733 0.062730 -v 3.199381 0.099273 0.052010 -v 3.188101 0.077998 0.043212 -v 3.179720 0.053726 0.036675 -v 3.174559 0.027389 0.032650 -v 3.172815 0.000000 0.031291 -v 3.587242 -0.000000 -0.145895 -v 3.587242 -0.021885 -0.143739 -v 3.587242 -0.042928 -0.137356 -v 3.587242 -0.062322 -0.126990 -v 3.587242 -0.079321 -0.113039 -v 3.587242 -0.093272 -0.096040 -v 3.587242 -0.103638 -0.076646 -v 3.587242 -0.110022 -0.055603 -v 3.587242 -0.112177 -0.033718 -v 3.587242 -0.110022 -0.011833 -v 3.587242 -0.103638 0.009210 -v 3.587242 -0.093272 0.028604 -v 3.587242 -0.079321 0.045603 -v 3.587242 -0.062322 0.059554 -v 3.587242 -0.042928 0.069920 -v 3.587242 -0.021885 0.076304 -v 3.587242 0.000000 0.078459 -v 3.587242 0.021885 0.076304 -v 3.587242 0.042928 0.069920 -v 3.587242 0.062322 0.059554 -v 3.587242 0.079321 0.045603 -v 3.587242 0.093272 0.028604 -v 3.587242 0.103638 0.009210 -v 3.587242 0.110022 -0.011833 -v 3.587242 0.112177 -0.033718 -v 3.587242 0.110022 -0.055603 -v 3.587242 0.103638 -0.076646 -v 3.587242 0.093272 -0.096040 -v 3.587242 0.079321 -0.113039 -v 3.587242 0.062322 -0.126990 -v 3.587242 0.042928 -0.137356 -v 3.587242 0.021884 -0.143740 -v 2.943389 0.000000 0.479873 -v 2.946735 -0.033974 0.479873 -v 2.956646 -0.066643 0.479873 -v 2.972738 -0.096750 0.479873 -v 2.994395 -0.123139 0.479873 -v 3.020784 -0.144796 0.479873 -v 3.050892 -0.160889 0.479873 -v 3.083561 -0.170799 0.479873 -v 3.117535 -0.174145 0.479873 -v 3.151508 -0.170799 0.479873 -v 3.184176 -0.160889 0.479873 -v 3.214284 -0.144796 0.479873 -v 3.240674 -0.123139 0.479873 -v 3.262331 -0.096750 0.479873 -v 3.278424 -0.066642 0.479873 -v 3.288334 -0.033974 0.479873 -v 3.291680 0.000000 0.479873 -v 3.288334 0.033974 0.479873 -v 3.278424 0.066643 0.479873 -v 3.262331 0.096750 0.479873 -v 3.240674 0.123139 0.479873 -v 3.214284 0.144797 0.479873 -v 3.184176 0.160889 0.479873 -v 3.151508 0.170799 0.479873 -v 3.117535 0.174145 0.479873 -v 3.083561 0.170799 0.479873 -v 3.050892 0.160889 0.479873 -v 3.020784 0.144796 0.479873 -v 2.994395 0.123139 0.479873 -v 2.972738 0.096750 0.479873 -v 2.956646 0.066642 0.479873 -v 2.946735 0.033974 0.479873 -v 3.368539 -0.000000 -0.102855 -v 3.048191 0.000000 0.184855 -v 3.050586 0.034861 0.185759 -v 3.369501 0.021297 -0.100929 -v 3.057676 0.068383 0.188436 -v 3.372353 0.041775 -0.095226 -v 3.069191 0.099276 0.192783 -v 3.376984 0.060648 -0.085964 -v 3.084687 0.126355 0.198633 -v 3.383216 0.077190 -0.073499 -v 3.103569 0.148578 0.205762 -v 3.390810 0.090766 -0.058311 -v 3.125113 0.165091 0.213894 -v 3.399475 0.100854 -0.040983 -v 3.148487 0.175260 0.222719 -v 3.408875 0.107066 -0.022181 -v 3.172796 0.178693 0.231897 -v 3.418653 0.109163 -0.002627 -v 3.197106 0.175260 0.241074 -v 3.428429 0.107066 0.016926 -v 3.220482 0.165091 0.249899 -v 3.437830 0.100854 0.035728 -v 3.242024 0.148578 0.258032 -v 3.446494 0.090766 0.053056 -v 3.260906 0.126355 0.265160 -v 3.454088 0.077190 0.068244 -v 3.276403 0.099277 0.271011 -v 3.460320 0.060648 0.080709 -v 3.287918 0.068383 0.275358 -v 3.464952 0.041775 0.089971 -v 3.295009 0.034861 0.278035 -v 3.467803 0.021297 0.095675 -v 3.297402 0.000000 0.278939 -v 3.468766 0.000000 0.097600 -v 3.295009 -0.034861 0.278035 -v 3.467803 -0.021297 0.095675 -v 3.287918 -0.068383 0.275358 -v 3.464952 -0.041775 0.089971 -v 3.276403 -0.099277 0.271011 -v 3.460320 -0.060648 0.080709 -v 3.260906 -0.126355 0.265160 -v 3.454088 -0.077190 0.068244 -v 3.242024 -0.148578 0.258032 -v 3.446494 -0.090766 0.053056 -v 3.220482 -0.165091 0.249899 -v 3.437830 -0.100854 0.035728 -v 3.197106 -0.175260 0.241074 -v 3.428429 -0.107066 0.016926 -v 3.172796 -0.178693 0.231897 -v 3.418653 -0.109163 -0.002627 -v 3.148487 -0.175260 0.222719 -v 3.408875 -0.107066 -0.022181 -v 3.125113 -0.165091 0.213895 -v 3.399475 -0.100854 -0.040983 -v 3.103569 -0.148578 0.205762 -v 3.390810 -0.090766 -0.058311 -v 3.084687 -0.126355 0.198633 -v 3.383216 -0.077190 -0.073499 -v 3.069191 -0.099277 0.192783 -v 3.376984 -0.060648 -0.085964 -v 3.057676 -0.068383 0.188436 -v 3.372353 -0.041775 -0.095226 -v 3.050586 -0.034861 0.185759 -v 3.369501 -0.021297 -0.100929 -v 3.174559 -0.027389 0.032650 -v 3.023735 0.000000 0.331704 -v 3.026553 0.034417 0.332276 -v 3.034897 0.067512 0.333971 -v 3.048448 0.098013 0.336723 -v 3.066685 0.124747 0.340427 -v 3.088904 0.146687 0.344940 -v 3.114257 0.162990 0.350089 -v 3.141765 0.173029 0.355676 -v 3.170372 0.176419 0.361486 -v 3.198979 0.173029 0.367297 -v 3.226487 0.162990 0.372884 -v 3.251839 0.146687 0.378033 -v 3.274060 0.124747 0.382546 -v 3.292296 0.098013 0.386249 -v 3.305847 0.067513 0.389002 -v 3.314192 0.034418 0.390696 -v 3.317009 0.000000 0.391269 -v 3.314192 -0.034418 0.390696 -v 3.305847 -0.067513 0.389002 -v 3.292296 -0.098013 0.386249 -v 3.274060 -0.124747 0.382546 -v 3.251839 -0.146687 0.378033 -v 3.226487 -0.162990 0.372884 -v 3.198979 -0.173029 0.367297 -v 3.170372 -0.176419 0.361486 -v 3.141765 -0.173029 0.355676 -v 3.114257 -0.162990 0.350089 -v 3.088905 -0.146687 0.344940 -v 3.066685 -0.124747 0.340427 -v 3.048448 -0.098013 0.336723 -v 3.034897 -0.067513 0.333971 -v 3.026553 -0.034418 0.332276 -v 3.587242 -0.000000 1.248980 -v 3.989225 0.000000 1.289294 -v 3.587242 -0.021885 1.246825 -v 3.989225 -0.014454 1.287870 -v 3.587242 -0.042928 1.240441 -v 3.989225 -0.028353 1.283654 -v 3.587242 -0.062322 1.230075 -v 3.989225 -0.041162 1.276808 -v 3.587242 -0.079321 1.216125 -v 3.989225 -0.052389 1.267594 -v 3.587242 -0.093272 1.199126 -v 3.989225 -0.061603 1.256366 -v 3.587242 -0.103638 1.179732 -v 3.989225 -0.068449 1.243557 -v 3.587242 -0.110022 1.158688 -v 3.989225 -0.072665 1.229659 -v 3.587242 -0.112177 1.136803 -v 3.989225 -0.074089 1.215205 -v 3.587242 -0.110022 1.114919 -v 3.989225 -0.072665 1.200751 -v 3.587242 -0.103638 1.093875 -v 3.989225 -0.068449 1.186852 -v 3.587242 -0.093272 1.074481 -v 3.989225 -0.061603 1.174043 -v 3.587242 -0.079321 1.057482 -v 3.989225 -0.052389 1.162816 -v 3.587242 -0.062322 1.043532 -v 3.989225 -0.041162 1.153602 -v 3.587242 -0.042928 1.033165 -v 3.989225 -0.028353 1.146756 -v 3.587242 -0.021885 1.026782 -v 3.989225 -0.014454 1.142540 -v 3.587242 0.000000 1.024626 -v 3.989225 0.000000 1.141116 -v 3.587242 0.021885 1.026782 -v 3.989225 0.014454 1.142540 -v 3.587242 0.042928 1.033165 -v 3.989225 0.028353 1.146756 -v 3.587242 0.062322 1.043532 -v 3.989225 0.041162 1.153602 -v 3.587242 0.079321 1.057482 -v 3.989225 0.052389 1.162816 -v 3.587242 0.093272 1.074481 -v 3.989225 0.061603 1.174043 -v 3.587242 0.103638 1.093875 -v 3.989225 0.068449 1.186852 -v 3.587242 0.110022 1.114919 -v 3.989225 0.072665 1.200751 -v 3.587242 0.112177 1.136803 -v 3.989225 0.074089 1.215205 -v 3.587242 0.110022 1.158688 -v 3.989225 0.072665 1.229659 -v 3.587242 0.103638 1.179732 -v 3.989225 0.068449 1.243558 -v 3.587242 0.093272 1.199126 -v 3.989225 0.061603 1.256367 -v 3.587242 0.079321 1.216125 -v 3.989225 0.052389 1.267594 -v 3.587242 0.062322 1.230075 -v 3.989225 0.041162 1.276808 -v 3.587242 0.042928 1.240442 -v 3.989225 0.028353 1.283654 -v 3.587242 0.021884 1.246825 -v 3.989225 0.014454 1.287870 -v 4.637677 -0.014454 1.209468 -v 4.637677 0.000000 1.210892 -v 4.637677 -0.028353 1.205252 -v 4.637677 -0.041162 1.198406 -v 4.637677 -0.052389 1.189192 -v 4.637677 -0.061603 1.177965 -v 4.637677 -0.068449 1.165156 -v 4.637677 -0.072665 1.151257 -v 4.637677 -0.074089 1.136803 -v 4.637677 -0.072665 1.122349 -v 4.637677 -0.068449 1.108450 -v 4.637677 -0.061603 1.095641 -v 4.637677 -0.052389 1.084414 -v 4.637677 -0.041162 1.075200 -v 4.637677 -0.028353 1.068354 -v 4.637677 -0.014454 1.064138 -v 4.637677 0.000000 1.062714 -v 4.637677 0.014454 1.064138 -v 4.637677 0.028353 1.068354 -v 4.637677 0.041162 1.075200 -v 4.637677 0.052389 1.084414 -v 4.637677 0.061603 1.095641 -v 4.637677 0.068449 1.108451 -v 4.637677 0.072665 1.122349 -v 4.637677 0.074089 1.136803 -v 4.637677 0.072665 1.151257 -v 4.637677 0.068449 1.165156 -v 4.637677 0.061603 1.177965 -v 4.637677 0.052389 1.189192 -v 4.637677 0.041162 1.198406 -v 4.637677 0.028353 1.205252 -v 4.637677 0.014454 1.209468 -v 5.273666 0.000001 1.136803 -v 3.179720 -0.053726 1.066410 -v 3.188101 -0.077998 1.059873 -v 3.199381 -0.099273 1.051075 -v 3.213126 -0.116733 1.040356 -v 3.228806 -0.129707 1.028126 -v 3.245822 -0.137696 1.014855 -v 3.263516 -0.140394 1.001054 -v 3.281211 -0.137696 0.987253 -v 3.298226 -0.129707 0.973983 -v 3.313907 -0.116733 0.961753 -v 3.327652 -0.099273 0.951033 -v 3.338932 -0.077998 0.942235 -v 3.347313 -0.053726 0.935698 -v 3.352474 -0.027389 0.931672 -v 3.354218 0.000000 0.930313 -v 3.352474 0.027389 0.931672 -v 3.347313 0.053726 0.935698 -v 3.338932 0.077999 0.942235 -v 3.327652 0.099273 0.951033 -v 3.313907 0.116733 0.961753 -v 3.298226 0.129707 0.973983 -v 3.281211 0.137696 0.987253 -v 3.263516 0.140394 1.001054 -v 3.245822 0.137696 1.014855 -v 3.228806 0.129707 1.028126 -v 3.213125 0.116733 1.040356 -v 3.199381 0.099273 1.051076 -v 3.188101 0.077998 1.059873 -v 3.179720 0.053726 1.066410 -v 3.174559 0.027389 1.070436 -v 3.172815 0.000000 1.071795 -v 3.587242 -0.000000 1.248980 -v 3.587242 -0.021885 1.246825 -v 3.587242 -0.042928 1.240441 -v 3.587242 -0.062322 1.230075 -v 3.587242 -0.079321 1.216125 -v 3.587242 -0.093272 1.199126 -v 3.587242 -0.103638 1.179732 -v 3.587242 -0.110022 1.158688 -v 3.587242 -0.112177 1.136803 -v 3.587242 -0.110022 1.114919 -v 3.587242 -0.103638 1.093875 -v 3.587242 -0.093272 1.074481 -v 3.587242 -0.079321 1.057482 -v 3.587242 -0.062322 1.043532 -v 3.587242 -0.042928 1.033165 -v 3.587242 -0.021885 1.026782 -v 3.587242 0.000000 1.024626 -v 3.587242 0.021885 1.026782 -v 3.587242 0.042928 1.033165 -v 3.587242 0.062322 1.043532 -v 3.587242 0.079321 1.057482 -v 3.587242 0.093272 1.074481 -v 3.587242 0.103638 1.093875 -v 3.587242 0.110022 1.114919 -v 3.587242 0.112177 1.136803 -v 3.587242 0.110022 1.158688 -v 3.587242 0.103638 1.179732 -v 3.587242 0.093272 1.199126 -v 3.587242 0.079321 1.216125 -v 3.587242 0.062322 1.230075 -v 3.587242 0.042928 1.240442 -v 3.587242 0.021884 1.246825 -v 2.943389 0.000000 0.623212 -v 2.946735 -0.033974 0.623212 -v 2.956646 -0.066642 0.623212 -v 2.972738 -0.096750 0.623212 -v 2.994395 -0.123139 0.623212 -v 3.020784 -0.144796 0.623212 -v 3.050892 -0.160889 0.623212 -v 3.083561 -0.170799 0.623212 -v 3.117535 -0.174145 0.623212 -v 3.151508 -0.170799 0.623212 -v 3.184176 -0.160889 0.623212 -v 3.214284 -0.144796 0.623212 -v 3.240674 -0.123139 0.623212 -v 3.262331 -0.096750 0.623212 -v 3.278424 -0.066642 0.623212 -v 3.288334 -0.033974 0.623212 -v 3.291679 0.000000 0.623212 -v 3.288334 0.033974 0.623212 -v 3.278424 0.066643 0.623212 -v 3.262331 0.096750 0.623212 -v 3.240674 0.123139 0.623212 -v 3.214284 0.144797 0.623212 -v 3.184176 0.160889 0.623212 -v 3.151508 0.170799 0.623212 -v 3.117535 0.174145 0.623212 -v 3.083561 0.170799 0.623212 -v 3.050892 0.160889 0.623212 -v 3.020784 0.144796 0.623212 -v 2.994395 0.123139 0.623212 -v 2.972738 0.096750 0.623212 -v 2.956645 0.066642 0.623212 -v 2.946735 0.033974 0.623212 -v 3.368539 -0.000000 1.205941 -v 3.048191 0.000000 0.918231 -v 3.050585 0.034861 0.917327 -v 3.369501 0.021297 1.204015 -v 3.057676 0.068383 0.914650 -v 3.372353 0.041775 1.198312 -v 3.069191 0.099276 0.910303 -v 3.376984 0.060648 1.189049 -v 3.084687 0.126355 0.904453 -v 3.383216 0.077190 1.176585 -v 3.103569 0.148578 0.897324 -v 3.390810 0.090766 1.161397 -v 3.125113 0.165091 0.889191 -v 3.399474 0.100854 1.144069 -v 3.148487 0.175260 0.880366 -v 3.408875 0.107066 1.125267 -v 3.172796 0.178693 0.871189 -v 3.418653 0.109163 1.105713 -v 3.197106 0.175260 0.862012 -v 3.428429 0.107066 1.086160 -v 3.220482 0.165091 0.853187 -v 3.437830 0.100854 1.067357 -v 3.242024 0.148578 0.845054 -v 3.446494 0.090766 1.050030 -v 3.260906 0.126355 0.837925 -v 3.454088 0.077190 1.034841 -v 3.276403 0.099277 0.832075 -v 3.460320 0.060648 1.022377 -v 3.287918 0.068383 0.827728 -v 3.464952 0.041775 1.013114 -v 3.295009 0.034861 0.825051 -v 3.467803 0.021297 1.007411 -v 3.297402 0.000000 0.824147 -v 3.468766 0.000000 1.005485 -v 3.295009 -0.034861 0.825051 -v 3.467803 -0.021297 1.007411 -v 3.287918 -0.068383 0.827728 -v 3.464952 -0.041775 1.013114 -v 3.276403 -0.099277 0.832075 -v 3.460320 -0.060648 1.022377 -v 3.260906 -0.126355 0.837925 -v 3.454088 -0.077190 1.034841 -v 3.242024 -0.148578 0.845054 -v 3.446494 -0.090766 1.050029 -v 3.220482 -0.165091 0.853187 -v 3.437830 -0.100854 1.067357 -v 3.197106 -0.175260 0.862012 -v 3.428429 -0.107066 1.086159 -v 3.172796 -0.178693 0.871189 -v 3.418652 -0.109163 1.105713 -v 3.148487 -0.175260 0.880366 -v 3.408875 -0.107066 1.125267 -v 3.125113 -0.165091 0.889191 -v 3.399475 -0.100854 1.144068 -v 3.103569 -0.148578 0.897324 -v 3.390810 -0.090766 1.161397 -v 3.084687 -0.126355 0.904453 -v 3.383216 -0.077190 1.176585 -v 3.069191 -0.099277 0.910303 -v 3.376984 -0.060648 1.189049 -v 3.057676 -0.068383 0.914650 -v 3.372353 -0.041775 1.198311 -v 3.050586 -0.034861 0.917327 -v 3.369501 -0.021297 1.204015 -v 3.174559 -0.027389 1.070436 -v 3.023735 0.000000 0.771381 -v 3.026553 0.034417 0.770809 -v 3.034897 0.067512 0.769114 -v 3.048448 0.098013 0.766362 -v 3.066685 0.124747 0.762658 -v 3.088904 0.146687 0.758145 -v 3.114257 0.162990 0.752996 -v 3.141765 0.173029 0.747409 -v 3.170372 0.176419 0.741599 -v 3.198979 0.173029 0.735789 -v 3.226487 0.162990 0.730202 -v 3.251839 0.146687 0.725053 -v 3.274060 0.124747 0.720540 -v 3.292296 0.098013 0.716836 -v 3.305847 0.067513 0.714084 -v 3.314192 0.034418 0.712389 -v 3.317009 0.000000 0.711817 -v 3.314192 -0.034418 0.712389 -v 3.305847 -0.067513 0.714084 -v 3.292296 -0.098013 0.716836 -v 3.274060 -0.124747 0.720540 -v 3.251839 -0.146687 0.725053 -v 3.226487 -0.162990 0.730202 -v 3.198979 -0.173029 0.735789 -v 3.170372 -0.176419 0.741599 -v 3.141765 -0.173029 0.747409 -v 3.114257 -0.162990 0.752996 -v 3.088905 -0.146687 0.758145 -v 3.066685 -0.124747 0.762658 -v 3.048448 -0.098013 0.766362 -v 3.034897 -0.067513 0.769114 -v 3.026553 -0.034418 0.770809 -v 3.194983 -0.000000 -0.630004 -v 3.596968 0.000000 -0.670318 -v 3.194983 -0.021885 -0.627848 -v 3.596968 -0.014454 -0.668894 -v 3.194983 -0.042928 -0.621465 -v 3.596968 -0.028353 -0.664678 -v 3.194983 -0.062322 -0.611099 -v 3.596968 -0.041162 -0.657831 -v 3.194983 -0.079321 -0.597148 -v 3.596968 -0.052389 -0.648617 -v 3.194983 -0.093272 -0.580149 -v 3.596968 -0.061603 -0.637390 -v 3.194983 -0.103638 -0.560755 -v 3.596968 -0.068449 -0.624581 -v 3.194983 -0.110022 -0.539711 -v 3.596968 -0.072665 -0.610682 -v 3.194983 -0.112177 -0.517827 -v 3.596968 -0.074089 -0.596228 -v 3.194983 -0.110022 -0.495942 -v 3.596968 -0.072665 -0.581774 -v 3.194983 -0.103638 -0.474898 -v 3.596968 -0.068449 -0.567876 -v 3.194983 -0.093272 -0.455504 -v 3.596968 -0.061603 -0.555067 -v 3.194983 -0.079321 -0.438506 -v 3.596968 -0.052389 -0.543840 -v 3.194983 -0.062322 -0.424555 -v 3.596968 -0.041162 -0.534626 -v 3.194983 -0.042928 -0.414189 -v 3.596968 -0.028353 -0.527779 -v 3.194983 -0.021885 -0.407805 -v 3.596968 -0.014454 -0.523563 -v 3.194983 0.000000 -0.405650 -v 3.596968 0.000000 -0.522139 -v 3.194983 0.021885 -0.407805 -v 3.596968 0.014454 -0.523563 -v 3.194983 0.042928 -0.414189 -v 3.596968 0.028353 -0.527779 -v 3.194983 0.062322 -0.424555 -v 3.596968 0.041162 -0.534626 -v 3.194983 0.079321 -0.438506 -v 3.596968 0.052389 -0.543840 -v 3.194983 0.093272 -0.455505 -v 3.596968 0.061603 -0.555067 -v 3.194983 0.103638 -0.474899 -v 3.596968 0.068449 -0.567876 -v 3.194983 0.110022 -0.495942 -v 3.596968 0.072665 -0.581774 -v 3.194983 0.112177 -0.517827 -v 3.596968 0.074089 -0.596228 -v 3.194983 0.110022 -0.539711 -v 3.596968 0.072665 -0.610683 -v 3.194983 0.103638 -0.560755 -v 3.596968 0.068449 -0.624581 -v 3.194983 0.093272 -0.580149 -v 3.596968 0.061603 -0.637390 -v 3.194983 0.079321 -0.597148 -v 3.596968 0.052389 -0.648617 -v 3.194983 0.062322 -0.611099 -v 3.596968 0.041162 -0.657831 -v 3.194983 0.042928 -0.621465 -v 3.596968 0.028353 -0.664678 -v 3.194983 0.021884 -0.627848 -v 3.596968 0.014454 -0.668894 -v 4.245420 -0.014454 -0.590492 -v 4.245420 0.000000 -0.591916 -v 4.245420 -0.028353 -0.586276 -v 4.245420 -0.041162 -0.579430 -v 4.245420 -0.052389 -0.570216 -v 4.245420 -0.061603 -0.558988 -v 4.245420 -0.068449 -0.546179 -v 4.245420 -0.072665 -0.532281 -v 4.245420 -0.074089 -0.517827 -v 4.245420 -0.072665 -0.503373 -v 4.245420 -0.068449 -0.489474 -v 4.245420 -0.061603 -0.476665 -v 4.245420 -0.052389 -0.465438 -v 4.245420 -0.041162 -0.456224 -v 4.245420 -0.028353 -0.449378 -v 4.245420 -0.014454 -0.445161 -v 4.245420 0.000000 -0.443738 -v 4.245420 0.014454 -0.445161 -v 4.245420 0.028353 -0.449378 -v 4.245420 0.041162 -0.456224 -v 4.245420 0.052389 -0.465438 -v 4.245420 0.061603 -0.476665 -v 4.245420 0.068449 -0.489474 -v 4.245420 0.072665 -0.503373 -v 4.245420 0.074089 -0.517827 -v 4.245420 0.072665 -0.532281 -v 4.245420 0.068449 -0.546180 -v 4.245420 0.061603 -0.558989 -v 4.245420 0.052389 -0.570216 -v 4.245420 0.041162 -0.579430 -v 4.245420 0.028353 -0.586276 -v 4.245420 0.014454 -0.590492 -v 4.881409 0.000001 -0.517827 -v 2.779208 -0.059018 -0.453871 -v 2.788416 -0.085681 -0.446689 -v 2.800806 -0.109051 -0.437025 -v 2.815905 -0.128230 -0.425250 -v 2.833130 -0.142482 -0.411815 -v 2.851821 -0.151258 -0.397238 -v 2.871259 -0.154221 -0.382077 -v 2.890697 -0.151258 -0.366917 -v 2.909387 -0.142482 -0.352340 -v 2.926613 -0.128230 -0.338905 -v 2.941710 -0.109051 -0.327129 -v 2.954102 -0.085681 -0.317465 -v 2.963308 -0.059018 -0.310284 -v 2.968979 -0.030087 -0.305862 -v 2.970894 0.000000 -0.304369 -v 2.968979 0.030087 -0.305862 -v 2.963308 0.059018 -0.310284 -v 2.954102 0.085681 -0.317465 -v 2.941710 0.109051 -0.327129 -v 2.926613 0.128230 -0.338905 -v 2.909387 0.142482 -0.352340 -v 2.890697 0.151258 -0.366917 -v 2.871259 0.154221 -0.382077 -v 2.851821 0.151258 -0.397238 -v 2.833130 0.142482 -0.411815 -v 2.815905 0.128230 -0.425250 -v 2.800806 0.109051 -0.437026 -v 2.788415 0.085681 -0.446690 -v 2.779208 0.059018 -0.453871 -v 2.773539 0.030087 -0.458293 -v 2.771625 0.000000 -0.459786 -v 3.194983 -0.000000 -0.630004 -v 3.194983 -0.021885 -0.627848 -v 3.194983 -0.042928 -0.621465 -v 3.194983 -0.062322 -0.611099 -v 3.194983 -0.079321 -0.597148 -v 3.194983 -0.093272 -0.580149 -v 3.194983 -0.103638 -0.560755 -v 3.194983 -0.110022 -0.539711 -v 3.194983 -0.112177 -0.517827 -v 3.194983 -0.110022 -0.495942 -v 3.194983 -0.103638 -0.474898 -v 3.194983 -0.093272 -0.455504 -v 3.194983 -0.079321 -0.438506 -v 3.194983 -0.062322 -0.424555 -v 3.194983 -0.042928 -0.414189 -v 3.194983 -0.021885 -0.407805 -v 3.194983 0.000000 -0.405650 -v 3.194983 0.021885 -0.407805 -v 3.194983 0.042928 -0.414189 -v 3.194983 0.062322 -0.424555 -v 3.194983 0.079321 -0.438506 -v 3.194983 0.093272 -0.455505 -v 3.194983 0.103638 -0.474899 -v 3.194983 0.110022 -0.495942 -v 3.194983 0.112177 -0.517827 -v 3.194983 0.110022 -0.539711 -v 3.194983 0.103638 -0.560755 -v 3.194983 0.093272 -0.580149 -v 3.194983 0.079321 -0.597148 -v 3.194983 0.062322 -0.611099 -v 3.194983 0.042928 -0.621465 -v 3.194983 0.021884 -0.627848 -v 2.551131 0.000000 -0.004236 -v 2.554478 -0.033974 -0.004236 -v 2.564387 -0.066643 -0.004236 -v 2.580481 -0.096750 -0.004236 -v 2.602138 -0.123139 -0.004236 -v 2.628527 -0.144796 -0.004236 -v 2.658634 -0.160889 -0.004236 -v 2.691302 -0.170799 -0.004236 -v 2.725277 -0.174145 -0.004236 -v 2.759251 -0.170799 -0.004236 -v 2.791919 -0.160889 -0.004236 -v 2.822027 -0.144796 -0.004235 -v 2.848416 -0.123139 -0.004235 -v 2.870073 -0.096750 -0.004235 -v 2.886166 -0.066642 -0.004235 -v 2.896076 -0.033974 -0.004235 -v 2.899422 0.000000 -0.004235 -v 2.896076 0.033974 -0.004235 -v 2.886166 0.066643 -0.004235 -v 2.870073 0.096750 -0.004235 -v 2.848415 0.123139 -0.004235 -v 2.822027 0.144797 -0.004235 -v 2.791919 0.160889 -0.004236 -v 2.759251 0.170799 -0.004236 -v 2.725277 0.174145 -0.004236 -v 2.691302 0.170799 -0.004236 -v 2.658634 0.160889 -0.004236 -v 2.628527 0.144796 -0.004236 -v 2.602138 0.123139 -0.004236 -v 2.580481 0.096750 -0.004236 -v 2.564387 0.066642 -0.004236 -v 2.554478 0.033974 -0.004236 -v 2.966830 0.000000 -0.605865 -v 2.655932 0.000000 -0.299254 -v 2.658328 0.034861 -0.298350 -v 2.967975 0.025313 -0.603576 -v 2.665419 0.068383 -0.295673 -v 2.971364 0.049653 -0.596797 -v 2.676933 0.099276 -0.291326 -v 2.976868 0.072085 -0.585788 -v 2.692430 0.126355 -0.285476 -v 2.984276 0.091746 -0.570973 -v 2.711311 0.148578 -0.278347 -v 2.993302 0.107882 -0.552921 -v 2.732855 0.165091 -0.270214 -v 3.003600 0.119873 -0.532325 -v 2.756229 0.175260 -0.261390 -v 3.014773 0.127256 -0.509977 -v 2.780539 0.178693 -0.252212 -v 3.026395 0.129749 -0.486736 -v 2.804849 0.175260 -0.243035 -v 3.038014 0.127256 -0.463495 -v 2.828223 0.165091 -0.234210 -v 3.049189 0.119873 -0.441148 -v 2.849766 0.148578 -0.226077 -v 3.059486 0.107883 -0.420552 -v 2.868649 0.126355 -0.218949 -v 3.068513 0.091747 -0.402500 -v 2.884145 0.099277 -0.213098 -v 3.075920 0.072085 -0.387684 -v 2.895660 0.068383 -0.208751 -v 3.081425 0.049653 -0.376676 -v 2.902751 0.034861 -0.206074 -v 3.084814 0.025313 -0.369897 -v 2.905145 0.000000 -0.205170 -v 3.085958 0.000000 -0.367608 -v 2.902751 -0.034861 -0.206074 -v 3.084814 -0.025313 -0.369897 -v 2.895660 -0.068383 -0.208751 -v 3.081425 -0.049653 -0.376676 -v 2.884145 -0.099277 -0.213098 -v 3.075920 -0.072085 -0.387684 -v 2.868649 -0.126355 -0.218949 -v 3.068513 -0.091747 -0.402500 -v 2.849766 -0.148578 -0.226077 -v 3.059486 -0.107883 -0.420552 -v 2.828223 -0.165091 -0.234210 -v 3.049189 -0.119873 -0.441148 -v 2.804849 -0.175260 -0.243035 -v 3.038014 -0.127256 -0.463495 -v 2.780539 -0.178693 -0.252212 -v 3.026395 -0.129749 -0.486736 -v 2.756229 -0.175260 -0.261390 -v 3.014773 -0.127256 -0.509977 -v 2.732855 -0.165091 -0.270214 -v 3.003600 -0.119873 -0.532325 -v 2.711311 -0.148578 -0.278347 -v 2.993302 -0.107883 -0.552921 -v 2.692430 -0.126355 -0.285476 -v 2.984276 -0.091747 -0.570973 -v 2.676933 -0.099277 -0.291326 -v 2.976868 -0.072085 -0.585788 -v 2.665419 -0.068383 -0.295673 -v 2.971364 -0.049653 -0.596797 -v 2.658328 -0.034861 -0.298350 -v 2.967975 -0.025313 -0.603576 -v 2.773539 -0.030087 -0.458293 -v 2.597857 0.000000 -0.152405 -v 2.600674 0.034417 -0.151832 -v 2.609018 0.067512 -0.150138 -v 2.622569 0.098013 -0.147386 -v 2.640805 0.124747 -0.143682 -v 2.663026 0.146687 -0.139169 -v 2.688377 0.162990 -0.134020 -v 2.715886 0.173029 -0.128433 -v 2.744493 0.176419 -0.122623 -v 2.773101 0.173029 -0.116812 -v 2.800609 0.162990 -0.111225 -v 2.825960 0.146687 -0.106076 -v 2.848182 0.124747 -0.101563 -v 2.866417 0.098013 -0.097859 -v 2.879968 0.067513 -0.095107 -v 2.888312 0.034418 -0.093412 -v 2.891130 0.000000 -0.092840 -v 2.888312 -0.034418 -0.093412 -v 2.879968 -0.067513 -0.095107 -v 2.866417 -0.098013 -0.097859 -v 2.848182 -0.124747 -0.101563 -v 2.825960 -0.146687 -0.106076 -v 2.800610 -0.162990 -0.111225 -v 2.773101 -0.173029 -0.116812 -v 2.744493 -0.176419 -0.122622 -v 2.715886 -0.173029 -0.128433 -v 2.688377 -0.162990 -0.134020 -v 2.663026 -0.146687 -0.139169 -v 2.640805 -0.124747 -0.143682 -v 2.622569 -0.098013 -0.147385 -v 2.609018 -0.067513 -0.150138 -v 2.600674 -0.034418 -0.151832 -v 2.267573 0.000000 0.523667 -v 2.274200 -0.030150 0.523667 -v 2.293830 -0.059141 0.523667 -v 2.325705 -0.085859 0.523667 -v 2.368602 -0.109278 0.523667 -v 2.420872 -0.128498 0.523667 -v 2.480506 -0.142779 0.523667 -v 2.545213 -0.151573 0.523667 -v 2.612506 -0.154543 0.523667 -v 2.679799 -0.151573 0.523667 -v 2.744506 -0.142779 0.523667 -v 2.804141 -0.128498 0.523667 -v 2.856410 -0.109278 0.523667 -v 2.899308 -0.085859 0.523667 -v 2.931183 -0.059141 0.523667 -v 2.950811 -0.030150 0.523667 -v 2.957439 0.000000 0.523667 -v 2.950811 0.030150 0.523667 -v 2.931183 0.059141 0.523667 -v 2.899307 0.085859 0.523667 -v 2.856410 0.109278 0.523667 -v 2.804141 0.128498 0.523667 -v 2.744506 0.142779 0.523667 -v 2.679799 0.151573 0.523667 -v 2.612506 0.154543 0.523667 -v 2.545213 0.151573 0.523667 -v 2.480506 0.142779 0.523667 -v 2.420871 0.128497 0.523667 -v 2.368602 0.109278 0.523667 -v 2.325705 0.085859 0.523667 -v 2.293830 0.059141 0.523667 -v 2.274200 0.030150 0.523667 -v 3.194983 -0.000000 1.733089 -v 3.596968 0.000000 1.773403 -v 3.194983 -0.021885 1.730934 -v 3.596968 -0.014454 1.771979 -v 3.194983 -0.042928 1.724550 -v 3.596968 -0.028353 1.767763 -v 3.194983 -0.062322 1.714184 -v 3.596968 -0.041162 1.760917 -v 3.194983 -0.079321 1.700234 -v 3.596968 -0.052389 1.751703 -v 3.194983 -0.093272 1.683235 -v 3.596968 -0.061603 1.740475 -v 3.194983 -0.103638 1.663841 -v 3.596968 -0.068449 1.727666 -v 3.194983 -0.110022 1.642797 -v 3.596968 -0.072665 1.713768 -v 3.194983 -0.112177 1.620912 -v 3.596968 -0.074089 1.699314 -v 3.194983 -0.110022 1.599028 -v 3.596968 -0.072665 1.684860 -v 3.194983 -0.103638 1.577984 -v 3.596968 -0.068449 1.670961 -v 3.194983 -0.093272 1.558590 -v 3.596968 -0.061603 1.658152 -v 3.194983 -0.079321 1.541591 -v 3.596968 -0.052389 1.646925 -v 3.194983 -0.062322 1.527641 -v 3.596968 -0.041162 1.637711 -v 3.194983 -0.042928 1.517274 -v 3.596968 -0.028353 1.630865 -v 3.194983 -0.021885 1.510891 -v 3.596968 -0.014454 1.626648 -v 3.194983 0.000000 1.508735 -v 3.596968 0.000000 1.625225 -v 3.194983 0.021885 1.510891 -v 3.596968 0.014454 1.626648 -v 3.194983 0.042928 1.517274 -v 3.596968 0.028353 1.630865 -v 3.194983 0.062322 1.527641 -v 3.596968 0.041162 1.637711 -v 3.194983 0.079321 1.541591 -v 3.596968 0.052389 1.646925 -v 3.194983 0.093272 1.558590 -v 3.596968 0.061603 1.658152 -v 3.194983 0.103638 1.577984 -v 3.596968 0.068449 1.670961 -v 3.194983 0.110022 1.599028 -v 3.596968 0.072665 1.684860 -v 3.194983 0.112177 1.620913 -v 3.596968 0.074089 1.699314 -v 3.194983 0.110022 1.642797 -v 3.596968 0.072665 1.713768 -v 3.194983 0.103638 1.663841 -v 3.596968 0.068449 1.727666 -v 3.194983 0.093272 1.683235 -v 3.596968 0.061603 1.740476 -v 3.194983 0.079321 1.700234 -v 3.596968 0.052389 1.751703 -v 3.194983 0.062322 1.714184 -v 3.596968 0.041162 1.760917 -v 3.194983 0.042928 1.724550 -v 3.596968 0.028353 1.767763 -v 3.194983 0.021884 1.730934 -v 3.596968 0.014454 1.771979 -v 4.245420 -0.014454 1.693577 -v 4.245420 0.000000 1.695001 -v 4.245420 -0.028353 1.689361 -v 4.245420 -0.041162 1.682515 -v 4.245420 -0.052389 1.673301 -v 4.245420 -0.061603 1.662074 -v 4.245420 -0.068449 1.649265 -v 4.245420 -0.072665 1.635366 -v 4.245420 -0.074089 1.620912 -v 4.245420 -0.072665 1.606458 -v 4.245420 -0.068449 1.592560 -v 4.245420 -0.061603 1.579751 -v 4.245420 -0.052389 1.568523 -v 4.245420 -0.041162 1.559309 -v 4.245420 -0.028353 1.552463 -v 4.245420 -0.014454 1.548247 -v 4.245420 0.000000 1.546823 -v 4.245420 0.014454 1.548247 -v 4.245420 0.028353 1.552463 -v 4.245420 0.041162 1.559309 -v 4.245420 0.052389 1.568523 -v 4.245420 0.061603 1.579751 -v 4.245420 0.068449 1.592560 -v 4.245420 0.072665 1.606458 -v 4.245420 0.074089 1.620912 -v 4.245420 0.072665 1.635366 -v 4.245420 0.068449 1.649265 -v 4.245420 0.061603 1.662074 -v 4.245420 0.052389 1.673301 -v 4.245420 0.041162 1.682515 -v 4.245420 0.028353 1.689361 -v 4.245420 0.014454 1.693577 -v 4.881409 0.000001 1.620912 -v 2.779208 -0.059018 1.556956 -v 2.788415 -0.085681 1.549775 -v 2.800806 -0.109051 1.540111 -v 2.815905 -0.128230 1.528336 -v 2.833130 -0.142482 1.514901 -v 2.851821 -0.151258 1.500323 -v 2.871259 -0.154221 1.485163 -v 2.890697 -0.151258 1.470003 -v 2.909387 -0.142482 1.455426 -v 2.926612 -0.128230 1.441991 -v 2.941710 -0.109051 1.430215 -v 2.954102 -0.085681 1.420551 -v 2.963308 -0.059018 1.413370 -v 2.968979 -0.030087 1.408948 -v 2.970893 0.000000 1.407455 -v 2.968979 0.030087 1.408948 -v 2.963308 0.059018 1.413370 -v 2.954102 0.085681 1.420551 -v 2.941710 0.109051 1.430215 -v 2.926612 0.128230 1.441991 -v 2.909387 0.142482 1.455426 -v 2.890697 0.151258 1.470003 -v 2.871259 0.154221 1.485163 -v 2.851821 0.151258 1.500324 -v 2.833130 0.142482 1.514901 -v 2.815905 0.128230 1.528336 -v 2.800806 0.109051 1.540111 -v 2.788415 0.085681 1.549775 -v 2.779208 0.059018 1.556956 -v 2.773539 0.030087 1.561378 -v 2.771625 0.000000 1.562871 -v 3.194983 -0.000000 1.733089 -v 3.194983 -0.021885 1.730934 -v 3.194983 -0.042928 1.724550 -v 3.194983 -0.062322 1.714184 -v 3.194983 -0.079321 1.700234 -v 3.194983 -0.093272 1.683235 -v 3.194983 -0.103638 1.663841 -v 3.194983 -0.110022 1.642797 -v 3.194983 -0.112177 1.620912 -v 3.194983 -0.110022 1.599028 -v 3.194983 -0.103638 1.577984 -v 3.194983 -0.093272 1.558590 -v 3.194983 -0.079321 1.541591 -v 3.194983 -0.062322 1.527641 -v 3.194983 -0.042928 1.517274 -v 3.194983 -0.021885 1.510891 -v 3.194983 0.000000 1.508735 -v 3.194983 0.021885 1.510891 -v 3.194983 0.042928 1.517274 -v 3.194983 0.062322 1.527641 -v 3.194983 0.079321 1.541591 -v 3.194983 0.093272 1.558590 -v 3.194983 0.103638 1.577984 -v 3.194983 0.110022 1.599028 -v 3.194983 0.112177 1.620913 -v 3.194983 0.110022 1.642797 -v 3.194983 0.103638 1.663841 -v 3.194983 0.093272 1.683235 -v 3.194983 0.079321 1.700234 -v 3.194983 0.062322 1.714184 -v 3.194983 0.042928 1.724550 -v 3.194983 0.021884 1.730934 -v 2.551131 0.000000 1.107321 -v 2.554478 -0.033974 1.107321 -v 2.564387 -0.066642 1.107321 -v 2.580481 -0.096750 1.107321 -v 2.602138 -0.123139 1.107321 -v 2.628527 -0.144796 1.107321 -v 2.658634 -0.160889 1.107321 -v 2.691302 -0.170799 1.107321 -v 2.725277 -0.174145 1.107321 -v 2.759251 -0.170799 1.107321 -v 2.791919 -0.160889 1.107321 -v 2.822026 -0.144796 1.107321 -v 2.848415 -0.123139 1.107321 -v 2.870073 -0.096750 1.107321 -v 2.886166 -0.066642 1.107321 -v 2.896075 -0.033974 1.107321 -v 2.899422 0.000000 1.107321 -v 2.896075 0.033974 1.107321 -v 2.886166 0.066643 1.107321 -v 2.870073 0.096750 1.107321 -v 2.848415 0.123139 1.107321 -v 2.822026 0.144797 1.107321 -v 2.791919 0.160889 1.107321 -v 2.759251 0.170799 1.107321 -v 2.725277 0.174145 1.107321 -v 2.691302 0.170799 1.107321 -v 2.658634 0.160889 1.107321 -v 2.628527 0.144796 1.107321 -v 2.602138 0.123139 1.107321 -v 2.580481 0.096750 1.107321 -v 2.564387 0.066642 1.107321 -v 2.554478 0.033974 1.107321 -v 2.966829 0.000000 1.708951 -v 2.655932 0.000000 1.402340 -v 2.658327 0.034861 1.401436 -v 2.967975 0.025313 1.706662 -v 2.665419 0.068383 1.398759 -v 2.971364 0.049653 1.699883 -v 2.676933 0.099276 1.394412 -v 2.976868 0.072085 1.688874 -v 2.692430 0.126355 1.388562 -v 2.984276 0.091746 1.674059 -v 2.711311 0.148578 1.381433 -v 2.993302 0.107882 1.656006 -v 2.732854 0.165091 1.373300 -v 3.003600 0.119873 1.635411 -v 2.756229 0.175260 1.364475 -v 3.014773 0.127256 1.613063 -v 2.780539 0.178693 1.355298 -v 3.026394 0.129749 1.589822 -v 2.804849 0.175260 1.346121 -v 3.038014 0.127256 1.566581 -v 2.828223 0.165091 1.337296 -v 3.049189 0.119873 1.544233 -v 2.849766 0.148578 1.329163 -v 3.059486 0.107883 1.523638 -v 2.868649 0.126355 1.322034 -v 3.068513 0.091747 1.505585 -v 2.884145 0.099277 1.316184 -v 3.075920 0.072085 1.490770 -v 2.895660 0.068383 1.311837 -v 3.081425 0.049653 1.479761 -v 2.902751 0.034861 1.309160 -v 3.084814 0.025313 1.472982 -v 2.905145 0.000000 1.308256 -v 3.085958 0.000000 1.470693 -v 2.902751 -0.034861 1.309160 -v 3.084814 -0.025313 1.472982 -v 2.895660 -0.068383 1.311837 -v 3.081425 -0.049653 1.479761 -v 2.884145 -0.099277 1.316184 -v 3.075920 -0.072085 1.490770 -v 2.868649 -0.126355 1.322034 -v 3.068513 -0.091747 1.505585 -v 2.849766 -0.148578 1.329163 -v 3.059486 -0.107883 1.523638 -v 2.828223 -0.165091 1.337296 -v 3.049189 -0.119873 1.544233 -v 2.804849 -0.175260 1.346121 -v 3.038014 -0.127256 1.566581 -v 2.780539 -0.178693 1.355298 -v 3.026394 -0.129749 1.589822 -v 2.756229 -0.175260 1.364475 -v 3.014773 -0.127256 1.613063 -v 2.732855 -0.165091 1.373300 -v 3.003600 -0.119873 1.635411 -v 2.711311 -0.148578 1.381433 -v 2.993302 -0.107883 1.656006 -v 2.692430 -0.126355 1.388562 -v 2.984276 -0.091747 1.674059 -v 2.676933 -0.099277 1.394412 -v 2.976868 -0.072085 1.688874 -v 2.665419 -0.068383 1.398759 -v 2.971364 -0.049653 1.699882 -v 2.658328 -0.034861 1.401436 -v 2.967975 -0.025313 1.706662 -v 2.773539 -0.030087 1.561378 -v 2.597857 0.000000 1.255490 -v 2.600674 0.034417 1.254918 -v 2.609018 0.067512 1.253223 -v 2.622569 0.098013 1.250471 -v 2.640805 0.124747 1.246768 -v 2.663026 0.146687 1.242254 -v 2.688377 0.162990 1.237106 -v 2.715885 0.173029 1.231518 -v 2.744493 0.176419 1.225708 -v 2.773101 0.173029 1.219898 -v 2.800609 0.162990 1.214311 -v 2.825960 0.146687 1.209162 -v 2.848182 0.124747 1.204649 -v 2.866417 0.098013 1.200945 -v 2.879968 0.067513 1.198193 -v 2.888312 0.034418 1.196498 -v 2.891130 0.000000 1.195926 -v 2.888312 -0.034418 1.196498 -v 2.879968 -0.067513 1.198193 -v 2.866417 -0.098013 1.200945 -v 2.848182 -0.124747 1.204649 -v 2.825960 -0.146687 1.209162 -v 2.800609 -0.162990 1.214311 -v 2.773101 -0.173029 1.219898 -v 2.744493 -0.176419 1.225708 -v 2.715886 -0.173029 1.231518 -v 2.688377 -0.162990 1.237106 -v 2.663026 -0.146687 1.242254 -v 2.640805 -0.124747 1.246768 -v 2.622569 -0.098013 1.250471 -v 2.609018 -0.067513 1.253223 -v 2.600674 -0.034418 1.254918 -v 2.267572 0.000000 0.579419 -v 2.274200 -0.030150 0.579419 -v 2.293830 -0.059141 0.579419 -v 2.325705 -0.085859 0.579419 -v 2.368602 -0.109278 0.579419 -v 2.420872 -0.128498 0.579419 -v 2.480506 -0.142779 0.579419 -v 2.545213 -0.151573 0.579419 -v 2.612506 -0.154543 0.579419 -v 2.679799 -0.151573 0.579419 -v 2.744506 -0.142779 0.579419 -v 2.804141 -0.128498 0.579419 -v 2.856410 -0.109278 0.579419 -v 2.899307 -0.085859 0.579419 -v 2.931183 -0.059141 0.579419 -v 2.950811 -0.030150 0.579419 -v 2.957439 0.000000 0.579419 -v 2.950811 0.030150 0.579419 -v 2.931183 0.059141 0.579419 -v 2.899307 0.085859 0.579419 -v 2.856410 0.109278 0.579419 -v 2.804140 0.128498 0.579419 -v 2.744506 0.142779 0.579419 -v 2.679799 0.151573 0.579419 -v 2.612506 0.154543 0.579419 -v 2.545213 0.151573 0.579419 -v 2.480506 0.142779 0.579419 -v 2.420871 0.128497 0.579419 -v 2.368602 0.109278 0.579419 -v 2.325705 0.085859 0.579419 -v 2.293830 0.059141 0.579419 -v 2.274200 0.030150 0.579419 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.375000 1.000000 -vt 0.406250 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 +mtllib mcl_trident.mtl +o Cube_Cube.001 +v 8.000000 -0.400000 -0.400001 +v 8.000000 0.400000 -0.400001 +v 8.000000 -0.400000 0.400000 +v 8.000000 0.400000 0.400000 +v 8.799999 0.400000 0.400000 +v 8.799999 -0.400000 0.400000 +v 8.799999 -0.400000 -0.400001 +v 8.799999 0.400000 -0.400001 +v 9.599998 0.400000 0.400000 +v 9.599998 -0.400000 0.400000 +v 9.599998 0.400000 -0.400001 +v 9.599998 -0.400000 -0.400001 +v 8.000000 0.400000 -1.200001 +v 8.000000 -0.400000 -1.200001 +v 8.000000 0.400000 1.199999 +v 8.000000 -0.400000 1.199999 +v 8.799999 0.400000 -1.200001 +v 8.799999 0.400000 1.199999 +v 8.799999 -0.400000 1.199999 +v 8.799999 -0.400000 -1.200001 +v 9.599998 0.400000 1.199999 +v 9.599998 -0.400000 1.199999 +v 9.599998 0.400000 -1.200001 +v 9.599998 -0.400000 -1.200001 +v 8.799999 0.400000 1.999999 +v 8.799999 -0.400000 1.999999 +v 8.799999 0.400000 -2.000001 +v 8.799999 -0.400000 -2.000001 +v 9.599998 0.400000 1.999999 +v 9.599998 -0.400000 1.999999 +v 9.599998 0.400000 -2.000001 +v 9.599998 -0.400000 -2.000001 +v 13.599998 0.400000 0.399999 +v 13.599998 -0.400000 0.399999 +v 13.599998 0.400000 -0.400001 +v 13.599998 -0.400000 -0.400001 +v 12.799997 0.400000 1.199999 +v 12.799997 -0.400000 1.199999 +v 12.799997 0.400000 1.999999 +v 12.799997 -0.400000 1.999999 +v 12.799999 0.400000 -1.200001 +v 12.799999 -0.400000 -1.200001 +v 12.799999 0.400000 -2.000001 +v 12.799999 -0.400000 -2.000001 +v 7.200000 -0.400000 -0.400001 +v 6.400000 -0.400000 -0.400001 +v 5.599999 -0.400000 -0.400001 +v 4.799999 -0.400000 -0.400001 +v 3.999999 -0.400000 -0.400000 +v 3.199999 -0.400000 -0.400000 +v 2.399999 -0.400000 -0.400000 +v 1.599998 -0.400000 -0.400000 +v 0.799998 -0.400000 -0.400000 +v -0.000001 -0.400000 -0.400000 +v -0.800001 -0.400000 -0.400000 +v -1.600001 -0.400000 -0.400000 +v -2.400001 -0.400000 -0.400000 +v -3.200001 -0.400000 -0.400000 +v -4.000001 -0.400000 -0.400000 +v -4.800001 -0.400000 -0.400000 +v -5.600000 -0.400000 -0.400000 +v -6.400001 -0.400000 -0.400000 +v -7.200000 -0.400000 -0.400000 +v -8.000000 -0.400000 -0.400000 +v -8.800000 -0.400000 -0.400000 +v -9.600000 -0.400000 -0.400000 +v -10.400000 -0.400000 -0.400000 +v -11.200000 -0.400000 -0.399999 +v -12.000000 -0.400000 -0.399999 +v -11.999999 0.400000 -0.399999 +v -11.199999 0.400000 -0.400000 +v -10.400000 0.400000 -0.400000 +v -9.599999 0.400000 -0.400000 +v -8.799999 0.400000 -0.400000 +v -8.000000 0.400000 -0.399999 +v -7.199999 0.400000 -0.400000 +v -6.400000 0.400000 -0.400000 +v -5.599999 0.400000 -0.400000 +v -4.799999 0.400000 -0.400000 +v -4.000000 0.400000 -0.400000 +v -3.199999 0.400000 -0.400000 +v -2.400000 0.400000 -0.400000 +v -1.599999 0.400000 -0.400000 +v -0.799999 0.400000 -0.400000 +v 0.000001 0.400000 -0.400000 +v 0.800001 0.400000 -0.400000 +v 1.600001 0.400000 -0.400000 +v 2.400002 0.400000 -0.400000 +v 3.200002 0.400000 -0.400000 +v 4.000002 0.400000 -0.400000 +v 4.800001 0.400000 -0.400001 +v 5.600000 0.400000 -0.400001 +v 6.400001 0.400000 -0.400001 +v 7.200001 0.400000 -0.400001 +v -11.999999 -0.400000 0.400001 +v -11.199999 -0.400000 0.400001 +v -10.400000 -0.400000 0.400001 +v -9.599999 -0.400000 0.400001 +v -8.799999 -0.400000 0.400001 +v -8.000000 -0.400000 0.400001 +v -7.199999 -0.400000 0.400001 +v -6.400000 -0.400000 0.400001 +v -5.599999 -0.400000 0.400001 +v -4.799999 -0.400000 0.400001 +v -4.000000 -0.400000 0.400000 +v -3.199999 -0.400000 0.400000 +v -2.400000 -0.400000 0.400000 +v -1.599999 -0.400000 0.400000 +v -0.799999 -0.400000 0.400000 +v 0.000001 -0.400000 0.400000 +v 0.800001 -0.400000 0.400000 +v 1.600001 -0.400000 0.400000 +v 2.400002 -0.400000 0.400000 +v 3.200002 -0.400000 0.400000 +v 4.000002 -0.400000 0.400000 +v 4.800001 -0.400000 0.400000 +v 5.600000 -0.400000 0.400000 +v 6.400001 -0.400000 0.400000 +v 7.200001 -0.400000 0.400000 +v 7.200000 0.400000 0.400000 +v 6.400000 0.400000 0.400000 +v 5.599999 0.400000 0.400000 +v 4.799999 0.400000 0.400000 +v 3.999999 0.400000 0.400000 +v 3.199999 0.400000 0.400000 +v 2.399999 0.400000 0.400000 +v 1.599998 0.400000 0.400000 +v 0.799998 0.400000 0.400000 +v -0.000001 0.400000 0.400000 +v -0.800001 0.400000 0.400000 +v -1.600001 0.400000 0.400000 +v -2.400001 0.400000 0.400000 +v -3.200001 0.400000 0.400000 +v -4.000001 0.400000 0.400000 +v -4.800001 0.400000 0.400000 +v -5.600000 0.400000 0.400001 +v -6.400001 0.400000 0.400001 +v -7.200000 0.400000 0.400001 +v -8.000000 0.400000 0.400001 +v -8.800000 0.400000 0.400001 +v -9.600000 0.400000 0.400001 +v -10.400000 0.400000 0.400001 +v -11.200000 0.400000 0.400001 +v -12.000000 0.400000 0.400001 +v 10.399998 -0.400000 1.199999 +v 11.199997 -0.400000 1.199999 +v 11.999996 -0.400000 1.199999 +v 11.999998 -0.400000 1.999999 +v 11.199999 -0.400000 1.999999 +v 10.399998 -0.400000 1.999999 +v 10.399998 0.400000 1.199999 +v 11.199997 0.400000 1.199999 +v 11.999996 0.400000 1.199999 +v 11.999998 0.400000 1.999999 +v 11.199999 0.400000 1.999999 +v 10.399998 0.400000 1.999999 +v 10.399998 -0.400000 -2.000001 +v 11.199999 -0.400000 -2.000001 +v 12.000000 -0.400000 -2.000001 +v 12.000000 -0.400000 -1.200001 +v 11.199999 -0.400000 -1.200001 +v 10.399998 -0.400000 -1.200001 +v 12.000000 0.400000 -1.200001 +v 11.199999 0.400000 -1.200001 +v 10.399998 0.400000 -1.200001 +v 10.399998 0.400000 -2.000001 +v 11.199999 0.400000 -2.000001 +v 12.000000 0.400000 -2.000001 +v 10.399998 -0.400000 0.400000 +v 11.199997 -0.400000 0.400000 +v 11.999998 -0.400000 0.399999 +v 12.799999 -0.400000 0.399999 +v 12.799999 0.400000 0.399999 +v 12.000000 0.400000 0.399999 +v 11.199999 0.400000 0.400000 +v 10.399998 0.400000 0.400000 +v 10.399998 0.400000 -0.400001 +v 11.199997 0.400000 -0.400001 +v 11.999998 0.400000 -0.400001 +v 12.799999 0.400000 -0.400001 +v 12.799999 -0.400000 -0.400001 +v 12.000000 -0.400000 -0.400001 +v 11.199999 -0.400000 -0.400001 +v 10.399998 -0.400000 -0.400001 +vt 0.312500 0.750000 +vt 0.343750 0.750000 +vt 0.343750 0.781250 +vt 0.312500 0.781250 +vt 0.062500 0.781250 +vt 0.093750 0.781250 +vt 0.093750 0.812500 +vt 0.062500 0.812500 +vt 0.437500 0.031250 +vt 0.437500 0.000000 +vt 0.468750 0.000000 +vt 0.468750 0.031250 +vt 0.218750 0.812500 +vt 0.250000 0.812500 +vt 0.250000 0.843750 +vt 0.218750 0.843750 +vt 0.093750 0.843750 +vt 0.125000 0.812500 +vt 0.125000 0.843750 +vt 0.218750 0.781250 +vt 0.250000 0.781250 +vt 0.375000 0.125000 +vt 0.406250 0.125000 +vt 0.406250 0.156250 +vt 0.375000 0.156250 +vt 0.187500 0.812500 +vt 0.187500 0.781250 +vt 0.031250 0.812500 +vt 0.031250 0.781250 +vt 0.062500 0.843750 +vt 0.468750 0.312500 +vt 0.468750 0.343750 +vt 0.437500 0.343750 +vt 0.437500 0.312500 +vt 0.437500 0.375000 +vt 0.437500 0.343750 +vt 0.468750 0.343750 +vt 0.468750 0.375000 +vt 0.281250 0.843750 +vt 0.281250 0.812500 +vt 0.312500 0.812500 +vt 0.312500 0.843750 +vt 0.156250 0.812500 +vt 0.156250 0.843750 +vt 0.437500 0.062500 +vt 0.437500 0.031250 +vt 0.468750 0.031250 +vt 0.468750 0.062500 +vt 0.125000 0.781250 +vt 0.468750 0.062500 +vt 0.468750 0.093750 +vt 0.437500 0.093750 +vt 0.437500 0.062500 +vt 0.468750 0.093750 +vt 0.468750 0.125000 +vt 0.437500 0.125000 +vt 0.437500 0.093750 +vt 0.031250 0.843750 +vt 0.281250 0.781250 +vt 0.187500 0.843750 +vt 0.406250 0.156250 +vt 0.437500 0.156250 +vt 0.437500 0.187500 +vt 0.406250 0.187500 +vt 0.406250 0.312500 +vt 0.375000 0.312500 +vt 0.375000 0.281250 +vt 0.406250 0.281250 +vt 0.156250 0.937500 +vt 0.187500 0.937500 +vt 0.187500 0.968750 +vt 0.156250 0.968750 +vt 0.437500 0.125000 +vt 0.468750 0.125000 +vt 0.468750 0.156250 +vt 0.437500 0.156250 +vt 0.000000 0.843750 +vt 0.000000 0.812500 +vt 0.156250 0.843750 +vt 0.156250 0.812500 +vt 0.281250 0.937500 +vt 0.312500 0.937500 +vt 0.312500 0.968750 +vt 0.281250 0.968750 +vt 0.468750 0.187500 +vt 0.437500 0.187500 +vt 0.437500 0.156250 +vt 0.468750 0.156250 +vt 0.468750 0.187500 +vt 0.468750 0.218750 +vt 0.437500 0.218750 +vt 0.437500 0.187500 +vt 0.437500 0.031250 +vt 0.406250 0.031250 +vt 0.406250 0.000000 +vt 0.437500 0.000000 +vt 0.062500 0.968750 +vt 0.093750 0.968750 vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.031250 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.031250 1.000000 -vt 0.812500 1.000000 -vt 0.781250 1.000000 -vt 0.343750 1.000000 -vt 0.750000 1.000000 -vt 0.312500 1.000000 -vt 0.718750 1.000000 -vt 0.281250 1.000000 -vt 0.687500 1.000000 -vt 0.250000 1.000000 -vt 0.656250 1.000000 -vt 0.218750 1.000000 -vt 0.625000 1.000000 -vt 0.187500 1.000000 -vt 0.593750 1.000000 -vt 0.156250 1.000000 -vt 0.562500 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.531250 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.500000 1.000000 -vt 0.906250 1.000000 -vt 0.468750 1.000000 -vt 0.875000 1.000000 -vt 0.437500 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.343750 1.000000 -vt 0.375000 1.000000 -vt 0.343750 1.000000 -vt 0.468750 1.000000 -vt 0.437500 1.000000 -vt 0.875000 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.406250 1.000000 -vt 0.812500 1.000000 -vt 0.781250 1.000000 -vt 0.750000 1.000000 -vt 0.312500 1.000000 -vt 0.718750 1.000000 -vt 0.281250 1.000000 -vt 0.687500 1.000000 -vt 0.250000 1.000000 -vt 0.656250 1.000000 -vt 0.218750 1.000000 -vt 0.625000 1.000000 -vt 0.187500 1.000000 -vt 0.593750 1.000000 -vt 0.156250 1.000000 -vt 0.562500 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.531250 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.500000 1.000000 -vt 0.906250 1.000000 -vt 0.750000 1.000000 -vt 0.312500 1.000000 -vt 0.718750 1.000000 -vt 0.281250 1.000000 -vt 0.687500 1.000000 -vt 0.250000 1.000000 -vt 0.656250 1.000000 -vt 0.218750 1.000000 -vt 0.625000 1.000000 -vt 0.187500 1.000000 -vt 0.593750 1.000000 -vt 0.156250 1.000000 -vt 0.562500 1.000000 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.531250 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.500000 1.000000 -vt 0.906250 1.000000 -vt 0.062500 1.000000 -vt 0.468750 1.000000 -vt 0.875000 1.000000 -vt 0.031250 1.000000 -vt 0.437500 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.406250 1.000000 -vt 0.812500 1.000000 -vt 0.375000 1.000000 -vt 0.781250 1.000000 -vt 0.437500 1.000000 -vt 0.468750 1.000000 -vt 0.500000 1.000000 -vt 0.531250 1.000000 -vt 0.562500 1.000000 -vt 0.593750 1.000000 -vt 0.625000 1.000000 -vt 0.656250 1.000000 -vt 0.687500 1.000000 -vt 0.718750 1.000000 -vt 0.750000 1.000000 -vt 0.781250 1.000000 -vt 0.812500 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.031250 1.000000 -vt 0.875000 1.000000 -vt 0.062500 1.000000 -vt 0.906250 1.000000 -vt 0.093750 1.000000 -vt 0.937500 1.000000 -vt 0.125000 1.000000 -vt 0.968750 1.000000 -vt 0.156250 1.000000 -vt 1.000000 1.000000 -vt 0.187500 1.000000 -vt 0.218750 1.000000 -vt 0.250000 1.000000 -vt 0.281250 1.000000 -vt 0.312500 1.000000 -vt 0.343750 1.000000 -vt 0.375000 1.000000 -vt 0.406250 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.343750 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.312500 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.281250 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 -vt 0.250000 1.000000 +vt 0.218750 0.968750 +vt 0.250000 0.968750 vt 0.250000 1.000000 vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.218750 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.187500 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.156250 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.093750 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.906250 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.062500 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.031250 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.812500 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.781250 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.718750 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.687500 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.656250 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.625000 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.593750 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.531250 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.468750 1.000000 -vt 0.281250 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.500000 -vt 0.281250 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 +vt 0.468750 0.250000 +vt 0.437500 0.250000 +vt 0.437500 0.218750 +vt 0.468750 0.218750 +vt 0.437500 0.343750 +vt 0.406250 0.343750 +vt 0.406250 0.312500 +vt 0.437500 0.312500 +vt 0.406250 0.281250 +vt 0.437500 0.281250 +vt 0.437500 0.312500 +vt 0.406250 0.312500 +vt 0.125000 0.937500 +vt 0.156250 0.937500 +vt 0.156250 0.968750 +vt 0.125000 0.968750 +vt 0.437500 0.250000 +vt 0.468750 0.250000 +vt 0.468750 0.281250 +vt 0.437500 0.281250 +vt 0.375000 0.406250 +vt 0.406250 0.406250 +vt 0.406250 0.437500 +vt 0.375000 0.437500 +vt 0.406250 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.156250 +vt 0.406250 0.156250 +vt 0.000000 0.937500 +vt 0.031250 0.937500 +vt 0.031250 0.968750 +vt 0.000000 0.968750 +vt 0.062500 0.750000 +vt 0.093750 0.750000 +vt 0.062500 0.718750 +vt 0.093750 0.718750 +vt 0.062500 0.687500 +vt 0.093750 0.687500 +vt 0.062500 0.656250 +vt 0.093750 0.656250 +vt 0.062500 0.625000 +vt 0.093750 0.625000 +vt 0.062500 0.593750 +vt 0.093750 0.593750 +vt 0.062500 0.562500 +vt 0.093750 0.562500 +vt 0.062500 0.531250 +vt 0.093750 0.531250 vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.218750 0.500000 -vt 0.218750 0.500000 -vt 0.281250 0.500000 -vt 0.250000 0.500000 -vt 0.312500 0.500000 -vt 0.343750 0.500000 -vt 0.375000 0.500000 -vt 0.406250 0.500000 -vt 0.437500 0.500000 -vt 0.468750 0.500000 -vt 0.500000 0.500000 -vt 0.531250 0.500000 -vt 0.562500 0.500000 -vt 0.593750 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.687500 0.500000 -vt 0.718750 0.500000 -vt 0.750000 0.500000 -vt 0.781250 0.500000 -vt 0.812500 0.500000 -vt 0.843750 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.875000 0.500000 -vt 0.062500 0.500000 -vt 0.906250 0.500000 -vt 0.093750 0.500000 -vt 0.937500 0.500000 -vt 0.125000 0.500000 -vt 0.968750 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 0.187500 0.500000 -vt 0.218750 0.500000 +vt 0.062500 0.468750 +vt 0.093750 0.468750 +vt 0.062500 0.437500 +vt 0.093750 0.437500 +vt 0.062500 0.406250 +vt 0.093750 0.406250 +vt 0.062500 0.375000 +vt 0.093750 0.375000 +vt 0.062500 0.343750 +vt 0.093750 0.343750 +vt 0.062500 0.312500 +vt 0.093750 0.312500 +vt 0.062500 0.281250 +vt 0.093750 0.281250 +vt 0.062500 0.250000 +vt 0.093750 0.250000 +vt 0.062500 0.218750 +vt 0.093750 0.218750 +vt 0.062500 0.187500 +vt 0.093750 0.187500 +vt 0.062500 0.156250 +vt 0.093750 0.156250 +vt 0.062500 0.125000 +vt 0.093750 0.125000 +vt 0.062500 0.093750 +vt 0.093750 0.093750 +vt 0.062500 0.062500 +vt 0.093750 0.062500 +vt 0.062500 0.031250 +vt 0.093750 0.031250 +vt 0.062500 0.000000 +vt 0.093750 0.000000 +vt 0.218750 0.750000 +vt 0.250000 0.750000 +vt 0.218750 0.718750 +vt 0.250000 0.718750 +vt 0.218750 0.687500 +vt 0.250000 0.687500 +vt 0.218750 0.656250 +vt 0.250000 0.656250 +vt 0.218750 0.625000 +vt 0.250000 0.625000 +vt 0.218750 0.593750 +vt 0.250000 0.593750 +vt 0.218750 0.562500 +vt 0.250000 0.562500 +vt 0.218750 0.531250 +vt 0.250000 0.531250 vt 0.218750 0.500000 vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 +vt 0.218750 0.468750 +vt 0.250000 0.468750 +vt 0.218750 0.437500 +vt 0.250000 0.437500 +vt 0.218750 0.406250 +vt 0.250000 0.406250 +vt 0.218750 0.375000 +vt 0.250000 0.375000 +vt 0.218750 0.343750 +vt 0.250000 0.343750 +vt 0.218750 0.312500 +vt 0.250000 0.312500 +vt 0.218750 0.281250 +vt 0.250000 0.281250 +vt 0.218750 0.250000 +vt 0.250000 0.250000 +vt 0.218750 0.218750 +vt 0.250000 0.218750 +vt 0.218750 0.187500 +vt 0.250000 0.187500 +vt 0.218750 0.156250 +vt 0.250000 0.156250 +vt 0.218750 0.125000 +vt 0.250000 0.125000 +vt 0.218750 0.093750 +vt 0.250000 0.093750 +vt 0.218750 0.062500 +vt 0.250000 0.062500 +vt 0.218750 0.031250 +vt 0.250000 0.031250 +vt 0.218750 0.000000 +vt 0.250000 0.000000 +vt 0.375000 0.781250 +vt 0.343750 0.781250 +vt 0.343750 0.750000 +vt 0.375000 0.750000 +vt 0.343750 0.718750 +vt 0.375000 0.718750 +vt 0.343750 0.687500 +vt 0.375000 0.687500 +vt 0.343750 0.656250 +vt 0.375000 0.656250 +vt 0.343750 0.625000 +vt 0.375000 0.625000 +vt 0.343750 0.593750 +vt 0.375000 0.593750 +vt 0.343750 0.562500 +vt 0.375000 0.562500 +vt 0.343750 0.531250 +vt 0.375000 0.531250 vt 0.343750 0.500000 +vt 0.375000 0.500000 +vt 0.343750 0.468750 +vt 0.375000 0.468750 +vt 0.343750 0.437500 +vt 0.375000 0.437500 +vt 0.343750 0.406250 +vt 0.375000 0.406250 +vt 0.343750 0.375000 +vt 0.375000 0.375000 +vt 0.343750 0.343750 +vt 0.375000 0.343750 +vt 0.343750 0.312500 +vt 0.375000 0.312500 +vt 0.343750 0.281250 +vt 0.375000 0.281250 +vt 0.343750 0.250000 +vt 0.375000 0.250000 +vt 0.343750 0.218750 +vt 0.375000 0.218750 +vt 0.343750 0.187500 +vt 0.375000 0.187500 +vt 0.343750 0.156250 +vt 0.375000 0.156250 +vt 0.343750 0.125000 +vt 0.375000 0.125000 +vt 0.343750 0.093750 +vt 0.375000 0.093750 +vt 0.343750 0.062500 +vt 0.375000 0.062500 +vt 0.343750 0.031250 +vt 0.375000 0.031250 +vt 0.343750 0.000000 +vt 0.375000 0.000000 +vt 0.437500 0.312500 +vt 0.437500 0.281250 +vt 0.468750 0.281250 +vt 0.468750 0.312500 +vt 0.312500 0.000000 +vt 0.343750 0.000000 +vt 0.343750 0.031250 +vt 0.312500 0.031250 +vt 0.343750 0.062500 +vt 0.312500 0.062500 +vt 0.343750 0.093750 +vt 0.312500 0.093750 +vt 0.343750 0.125000 +vt 0.312500 0.125000 +vt 0.343750 0.156250 +vt 0.312500 0.156250 +vt 0.343750 0.187500 +vt 0.312500 0.187500 +vt 0.343750 0.218750 +vt 0.312500 0.218750 +vt 0.343750 0.250000 +vt 0.312500 0.250000 +vt 0.343750 0.281250 +vt 0.312500 0.281250 +vt 0.343750 0.312500 +vt 0.312500 0.312500 +vt 0.343750 0.343750 +vt 0.312500 0.343750 +vt 0.343750 0.375000 +vt 0.312500 0.375000 +vt 0.343750 0.406250 +vt 0.312500 0.406250 +vt 0.343750 0.437500 +vt 0.312500 0.437500 +vt 0.343750 0.468750 +vt 0.312500 0.468750 vt 0.343750 0.500000 vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.218750 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.218750 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.750000 0.490000 -vt 0.796822 0.485388 -vt 0.841844 0.471731 -vt 0.883337 0.449553 -vt 0.919706 0.419706 -vt 0.949553 0.383337 -vt 0.971731 0.341844 -vt 0.985388 0.296822 -vt 0.990000 0.250000 -vt 0.985388 0.203178 -vt 0.971731 0.158156 -vt 0.949553 0.116663 -vt 0.919706 0.080294 -vt 0.883337 0.050447 -vt 0.841844 0.028269 -vt 0.796822 0.014612 -vt 0.750000 0.010000 -vt 0.703178 0.014612 -vt 0.658156 0.028269 -vt 0.616663 0.050447 -vt 0.580294 0.080294 -vt 0.550447 0.116663 -vt 0.528269 0.158156 -vt 0.514611 0.203179 -vt 0.510000 0.250000 -vt 0.514612 0.296822 -vt 0.528269 0.341844 -vt 0.550447 0.383337 -vt 0.580295 0.419706 -vt 0.616663 0.449553 -vt 0.658156 0.471731 -vt 0.703179 0.485389 -vt 0.625000 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.625000 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.031250 0.500000 -vt 0.031250 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.218750 0.500000 -vt 0.593750 0.500000 -vt 0.625000 0.500000 -vt 0.156250 0.500000 -vt 0.562500 0.500000 -vt 0.968750 0.500000 -vt 1.000000 0.500000 -vt 0.125000 0.500000 -vt 0.531250 0.500000 -vt 0.937500 0.500000 -vt 0.093750 0.500000 -vt 0.500000 0.500000 -vt 0.906250 0.500000 -vt 0.062500 0.500000 -vt 0.468750 0.500000 -vt 0.875000 0.500000 -vt 0.031250 0.500000 -vt 0.437500 0.500000 -vt 0.843750 0.500000 -vt 0.000000 0.500000 -vt 0.406250 0.500000 -vt 0.812500 0.500000 -vt 0.375000 0.500000 -vt 0.781250 0.500000 -vt 0.343750 0.500000 -vt 0.750000 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.281250 0.500000 -vt 0.687500 0.500000 -vt 0.250000 0.500000 -vt 0.656250 0.500000 -vt 0.218750 0.500000 -vt 0.187500 0.500000 -vt 0.625000 0.500000 -vt 0.593750 0.500000 -vt 0.156250 0.500000 -vt 0.562500 0.500000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.125000 0.500000 -vt 0.531250 0.500000 -vt 0.937500 0.500000 -vt 0.093750 0.500000 -vt 0.500000 0.500000 -vt 0.906250 0.500000 -vt 0.062500 0.500000 -vt 0.468750 0.500000 -vt 0.875000 0.500000 -vt 0.031250 0.500000 -vt 0.437500 0.500000 -vt 0.843750 0.500000 -vt 0.000000 0.500000 -vt 0.406250 0.500000 -vt 0.812500 0.500000 -vt 0.375000 0.500000 -vt 0.781250 0.500000 -vt 0.343750 0.500000 -vt 0.750000 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.281250 0.500000 -vt 0.687500 0.500000 -vt 0.250000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.625000 0.500000 -vt 0.656250 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.218750 0.500000 -vt 0.250000 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.687500 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.281250 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.718750 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.312500 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.343750 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.781250 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.375000 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.406250 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.843750 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.468750 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.906250 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.093750 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.937500 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.531250 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.968750 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.562500 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.593750 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 0.187500 0.500000 -vt 1.000000 0.500000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.968750 0.500000 -vt 0.937500 1.000000 -vt 0.937500 0.500000 -vt 0.906250 1.000000 -vt 0.906250 0.500000 -vt 0.875000 1.000000 -vt 0.875000 0.500000 -vt 0.843750 1.000000 -vt 0.843750 0.500000 -vt 0.812500 1.000000 -vt 0.812500 0.500000 -vt 0.781250 1.000000 -vt 0.781250 0.500000 -vt 0.750000 1.000000 -vt 0.750000 0.500000 -vt 0.718750 1.000000 -vt 0.718750 0.500000 -vt 0.687500 1.000000 -vt 0.687500 0.500000 -vt 0.656250 1.000000 -vt 0.656250 0.500000 -vt 0.625000 1.000000 -vt 0.625000 0.500000 -vt 0.593750 1.000000 -vt 0.593750 0.500000 -vt 0.562500 1.000000 -vt 0.562500 0.500000 -vt 0.531250 1.000000 -vt 0.531250 0.500000 -vt 0.500000 1.000000 -vt 0.500000 0.500000 -vt 0.468750 1.000000 -vt 0.468750 0.500000 -vt 0.437500 1.000000 -vt 0.437500 0.500000 -vt 0.406250 1.000000 -vt 0.406250 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt 0.343750 1.000000 -vt 0.343750 0.500000 -vt 0.312500 1.000000 -vt 0.312500 0.500000 -vt 0.281250 1.000000 -vt 0.281250 0.500000 -vt 0.250000 1.000000 -vt 0.250000 0.500000 -vt 0.218750 1.000000 -vt 0.218750 0.500000 -vt 0.187500 1.000000 -vt 0.187500 0.500000 -vt 0.156250 1.000000 -vt 0.156250 0.500000 -vt 0.125000 1.000000 -vt 0.125000 0.500000 -vt 0.093750 1.000000 -vt 0.093750 0.500000 -vt 0.062500 1.000000 -vt 0.062500 0.500000 -vt 0.718750 1.000000 -vt 0.687500 1.000000 -vt 0.031250 1.000000 -vt 0.031250 0.500000 -vt 0.000000 1.000000 -vt 0.000000 0.500000 -vt 0.812500 0.500000 -vt 0.843750 0.500000 -vt 0.562500 1.000000 -vt 0.593750 1.000000 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.156250 1.000000 -vt 0.125000 1.000000 -vt 0.843750 1.000000 -vt 0.812500 1.000000 -vt 0.531250 1.000000 -vt 0.281250 1.000000 -vt 0.250000 1.000000 -vt 0.968750 1.000000 -vt 0.937500 1.000000 -vt 0.656250 1.000000 -vt 0.375000 1.000000 -vt 0.093750 1.000000 -vt 0.781250 1.000000 -vt 0.500000 1.000000 -vt 0.218750 1.000000 -vt 0.906250 1.000000 -vt 0.625000 1.000000 -vt 0.343750 1.000000 -vt 0.062500 1.000000 -vt 0.750000 1.000000 -vt 0.468750 1.000000 -vt 0.187500 1.000000 -vt 0.875000 1.000000 -vt 0.312500 1.000000 -vt 0.031250 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.890975 0.466368 -vt 0.873729 0.481154 -vt 0.889672 0.485865 -vt 0.894793 0.474776 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.531250 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.500000 1.000000 -vt 0.906250 1.000000 -vt 0.062500 1.000000 -vt 0.468750 1.000000 -vt 0.875000 1.000000 -vt 0.031250 1.000000 -vt 0.437500 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.406250 1.000000 -vt 0.812500 1.000000 -vt 0.375000 1.000000 -vt 0.781250 1.000000 -vt 0.343750 1.000000 -vt 0.750000 1.000000 -vt 0.312500 1.000000 -vt 0.718750 1.000000 -vt 0.281250 1.000000 -vt 0.687500 1.000000 -vt 0.250000 1.000000 -vt 0.656250 1.000000 -vt 0.218750 1.000000 -vt 0.625000 1.000000 -vt 0.187500 1.000000 -vt 0.593750 1.000000 -vt 0.156250 1.000000 -vt 0.250000 0.496667 -vt 0.255226 0.495129 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.531250 0.500000 -vt 0.562500 0.500000 -vt 0.250000 0.500000 -vt 0.281250 0.500000 -vt 0.937500 0.500000 -vt 0.968750 0.500000 -vt 0.656250 0.500000 -vt 0.687500 0.500000 -vt 0.375000 0.500000 -vt 0.406250 0.500000 -vt 0.093750 0.500000 -vt 0.125000 0.500000 -vt 0.781250 0.500000 -vt 0.500000 0.500000 -vt 0.218750 0.500000 -vt 0.906250 0.500000 -vt 0.625000 0.500000 -vt 0.343750 0.500000 -vt 0.062500 0.500000 -vt 0.750000 0.500000 -vt 0.468750 0.500000 -vt 0.187500 0.500000 -vt 0.875000 0.500000 -vt 0.593750 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.437500 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 0.750000 0.490000 -vt 0.796822 0.485388 -vt 0.841844 0.471731 -vt 0.883337 0.449553 -vt 0.919706 0.419706 -vt 0.949553 0.383337 -vt 0.971731 0.341844 -vt 0.985388 0.296822 -vt 0.990000 0.250000 -vt 0.985388 0.203178 -vt 0.971731 0.158156 -vt 0.949553 0.116663 -vt 0.919706 0.080294 -vt 0.883337 0.050447 -vt 0.841844 0.028269 -vt 0.796822 0.014612 -vt 0.750000 0.010000 -vt 0.703178 0.014612 -vt 0.658156 0.028269 -vt 0.616663 0.050447 -vt 0.580294 0.080294 -vt 0.550447 0.116663 -vt 0.528269 0.158156 -vt 0.514611 0.203179 -vt 0.510000 0.250000 -vt 0.514612 0.296822 -vt 0.528269 0.341844 -vt 0.550447 0.383337 -vt 0.580295 0.419706 -vt 0.616663 0.449553 -vt 0.658156 0.471731 -vt 0.703179 0.485389 -vt 0.261052 0.490577 -vt 0.268054 0.483184 -vt 0.276765 0.473235 -vt 0.287649 0.461112 -vt 0.301090 0.447281 -vt 0.317371 0.432274 -vt 0.336667 0.416667 -vt 0.359037 0.401060 -vt 0.384423 0.386052 -vt 0.412649 0.372221 -vt 0.443431 0.360098 -vt 0.476388 0.350149 -vt 0.511052 0.342756 -vt 0.546893 0.338204 -vt 0.583333 0.336667 -vt 0.619774 0.338204 -vt 0.655615 0.342756 -vt 0.690279 0.350149 -vt 0.723235 0.360098 -vt 0.754018 0.372221 -vt 0.782244 0.386052 -vt 0.807629 0.401059 -vt 0.830000 0.416667 -vt 0.849296 0.432274 -vt 0.865577 0.447281 -vt 0.879017 0.461112 -vt 0.889902 0.473235 -vt 0.898612 0.483184 -vt 0.905614 0.490577 -vt 0.911441 0.495129 -vt 0.916667 0.496667 -vt 0.825476 0.487824 -vt 0.791667 0.491667 -vt 0.833333 0.493333 -vt 0.854131 0.490259 -vt 0.882786 0.492694 -vt 0.875000 0.495000 -vt 0.857787 0.476443 -vt 0.887156 0.457961 -vt 0.912255 0.433088 -vt 0.904804 0.446470 -vt 0.897353 0.459853 -vt 0.931919 0.402781 -vt 0.914285 0.422224 -vt 0.896651 0.441668 -vt 0.945192 0.368203 -vt 0.918654 0.394563 -vt 0.892115 0.420922 -vt 0.951365 0.330685 -vt 0.917342 0.364548 -vt 0.883319 0.398411 -vt 0.950000 0.291667 -vt 0.910000 0.333333 -vt 0.870000 0.375000 -vt 0.940949 0.252649 -vt 0.896509 0.302119 -vt 0.852069 0.351589 -vt 0.924359 0.215130 -vt 0.876987 0.272104 -vt 0.829616 0.329078 -vt 0.900669 0.180553 -vt 0.851785 0.244442 -vt 0.802901 0.308332 -vt 0.870588 0.150245 -vt 0.821470 0.220196 -vt 0.772353 0.290147 -vt 0.835072 0.125373 -vt 0.786808 0.200298 -vt 0.738543 0.275224 -vt 0.795287 0.106891 -vt 0.748729 0.185513 -vt 0.702172 0.264134 -vt 0.752560 0.095510 -vt 0.708298 0.176408 -vt 0.664036 0.257306 -vt 0.708333 0.091667 -vt 0.666667 0.173333 -vt 0.625000 0.255000 -vt 0.664107 0.095510 -vt 0.625035 0.176408 -vt 0.585964 0.257306 -vt 0.621380 0.106891 -vt 0.584604 0.185513 -vt 0.547828 0.264134 -vt 0.581594 0.125373 -vt 0.546525 0.200298 -vt 0.511457 0.275224 -vt 0.546079 0.150245 -vt 0.511863 0.220196 -vt 0.477647 0.290147 -vt 0.515998 0.180553 -vt 0.481548 0.244442 -vt 0.447099 0.308332 -vt 0.492307 0.215130 -vt 0.456346 0.272104 -vt 0.420384 0.329078 -vt 0.475718 0.252649 -vt 0.436824 0.302119 -vt 0.397931 0.351589 -vt 0.466667 0.291667 -vt 0.423333 0.333333 -vt 0.380000 0.375000 -vt 0.465301 0.330685 -vt 0.415991 0.364548 -vt 0.366681 0.398411 -vt 0.471474 0.368204 -vt 0.414679 0.394563 -vt 0.357885 0.420922 -vt 0.484748 0.402781 -vt 0.419048 0.422225 -vt 0.353349 0.441669 -vt 0.504412 0.433088 -vt 0.428530 0.446470 -vt 0.352647 0.459853 -vt 0.529511 0.457961 -vt 0.442359 0.466368 -vt 0.355207 0.474776 -vt 0.558880 0.476443 -vt 0.459604 0.481154 -vt 0.360328 0.485866 -vt 0.591191 0.487824 -vt 0.479202 0.490259 -vt 0.367214 0.492694 -vt 0.625000 0.491667 -vt 0.500000 0.493333 -vt 0.375000 0.495000 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.937500 0.500000 -vt 0.937500 1.000000 -vt 0.906250 0.500000 -vt 0.906250 1.000000 -vt 0.875000 0.500000 -vt 0.875000 1.000000 -vt 0.843750 0.500000 -vt 0.843750 1.000000 -vt 0.812500 0.500000 -vt 0.812500 1.000000 -vt 0.781250 0.500000 -vt 0.781250 1.000000 -vt 0.750000 0.500000 -vt 0.750000 1.000000 -vt 0.718750 0.500000 -vt 0.718750 1.000000 -vt 0.687500 0.500000 -vt 0.687500 1.000000 -vt 0.656250 0.500000 -vt 0.656250 1.000000 -vt 0.625000 0.500000 -vt 0.625000 1.000000 -vt 0.593750 0.500000 -vt 0.593750 1.000000 -vt 0.562500 0.500000 -vt 0.562500 1.000000 -vt 0.531250 0.500000 -vt 0.531250 1.000000 -vt 0.500000 0.500000 -vt 0.500000 1.000000 -vt 0.468750 0.500000 -vt 0.468750 1.000000 -vt 0.437500 0.500000 -vt 0.437500 1.000000 -vt 0.406250 0.500000 -vt 0.406250 1.000000 -vt 0.375000 0.500000 -vt 0.375000 1.000000 -vt 0.343750 0.500000 -vt 0.343750 1.000000 -vt 0.312500 0.500000 -vt 0.312500 1.000000 -vt 0.281250 0.500000 -vt 0.281250 1.000000 -vt 0.250000 0.500000 -vt 0.250000 1.000000 -vt 0.218750 0.500000 -vt 0.218750 1.000000 -vt 0.187500 0.500000 -vt 0.187500 1.000000 -vt 0.156250 0.500000 -vt 0.156250 1.000000 -vt 0.125000 0.500000 -vt 0.125000 1.000000 -vt 0.093750 0.500000 -vt 0.093750 1.000000 -vt 0.062500 0.500000 -vt 0.062500 1.000000 -vt 0.687500 1.000000 -vt 0.718750 1.000000 -vt 0.031250 0.500000 -vt 0.031250 1.000000 -vt 0.000000 0.500000 -vt 0.000000 1.000000 -vt 0.843750 0.500000 -vt 0.812500 0.500000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.593750 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.125000 1.000000 -vt 0.156250 1.000000 -vt 0.812500 1.000000 -vt 0.843750 1.000000 -vt 0.531250 1.000000 -vt 0.250000 1.000000 -vt 0.281250 1.000000 -vt 0.937500 1.000000 -vt 0.968750 1.000000 -vt 0.656250 1.000000 -vt 0.375000 1.000000 -vt 0.093750 1.000000 -vt 0.781250 1.000000 -vt 0.500000 1.000000 -vt 0.218750 1.000000 -vt 0.906250 1.000000 -vt 0.625000 1.000000 -vt 0.343750 1.000000 -vt 0.062500 1.000000 -vt 0.750000 1.000000 -vt 0.468750 1.000000 -vt 0.187500 1.000000 -vt 0.875000 1.000000 -vt 0.312500 1.000000 -vt 0.031250 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.890975 0.466368 -vt 0.894793 0.474776 -vt 0.889672 0.485865 -vt 0.873729 0.481154 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.531250 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.500000 1.000000 -vt 0.906250 1.000000 -vt 0.062500 1.000000 -vt 0.468750 1.000000 -vt 0.875000 1.000000 -vt 0.031250 1.000000 -vt 0.437500 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.406250 1.000000 -vt 0.812500 1.000000 -vt 0.375000 1.000000 -vt 0.781250 1.000000 -vt 0.343750 1.000000 -vt 0.750000 1.000000 -vt 0.312500 1.000000 -vt 0.718750 1.000000 -vt 0.281250 1.000000 -vt 0.687500 1.000000 -vt 0.250000 1.000000 -vt 0.656250 1.000000 -vt 0.218750 1.000000 -vt 0.625000 1.000000 -vt 0.187500 1.000000 -vt 0.593750 1.000000 -vt 0.156250 1.000000 -vt 0.250000 0.496667 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.255226 0.495129 -vt 0.562500 0.500000 -vt 0.531250 0.500000 -vt 0.281250 0.500000 -vt 0.250000 0.500000 -vt 0.968750 0.500000 -vt 0.937500 0.500000 -vt 0.687500 0.500000 -vt 0.656250 0.500000 -vt 0.406250 0.500000 -vt 0.375000 0.500000 -vt 0.125000 0.500000 -vt 0.093750 0.500000 -vt 0.781250 0.500000 -vt 0.500000 0.500000 -vt 0.218750 0.500000 -vt 0.906250 0.500000 -vt 0.625000 0.500000 -vt 0.343750 0.500000 -vt 0.062500 0.500000 -vt 0.750000 0.500000 -vt 0.468750 0.500000 -vt 0.187500 0.500000 -vt 0.875000 0.500000 -vt 0.593750 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.437500 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 0.750000 0.490000 -vt 0.703179 0.485389 -vt 0.658156 0.471731 -vt 0.616663 0.449553 -vt 0.580295 0.419706 -vt 0.550447 0.383337 -vt 0.528269 0.341844 -vt 0.514612 0.296822 -vt 0.510000 0.250000 -vt 0.514611 0.203179 -vt 0.528269 0.158156 -vt 0.550447 0.116663 -vt 0.580294 0.080294 -vt 0.616663 0.050447 -vt 0.658156 0.028269 -vt 0.703178 0.014612 -vt 0.750000 0.010000 -vt 0.796822 0.014612 -vt 0.841844 0.028269 -vt 0.883337 0.050447 -vt 0.919706 0.080294 -vt 0.949553 0.116663 -vt 0.971731 0.158156 -vt 0.985388 0.203178 -vt 0.990000 0.250000 -vt 0.985388 0.296822 -vt 0.971731 0.341844 -vt 0.949553 0.383337 -vt 0.919706 0.419706 -vt 0.883337 0.449553 -vt 0.841844 0.471731 -vt 0.796822 0.485388 -vt 0.261052 0.490577 -vt 0.268054 0.483184 -vt 0.276765 0.473235 -vt 0.287649 0.461112 -vt 0.301090 0.447281 -vt 0.317371 0.432274 -vt 0.336667 0.416667 -vt 0.359037 0.401060 -vt 0.384423 0.386052 -vt 0.412649 0.372221 -vt 0.443431 0.360098 -vt 0.476388 0.350149 -vt 0.511052 0.342756 -vt 0.546893 0.338204 -vt 0.583333 0.336667 -vt 0.619774 0.338204 -vt 0.655615 0.342756 -vt 0.690279 0.350149 -vt 0.723235 0.360098 -vt 0.754018 0.372221 -vt 0.782244 0.386052 -vt 0.807629 0.401059 -vt 0.830000 0.416667 -vt 0.849296 0.432274 -vt 0.865577 0.447281 -vt 0.879017 0.461112 -vt 0.889902 0.473235 -vt 0.898612 0.483184 -vt 0.905614 0.490577 -vt 0.911441 0.495129 -vt 0.916667 0.496667 -vt 0.825476 0.487824 -vt 0.854131 0.490259 -vt 0.833333 0.493333 -vt 0.791667 0.491667 -vt 0.882786 0.492694 -vt 0.875000 0.495000 -vt 0.857787 0.476443 -vt 0.887156 0.457961 -vt 0.912255 0.433088 -vt 0.904804 0.446470 -vt 0.897353 0.459853 -vt 0.931919 0.402781 -vt 0.914285 0.422224 -vt 0.896651 0.441668 -vt 0.945192 0.368203 -vt 0.918654 0.394563 -vt 0.892115 0.420922 -vt 0.951365 0.330685 -vt 0.917342 0.364548 -vt 0.883319 0.398411 -vt 0.950000 0.291667 -vt 0.910000 0.333333 -vt 0.870000 0.375000 -vt 0.940949 0.252649 -vt 0.896509 0.302119 -vt 0.852069 0.351589 -vt 0.924359 0.215130 -vt 0.876987 0.272104 -vt 0.829616 0.329078 -vt 0.900669 0.180553 -vt 0.851785 0.244442 -vt 0.802901 0.308332 -vt 0.870588 0.150245 -vt 0.821470 0.220196 -vt 0.772353 0.290147 -vt 0.835072 0.125373 -vt 0.786808 0.200298 -vt 0.738543 0.275224 -vt 0.795287 0.106891 -vt 0.748729 0.185513 -vt 0.702172 0.264134 -vt 0.752560 0.095510 -vt 0.708298 0.176408 -vt 0.664036 0.257306 -vt 0.708333 0.091667 -vt 0.666667 0.173333 -vt 0.625000 0.255000 -vt 0.664107 0.095510 -vt 0.625035 0.176408 -vt 0.585964 0.257306 -vt 0.621380 0.106891 -vt 0.584604 0.185513 -vt 0.547828 0.264134 -vt 0.581594 0.125373 -vt 0.546525 0.200298 -vt 0.511457 0.275224 -vt 0.546079 0.150245 -vt 0.511863 0.220196 -vt 0.477647 0.290147 -vt 0.515998 0.180553 -vt 0.481548 0.244442 -vt 0.447099 0.308332 -vt 0.492307 0.215130 -vt 0.456346 0.272104 -vt 0.420384 0.329078 -vt 0.475718 0.252649 -vt 0.436824 0.302119 -vt 0.397931 0.351589 -vt 0.466667 0.291667 -vt 0.423333 0.333333 -vt 0.380000 0.375000 -vt 0.465301 0.330685 -vt 0.415991 0.364548 -vt 0.366681 0.398411 -vt 0.471474 0.368204 -vt 0.414679 0.394563 -vt 0.357885 0.420922 -vt 0.484748 0.402781 -vt 0.419048 0.422225 -vt 0.353349 0.441669 -vt 0.504412 0.433088 -vt 0.428530 0.446470 -vt 0.352647 0.459853 -vt 0.529511 0.457961 -vt 0.442359 0.466368 -vt 0.355207 0.474776 -vt 0.558880 0.476443 -vt 0.459604 0.481154 -vt 0.360328 0.485866 -vt 0.591191 0.487824 -vt 0.479202 0.490259 -vt 0.367214 0.492694 -vt 0.625000 0.491667 -vt 0.500000 0.493333 -vt 0.375000 0.495000 -vt 1.000000 0.500000 -vt 1.000000 1.000000 -vt 0.968750 1.000000 -vt 0.968750 0.500000 -vt 0.937500 1.000000 -vt 0.937500 0.500000 -vt 0.906250 1.000000 -vt 0.906250 0.500000 -vt 0.875000 1.000000 -vt 0.875000 0.500000 -vt 0.843750 1.000000 -vt 0.843750 0.500000 -vt 0.812500 1.000000 -vt 0.812500 0.500000 -vt 0.781250 1.000000 -vt 0.781250 0.500000 -vt 0.750000 1.000000 -vt 0.750000 0.500000 -vt 0.718750 1.000000 -vt 0.718750 0.500000 -vt 0.687500 1.000000 -vt 0.687500 0.500000 -vt 0.656250 1.000000 -vt 0.656250 0.500000 -vt 0.625000 1.000000 -vt 0.625000 0.500000 -vt 0.593750 1.000000 -vt 0.593750 0.500000 -vt 0.562500 1.000000 -vt 0.562500 0.500000 -vt 0.531250 1.000000 -vt 0.531250 0.500000 -vt 0.500000 1.000000 -vt 0.500000 0.500000 -vt 0.468750 1.000000 -vt 0.468750 0.500000 -vt 0.437500 1.000000 -vt 0.437500 0.500000 -vt 0.406250 1.000000 -vt 0.406250 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt 0.343750 1.000000 -vt 0.343750 0.500000 -vt 0.312500 1.000000 -vt 0.312500 0.500000 -vt 0.281250 1.000000 -vt 0.281250 0.500000 -vt 0.250000 1.000000 -vt 0.250000 0.500000 -vt 0.218750 1.000000 -vt 0.218750 0.500000 -vt 0.187500 1.000000 -vt 0.187500 0.500000 -vt 0.156250 1.000000 -vt 0.156250 0.500000 -vt 0.125000 1.000000 -vt 0.125000 0.500000 -vt 0.093750 1.000000 -vt 0.093750 0.500000 -vt 0.062500 1.000000 -vt 0.062500 0.500000 -vt 0.718750 1.000000 -vt 0.687500 1.000000 -vt 0.031250 1.000000 -vt 0.031250 0.500000 -vt 0.000000 1.000000 -vt 0.000000 0.500000 -vt 0.812500 0.500000 -vt 0.843750 0.500000 -vt 0.562500 1.000000 -vt 0.593750 1.000000 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.406250 1.000000 -vt 0.156250 1.000000 -vt 0.125000 1.000000 -vt 0.843750 1.000000 -vt 0.812500 1.000000 -vt 0.531250 1.000000 -vt 0.281250 1.000000 -vt 0.250000 1.000000 -vt 0.968750 1.000000 -vt 0.937500 1.000000 -vt 0.656250 1.000000 -vt 0.375000 1.000000 -vt 0.093750 1.000000 -vt 0.781250 1.000000 -vt 0.500000 1.000000 -vt 0.218750 1.000000 -vt 0.906250 1.000000 -vt 0.625000 1.000000 -vt 0.343750 1.000000 -vt 0.062500 1.000000 -vt 0.750000 1.000000 -vt 0.468750 1.000000 -vt 0.187500 1.000000 -vt 0.875000 1.000000 -vt 0.312500 1.000000 -vt 0.031250 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.890975 0.466368 -vt 0.873729 0.481154 -vt 0.889672 0.485865 -vt 0.894793 0.474776 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.531250 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.500000 1.000000 -vt 0.906250 1.000000 -vt 0.062500 1.000000 -vt 0.468750 1.000000 -vt 0.875000 1.000000 -vt 0.031250 1.000000 -vt 0.437500 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.406250 1.000000 -vt 0.812500 1.000000 -vt 0.375000 1.000000 -vt 0.781250 1.000000 -vt 0.343750 1.000000 -vt 0.750000 1.000000 -vt 0.312500 1.000000 -vt 0.718750 1.000000 -vt 0.281250 1.000000 -vt 0.687500 1.000000 -vt 0.250000 1.000000 -vt 0.656250 1.000000 -vt 0.218750 1.000000 -vt 0.625000 1.000000 -vt 0.187500 1.000000 -vt 0.593750 1.000000 -vt 0.156250 1.000000 -vt 0.250000 0.496667 -vt 0.255226 0.495129 -vt 0.031250 0.500000 -vt 0.000000 0.500000 -vt 0.531250 0.500000 -vt 0.562500 0.500000 -vt 0.250000 0.500000 -vt 0.281250 0.500000 -vt 0.937500 0.500000 -vt 0.968750 0.500000 -vt 0.656250 0.500000 -vt 0.687500 0.500000 -vt 0.375000 0.500000 -vt 0.406250 0.500000 -vt 0.093750 0.500000 -vt 0.125000 0.500000 -vt 0.781250 0.500000 -vt 0.500000 0.500000 -vt 0.218750 0.500000 -vt 0.906250 0.500000 -vt 0.625000 0.500000 -vt 0.343750 0.500000 -vt 0.062500 0.500000 -vt 0.750000 0.500000 -vt 0.468750 0.500000 -vt 0.187500 0.500000 -vt 0.875000 0.500000 -vt 0.593750 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.437500 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 0.919706 0.080294 -vt 0.883337 0.050447 -vt 0.883337 0.050447 -vt 0.919706 0.080294 -vt 0.261052 0.490577 -vt 0.268054 0.483184 -vt 0.276765 0.473235 -vt 0.287649 0.461112 -vt 0.301090 0.447281 -vt 0.317371 0.432274 -vt 0.336667 0.416667 -vt 0.359037 0.401060 -vt 0.384423 0.386052 -vt 0.412649 0.372221 -vt 0.443431 0.360098 -vt 0.476388 0.350149 -vt 0.511052 0.342756 -vt 0.546893 0.338204 -vt 0.583333 0.336667 -vt 0.619774 0.338204 -vt 0.655615 0.342756 -vt 0.690279 0.350149 -vt 0.723235 0.360098 -vt 0.754018 0.372221 -vt 0.782244 0.386052 -vt 0.807629 0.401059 -vt 0.830000 0.416667 -vt 0.849296 0.432274 -vt 0.865577 0.447281 -vt 0.879017 0.461112 -vt 0.889902 0.473235 -vt 0.898612 0.483184 -vt 0.905614 0.490577 -vt 0.911441 0.495129 -vt 0.916667 0.496667 -vt 0.825476 0.487824 -vt 0.791667 0.491667 -vt 0.833333 0.493333 -vt 0.854131 0.490259 -vt 0.882786 0.492694 -vt 0.875000 0.495000 -vt 0.857787 0.476443 -vt 0.887156 0.457961 -vt 0.912255 0.433088 -vt 0.904804 0.446470 -vt 0.897353 0.459853 -vt 0.931919 0.402781 -vt 0.914285 0.422224 -vt 0.896651 0.441668 -vt 0.945192 0.368203 -vt 0.918654 0.394563 -vt 0.892115 0.420922 -vt 0.951365 0.330685 -vt 0.917342 0.364548 -vt 0.883319 0.398411 -vt 0.950000 0.291667 -vt 0.910000 0.333333 -vt 0.870000 0.375000 -vt 0.940949 0.252649 -vt 0.896509 0.302119 -vt 0.852069 0.351589 -vt 0.924359 0.215130 -vt 0.876987 0.272104 -vt 0.829616 0.329078 -vt 0.900669 0.180553 -vt 0.851785 0.244442 -vt 0.802901 0.308332 -vt 0.870588 0.150245 -vt 0.821470 0.220196 -vt 0.772353 0.290147 -vt 0.835072 0.125373 -vt 0.786808 0.200298 -vt 0.738543 0.275224 -vt 0.795287 0.106891 -vt 0.748729 0.185513 -vt 0.702172 0.264134 -vt 0.752560 0.095510 -vt 0.708298 0.176408 -vt 0.664036 0.257306 -vt 0.708333 0.091667 -vt 0.666667 0.173333 -vt 0.625000 0.255000 -vt 0.664107 0.095510 -vt 0.625035 0.176408 -vt 0.585964 0.257306 -vt 0.621380 0.106891 -vt 0.584604 0.185513 -vt 0.547828 0.264134 -vt 0.581594 0.125373 -vt 0.546525 0.200298 -vt 0.511457 0.275224 -vt 0.546079 0.150245 -vt 0.511863 0.220196 -vt 0.477647 0.290147 -vt 0.515998 0.180553 -vt 0.481548 0.244442 -vt 0.447099 0.308332 -vt 0.492307 0.215130 -vt 0.456346 0.272104 -vt 0.420384 0.329078 -vt 0.475718 0.252649 -vt 0.436824 0.302119 -vt 0.397931 0.351589 -vt 0.466667 0.291667 -vt 0.423333 0.333333 -vt 0.380000 0.375000 -vt 0.465301 0.330685 -vt 0.415991 0.364548 -vt 0.366681 0.398411 -vt 0.471474 0.368204 -vt 0.414679 0.394563 -vt 0.357885 0.420922 -vt 0.484748 0.402781 -vt 0.419048 0.422225 -vt 0.353349 0.441669 -vt 0.504412 0.433088 -vt 0.428530 0.446470 -vt 0.352647 0.459853 -vt 0.529511 0.457961 -vt 0.442359 0.466368 -vt 0.355207 0.474776 -vt 0.558880 0.476443 -vt 0.459604 0.481154 -vt 0.360328 0.485866 -vt 0.591191 0.487824 -vt 0.479202 0.490259 -vt 0.367214 0.492694 -vt 0.625000 0.491667 -vt 0.500000 0.493333 -vt 0.375000 0.495000 -vt 0.750000 0.490000 -vt 0.703179 0.485389 -vt 0.658156 0.471731 -vt 0.616663 0.449553 -vt 0.580295 0.419706 -vt 0.550447 0.383337 -vt 0.528269 0.341844 -vt 0.514612 0.296822 -vt 0.510000 0.250000 -vt 0.514611 0.203179 -vt 0.528269 0.158156 -vt 0.550447 0.116663 -vt 0.580294 0.080294 -vt 0.616663 0.050447 -vt 0.658156 0.028269 -vt 0.703178 0.014612 -vt 0.750000 0.010000 -vt 0.796822 0.014612 -vt 0.841844 0.028269 -vt 0.949553 0.116663 -vt 0.971731 0.158156 -vt 0.985388 0.203178 -vt 0.990000 0.250000 -vt 0.985388 0.296822 -vt 0.971731 0.341844 -vt 0.949553 0.383337 -vt 0.919706 0.419706 -vt 0.883337 0.449553 -vt 0.841844 0.471731 -vt 0.796822 0.485388 -vt 0.750000 0.490000 -vt 0.796822 0.485388 -vt 0.841844 0.471731 -vt 0.883337 0.449553 -vt 0.919706 0.419706 -vt 0.949553 0.383337 -vt 0.971731 0.341844 -vt 0.985388 0.296822 -vt 0.990000 0.250000 -vt 0.985388 0.203178 -vt 0.971731 0.158156 -vt 0.949553 0.116663 -vt 0.841844 0.028269 -vt 0.796822 0.014612 -vt 0.750000 0.010000 -vt 0.703178 0.014612 -vt 0.658156 0.028269 -vt 0.616663 0.050447 -vt 0.580294 0.080294 -vt 0.550447 0.116663 -vt 0.528269 0.158156 -vt 0.514611 0.203179 -vt 0.510000 0.250000 -vt 0.514612 0.296822 -vt 0.528269 0.341844 -vt 0.550447 0.383337 -vt 0.580295 0.419706 -vt 0.616663 0.449553 -vt 0.658156 0.471731 -vt 0.703179 0.485389 -vt 1.000000 0.500000 -vt 0.968750 0.500000 -vt 0.968750 1.000000 -vt 1.000000 1.000000 -vt 0.937500 0.500000 -vt 0.937500 1.000000 -vt 0.906250 0.500000 -vt 0.906250 1.000000 -vt 0.875000 0.500000 -vt 0.875000 1.000000 -vt 0.843750 0.500000 -vt 0.843750 1.000000 -vt 0.812500 0.500000 -vt 0.812500 1.000000 -vt 0.781250 0.500000 -vt 0.781250 1.000000 -vt 0.750000 0.500000 -vt 0.750000 1.000000 -vt 0.718750 0.500000 -vt 0.718750 1.000000 -vt 0.687500 0.500000 -vt 0.687500 1.000000 -vt 0.656250 0.500000 -vt 0.656250 1.000000 -vt 0.625000 0.500000 -vt 0.625000 1.000000 -vt 0.593750 0.500000 -vt 0.593750 1.000000 -vt 0.562500 0.500000 -vt 0.562500 1.000000 -vt 0.531250 0.500000 -vt 0.531250 1.000000 -vt 0.500000 0.500000 -vt 0.500000 1.000000 -vt 0.468750 0.500000 -vt 0.468750 1.000000 -vt 0.437500 0.500000 -vt 0.437500 1.000000 -vt 0.406250 0.500000 -vt 0.406250 1.000000 -vt 0.375000 0.500000 -vt 0.375000 1.000000 -vt 0.343750 0.500000 -vt 0.343750 1.000000 -vt 0.312500 0.500000 -vt 0.312500 1.000000 -vt 0.281250 0.500000 -vt 0.281250 1.000000 -vt 0.250000 0.500000 -vt 0.250000 1.000000 -vt 0.218750 0.500000 -vt 0.218750 1.000000 -vt 0.187500 0.500000 -vt 0.187500 1.000000 -vt 0.156250 0.500000 -vt 0.156250 1.000000 -vt 0.125000 0.500000 -vt 0.125000 1.000000 -vt 0.093750 0.500000 -vt 0.093750 1.000000 -vt 0.062500 0.500000 -vt 0.062500 1.000000 -vt 0.687500 1.000000 -vt 0.718750 1.000000 -vt 0.031250 0.500000 -vt 0.031250 1.000000 -vt 0.000000 0.500000 -vt 0.000000 1.000000 -vt 0.843750 0.500000 -vt 0.812500 0.500000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.593750 1.000000 -vt 0.406250 1.000000 -vt 0.437500 1.000000 -vt 0.125000 1.000000 -vt 0.156250 1.000000 -vt 0.812500 1.000000 -vt 0.843750 1.000000 -vt 0.531250 1.000000 -vt 0.250000 1.000000 -vt 0.281250 1.000000 -vt 0.937500 1.000000 -vt 0.968750 1.000000 -vt 0.656250 1.000000 -vt 0.375000 1.000000 -vt 0.093750 1.000000 -vt 0.781250 1.000000 -vt 0.500000 1.000000 -vt 0.218750 1.000000 -vt 0.906250 1.000000 -vt 0.625000 1.000000 -vt 0.343750 1.000000 -vt 0.062500 1.000000 -vt 0.750000 1.000000 -vt 0.468750 1.000000 -vt 0.187500 1.000000 -vt 0.875000 1.000000 -vt 0.312500 1.000000 -vt 0.031250 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.890975 0.466368 -vt 0.894793 0.474776 -vt 0.889672 0.485865 -vt 0.873729 0.481154 -vt 0.968750 1.000000 -vt 0.125000 1.000000 -vt 0.531250 1.000000 -vt 0.937500 1.000000 -vt 0.093750 1.000000 -vt 0.500000 1.000000 -vt 0.906250 1.000000 -vt 0.062500 1.000000 -vt 0.468750 1.000000 -vt 0.875000 1.000000 -vt 0.031250 1.000000 -vt 0.437500 1.000000 -vt 0.843750 1.000000 -vt 0.000000 1.000000 -vt 0.406250 1.000000 -vt 0.812500 1.000000 -vt 0.375000 1.000000 -vt 0.781250 1.000000 -vt 0.343750 1.000000 -vt 0.750000 1.000000 -vt 0.312500 1.000000 -vt 0.718750 1.000000 -vt 0.281250 1.000000 -vt 0.687500 1.000000 -vt 0.250000 1.000000 -vt 0.656250 1.000000 -vt 0.218750 1.000000 -vt 0.625000 1.000000 -vt 0.187500 1.000000 -vt 0.593750 1.000000 -vt 0.156250 1.000000 -vt 0.250000 0.496667 -vt 0.000000 0.500000 -vt 0.031250 0.500000 -vt 0.255226 0.495129 -vt 0.562500 0.500000 -vt 0.531250 0.500000 -vt 0.281250 0.500000 -vt 0.250000 0.500000 -vt 0.968750 0.500000 -vt 0.937500 0.500000 -vt 0.687500 0.500000 -vt 0.656250 0.500000 -vt 0.406250 0.500000 -vt 0.375000 0.500000 -vt 0.125000 0.500000 -vt 0.093750 0.500000 -vt 0.781250 0.500000 -vt 0.500000 0.500000 -vt 0.218750 0.500000 -vt 0.906250 0.500000 -vt 0.625000 0.500000 -vt 0.343750 0.500000 -vt 0.062500 0.500000 -vt 0.750000 0.500000 -vt 0.468750 0.500000 -vt 0.187500 0.500000 -vt 0.875000 0.500000 -vt 0.593750 0.500000 -vt 0.312500 0.500000 -vt 0.718750 0.500000 -vt 0.437500 0.500000 -vt 0.156250 0.500000 -vt 1.000000 0.500000 -vt 0.919706 0.080294 -vt 0.919706 0.080294 -vt 0.883337 0.050447 -vt 0.883337 0.050447 -vt 0.261052 0.490577 -vt 0.268054 0.483184 -vt 0.276765 0.473235 -vt 0.287649 0.461112 -vt 0.301090 0.447281 -vt 0.317371 0.432274 -vt 0.336667 0.416667 -vt 0.359037 0.401060 -vt 0.384423 0.386052 -vt 0.412649 0.372221 -vt 0.443431 0.360098 -vt 0.476388 0.350149 -vt 0.511052 0.342756 -vt 0.546893 0.338204 -vt 0.583333 0.336667 -vt 0.619774 0.338204 -vt 0.655615 0.342756 -vt 0.690279 0.350149 -vt 0.723235 0.360098 -vt 0.754018 0.372221 -vt 0.782244 0.386052 -vt 0.807629 0.401059 -vt 0.830000 0.416667 -vt 0.849296 0.432274 -vt 0.865577 0.447281 -vt 0.879017 0.461112 -vt 0.889902 0.473235 -vt 0.898612 0.483184 -vt 0.905614 0.490577 -vt 0.911441 0.495129 -vt 0.916667 0.496667 -vt 0.825476 0.487824 -vt 0.854131 0.490259 -vt 0.833333 0.493333 -vt 0.791667 0.491667 -vt 0.882786 0.492694 -vt 0.875000 0.495000 -vt 0.857787 0.476443 -vt 0.887156 0.457961 -vt 0.912255 0.433088 -vt 0.904804 0.446470 -vt 0.897353 0.459853 -vt 0.931919 0.402781 -vt 0.914285 0.422224 -vt 0.896651 0.441668 -vt 0.945192 0.368203 -vt 0.918654 0.394563 -vt 0.892115 0.420922 -vt 0.951365 0.330685 -vt 0.917342 0.364548 -vt 0.883319 0.398411 -vt 0.950000 0.291667 -vt 0.910000 0.333333 -vt 0.870000 0.375000 -vt 0.940949 0.252649 -vt 0.896509 0.302119 -vt 0.852069 0.351589 -vt 0.924359 0.215130 -vt 0.876987 0.272104 -vt 0.829616 0.329078 -vt 0.900669 0.180553 -vt 0.851785 0.244442 -vt 0.802901 0.308332 -vt 0.870588 0.150245 -vt 0.821470 0.220196 -vt 0.772353 0.290147 -vt 0.835072 0.125373 -vt 0.786808 0.200298 -vt 0.738543 0.275224 -vt 0.795287 0.106891 -vt 0.748729 0.185513 -vt 0.702172 0.264134 -vt 0.752560 0.095510 -vt 0.708298 0.176408 -vt 0.664036 0.257306 -vt 0.708333 0.091667 -vt 0.666667 0.173333 -vt 0.625000 0.255000 -vt 0.664107 0.095510 -vt 0.625035 0.176408 -vt 0.585964 0.257306 -vt 0.621380 0.106891 -vt 0.584604 0.185513 -vt 0.547828 0.264134 -vt 0.581594 0.125373 -vt 0.546525 0.200298 -vt 0.511457 0.275224 -vt 0.546079 0.150245 -vt 0.511863 0.220196 -vt 0.477647 0.290147 -vt 0.515998 0.180553 -vt 0.481548 0.244442 -vt 0.447099 0.308332 -vt 0.492307 0.215130 -vt 0.456346 0.272104 -vt 0.420384 0.329078 -vt 0.475718 0.252649 -vt 0.436824 0.302119 -vt 0.397931 0.351589 -vt 0.466667 0.291667 -vt 0.423333 0.333333 -vt 0.380000 0.375000 -vt 0.465301 0.330685 -vt 0.415991 0.364548 -vt 0.366681 0.398411 -vt 0.471474 0.368204 -vt 0.414679 0.394563 -vt 0.357885 0.420922 -vt 0.484748 0.402781 -vt 0.419048 0.422225 -vt 0.353349 0.441669 -vt 0.504412 0.433088 -vt 0.428530 0.446470 -vt 0.352647 0.459853 -vt 0.529511 0.457961 -vt 0.442359 0.466368 -vt 0.355207 0.474776 -vt 0.558880 0.476443 -vt 0.459604 0.481154 -vt 0.360328 0.485866 -vt 0.591191 0.487824 -vt 0.479202 0.490259 -vt 0.367214 0.492694 -vt 0.625000 0.491667 -vt 0.500000 0.493333 -vt 0.375000 0.495000 -vt 0.750000 0.490000 -vt 0.703179 0.485389 -vt 0.658156 0.471731 -vt 0.616663 0.449553 -vt 0.580295 0.419706 -vt 0.550447 0.383337 -vt 0.528269 0.341844 -vt 0.514612 0.296822 -vt 0.510000 0.250000 -vt 0.514611 0.203179 -vt 0.528269 0.158156 -vt 0.550447 0.116663 -vt 0.580294 0.080294 -vt 0.616663 0.050447 -vt 0.658156 0.028269 -vt 0.703178 0.014612 -vt 0.750000 0.010000 -vt 0.796822 0.014612 -vt 0.841844 0.028269 -vt 0.949553 0.116663 -vt 0.971731 0.158156 -vt 0.985388 0.203178 -vt 0.990000 0.250000 -vt 0.985388 0.296822 -vt 0.971731 0.341844 -vt 0.949553 0.383337 -vt 0.919706 0.419706 -vt 0.883337 0.449553 -vt 0.841844 0.471731 -vt 0.796822 0.485388 -vt 0.750000 0.490000 -vt 0.703179 0.485389 -vt 0.658156 0.471731 -vt 0.616663 0.449553 -vt 0.580295 0.419706 -vt 0.550447 0.383337 -vt 0.528269 0.341844 -vt 0.514612 0.296822 -vt 0.510000 0.250000 -vt 0.514611 0.203179 -vt 0.528269 0.158156 -vt 0.550447 0.116663 -vt 0.580294 0.080294 -vt 0.616663 0.050447 -vt 0.658156 0.028269 -vt 0.703178 0.014612 -vt 0.750000 0.010000 -vt 0.796822 0.014612 -vt 0.841844 0.028269 -vt 0.949553 0.116663 -vt 0.971731 0.158156 -vt 0.985388 0.203178 -vt 0.990000 0.250000 -vt 0.985388 0.296822 -vt 0.971731 0.341844 -vt 0.949553 0.383337 -vt 0.919706 0.419706 -vt 0.883337 0.449553 -vt 0.841844 0.471731 -vt 0.796822 0.485388 -vn 0.0000 -0.9952 0.0980 -vn 0.0000 -0.4714 -0.8819 -vn -0.4652 -0.8810 0.0868 -vn -0.1306 -0.6290 -0.7664 -vn 0.0000 -0.6344 -0.7730 -vn 0.0000 -0.9569 0.2903 -vn 0.0000 -0.7730 -0.6344 -vn 0.0000 -0.8819 0.4714 -vn 0.0000 0.0980 0.9952 -vn 0.0000 -0.8819 -0.4714 -vn 0.0000 -0.7730 0.6344 -vn 0.0000 0.2903 0.9569 -vn 0.0000 -0.9569 -0.2903 -vn 0.0000 -0.6344 0.7730 -vn 0.0000 0.4714 0.8819 -vn 0.0000 -0.9952 -0.0980 -vn 0.0000 -0.4714 0.8819 -vn -0.0000 0.6344 0.7730 -vn 0.0000 -0.2903 0.9569 -vn -0.0000 0.7730 0.6344 -vn 0.0000 -0.0980 0.9952 -vn -0.0000 0.8819 0.4714 -vn -0.0000 0.9569 0.2903 -vn -0.0000 0.9952 0.0980 -vn -0.0000 0.9952 -0.0980 -vn -0.0000 0.9569 -0.2903 -vn -0.0000 0.8819 -0.4714 -vn -0.0000 0.7730 -0.6344 -vn -0.0000 0.6344 -0.7730 -vn -0.0000 0.4714 -0.8819 -vn -0.0000 0.2903 -0.9569 -vn -0.0000 0.0980 -0.9952 -vn -0.0000 -0.0980 -0.9952 -vn -0.0000 -0.2903 -0.9569 -vn 0.1948 -0.2847 0.9386 -vn -0.1306 0.9487 0.2878 -vn -0.1306 -0.7664 -0.6290 -vn -0.1306 0.9867 0.0972 -vn -0.1306 -0.8744 -0.4674 -vn -0.1306 0.9867 -0.0972 -vn -0.1306 -0.9487 -0.2878 -vn -0.1306 0.9487 -0.2878 -vn -0.1306 -0.9867 -0.0972 -vn -0.1306 0.8744 -0.4674 -vn -0.1306 -0.9867 0.0972 -vn -0.1306 0.7664 -0.6290 -vn -0.1306 -0.9487 0.2878 -vn -0.1306 0.6290 -0.7664 -vn -0.1306 -0.8744 0.4674 -vn -0.1306 0.4674 -0.8744 -vn -0.1306 0.0972 0.9867 -vn -0.1306 -0.7664 0.6290 -vn -0.1306 0.2878 -0.9487 -vn -0.1306 0.2878 0.9487 -vn -0.1306 -0.6290 0.7664 -vn -0.1306 0.0972 -0.9867 -vn -0.1306 0.4674 0.8744 -vn -0.1306 -0.4674 0.8744 -vn -0.1306 -0.0972 -0.9867 -vn -0.1306 0.6290 0.7664 -vn -0.1306 -0.2878 0.9487 -vn -0.1306 -0.2878 -0.9487 -vn -0.1306 0.7664 0.6290 -vn -0.1306 -0.0972 0.9867 -vn -0.1306 -0.4674 -0.8744 -vn -0.1306 0.8744 0.4674 -vn 0.8252 -0.4366 -0.3583 -vn 0.1948 -0.2847 -0.9386 -vn 0.1948 0.7582 0.6222 -vn 0.1948 -0.0961 0.9761 -vn 0.1948 -0.4624 -0.8650 -vn 0.1948 0.8650 0.4624 -vn 0.1948 -0.6222 -0.7582 -vn 0.1948 0.9386 0.2847 -vn 0.1948 -0.7582 -0.6222 -vn 0.1948 0.9761 0.0961 -vn 0.1948 -0.8650 -0.4624 -vn 0.1948 0.9761 -0.0961 -vn 0.1948 -0.9386 -0.2847 -vn 0.1948 0.9386 -0.2847 -vn 0.1948 -0.9761 -0.0961 -vn 0.1948 0.8650 -0.4624 -vn 0.1948 -0.9761 0.0961 -vn 0.1948 0.7582 -0.6222 -vn 0.1948 -0.9386 0.2847 -vn 0.1948 0.6222 -0.7582 -vn 0.1948 -0.8650 0.4624 -vn 0.1948 0.4624 -0.8650 -vn 0.1948 0.0961 0.9761 -vn 0.1948 -0.7582 0.6222 -vn 0.1948 0.2847 -0.9386 -vn 0.1948 0.2847 0.9386 -vn 0.1948 -0.6222 0.7582 -vn 0.1948 0.0961 -0.9761 -vn 0.1948 0.4624 0.8650 -vn 0.1948 -0.4624 0.8650 -vn 0.1948 -0.0961 -0.9761 -vn 0.1948 0.6222 0.7582 -vn 0.8252 0.5621 0.0554 -vn 0.8252 -0.4981 -0.2662 -vn 0.8252 0.5621 -0.0554 -vn 0.8253 -0.5404 -0.1640 -vn 0.8252 0.5405 -0.1639 -vn 0.8252 -0.5621 -0.0554 -vn 0.8252 0.4981 -0.2662 -vn 0.8252 -0.5621 0.0554 -vn 0.8253 0.4365 -0.3583 -vn 0.8252 -0.5405 0.1639 -vn 0.8252 0.3583 -0.4366 -vn 0.8252 -0.4981 0.2662 -vn 0.8252 0.2663 -0.4981 -vn 0.8252 0.0554 0.5621 -vn 0.8252 -0.4366 0.3583 -vn 0.8252 0.1639 -0.5405 -vn 0.8252 0.1640 0.5405 -vn 0.8252 -0.3583 0.4366 -vn 0.8252 0.0554 -0.5621 -vn 0.8252 0.2662 0.4981 -vn 0.8252 -0.2663 0.4981 -vn 0.8252 -0.0554 -0.5621 -vn 0.8252 0.3583 0.4366 -vn 0.8252 -0.1640 0.5405 -vn 0.8252 -0.1640 -0.5405 -vn 0.8252 0.4366 0.3583 -vn 0.8252 -0.0553 0.5621 -vn 0.8252 -0.2663 -0.4981 -vn 0.8252 0.4981 0.2662 -vn 0.8252 -0.3583 -0.4366 -vn 0.8252 0.5405 0.1639 -vn 0.3943 -0.2668 -0.8794 -vn 0.3943 -0.0901 -0.9145 -vn 0.3943 0.0901 -0.9145 -vn 0.3943 0.2668 -0.8794 -vn 0.3943 0.4332 -0.8105 -vn 0.3943 0.5830 -0.7104 -vn 0.3943 0.7104 -0.5830 -vn 0.3943 0.8105 -0.4332 -vn 0.3943 0.8794 -0.2668 -vn 0.3943 0.9145 -0.0901 -vn 0.3943 0.9145 0.0901 -vn 0.3943 0.8794 0.2668 -vn 0.3943 0.8105 0.4332 -vn 0.3943 -0.0901 0.9145 -vn 0.3943 0.7104 0.5830 -vn 0.3943 -0.2668 0.8794 -vn 0.3943 0.5830 0.7104 -vn 0.3943 -0.4332 0.8105 -vn 0.3943 0.4332 0.8105 -vn 0.3943 -0.5830 0.7104 -vn 0.3943 0.2668 0.8794 -vn 0.3943 -0.7104 0.5830 -vn 0.3943 0.0901 0.9145 -vn 0.3943 -0.8105 0.4332 -vn 0.3943 -0.8794 0.2668 -vn 0.3943 -0.9145 0.0901 -vn 0.3943 -0.9145 -0.0901 -vn 0.3943 -0.8794 -0.2668 -vn 0.3943 -0.8105 -0.4332 -vn 0.3943 -0.7104 -0.5830 -vn 0.3943 -0.5830 -0.7104 -vn 0.3943 -0.4332 -0.8105 -vn -0.3943 -0.4332 -0.8105 -vn 0.4847 -0.4123 -0.7714 -vn 0.5859 -0.3820 -0.7147 -vn -0.4847 -0.4123 -0.7714 -vn -0.3943 -0.5830 -0.7104 -vn 0.4847 -0.5549 -0.6761 -vn 0.5859 -0.5141 -0.6264 -vn -0.4847 -0.5549 -0.6761 -vn -0.3943 -0.7104 -0.5830 -vn 0.4847 -0.6761 -0.5549 -vn 0.5859 -0.6264 -0.5141 -vn -0.4847 -0.6761 -0.5549 -vn -0.3943 -0.8105 -0.4332 -vn 0.4847 -0.7714 -0.4123 -vn 0.5859 -0.7147 -0.3820 -vn -0.4847 -0.7714 -0.4123 -vn -0.3943 -0.8794 -0.2668 -vn 0.4847 -0.8370 -0.2539 -vn 0.5859 -0.7755 -0.2352 -vn -0.4847 -0.8370 -0.2539 -vn -0.3943 -0.9145 -0.0901 -vn 0.4847 -0.8705 -0.0857 -vn 0.5859 -0.8065 -0.0794 -vn -0.4847 -0.8705 -0.0857 -vn -0.3943 -0.9145 0.0901 -vn 0.4847 -0.8705 0.0857 -vn 0.5859 -0.8064 0.0794 -vn 0.5859 -0.8065 0.0794 -vn -0.4847 -0.8705 0.0857 -vn -0.3943 -0.8794 0.2668 -vn 0.4847 -0.8370 0.2539 -vn 0.5859 -0.7755 0.2352 -vn -0.4847 -0.8370 0.2539 -vn -0.3943 -0.8105 0.4332 -vn 0.4847 -0.7714 0.4123 -vn 0.5859 -0.7147 0.3820 -vn -0.4847 -0.7714 0.4123 -vn -0.3943 0.0901 0.9145 -vn 0.4847 0.0857 0.8705 -vn 0.5859 0.0794 0.8065 -vn 0.5859 0.0795 0.8065 -vn -0.4847 0.0857 0.8705 -vn -0.3943 -0.7104 0.5830 -vn 0.4847 -0.6761 0.5549 -vn 0.5859 -0.6264 0.5141 -vn -0.4847 -0.6761 0.5549 -vn -0.3943 0.2668 0.8794 -vn 0.4847 0.2539 0.8370 -vn 0.5859 0.2352 0.7755 -vn -0.4847 0.2539 0.8370 -vn -0.3943 -0.5830 0.7104 -vn 0.4847 -0.5549 0.6761 -vn 0.5859 -0.5141 0.6264 -vn -0.4847 -0.5549 0.6761 -vn -0.3943 0.4332 0.8105 -vn 0.4847 0.4123 0.7714 -vn 0.5859 0.3820 0.7147 -vn -0.4847 0.4123 0.7714 -vn -0.3943 -0.4332 0.8105 -vn 0.4847 -0.4123 0.7714 -vn 0.5859 -0.3820 0.7147 -vn -0.4847 -0.4123 0.7714 -vn -0.3943 0.5830 0.7104 -vn 0.4847 0.5549 0.6761 -vn 0.5859 0.5141 0.6264 -vn -0.4847 0.5549 0.6761 -vn -0.3943 -0.2668 0.8794 -vn 0.4847 -0.2539 0.8370 -vn 0.5859 -0.2352 0.7755 -vn -0.4847 -0.2539 0.8370 -vn -0.3943 0.7104 0.5830 -vn 0.4847 0.6761 0.5549 -vn 0.5859 0.6264 0.5141 -vn -0.4847 0.6761 0.5549 -vn -0.3943 -0.0901 0.9145 -vn 0.4847 -0.0857 0.8705 -vn 0.5859 -0.0794 0.8065 -vn 0.5859 -0.0795 0.8065 -vn -0.4847 -0.0857 0.8705 -vn -0.3943 0.8105 0.4332 -vn 0.4847 0.7714 0.4123 -vn 0.5859 0.7147 0.3820 -vn -0.4847 0.7714 0.4123 -vn -0.3943 0.8794 0.2668 -vn 0.4847 0.8370 0.2539 -vn 0.5859 0.7755 0.2352 -vn -0.4847 0.8370 0.2539 -vn -0.3943 0.9145 0.0901 -vn 0.4847 0.8705 0.0857 -vn 0.5859 0.8065 0.0794 -vn -0.4847 0.8705 0.0857 -vn -0.3943 0.9145 -0.0901 -vn 0.4847 0.8705 -0.0857 -vn 0.5859 0.8065 -0.0794 -vn -0.4847 0.8705 -0.0857 -vn -0.3943 0.8794 -0.2668 -vn 0.4847 0.8370 -0.2539 -vn 0.5859 0.7755 -0.2352 -vn -0.4847 0.8370 -0.2539 -vn -0.3943 0.8105 -0.4332 -vn 0.4847 0.7714 -0.4123 -vn 0.5859 0.7147 -0.3820 -vn -0.4847 0.7714 -0.4123 -vn -0.3943 0.7104 -0.5830 -vn 0.4847 0.6761 -0.5549 -vn 0.5859 0.6264 -0.5141 -vn -0.4847 0.6761 -0.5549 -vn -0.3943 0.5830 -0.7104 -vn 0.4847 0.5549 -0.6761 -vn 0.5859 0.5141 -0.6264 -vn -0.4847 0.5549 -0.6761 -vn -0.3943 0.4332 -0.8105 -vn 0.4847 0.4123 -0.7714 -vn 0.5859 0.3820 -0.7147 -vn -0.4847 0.4123 -0.7714 -vn -0.3943 0.2668 -0.8794 -vn 0.4847 0.2539 -0.8370 -vn 0.5859 0.2352 -0.7755 -vn -0.4847 0.2539 -0.8370 -vn -0.3943 0.0901 -0.9145 -vn 0.4847 0.0857 -0.8705 -vn 0.5859 0.0794 -0.8065 -vn -0.4847 0.0857 -0.8705 -vn -0.3943 -0.0901 -0.9145 -vn 0.4847 -0.0857 -0.8705 -vn 0.5859 -0.0794 -0.8065 -vn -0.4847 -0.0857 -0.8705 -vn -0.3943 -0.2668 -0.8794 -vn 0.4847 -0.2539 -0.8370 -vn 0.5859 -0.2352 -0.7755 -vn -0.4847 -0.2539 -0.8370 -vn -0.5859 -0.2352 -0.7755 -vn -0.5859 -0.0794 -0.8065 -vn -0.5859 0.0794 -0.8065 -vn -0.5859 0.2352 -0.7755 -vn -0.5859 0.3820 -0.7147 -vn -0.5859 0.5141 -0.6264 -vn -0.5859 0.6264 -0.5141 -vn -0.5859 0.7147 -0.3820 -vn -0.5859 0.7755 -0.2352 -vn -0.5859 0.8065 -0.0794 -vn -0.5859 0.8065 0.0794 -vn -0.5859 0.7755 0.2352 -vn -0.5859 0.7147 0.3820 -vn -0.5859 -0.0794 0.8065 -vn -0.5859 0.6264 0.5141 -vn -0.5859 -0.2352 0.7755 -vn -0.5859 0.5141 0.6264 -vn -0.5859 -0.3820 0.7147 -vn -0.5859 0.3820 0.7147 -vn -0.5859 -0.5141 0.6264 -vn -0.5859 0.2352 0.7755 -vn -0.5859 -0.6264 0.5141 -vn -0.5859 0.0794 0.8065 -vn -0.5859 -0.7147 0.3820 -vn -0.5859 -0.7755 0.2352 -vn -0.5859 -0.8065 0.0794 -vn -0.5859 -0.8064 -0.0794 -vn -0.5859 -0.7755 -0.2352 -vn -0.5859 -0.7147 -0.3820 -vn -0.5859 -0.6264 -0.5141 -vn -0.5859 -0.5141 -0.6264 -vn -0.5859 -0.3820 -0.7147 -vn -0.5859 -0.2353 -0.7755 -vn -0.5859 -0.8065 -0.0794 -vn -0.5859 0.0794 -0.8064 -vn -0.5860 0.8064 -0.0794 -vn -0.5859 0.8064 0.0794 -vn -0.5860 -0.8064 -0.0794 -vn -0.5860 -0.7755 -0.2352 -vn -0.6480 -0.7580 -0.0747 -vn -0.6480 -0.7288 -0.2211 -vn -0.6480 -0.6717 -0.3590 -vn -0.6480 -0.5888 -0.4832 -vn -0.6480 -0.4832 -0.5888 -vn -0.6480 -0.3590 -0.6717 -vn -0.6480 -0.2211 -0.7288 -vn -0.6480 -0.0747 -0.7580 -vn -0.6480 0.0747 -0.7580 -vn -0.6480 0.2211 -0.7288 -vn -0.6480 0.3590 -0.6717 -vn -0.6480 0.4832 -0.5888 -vn -0.6480 0.5888 -0.4832 -vn -0.6480 0.6717 -0.3590 -vn -0.6480 0.7288 -0.2211 -vn -0.6480 0.7580 -0.0747 -vn -0.6480 0.7580 0.0747 -vn -0.6480 0.7288 0.2211 -vn -0.6480 0.6717 0.3590 -vn -0.6480 -0.0747 0.7580 -vn -0.6480 0.5888 0.4832 -vn -0.6480 -0.2211 0.7288 -vn -0.6480 0.4832 0.5888 -vn -0.6480 -0.3590 0.6717 -vn -0.6480 0.3590 0.6717 -vn -0.6480 -0.4832 0.5888 -vn -0.6480 0.2211 0.7288 -vn -0.6480 -0.5888 0.4832 -vn -0.6480 0.0747 0.7580 -vn -0.6480 -0.6717 0.3590 -vn -0.6480 -0.7288 0.2211 -vn -0.6480 -0.7580 0.0747 -vn 0.6480 -0.7580 0.0747 -vn -0.2632 -0.9601 0.0946 -vn -0.5813 -0.8097 0.0798 -vn -0.5814 -0.8097 0.0798 -vn 0.2632 -0.9601 0.0946 -vn 0.6480 -0.7289 0.2211 -vn -0.2632 -0.9232 0.2801 -vn -0.5813 -0.7786 0.2362 -vn 0.2632 -0.9232 0.2801 -vn 0.6480 -0.6717 0.3590 -vn -0.2632 -0.8508 0.4548 -vn -0.5813 -0.7176 0.3836 -vn 0.2632 -0.8508 0.4548 -vn 0.6480 0.0747 0.7580 -vn -0.2632 0.0946 0.9601 -vn -0.5813 0.0798 0.8097 -vn -0.5814 0.0798 0.8097 -vn 0.2632 0.0946 0.9601 -vn 0.6480 -0.5888 0.4832 -vn -0.2632 -0.7458 0.6120 -vn -0.5813 -0.6290 0.5162 -vn 0.2632 -0.7458 0.6120 -vn 0.6480 0.2211 0.7289 -vn -0.2632 0.2801 0.9232 -vn -0.5813 0.2362 0.7786 -vn 0.2632 0.2801 0.9232 -vn 0.6480 -0.4832 0.5888 -vn -0.2632 -0.6120 0.7458 -vn -0.5813 -0.5162 0.6290 -vn 0.2632 -0.6120 0.7458 -vn 0.6480 0.3590 0.6717 -vn -0.2632 0.4548 0.8508 -vn -0.5813 0.3836 0.7176 -vn 0.2632 0.4548 0.8508 -vn 0.6480 -0.3590 0.6717 -vn -0.2632 -0.4548 0.8508 -vn -0.5813 -0.3836 0.7176 -vn 0.2632 -0.4548 0.8508 -vn 0.6480 0.4832 0.5888 -vn -0.2632 0.6120 0.7458 -vn -0.5813 0.5162 0.6290 -vn 0.2632 0.6120 0.7458 -vn 0.6480 -0.2211 0.7289 -vn -0.2632 -0.2800 0.9232 -vn -0.5813 -0.2362 0.7786 -vn 0.2632 -0.2800 0.9232 -vn 0.6480 0.5888 0.4832 -vn -0.2632 0.7458 0.6120 -vn -0.5813 0.6290 0.5162 -vn 0.2632 0.7458 0.6120 -vn 0.6480 -0.0747 0.7580 -vn -0.2632 -0.0946 0.9601 -vn -0.5813 -0.0798 0.8097 -vn -0.5814 -0.0798 0.8097 -vn 0.2632 -0.0946 0.9601 -vn 0.6480 0.6717 0.3590 -vn -0.2632 0.8508 0.4548 -vn -0.5813 0.7176 0.3836 -vn 0.2632 0.8508 0.4548 -vn 0.6480 0.7289 0.2211 -vn -0.2632 0.9232 0.2800 -vn -0.5813 0.7786 0.2362 -vn 0.2632 0.9232 0.2801 -vn 0.6480 0.7580 0.0747 -vn -0.2632 0.9601 0.0946 -vn -0.5813 0.8097 0.0798 -vn 0.2632 0.9601 0.0946 -vn 0.6480 0.7580 -0.0747 -vn -0.2632 0.9601 -0.0946 -vn -0.5813 0.8097 -0.0798 -vn 0.2632 0.9601 -0.0946 -vn 0.6480 0.7289 -0.2211 -vn -0.2632 0.9232 -0.2800 -vn -0.5813 0.7786 -0.2362 -vn 0.2632 0.9232 -0.2801 -vn 0.6480 0.6717 -0.3590 -vn -0.2632 0.8508 -0.4548 -vn -0.5813 0.7176 -0.3836 -vn 0.2632 0.8508 -0.4548 -vn 0.6480 0.5888 -0.4832 -vn -0.2632 0.7458 -0.6120 -vn -0.5813 0.6290 -0.5162 -vn 0.2632 0.7458 -0.6120 -vn 0.6480 0.4832 -0.5888 -vn -0.2632 0.6120 -0.7458 -vn -0.5813 0.5162 -0.6290 -vn 0.2632 0.6120 -0.7458 -vn 0.6480 0.3590 -0.6717 -vn -0.2632 0.4548 -0.8508 -vn -0.5813 0.3836 -0.7176 -vn 0.2632 0.4548 -0.8508 -vn 0.6480 0.2211 -0.7289 -vn -0.2632 0.2800 -0.9232 -vn -0.5814 0.2362 -0.7786 -vn 0.2632 0.2800 -0.9232 -vn 0.6480 0.0747 -0.7580 -vn -0.2632 0.0946 -0.9601 -vn -0.5814 0.0798 -0.8097 -vn 0.2632 0.0946 -0.9601 -vn 0.6480 -0.0747 -0.7580 -vn -0.2632 -0.0946 -0.9601 -vn -0.5813 -0.0798 -0.8097 -vn 0.2632 -0.0946 -0.9601 -vn 0.6480 -0.2211 -0.7289 -vn -0.2632 -0.2801 -0.9232 -vn -0.5814 -0.2362 -0.7786 -vn -0.5813 -0.2362 -0.7786 -vn 0.2632 -0.2801 -0.9232 -vn 0.6480 -0.3590 -0.6717 -vn -0.2632 -0.4548 -0.8508 -vn -0.5813 -0.3836 -0.7176 -vn 0.2632 -0.4548 -0.8508 -vn 0.6480 -0.4832 -0.5888 -vn -0.2632 -0.6120 -0.7458 -vn -0.5814 -0.5162 -0.6290 -vn -0.5813 -0.5162 -0.6290 -vn 0.2632 -0.6120 -0.7458 -vn 0.6480 -0.5888 -0.4832 -vn -0.2632 -0.7458 -0.6120 -vn -0.5813 -0.6290 -0.5162 -vn 0.2632 -0.7458 -0.6120 -vn 0.6480 -0.6717 -0.3590 -vn -0.2632 -0.8508 -0.4548 -vn -0.5813 -0.7176 -0.3836 -vn 0.2632 -0.8508 -0.4548 -vn 0.6480 -0.7289 -0.2211 -vn -0.2632 -0.9232 -0.2800 -vn -0.5813 -0.7786 -0.2362 -vn 0.2632 -0.9232 -0.2800 -vn 0.6480 -0.7580 -0.0747 -vn -0.2632 -0.9601 -0.0946 -vn -0.5813 -0.8097 -0.0798 -vn -0.5814 -0.8097 -0.0798 -vn 0.2632 -0.9601 -0.0946 -vn 0.5813 -0.8097 -0.0797 -vn 0.5813 -0.7786 -0.2362 -vn 0.5813 -0.7176 -0.3836 -vn 0.5813 -0.6290 -0.5162 -vn 0.5813 -0.5162 -0.6290 -vn 0.5813 -0.3836 -0.7176 -vn 0.5813 -0.2362 -0.7786 -vn 0.5813 -0.0798 -0.8097 -vn 0.5813 0.0798 -0.8097 -vn 0.5813 0.2362 -0.7786 -vn 0.5813 0.3836 -0.7176 -vn 0.5813 0.5162 -0.6290 -vn 0.5813 0.6290 -0.5162 -vn 0.5813 0.7176 -0.3836 -vn 0.5813 0.7786 -0.2362 -vn 0.5814 0.8097 -0.0798 -vn 0.5813 0.8097 0.0798 -vn 0.5813 0.7786 0.2362 -vn 0.5814 0.7176 0.3836 -vn 0.5813 -0.0797 0.8097 -vn 0.5813 0.6290 0.5162 -vn 0.5813 -0.2362 0.7786 -vn 0.5813 0.5162 0.6290 -vn 0.5813 -0.3836 0.7176 -vn 0.5813 0.3836 0.7176 -vn 0.5813 -0.5162 0.6290 -vn 0.5813 0.2362 0.7786 -vn 0.5813 -0.6290 0.5162 -vn 0.5813 0.0797 0.8097 -vn 0.5814 -0.7176 0.3836 -vn 0.5814 -0.7786 0.2362 -vn 0.5813 -0.8097 0.0797 -vn 0.5813 0.8097 -0.0798 -vn 0.5813 0.7176 0.3836 -vn 0.5813 -0.7176 0.3836 -vn 0.5813 -0.7786 0.2362 -vn -0.1725 -0.9426 0.2859 -vn -0.4652 0.6843 -0.5616 -vn -0.4652 -0.8471 0.2570 -vn -0.4652 0.5616 -0.6843 -vn -0.4652 -0.7807 0.4173 -vn -0.4652 0.4173 -0.7807 -vn -0.4652 0.0868 0.8810 -vn -0.4652 -0.6843 0.5616 -vn -0.4652 0.2570 -0.8471 -vn -0.4652 0.2570 0.8471 -vn -0.4652 -0.5616 0.6843 -vn -0.4652 0.0868 -0.8810 -vn -0.4652 0.4173 0.7807 -vn -0.4652 -0.4173 0.7807 -vn -0.4652 -0.0868 -0.8810 -vn -0.4652 0.5616 0.6843 -vn -0.4652 -0.2570 0.8471 -vn -0.4652 -0.2570 -0.8471 -vn -0.4652 0.6843 0.5616 -vn -0.4652 -0.0868 0.8810 -vn -0.4652 -0.4173 -0.7807 -vn -0.4652 0.7807 0.4173 -vn -0.4652 -0.5616 -0.6843 -vn -0.4652 0.8471 0.2570 -vn -0.4652 -0.6843 -0.5616 -vn -0.4652 0.8810 0.0868 -vn -0.4652 -0.7807 -0.4173 -vn -0.4652 0.8810 -0.0868 -vn -0.4652 -0.8471 -0.2570 -vn -0.4652 0.8471 -0.2570 -vn -0.4652 -0.8810 -0.0868 -vn -0.4652 0.7807 -0.4173 +vt 0.343750 0.531250 +vt 0.312500 0.531250 +vt 0.343750 0.562500 +vt 0.312500 0.562500 +vt 0.343750 0.593750 +vt 0.312500 0.593750 +vt 0.343750 0.625000 +vt 0.312500 0.625000 +vt 0.343750 0.656250 +vt 0.312500 0.656250 +vt 0.343750 0.687500 +vt 0.312500 0.687500 +vt 0.343750 0.718750 +vt 0.312500 0.718750 +vt 0.156250 0.875000 +vt 0.125000 0.875000 +vt 0.156250 0.906250 +vt 0.125000 0.906250 +vt 0.437500 0.218750 +vt 0.406250 0.218750 +vt 0.437500 0.250000 +vt 0.406250 0.250000 +vt 0.437500 0.437500 +vt 0.406250 0.437500 +vt 0.406250 0.406250 +vt 0.437500 0.406250 +vt 0.406250 0.375000 +vt 0.437500 0.375000 +vt 0.187500 0.875000 +vt 0.156250 0.875000 +vt 0.187500 0.906250 +vt 0.156250 0.906250 +vt 0.031250 0.875000 +vt 0.000000 0.875000 +vt 0.031250 0.906250 +vt 0.000000 0.906250 +vt 0.375000 0.250000 +vt 0.406250 0.250000 +vt 0.375000 0.218750 +vt 0.406250 0.218750 +vt 0.375000 0.312500 +vt 0.406250 0.312500 +vt 0.406250 0.343750 +vt 0.375000 0.343750 +vt 0.406250 0.375000 +vt 0.375000 0.375000 +vt 0.312500 0.875000 +vt 0.281250 0.875000 +vt 0.312500 0.906250 +vt 0.281250 0.906250 +vt 0.250000 0.875000 +vt 0.218750 0.875000 +vt 0.250000 0.906250 +vt 0.218750 0.906250 +vt 0.250000 0.937500 +vt 0.218750 0.937500 +vt 0.093750 0.875000 +vt 0.062500 0.875000 +vt 0.093750 0.906250 +vt 0.062500 0.906250 +vt 0.093750 0.937500 +vt 0.062500 0.937500 +vt 0.437500 0.156250 +vt 0.406250 0.156250 +vt 0.406250 0.125000 +vt 0.437500 0.125000 +vt 0.406250 0.093750 +vt 0.437500 0.093750 +vt 0.406250 0.062500 +vt 0.437500 0.062500 +vt 0.375000 0.000000 +vt 0.406250 0.000000 +vt 0.406250 0.031250 +vt 0.375000 0.031250 +vt 0.406250 0.062500 +vt 0.375000 0.062500 +vt 0.406250 0.093750 +vt 0.375000 0.093750 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 vn 0.0000 0.0000 1.0000 -vn -0.1725 0.6249 -0.7614 -vn -0.1725 -0.8687 0.4643 -vn -0.1725 0.4643 -0.8687 -vn -0.1725 0.0965 0.9803 -vn -0.1725 -0.7614 0.6249 -vn -0.1725 0.2859 -0.9426 -vn -0.1725 0.2859 0.9426 -vn -0.1725 -0.6249 0.7614 -vn -0.1725 0.0965 -0.9803 -vn -0.1725 0.4643 0.8687 -vn -0.1725 -0.4643 0.8687 -vn -0.1725 -0.0965 -0.9803 -vn -0.1725 0.6249 0.7614 -vn -0.1725 -0.2859 0.9426 -vn -0.1725 -0.2859 -0.9426 -vn -0.1725 0.7614 0.6249 -vn -0.1725 -0.0965 0.9803 -vn -0.1725 -0.4643 -0.8687 -vn -0.1725 0.8687 0.4643 -vn -0.1725 -0.6249 -0.7614 -vn -0.1725 0.9426 0.2859 -vn -0.1725 -0.7614 -0.6249 -vn -0.1725 0.9803 0.0965 -vn -0.1725 -0.8687 -0.4643 -vn -0.1725 0.9803 -0.0965 -vn -0.1725 -0.9426 -0.2859 -vn -0.1725 0.9426 -0.2859 -vn -0.1725 -0.9803 -0.0965 -vn -0.1725 0.8687 -0.4643 -vn -0.1725 -0.9803 0.0965 -vn -0.1725 0.7614 -0.6249 -vn -0.0098 0.7730 -0.6344 -vn -0.0098 -0.9951 0.0980 -vn -0.0098 0.8819 -0.4714 -vn -0.0098 -0.9951 -0.0980 -vn -0.0098 0.9569 -0.2903 -vn -0.0098 -0.9569 -0.2903 -vn -0.0098 0.9951 -0.0980 -vn -0.0098 -0.8819 -0.4714 -vn -0.0098 0.9951 0.0980 -vn -0.0098 -0.7730 -0.6344 -vn -0.0098 0.9569 0.2903 -vn -0.0098 -0.6344 -0.7730 -vn -0.0098 0.8819 0.4714 -vn -0.0098 -0.4714 -0.8819 -vn -0.0098 -0.0980 0.9951 -vn -0.0098 0.7730 0.6344 -vn -0.0098 -0.2903 -0.9569 -vn -0.0098 -0.2903 0.9569 -vn -0.0098 0.6344 0.7730 -vn -0.0098 -0.0980 -0.9951 -vn -0.0098 -0.4714 0.8819 -vn -0.0098 0.4714 0.8819 -vn -0.0098 0.0980 -0.9951 -vn -0.0098 -0.6344 0.7730 -vn -0.0098 0.2903 0.9569 -vn -0.0098 0.2903 -0.9569 -vn -0.0098 -0.7730 0.6344 -vn -0.0098 0.0980 0.9951 -vn -0.0098 0.4714 -0.8819 -vn -0.0098 -0.8819 0.4714 -vn -0.0098 0.6344 -0.7730 -vn -0.0098 -0.9569 0.2903 -vn 0.2072 0.7562 -0.6206 -vn 0.2072 -0.9736 0.0959 -vn 0.2072 0.8628 -0.4612 -vn 0.2072 -0.9736 -0.0959 -vn 0.2072 0.9362 -0.2840 -vn 0.2072 -0.9362 -0.2840 -vn 0.2072 0.9736 -0.0959 -vn 0.2072 -0.8628 -0.4612 -vn 0.2072 0.9736 0.0959 -vn 0.2072 -0.7562 -0.6206 -vn 0.2072 0.9362 0.2840 -vn 0.2072 -0.6206 -0.7562 -vn 0.2072 0.8628 0.4612 -vn 0.2072 -0.4612 -0.8628 -vn 0.2072 -0.0959 0.9736 -vn 0.2072 0.7562 0.6206 -vn 0.2072 -0.2840 -0.9362 -vn 0.2072 -0.2840 0.9362 -vn 0.2072 0.6206 0.7562 -vn 0.2072 -0.0959 -0.9736 -vn 0.2072 -0.4612 0.8628 -vn 0.2072 0.4612 0.8628 -vn 0.2072 0.0959 -0.9736 -vn 0.2072 -0.6206 0.7562 -vn 0.2072 0.2840 0.9362 -vn 0.2072 0.2840 -0.9362 -vn 0.2072 -0.7562 0.6206 -vn 0.2072 0.0959 0.9736 -vn 0.2072 0.4612 -0.8628 -vn 0.2072 -0.8628 0.4612 -vn 0.2072 0.6206 -0.7562 -vn 0.2072 -0.9362 0.2840 -vn -0.0596 -0.9552 0.2898 -vn -0.0596 0.6333 -0.7716 -vn -0.0596 -0.8804 0.4706 -vn -0.0596 0.4706 -0.8804 -vn -0.0596 0.0978 0.9934 -vn -0.0596 -0.7716 0.6333 -vn -0.0596 0.2898 -0.9552 -vn -0.0596 0.2898 0.9552 -vn -0.0596 -0.6333 0.7716 -vn -0.0596 0.0978 -0.9934 -vn -0.0596 0.4706 0.8804 -vn -0.0596 -0.4706 0.8804 -vn -0.0596 -0.0978 -0.9934 -vn -0.0596 0.6333 0.7716 -vn -0.0596 -0.2898 0.9552 -vn -0.0596 -0.2898 -0.9552 -vn -0.0596 0.7716 0.6333 -vn -0.0596 -0.0978 0.9934 -vn -0.0596 -0.4706 -0.8804 -vn -0.0596 0.8804 0.4706 -vn -0.0596 -0.6333 -0.7716 -vn -0.0596 0.9552 0.2898 -vn -0.0596 -0.7716 -0.6333 -vn -0.0596 0.9934 0.0978 -vn -0.0596 -0.8804 -0.4706 -vn -0.0596 0.9934 -0.0978 -vn -0.0596 -0.9552 -0.2898 -vn -0.0596 0.9552 -0.2898 -vn -0.0596 -0.9934 -0.0978 -vn -0.0596 0.8804 -0.4706 -vn -0.0596 -0.9934 0.0978 -vn -0.0596 0.7716 -0.6333 -vn -0.3698 -0.8891 0.2697 -vn -0.3698 0.5894 -0.7182 -vn -0.3698 -0.8194 0.4380 -vn -0.3698 0.4380 -0.8194 -vn -0.3698 0.0911 0.9246 -vn -0.3698 -0.7182 0.5894 -vn -0.3698 0.2697 -0.8891 -vn -0.3698 0.2697 0.8891 -vn -0.3698 -0.5894 0.7182 -vn -0.3698 0.0911 -0.9246 -vn -0.3698 0.4380 0.8194 -vn -0.3698 -0.4380 0.8194 -vn -0.3698 -0.0911 -0.9246 -vn -0.3698 0.5894 0.7182 -vn -0.3698 -0.2697 0.8891 -vn -0.3698 -0.2697 -0.8891 -vn -0.3698 0.7182 0.5894 -vn -0.3698 -0.0911 0.9246 -vn -0.3698 -0.4380 -0.8194 -vn -0.3698 0.8194 0.4380 -vn -0.3698 -0.5894 -0.7182 -vn -0.3698 0.8891 0.2697 -vn -0.3698 -0.7182 -0.5894 -vn -0.3698 0.9246 0.0911 -vn -0.3698 -0.8194 -0.4380 -vn -0.3698 0.9246 -0.0911 -vn -0.3698 -0.8891 -0.2697 -vn -0.3698 0.8891 -0.2697 -vn -0.3698 -0.9246 -0.0911 -vn -0.3698 0.8194 -0.4380 -vn -0.3698 -0.9246 0.0911 -vn -0.3698 0.7182 -0.5894 -vn -0.0191 0.7729 -0.6343 -vn 0.4373 0.6952 -0.5705 -vn 0.4880 0.6747 -0.5537 -vn -0.4880 0.6747 -0.5537 -vn 0.5006 0.6692 -0.5492 -vn -0.4978 0.6704 -0.5502 -vn -0.0191 -0.9950 0.0980 -vn 0.4373 -0.8950 0.0882 -vn 0.4880 -0.8686 0.0856 -vn -0.4880 -0.8686 0.0856 -vn 0.4806 -0.8727 0.0859 -vn -0.4778 -0.8742 0.0861 -vn 0.4880 -0.8686 0.0855 -vn -0.0191 0.8818 -0.4713 -vn 0.4373 0.7931 -0.4239 -vn 0.4880 0.7698 -0.4115 -vn -0.4880 0.7698 -0.4115 -vn 0.5001 0.7637 -0.4082 -vn -0.4974 0.7651 -0.4090 -vn -0.4880 0.7698 -0.4114 -vn -0.0191 -0.9950 -0.0980 -vn 0.4373 -0.8950 -0.0881 -vn 0.4880 -0.8686 -0.0856 -vn -0.4880 -0.8686 -0.0856 -vn 0.4822 -0.8719 -0.0859 -vn -0.4794 -0.8733 -0.0860 -vn -0.0191 0.9568 -0.2902 -vn 0.4373 0.8606 -0.2611 -vn 0.4880 0.8352 -0.2534 -vn -0.4880 0.8352 -0.2534 -vn -0.4880 0.8353 -0.2534 -vn 0.4993 0.8291 -0.2515 -vn -0.4965 0.8306 -0.2520 -vn 0.4880 0.8353 -0.2534 -vn -0.0191 -0.9568 -0.2902 -vn 0.4373 -0.8606 -0.2611 -vn 0.4880 -0.8353 -0.2534 -vn -0.4880 -0.8352 -0.2534 -vn 0.4880 -0.8352 -0.2534 -vn -0.4880 -0.8353 -0.2534 -vn 0.4840 -0.8374 -0.2540 -vn -0.4813 -0.8388 -0.2544 -vn -0.0191 0.9950 -0.0980 -vn 0.4373 0.8950 -0.0882 -vn 0.4880 0.8686 -0.0856 -vn -0.4880 0.8686 -0.0856 -vn 0.4981 0.8630 -0.0850 -vn -0.4953 0.8645 -0.0851 -vn -0.0191 -0.8818 -0.4713 -vn 0.4373 -0.7931 -0.4239 -vn 0.4880 -0.7698 -0.4115 -vn -0.4880 -0.7698 -0.4115 -vn 0.4880 -0.7698 -0.4114 -vn 0.4861 -0.7707 -0.4120 -vn -0.4834 -0.7720 -0.4127 -vn -0.4880 -0.7698 -0.4114 -vn -0.0191 0.9950 0.0980 -vn 0.4373 0.8950 0.0882 -vn 0.4880 0.8686 0.0856 -vn -0.4880 0.8686 0.0856 -vn 0.4965 0.8638 0.0851 -vn -0.4938 0.8654 0.0852 -vn -0.0191 -0.7729 -0.6343 -vn 0.4373 -0.6952 -0.5705 -vn 0.4880 -0.6747 -0.5537 -vn -0.4880 -0.6747 -0.5537 -vn 0.4883 -0.6746 -0.5536 -vn -0.4856 -0.6758 -0.5546 -vn -0.0191 0.9568 0.2902 -vn 0.4373 0.8606 0.2611 -vn 0.4880 0.8353 0.2534 -vn -0.4880 0.8352 0.2534 -vn 0.4880 0.8352 0.2534 -vn -0.4880 0.8353 0.2534 -vn 0.4947 0.8316 0.2523 -vn -0.4920 0.8331 0.2527 -vn -0.0191 -0.6343 -0.7729 -vn 0.4373 -0.5705 -0.6952 -vn 0.4880 -0.5537 -0.6747 -vn -0.4880 -0.5537 -0.6747 -vn 0.4905 -0.5528 -0.6736 -vn -0.4878 -0.5538 -0.6748 -vn -0.0191 0.8818 0.4713 -vn 0.4373 0.7931 0.4239 -vn 0.4880 0.7698 0.4115 -vn -0.4880 0.7698 0.4115 -vn 0.4927 0.7675 0.4102 -vn -0.4899 0.7688 0.4109 -vn 0.4880 0.7698 0.4114 -vn -0.4880 0.7698 0.4114 -vn -0.0191 -0.4713 -0.8818 -vn 0.4373 -0.4239 -0.7931 -vn 0.4880 -0.4115 -0.7698 -vn -0.4880 -0.4115 -0.7698 -vn 0.4927 -0.4102 -0.7675 -vn -0.4899 -0.4109 -0.7688 -vn -0.4880 -0.4114 -0.7698 -vn -0.0191 -0.0980 0.9950 -vn 0.4373 -0.0881 0.8950 -vn 0.4880 -0.0856 0.8686 -vn -0.4880 -0.0856 0.8686 -vn 0.4806 -0.0860 0.8727 -vn -0.4778 -0.0861 0.8742 -vn -0.4880 -0.0855 0.8686 -vn -0.0191 0.7729 0.6343 -vn 0.4373 0.6952 0.5705 -vn 0.4880 0.6747 0.5537 -vn -0.4880 0.6747 0.5537 -vn 0.4905 0.6736 0.5528 -vn -0.4878 0.6748 0.5538 -vn -0.0191 -0.2902 -0.9568 -vn 0.4373 -0.2611 -0.8606 -vn 0.4880 -0.2534 -0.8353 -vn -0.4880 -0.2534 -0.8353 -vn 0.4880 -0.2534 -0.8352 -vn 0.4947 -0.2523 -0.8316 -vn -0.4920 -0.2527 -0.8331 -vn -0.4880 -0.2534 -0.8352 -vn -0.0191 -0.2902 0.9568 -vn 0.4373 -0.2611 0.8606 -vn 0.4880 -0.2534 0.8352 -vn -0.4880 -0.2534 0.8352 -vn -0.4880 -0.2534 0.8353 -vn 0.4793 -0.2548 0.8399 -vn -0.4766 -0.2552 0.8413 -vn 0.4880 -0.2534 0.8353 -vn -0.0191 0.6343 0.7729 -vn 0.4373 0.5705 0.6952 -vn 0.4880 0.5537 0.6747 -vn -0.4880 0.5537 0.6747 -vn 0.4883 0.5536 0.6746 -vn -0.4856 0.5546 0.6758 -vn -0.0191 -0.0980 -0.9950 -vn 0.4373 -0.0881 -0.8950 -vn 0.4880 -0.0856 -0.8686 -vn -0.4880 -0.0856 -0.8686 -vn 0.4965 -0.0851 -0.8638 -vn -0.4938 -0.0852 -0.8654 -vn -0.0191 -0.4713 0.8818 -vn 0.4373 -0.4239 0.7931 -vn 0.4880 -0.4114 0.7698 -vn -0.4880 -0.4115 0.7698 -vn -0.4880 -0.4114 0.7698 -vn 0.4784 -0.4139 0.7744 -vn -0.4757 -0.4146 0.7757 -vn 0.4880 -0.4115 0.7698 -vn -0.0191 0.4713 0.8818 -vn 0.4373 0.4239 0.7931 -vn 0.4880 0.4114 0.7698 -vn -0.4880 0.4115 0.7698 -vn 0.4861 0.4120 0.7707 -vn -0.4834 0.4127 0.7720 -vn 0.4880 0.4115 0.7698 -vn -0.4880 0.4114 0.7698 -vn -0.0191 0.0980 -0.9950 -vn 0.4373 0.0881 -0.8950 -vn 0.4880 0.0856 -0.8686 -vn -0.4880 0.0856 -0.8686 -vn 0.4981 0.0850 -0.8630 -vn -0.4953 0.0851 -0.8645 -vn -0.4880 0.0855 -0.8686 -vn -0.0191 -0.6343 0.7729 -vn 0.4373 -0.5705 0.6952 -vn 0.4880 -0.5537 0.6747 -vn -0.4880 -0.5537 0.6747 -vn 0.4780 -0.5572 0.6790 -vn -0.4744 -0.5567 0.6819 -vn 0.4904 -0.5577 0.6697 -vn -0.0191 0.2902 0.9568 -vn 0.4373 0.2611 0.8606 -vn 0.4880 0.2534 0.8352 -vn -0.4880 0.2534 0.8352 -vn -0.4880 0.2534 0.8353 -vn 0.4840 0.2540 0.8374 -vn -0.4813 0.2544 0.8388 -vn 0.4880 0.2534 0.8353 -vn -0.0191 0.2902 -0.9568 -vn 0.4373 0.2611 -0.8606 -vn 0.4880 0.2534 -0.8352 -vn -0.4880 0.2534 -0.8353 -vn 0.4993 0.2515 -0.8291 -vn -0.4965 0.2520 -0.8306 -vn 0.4880 0.2534 -0.8353 -vn -0.4880 0.2534 -0.8352 -vn -0.0191 -0.7729 0.6343 -vn 0.4373 -0.6952 0.5705 -vn 0.4880 -0.6747 0.5537 -vn -0.4880 -0.6747 0.5537 -vn 0.4780 -0.6790 0.5572 -vn -0.4731 -0.6846 0.5545 -vn 0.4892 -0.6722 0.5557 -vn -0.0191 0.0980 0.9950 -vn 0.4373 0.0882 0.8950 -vn 0.4880 0.0856 0.8686 -vn -0.4880 0.0856 0.8686 -vn 0.4880 0.0855 0.8686 -vn 0.4822 0.0859 0.8719 -vn -0.4794 0.0860 0.8734 -vn -0.4880 0.0855 0.8686 -vn -0.0191 0.4713 -0.8818 -vn 0.4373 0.4239 -0.7931 -vn 0.4880 0.4114 -0.7698 -vn -0.4880 0.4115 -0.7698 -vn 0.4880 0.4115 -0.7698 -vn 0.5001 0.4082 -0.7637 -vn -0.4974 0.4090 -0.7651 -vn -0.4880 0.4114 -0.7698 -vn -0.0191 -0.8818 0.4713 -vn 0.4373 -0.7931 0.4239 -vn 0.4880 -0.7698 0.4115 -vn -0.4880 -0.7698 0.4115 -vn 0.4784 -0.7744 0.4139 -vn -0.4757 -0.7757 0.4146 -vn -0.4880 -0.7698 0.4114 -vn -0.0191 0.6343 -0.7729 -vn 0.4373 0.5705 -0.6952 -vn 0.4880 0.5537 -0.6747 -vn -0.4880 0.5537 -0.6747 -vn 0.5006 0.5492 -0.6692 -vn -0.4978 0.5502 -0.6704 -vn -0.0191 -0.9568 0.2902 -vn 0.4373 -0.8606 0.2611 -vn 0.4880 -0.8352 0.2534 -vn -0.4880 -0.8352 0.2534 -vn -0.4880 -0.8353 0.2534 -vn 0.4793 -0.8399 0.2548 -vn -0.4766 -0.8413 0.2552 -vn -0.4880 -0.8353 0.2533 -vn -0.0993 -0.0975 -0.9903 -vn -0.0920 -0.2891 -0.9529 -vn -0.0775 -0.4700 -0.8793 -vn -0.0564 -0.6334 -0.7718 -vn -0.0294 -0.7727 -0.6341 -vn 0.0024 -0.8819 -0.4714 -vn 0.0377 -0.9563 -0.2901 -vn 0.0750 -0.9924 -0.0977 -vn 0.1127 -0.9888 0.0974 -vn 0.1492 -0.9462 0.2870 -vn 0.1831 -0.8670 0.4634 -vn 0.2130 -0.7553 0.6198 -vn 0.2380 -0.6162 0.7508 -vn 0.2573 -0.4555 0.8522 -vn 0.2705 -0.2795 0.9213 -vn 0.2771 -0.0942 0.9562 -vn 0.2771 0.0942 0.9562 -vn 0.2705 0.2795 0.9213 -vn 0.2573 0.4555 0.8522 -vn 0.2380 0.6162 0.7508 -vn 0.2130 0.7553 0.6198 -vn 0.1831 0.8670 0.4634 -vn 0.1492 0.9462 0.2870 -vn 0.1127 0.9888 0.0974 -vn 0.0750 0.9924 -0.0977 -vn 0.0377 0.9563 -0.2901 -vn 0.0024 0.8819 -0.4714 -vn -0.0294 0.7727 -0.6341 -vn -0.0564 0.6334 -0.7718 -vn -0.0775 0.4700 -0.8793 -vn -0.0351 -0.9564 0.2901 -vn -0.0920 0.2891 -0.9529 -vn -0.0993 0.0975 -0.9903 -vn 0.1152 -0.4683 0.8761 -vn -0.1060 0.4687 0.8769 -vn 0.0765 0.7707 -0.6325 -vn 0.0569 -0.8805 -0.4706 -vn -0.1149 -0.2884 0.9506 -vn -0.0118 0.9951 0.0980 -vn 0.1149 -0.2884 -0.9506 -vn -0.0569 -0.8805 0.4706 -vn -0.0931 0.6316 0.7697 -vn 0.0931 0.6316 -0.7697 -vn 0.0351 -0.9564 -0.2901 -vn -0.1195 -0.0973 0.9881 -vn 0.0119 0.9951 -0.0980 -vn 0.1060 -0.4687 -0.8770 -vn -0.0765 -0.7707 0.6325 -vn -0.0765 0.7707 0.6325 -vn 0.1060 0.4687 -0.8770 -vn 0.0119 -0.9951 -0.0980 -vn -0.1195 0.0973 0.9881 -vn 0.0351 0.9564 -0.2901 -vn 0.0931 -0.6316 -0.7697 -vn -0.0931 -0.6316 0.7697 -vn -0.0569 0.8805 0.4706 -vn 0.1149 0.2884 -0.9506 -vn -0.0118 -0.9951 0.0980 -vn -0.1149 0.2884 0.9506 -vn 0.0569 0.8805 -0.4706 -vn 0.0765 -0.7707 -0.6325 -vn -0.1060 -0.4687 0.8770 -vn -0.0351 0.9564 0.2901 -vn 0.1195 -0.0973 -0.9881 -vn 0.1195 0.0973 -0.9881 -vn -0.7025 -0.3729 -0.6062 -vn 0.1152 -0.0974 -0.9886 -vn 0.1152 0.7679 -0.6302 -vn 0.1152 -0.2884 0.9506 -vn 0.1152 -0.2884 -0.9506 -vn 0.1152 0.6302 -0.7679 -vn 0.1152 -0.0974 0.9886 -vn 0.1152 -0.4683 -0.8761 -vn 0.1152 0.4683 -0.8761 -vn 0.1152 0.0974 0.9886 -vn 0.1152 -0.6302 -0.7679 -vn 0.1152 0.2884 -0.9506 -vn 0.1152 0.2884 0.9506 -vn 0.1152 -0.7679 -0.6302 -vn 0.1152 0.0974 -0.9886 -vn 0.1152 0.4683 0.8761 -vn 0.1152 -0.8761 -0.4683 -vn 0.1152 0.6302 0.7679 -vn 0.1152 -0.9506 -0.2884 -vn 0.1152 0.7679 0.6302 -vn 0.1152 -0.9886 -0.0974 -vn 0.1152 0.8761 0.4683 -vn 0.1152 -0.9886 0.0974 -vn 0.1152 0.9506 0.2884 -vn 0.1152 -0.9506 0.2884 -vn 0.1152 0.9886 0.0974 -vn 0.1152 -0.8761 0.4683 -vn 0.1152 0.9886 -0.0974 -vn 0.1152 -0.7679 0.6302 -vn 0.1152 0.9506 -0.2884 -vn 0.1152 -0.6302 0.7679 -vn 0.1152 0.8761 -0.4683 -vn -0.1922 0.0966 -0.9766 -vn -0.1857 0.2864 -0.9400 -vn -0.1728 0.4660 -0.8677 -vn -0.1540 0.6288 -0.7621 -vn -0.1298 0.7685 -0.6266 -vn -0.1011 0.8791 -0.4658 -vn -0.0689 0.9558 -0.2859 -vn -0.0346 0.9950 -0.0940 -vn 0.0005 0.9948 0.1020 -vn 0.0349 0.9553 0.2937 -vn 0.0671 0.8783 0.4734 -vn 0.0960 0.7675 0.6338 -vn 0.1203 0.6279 0.7689 -vn 0.1393 0.4652 0.8742 -vn 0.1522 0.2859 0.9461 -vn 0.1588 0.0964 0.9826 -vn 0.1588 -0.0964 0.9826 -vn 0.1522 -0.2859 0.9461 -vn 0.1393 -0.4652 0.8742 -vn 0.1203 -0.6279 0.7689 -vn 0.0960 -0.7675 0.6338 -vn 0.0671 -0.8783 0.4734 -vn 0.0349 -0.9553 0.2937 -vn 0.0005 -0.9948 0.1020 -vn -0.0346 -0.9950 -0.0940 -vn -0.0689 -0.9558 -0.2859 -vn -0.1011 -0.8791 -0.4658 -vn -0.1298 -0.7685 -0.6266 -vn -0.1540 -0.6288 -0.7621 -vn -0.1728 -0.4660 -0.8677 -vn -0.1857 -0.2864 -0.9400 -vn -0.1922 -0.0966 -0.9766 -vn -0.9837 -0.0775 -0.1625 -vn -0.5622 -0.0867 -0.8224 -vn -0.9605 -0.2326 -0.1529 -vn -0.5376 -0.2588 -0.8025 -vn -0.9119 -0.3878 -0.1342 -vn -0.4884 -0.4261 -0.7615 -vn -0.8337 -0.5417 -0.1076 -vn -0.4148 -0.5843 -0.6975 -vn -0.7200 -0.6899 -0.0751 -vn -0.3184 -0.7269 -0.6085 -vn -0.5652 -0.8240 -0.0404 -vn -0.2025 -0.8460 -0.4933 -vn -0.3669 -0.9302 -0.0090 -vn -0.0731 -0.9328 -0.3529 -vn -0.1313 -0.9913 0.0124 -vn 0.0612 -0.9796 -0.1912 -vn 0.1229 -0.9923 0.0177 -vn 0.1903 -0.9816 -0.0156 -vn 0.3680 -0.9298 0.0045 -vn 0.3048 -0.9381 0.1644 -vn 0.5778 -0.8158 -0.0242 -vn 0.3975 -0.8530 0.3382 -vn 0.7387 -0.6713 -0.0616 -vn 0.4652 -0.7335 0.4955 -vn 0.8509 -0.5157 -0.0999 -vn 0.5091 -0.5888 0.6279 -vn 0.9229 -0.3614 -0.1330 -vn 0.5334 -0.4280 0.7296 -vn 0.9643 -0.2131 -0.1569 -vn 0.5445 -0.2590 0.7978 -vn 0.9830 -0.0703 -0.1693 -vn 0.5483 -0.0866 0.8318 -vn 0.9830 0.0703 -0.1693 -vn 0.5483 0.0866 0.8318 -vn 0.9643 0.2131 -0.1569 -vn 0.5445 0.2590 0.7978 -vn 0.9229 0.3614 -0.1330 -vn 0.5334 0.4280 0.7296 -vn 0.8509 0.5157 -0.0999 -vn 0.5091 0.5888 0.6279 -vn 0.7387 0.6713 -0.0616 -vn 0.4653 0.7335 0.4955 -vn 0.5778 0.8158 -0.0242 -vn 0.3975 0.8530 0.3382 -vn 0.3680 0.9298 0.0045 -vn 0.3048 0.9381 0.1644 -vn 0.1229 0.9923 0.0177 -vn 0.1903 0.9816 -0.0156 -vn -0.1313 0.9913 0.0124 -vn 0.0612 0.9796 -0.1912 -vn -0.3669 0.9302 -0.0090 -vn -0.0731 0.9328 -0.3529 -vn -0.5651 0.8240 -0.0404 -vn -0.2025 0.8460 -0.4933 -vn -0.7200 0.6899 -0.0751 -vn -0.3184 0.7269 -0.6085 -vn -0.8337 0.5417 -0.1076 -vn -0.4148 0.5843 -0.6975 -vn -0.9119 0.3878 -0.1342 -vn -0.4884 0.4261 -0.7615 -vn -0.9605 0.2326 -0.1529 -vn -0.5376 0.2588 -0.8025 -vn -0.9837 0.0775 -0.1625 -vn -0.5622 0.0867 -0.8224 -vn -0.6261 -0.5222 -0.5791 -vn -0.5175 -0.6667 -0.5363 -vn -0.3735 -0.7981 -0.4728 -vn -0.1954 -0.9023 -0.3844 -vn 0.0076 -0.9626 -0.2708 -vn 0.2169 -0.9663 -0.1387 -vn 0.4103 -0.9120 -0.0005 -vn 0.5709 -0.8106 0.1302 -vn 0.6925 -0.6790 0.2437 -vn 0.7776 -0.5321 0.3350 -vn 0.8327 -0.3798 0.4029 -vn 0.8649 -0.2271 0.4476 -vn 0.8796 -0.0755 0.4697 -vn 0.8796 0.0755 0.4697 -vn 0.8649 0.2272 0.4476 -vn 0.8327 0.3798 0.4029 -vn 0.7776 0.5321 0.3350 -vn 0.6925 0.6790 0.2437 -vn 0.5709 0.8106 0.1302 -vn 0.4103 0.9120 -0.0005 -vn 0.2169 0.9663 -0.1387 -vn 0.0076 0.9626 -0.2708 -vn -0.1954 0.9023 -0.3844 -vn -0.3735 0.7981 -0.4728 -vn -0.5175 0.6667 -0.5363 -vn -0.6261 0.5222 -0.5791 -vn -0.7025 0.3729 -0.6062 -vn -0.7506 0.2233 -0.6219 -vn -0.7738 0.0743 -0.6291 -vn -0.7506 -0.2233 -0.6219 -vn -0.7738 -0.0743 -0.6291 -vn -0.8764 0.0830 -0.4744 -vn -0.8532 0.2487 -0.4584 -vn -0.8050 0.4131 -0.4258 -vn -0.7283 0.5731 -0.3756 -vn -0.6193 0.7223 -0.3077 -vn -0.4760 0.8505 -0.2236 -vn -0.3013 0.9449 -0.1281 -vn -0.1043 0.9941 -0.0293 -vn 0.1010 0.9929 0.0632 -vn 0.2997 0.9435 0.1412 -vn 0.4803 0.8540 0.2000 -vn 0.6358 0.7338 0.2394 -vn 0.7628 0.5911 0.2620 -vn 0.8594 0.4327 0.2723 -vn 0.9244 0.2637 0.2755 -vn 0.9571 0.0886 0.2758 -vn 0.9571 -0.0886 0.2758 -vn 0.9244 -0.2637 0.2755 -vn 0.8594 -0.4327 0.2723 -vn 0.7628 -0.5911 0.2620 -vn 0.6358 -0.7338 0.2394 -vn 0.4803 -0.8540 0.2000 -vn 0.2997 -0.9435 0.1412 -vn 0.1010 -0.9929 0.0632 -vn -0.1043 -0.9941 -0.0293 -vn -0.3013 -0.9449 -0.1281 -vn -0.4760 -0.8505 -0.2236 -vn -0.6193 -0.7223 -0.3077 -vn -0.7283 -0.5731 -0.3756 -vn -0.8050 -0.4131 -0.4258 -vn -0.8532 -0.2487 -0.4584 -vn -0.8764 -0.0830 -0.4744 -vn -0.0993 -0.0975 0.9903 -vn -0.0920 -0.2891 0.9529 -vn -0.0775 -0.4700 0.8793 -vn -0.0564 -0.6334 0.7718 -vn -0.0294 -0.7727 0.6341 -vn 0.0024 -0.8819 0.4714 -vn 0.0377 -0.9563 0.2901 -vn 0.0750 -0.9924 0.0977 -vn 0.1127 -0.9888 -0.0974 -vn 0.1492 -0.9462 -0.2870 -vn 0.1831 -0.8670 -0.4634 -vn 0.2130 -0.7553 -0.6198 -vn 0.2380 -0.6162 -0.7508 -vn 0.2573 -0.4555 -0.8522 -vn 0.2705 -0.2795 -0.9213 -vn 0.2771 -0.0942 -0.9562 -vn 0.2771 0.0942 -0.9562 -vn 0.2705 0.2795 -0.9213 -vn 0.2573 0.4555 -0.8522 -vn 0.2380 0.6162 -0.7508 -vn 0.2130 0.7553 -0.6198 -vn 0.1831 0.8670 -0.4634 -vn 0.1492 0.9462 -0.2870 -vn 0.1127 0.9888 -0.0974 -vn 0.0750 0.9924 0.0977 -vn 0.0377 0.9563 0.2901 -vn 0.0024 0.8819 0.4714 -vn -0.0294 0.7727 0.6341 -vn -0.0564 0.6334 0.7718 -vn -0.0775 0.4700 0.8793 -vn -0.0351 -0.9564 -0.2901 -vn -0.0920 0.2891 0.9529 -vn -0.0993 0.0975 0.9903 -vn -0.1060 0.4687 -0.8770 -vn 0.0765 0.7707 0.6325 -vn 0.0569 -0.8805 0.4706 -vn -0.1149 -0.2884 -0.9506 -vn -0.0118 0.9951 -0.0980 -vn 0.1149 -0.2884 0.9506 -vn -0.0569 -0.8805 -0.4706 -vn -0.0931 0.6316 -0.7697 -vn 0.0931 0.6316 0.7697 -vn 0.0351 -0.9564 0.2901 -vn -0.1195 -0.0973 -0.9881 -vn 0.0119 0.9951 0.0980 -vn 0.1060 -0.4687 0.8769 -vn -0.0765 -0.7707 -0.6325 -vn -0.0765 0.7707 -0.6325 -vn 0.1060 0.4687 0.8769 -vn 0.0119 -0.9951 0.0980 -vn -0.1195 0.0973 -0.9881 -vn 0.0351 0.9564 0.2901 -vn 0.0931 -0.6316 0.7697 -vn -0.0931 -0.6316 -0.7697 -vn -0.0569 0.8805 -0.4706 -vn 0.1149 0.2884 0.9506 -vn -0.0118 -0.9951 -0.0980 -vn -0.1149 0.2884 -0.9506 -vn 0.0569 0.8805 0.4706 -vn 0.0765 -0.7707 0.6325 -vn -0.1060 -0.4687 -0.8770 -vn -0.0351 0.9564 -0.2901 -vn 0.1195 -0.0973 0.9881 -vn 0.1195 0.0973 0.9881 -vn -0.7025 -0.3729 0.6062 -vn 0.1152 -0.4683 0.8760 -vn 0.1152 0.4683 0.8760 -vn -0.1922 0.0966 0.9766 -vn -0.0000 -0.0000 -1.0000 -vn -0.1857 0.2864 0.9400 -vn -0.1728 0.4660 0.8677 -vn -0.1540 0.6288 0.7621 -vn -0.1298 0.7685 0.6266 -vn -0.1011 0.8791 0.4658 -vn -0.0689 0.9558 0.2859 -vn -0.0346 0.9950 0.0940 -vn 0.0005 0.9948 -0.1020 -vn 0.0349 0.9553 -0.2937 -vn 0.0671 0.8783 -0.4734 -vn 0.0960 0.7676 -0.6338 -vn 0.1203 0.6279 -0.7689 -vn 0.1393 0.4652 -0.8742 -vn 0.1522 0.2859 -0.9461 -vn 0.1588 0.0964 -0.9826 -vn 0.1588 -0.0964 -0.9826 -vn 0.1522 -0.2859 -0.9461 -vn 0.1393 -0.4652 -0.8742 -vn 0.1203 -0.6279 -0.7689 -vn 0.0960 -0.7675 -0.6338 -vn 0.0671 -0.8783 -0.4734 -vn 0.0349 -0.9553 -0.2937 -vn 0.0005 -0.9948 -0.1020 -vn -0.0346 -0.9950 0.0940 -vn -0.0689 -0.9558 0.2859 -vn -0.1011 -0.8791 0.4658 -vn -0.1298 -0.7685 0.6266 -vn -0.1540 -0.6288 0.7621 -vn -0.1728 -0.4660 0.8677 -vn -0.1857 -0.2864 0.9399 -vn -0.1922 -0.0966 0.9766 -vn -0.9837 -0.0775 0.1625 -vn -0.5622 -0.0867 0.8224 -vn -0.9605 -0.2326 0.1529 -vn -0.5376 -0.2588 0.8025 -vn -0.9119 -0.3878 0.1342 -vn -0.4884 -0.4261 0.7615 -vn -0.8337 -0.5417 0.1076 -vn -0.4148 -0.5843 0.6975 -vn -0.7200 -0.6899 0.0751 -vn -0.3184 -0.7269 0.6085 -vn -0.5652 -0.8240 0.0404 -vn -0.2025 -0.8460 0.4933 -vn -0.3669 -0.9302 0.0090 -vn -0.0731 -0.9328 0.3529 -vn -0.1313 -0.9913 -0.0124 -vn 0.0612 -0.9796 0.1912 -vn 0.1229 -0.9923 -0.0177 -vn 0.1903 -0.9816 0.0156 -vn 0.3680 -0.9298 -0.0045 -vn 0.3048 -0.9381 -0.1644 -vn 0.5778 -0.8158 0.0242 -vn 0.3975 -0.8530 -0.3382 -vn 0.7387 -0.6713 0.0616 -vn 0.4652 -0.7335 -0.4955 -vn 0.8509 -0.5157 0.0999 -vn 0.5091 -0.5888 -0.6279 -vn 0.9229 -0.3614 0.1330 -vn 0.5334 -0.4280 -0.7296 -vn 0.9643 -0.2131 0.1569 -vn 0.5445 -0.2590 -0.7978 -vn 0.9830 -0.0703 0.1693 -vn 0.5483 -0.0866 -0.8318 -vn 0.9830 0.0703 0.1693 -vn 0.5483 0.0866 -0.8318 -vn 0.9643 0.2131 0.1569 -vn 0.5445 0.2590 -0.7978 -vn 0.9229 0.3614 0.1330 -vn 0.5334 0.4280 -0.7296 -vn 0.8509 0.5157 0.0999 -vn 0.5091 0.5888 -0.6279 -vn 0.7387 0.6713 0.0616 -vn 0.4652 0.7335 -0.4955 -vn 0.5778 0.8158 0.0242 -vn 0.3975 0.8530 -0.3382 -vn 0.3680 0.9298 -0.0045 -vn 0.3048 0.9381 -0.1644 -vn 0.1229 0.9923 -0.0177 -vn 0.1903 0.9816 0.0156 -vn -0.1313 0.9913 -0.0124 -vn 0.0612 0.9796 0.1912 -vn -0.3669 0.9302 0.0090 -vn -0.0731 0.9328 0.3529 -vn -0.5652 0.8240 0.0404 -vn -0.2025 0.8460 0.4933 -vn -0.7200 0.6899 0.0751 -vn -0.3184 0.7269 0.6085 -vn -0.8337 0.5417 0.1076 -vn -0.4148 0.5843 0.6975 -vn -0.9119 0.3878 0.1342 -vn -0.4884 0.4261 0.7615 -vn -0.9605 0.2326 0.1529 -vn -0.5376 0.2588 0.8025 -vn -0.9837 0.0775 0.1625 -vn -0.5622 0.0867 0.8224 -vn -0.6261 -0.5221 0.5791 -vn -0.5175 -0.6667 0.5363 -vn -0.3736 -0.7981 0.4728 -vn -0.1954 -0.9023 0.3844 -vn 0.0076 -0.9626 0.2708 -vn 0.2169 -0.9663 0.1387 -vn 0.4103 -0.9120 0.0005 -vn 0.5709 -0.8106 -0.1302 -vn 0.6925 -0.6790 -0.2437 -vn 0.7776 -0.5321 -0.3350 -vn 0.8327 -0.3798 -0.4029 -vn 0.8649 -0.2271 -0.4476 -vn 0.8796 -0.0755 -0.4697 -vn 0.8796 0.0755 -0.4697 -vn 0.8649 0.2271 -0.4476 -vn 0.8327 0.3798 -0.4029 -vn 0.7776 0.5321 -0.3350 -vn 0.6925 0.6790 -0.2437 -vn 0.5709 0.8106 -0.1302 -vn 0.4103 0.9120 0.0005 -vn 0.2169 0.9663 0.1387 -vn 0.0076 0.9626 0.2708 -vn -0.1954 0.9023 0.3844 -vn -0.3735 0.7981 0.4728 -vn -0.5175 0.6667 0.5363 -vn -0.6261 0.5222 0.5791 -vn -0.7025 0.3729 0.6062 -vn -0.7506 0.2233 0.6219 -vn -0.7738 0.0743 0.6291 -vn -0.7506 -0.2233 0.6219 -vn -0.7738 -0.0743 0.6291 -vn -0.8764 0.0830 0.4744 -vn -0.8532 0.2486 0.4584 -vn -0.8050 0.4131 0.4258 -vn -0.7283 0.5731 0.3756 -vn -0.6193 0.7223 0.3077 -vn -0.4760 0.8505 0.2236 -vn -0.3013 0.9449 0.1281 -vn -0.1043 0.9941 0.0293 -vn 0.1010 0.9929 -0.0632 -vn 0.2997 0.9435 -0.1412 -vn 0.4803 0.8540 -0.2000 -vn 0.6358 0.7338 -0.2394 -vn 0.7629 0.5911 -0.2620 -vn 0.8594 0.4327 -0.2723 -vn 0.9244 0.2637 -0.2755 -vn 0.9571 0.0885 -0.2758 -vn 0.9571 -0.0885 -0.2758 -vn 0.9244 -0.2637 -0.2755 -vn 0.8594 -0.4327 -0.2723 -vn 0.7629 -0.5911 -0.2620 -vn 0.6358 -0.7338 -0.2394 -vn 0.4803 -0.8540 -0.2000 -vn 0.2997 -0.9435 -0.1412 -vn 0.1010 -0.9929 -0.0632 -vn -0.1043 -0.9941 0.0293 -vn -0.3013 -0.9449 0.1281 -vn -0.4761 -0.8505 0.2236 -vn -0.6193 -0.7223 0.3077 -vn -0.7283 -0.5731 0.3756 -vn -0.8050 -0.4131 0.4258 -vn -0.8532 -0.2487 0.4584 -vn -0.8764 -0.0830 0.4744 -vn -0.1060 0.4687 0.8770 -vn 0.1060 -0.4687 -0.8769 -vn -0.7386 -0.3778 -0.5583 -vn -0.1046 0.0957 -0.9899 -vn 0.6109 -0.7917 -0.0030 -vn -0.0972 0.2839 -0.9539 -vn -0.0827 0.4621 -0.8830 -vn -0.0613 0.6238 -0.7792 -vn -0.0337 0.7626 -0.6460 -vn -0.0006 0.8729 -0.4879 -vn 0.0369 0.9497 -0.3108 -vn 0.0775 0.9895 -0.1219 -vn 0.1198 0.9902 0.0712 -vn 0.1621 0.9518 0.2602 -vn 0.2029 0.8760 0.4375 -vn 0.2405 0.7663 0.5958 -vn 0.2731 0.6274 0.7292 -vn 0.2994 0.4651 0.8331 -vn 0.3177 0.2859 0.9040 -vn 0.3272 0.0965 0.9400 -vn 0.3272 -0.0965 0.9400 -vn 0.3177 -0.2859 0.9040 -vn 0.2994 -0.4651 0.8331 -vn 0.2731 -0.6274 0.7292 -vn 0.2405 -0.7663 0.5958 -vn 0.2029 -0.8760 0.4375 -vn 0.1621 -0.9518 0.2602 -vn 0.1198 -0.9902 0.0712 -vn 0.0775 -0.9895 -0.1219 -vn 0.0369 -0.9497 -0.3108 -vn -0.0006 -0.8729 -0.4879 -vn -0.0337 -0.7626 -0.6460 -vn -0.0613 -0.6238 -0.7792 -vn -0.0827 -0.4621 -0.8830 -vn -0.0972 -0.2839 -0.9539 -vn -0.1046 -0.0958 -0.9899 -vn -0.9275 -0.0776 -0.3658 -vn -0.5959 -0.0874 -0.7983 -vn -0.9062 -0.2331 -0.3528 -vn -0.5709 -0.2608 -0.7785 -vn -0.8612 -0.3894 -0.3267 -vn -0.5208 -0.4294 -0.7378 -vn -0.7880 -0.5449 -0.2868 -vn -0.4460 -0.5887 -0.6742 -vn -0.6804 -0.6947 -0.2333 -vn -0.3480 -0.7322 -0.5854 -vn -0.5329 -0.8294 -0.1675 -vn -0.2305 -0.8518 -0.4705 -vn -0.3445 -0.9341 -0.0935 -vn -0.0997 -0.9387 -0.3301 -vn -0.1227 -0.9923 -0.0187 -vn 0.0351 -0.9851 -0.1683 -vn 0.1144 -0.9923 0.0478 -vn 0.1634 -0.9865 0.0080 -vn 0.3432 -0.9341 0.0980 -vn 0.2754 -0.9424 0.1897 -vn 0.5439 -0.8293 0.1287 -vn 0.3638 -0.8565 0.3662 -vn 0.7057 -0.6942 0.1418 -vn 0.4254 -0.7357 0.5270 -vn 0.8271 -0.5437 0.1425 -vn 0.4615 -0.5895 0.6630 -vn 0.9115 -0.3880 0.1367 -vn 0.4778 -0.4275 0.7674 -vn 0.9641 -0.2319 0.1297 -vn 0.4823 -0.2580 0.8371 -vn 0.9891 -0.0771 0.1252 -vn 0.4823 -0.0862 0.8718 -vn 0.9891 0.0771 0.1252 -vn 0.4823 0.0862 0.8718 -vn 0.9641 0.2319 0.1297 -vn 0.4823 0.2580 0.8371 -vn 0.9115 0.3880 0.1367 -vn 0.4778 0.4275 0.7674 -vn 0.8271 0.5437 0.1425 -vn 0.4615 0.5895 0.6630 -vn 0.7057 0.6942 0.1418 -vn 0.4254 0.7357 0.5270 -vn 0.5438 0.8293 0.1287 -vn 0.3638 0.8565 0.3662 -vn 0.3432 0.9341 0.0980 -vn 0.2754 0.9424 0.1897 -vn 0.1144 0.9923 0.0478 -vn 0.1634 0.9865 0.0080 -vn -0.1227 0.9923 -0.0187 -vn 0.0351 0.9851 -0.1683 -vn -0.3445 0.9341 -0.0935 -vn -0.0997 0.9387 -0.3301 -vn -0.5329 0.8294 -0.1675 -vn -0.2305 0.8518 -0.4705 -vn -0.6804 0.6947 -0.2333 -vn -0.3480 0.7322 -0.5854 -vn -0.7880 0.5449 -0.2868 -vn -0.4460 0.5887 -0.6742 -vn -0.8612 0.3894 -0.3267 -vn -0.5208 0.4294 -0.7378 -vn -0.9062 0.2331 -0.3528 -vn -0.5709 0.2608 -0.7785 -vn -0.9275 0.0776 -0.3658 -vn -0.5959 0.0874 -0.7983 -vn -0.6636 -0.5294 -0.5286 -vn -0.5562 -0.6767 -0.4823 -vn -0.4132 -0.8110 -0.4142 -vn -0.2352 -0.9177 -0.3202 -vn -0.0315 -0.9791 -0.2007 -vn 0.1787 -0.9819 -0.0632 -vn 0.3725 -0.9247 0.0790 -vn 0.5325 -0.8195 0.2119 -vn 0.6524 -0.6842 0.3259 -vn 0.7351 -0.5346 0.4169 -vn 0.7879 -0.3806 0.4841 -vn 0.8182 -0.2272 0.5281 -vn 0.8318 -0.0755 0.5499 -vn 0.8318 0.0755 0.5499 -vn 0.8182 0.2272 0.5281 -vn 0.7879 0.3806 0.4841 -vn 0.7351 0.5346 0.4169 -vn 0.6524 0.6842 0.3259 -vn 0.5325 0.8195 0.2119 -vn 0.3725 0.9247 0.0790 -vn 0.1787 0.9819 -0.0632 -vn -0.0315 0.9791 -0.2007 -vn -0.2352 0.9177 -0.3202 -vn -0.4132 0.8110 -0.4142 -vn -0.5562 0.6767 -0.4823 -vn -0.6636 0.5294 -0.5286 -vn -0.7386 0.3777 -0.5583 -vn -0.7858 0.2260 -0.5757 -vn -0.8085 0.0752 -0.5837 -vn -0.7858 -0.2260 -0.5757 -vn -0.8085 -0.0752 -0.5837 -vn -0.9503 0.0881 -0.2984 -vn -0.9219 0.2632 -0.2841 -vn -0.8638 0.4341 -0.2559 -vn -0.7737 0.5960 -0.2150 -vn -0.6502 0.7419 -0.1639 -vn -0.4941 0.8628 -0.1069 -vn -0.3101 0.9494 -0.0501 -vn -0.1069 0.9943 -0.0008 -vn 0.1038 0.9940 0.0342 -vn 0.3100 0.9494 0.0506 -vn 0.5006 0.8644 0.0468 -vn 0.6662 0.7454 0.0255 -vn 0.7999 0.6002 -0.0073 -vn 0.8983 0.4374 -0.0429 -vn 0.9615 0.2650 -0.0726 -vn 0.9920 0.0887 -0.0894 -vn 0.9920 -0.0887 -0.0894 -vn 0.9615 -0.2650 -0.0726 -vn 0.8983 -0.4374 -0.0429 -vn 0.7999 -0.6001 -0.0073 -vn 0.6661 -0.7454 0.0255 -vn 0.5006 -0.8644 0.0468 -vn 0.3100 -0.9494 0.0506 -vn 0.1038 -0.9940 0.0342 -vn -0.1069 -0.9943 -0.0008 -vn -0.3101 -0.9494 -0.0501 -vn -0.4941 -0.8628 -0.1069 -vn -0.6502 -0.7419 -0.1639 -vn -0.7737 -0.5960 -0.2150 -vn -0.8637 -0.4341 -0.2559 -vn -0.9219 -0.2632 -0.2841 -vn -0.9503 -0.0881 -0.2984 -vn -0.3194 0.9437 -0.0860 -vn 0.7635 -0.6444 -0.0425 -vn -0.8741 -0.1360 -0.4663 -vn -0.4548 0.8752 -0.1650 -vn 0.8989 -0.4307 -0.0803 -vn -0.8175 -0.3916 -0.4223 -vn -0.5906 0.7655 -0.2552 -vn 0.9827 -0.1528 -0.1044 -vn -0.7169 -0.6052 -0.3462 -vn -0.7169 0.6052 -0.3462 -vn 0.9827 0.1528 -0.1044 -vn -0.5906 -0.7655 -0.2552 -vn -0.8175 0.3916 -0.4223 -vn 0.8989 0.4307 -0.0803 -vn -0.4548 -0.8752 -0.1650 -vn -0.8741 0.1360 -0.4663 -vn 0.7635 0.6445 -0.0425 -vn -0.3194 -0.9437 -0.0860 -vn 0.6109 0.7917 -0.0030 -vn -0.1886 -0.9818 -0.0232 -vn 0.4609 0.8869 0.0297 -vn -0.0622 -0.9978 0.0214 -vn 0.3202 0.9460 0.0506 -vn 0.0622 -0.9969 0.0480 -vn 0.1883 0.9804 0.0573 -vn 0.1883 -0.9804 0.0573 -vn 0.0622 0.9969 0.0480 -vn 0.3202 -0.9460 0.0506 -vn -0.0622 0.9978 0.0214 -vn 0.4609 -0.8869 0.0297 -vn -0.1886 0.9818 -0.0232 -vn 0.1060 -0.4687 0.8770 -vn -0.0765 0.7708 -0.6325 -vn 0.1060 0.4687 0.8770 -vn -0.7386 -0.3777 0.5583 -vn -0.1046 0.0958 0.9899 -vn 0.6109 -0.7917 0.0030 -vn -0.0972 0.2839 0.9539 -vn -0.0827 0.4621 0.8830 -vn -0.0613 0.6238 0.7792 -vn -0.0337 0.7626 0.6460 -vn -0.0006 0.8729 0.4879 -vn 0.0369 0.9497 0.3108 -vn 0.0775 0.9895 0.1219 -vn 0.1198 0.9902 -0.0712 -vn 0.1621 0.9518 -0.2602 -vn 0.2029 0.8760 -0.4375 -vn 0.2405 0.7663 -0.5958 -vn 0.2731 0.6274 -0.7292 -vn 0.2994 0.4651 -0.8331 -vn 0.3177 0.2859 -0.9040 -vn 0.3272 0.0965 -0.9400 -vn 0.3272 -0.0965 -0.9400 -vn 0.3177 -0.2859 -0.9040 -vn 0.2994 -0.4651 -0.8331 -vn 0.2731 -0.6274 -0.7292 -vn 0.2405 -0.7663 -0.5958 -vn 0.2029 -0.8760 -0.4375 -vn 0.1621 -0.9518 -0.2602 -vn 0.1198 -0.9902 -0.0712 -vn 0.0775 -0.9895 0.1219 -vn 0.0369 -0.9497 0.3108 -vn -0.0006 -0.8729 0.4879 -vn -0.0336 -0.7626 0.6460 -vn -0.0613 -0.6238 0.7792 -vn -0.0827 -0.4621 0.8830 -vn -0.0972 -0.2839 0.9539 -vn -0.1046 -0.0958 0.9899 -vn -0.9275 -0.0776 0.3658 -vn -0.5959 -0.0874 0.7983 -vn -0.9062 -0.2331 0.3528 -vn -0.5709 -0.2608 0.7785 -vn -0.8612 -0.3894 0.3267 -vn -0.5208 -0.4294 0.7378 -vn -0.7880 -0.5449 0.2868 -vn -0.4460 -0.5887 0.6742 -vn -0.6804 -0.6947 0.2333 -vn -0.3480 -0.7322 0.5854 -vn -0.5329 -0.8294 0.1675 -vn -0.2305 -0.8518 0.4705 -vn -0.3445 -0.9341 0.0935 -vn -0.0997 -0.9387 0.3301 -vn -0.1227 -0.9923 0.0187 -vn 0.0351 -0.9851 0.1683 -vn 0.1144 -0.9923 -0.0478 -vn 0.1634 -0.9865 -0.0080 -vn 0.3432 -0.9341 -0.0980 -vn 0.2754 -0.9424 -0.1897 -vn 0.5438 -0.8293 -0.1287 -vn 0.3638 -0.8565 -0.3662 -vn 0.7057 -0.6942 -0.1418 -vn 0.4254 -0.7357 -0.5270 -vn 0.8271 -0.5437 -0.1425 -vn 0.4615 -0.5895 -0.6630 -vn 0.9115 -0.3879 -0.1367 -vn 0.4778 -0.4275 -0.7674 -vn 0.9641 -0.2319 -0.1297 -vn 0.4823 -0.2580 -0.8371 -vn 0.9891 -0.0771 -0.1252 -vn 0.4823 -0.0861 -0.8718 -vn 0.9891 0.0771 -0.1252 -vn 0.4823 0.0861 -0.8718 -vn 0.9641 0.2319 -0.1297 -vn 0.4823 0.2580 -0.8371 -vn 0.9115 0.3879 -0.1367 -vn 0.4778 0.4275 -0.7674 -vn 0.8271 0.5437 -0.1425 -vn 0.4615 0.5895 -0.6630 -vn 0.7057 0.6942 -0.1418 -vn 0.4254 0.7357 -0.5270 -vn 0.5438 0.8293 -0.1287 -vn 0.3638 0.8565 -0.3662 -vn 0.3432 0.9341 -0.0980 -vn 0.2754 0.9424 -0.1897 -vn 0.1144 0.9923 -0.0478 -vn 0.1634 0.9865 -0.0080 -vn -0.1227 0.9923 0.0187 -vn 0.0351 0.9851 0.1683 -vn -0.3445 0.9341 0.0935 -vn -0.0997 0.9387 0.3301 -vn -0.5330 0.8294 0.1675 -vn -0.2305 0.8518 0.4705 -vn -0.6804 0.6947 0.2333 -vn -0.3480 0.7322 0.5854 -vn -0.7880 0.5449 0.2868 -vn -0.4460 0.5887 0.6742 -vn -0.8612 0.3894 0.3267 -vn -0.5208 0.4294 0.7378 -vn -0.9062 0.2331 0.3528 -vn -0.5709 0.2608 0.7785 -vn -0.9275 0.0776 0.3658 -vn -0.5959 0.0874 0.7983 -vn -0.6636 -0.5294 0.5286 -vn -0.5562 -0.6767 0.4823 -vn -0.4132 -0.8110 0.4142 -vn -0.2352 -0.9177 0.3202 -vn -0.0315 -0.9791 0.2007 -vn 0.1787 -0.9819 0.0632 -vn 0.3725 -0.9247 -0.0790 -vn 0.5325 -0.8195 -0.2119 -vn 0.6524 -0.6843 -0.3259 -vn 0.7351 -0.5346 -0.4169 -vn 0.7879 -0.3806 -0.4841 -vn 0.8182 -0.2272 -0.5281 -vn 0.8318 -0.0755 -0.5499 -vn 0.8318 0.0755 -0.5499 -vn 0.8182 0.2272 -0.5281 -vn 0.7879 0.3806 -0.4841 -vn 0.7351 0.5346 -0.4169 -vn 0.6524 0.6842 -0.3259 -vn 0.5325 0.8195 -0.2119 -vn 0.3725 0.9247 -0.0790 -vn 0.1787 0.9819 0.0632 -vn -0.0315 0.9791 0.2007 -vn -0.2352 0.9177 0.3202 -vn -0.4132 0.8110 0.4142 -vn -0.5562 0.6767 0.4823 -vn -0.6636 0.5294 0.5286 -vn -0.7386 0.3777 0.5583 -vn -0.7858 0.2260 0.5757 -vn -0.8085 0.0752 0.5837 -vn -0.7858 -0.2260 0.5757 -vn -0.8085 -0.0752 0.5837 -vn -0.9503 0.0881 0.2984 -vn -0.9219 0.2632 0.2841 -vn -0.8638 0.4341 0.2559 -vn -0.7737 0.5960 0.2150 -vn -0.6502 0.7419 0.1639 -vn -0.4941 0.8628 0.1069 -vn -0.3101 0.9494 0.0501 -vn -0.1069 0.9943 0.0008 -vn 0.1038 0.9940 -0.0342 -vn 0.3100 0.9494 -0.0506 -vn 0.5006 0.8644 -0.0468 -vn 0.6661 0.7454 -0.0255 -vn 0.7998 0.6002 0.0073 -vn 0.8983 0.4374 0.0429 -vn 0.9615 0.2650 0.0726 -vn 0.9920 0.0887 0.0894 -vn 0.9920 -0.0887 0.0894 -vn 0.9615 -0.2650 0.0726 -vn 0.8983 -0.4374 0.0429 -vn 0.7998 -0.6002 0.0073 -vn 0.6661 -0.7454 -0.0255 -vn 0.5006 -0.8644 -0.0468 -vn 0.3100 -0.9494 -0.0506 -vn 0.1038 -0.9940 -0.0342 -vn -0.1069 -0.9943 0.0008 -vn -0.3101 -0.9494 0.0501 -vn -0.4941 -0.8628 0.1069 -vn -0.6502 -0.7419 0.1639 -vn -0.7737 -0.5960 0.2150 -vn -0.8638 -0.4341 0.2559 -vn -0.9219 -0.2632 0.2841 -vn -0.9503 -0.0881 0.2984 -vn -0.3194 0.9437 0.0860 -vn 0.7635 -0.6445 0.0425 -vn -0.8741 -0.1360 0.4663 -vn -0.4548 0.8752 0.1650 -vn 0.8989 -0.4306 0.0803 -vn -0.8175 -0.3916 0.4223 -vn -0.5906 0.7655 0.2552 -vn 0.9827 -0.1529 0.1044 -vn -0.7169 -0.6052 0.3462 -vn -0.7169 0.6052 0.3462 -vn 0.9827 0.1529 0.1044 -vn -0.5906 -0.7655 0.2552 -vn -0.8175 0.3916 0.4223 -vn 0.8989 0.4306 0.0803 -vn -0.4548 -0.8752 0.1650 -vn -0.8741 0.1360 0.4663 -vn 0.7635 0.6445 0.0425 -vn -0.3194 -0.9437 0.0860 -vn 0.6109 0.7917 0.0030 -vn -0.1886 -0.9818 0.0232 -vn 0.4609 0.8869 -0.0297 -vn -0.0622 -0.9978 -0.0214 -vn 0.3202 0.9460 -0.0506 -vn 0.0622 -0.9969 -0.0480 -vn 0.1883 0.9804 -0.0573 -vn 0.1883 -0.9804 -0.0573 -vn 0.0622 0.9969 -0.0480 -vn 0.3202 -0.9460 -0.0506 -vn -0.0622 0.9978 -0.0214 -vn 0.4609 -0.8869 -0.0297 -vn -0.1886 0.9818 0.0232 -usemtl Jewelry +vn 1.0000 0.0000 0.0000 +usemtl Material.001 s off -f 768/1/1 738/2/1 58/3/1 57/4/1 -f 196/5/2 194/6/2 83/7/2 84/8/2 -f 1219/9/3 1218/10/3 1115/11/3 1114/12/3 -f 85/13/4 84/8/4 116/14/4 117/15/4 -f 197/16/5 196/5/5 84/8/5 85/13/5 -f 738/2/6 739/17/6 59/18/6 58/3/6 -f 198/19/7 197/16/7 85/13/7 86/20/7 -f 739/17/8 740/21/8 60/22/8 59/18/8 -f 769/23/9 741/24/9 34/25/9 33/26/9 -f 199/27/10 198/19/10 86/20/10 87/28/10 -f 740/21/11 742/29/11 61/30/11 60/22/11 -f 741/24/12 743/31/12 35/32/12 34/25/12 -f 200/33/13 199/27/13 87/28/13 88/34/13 -f 742/29/14 744/35/14 62/36/14 61/30/14 -f 743/31/15 745/37/15 36/38/15 35/32/15 -f 201/39/16 200/33/16 88/34/16 89/40/16 -f 744/35/17 746/41/17 63/42/17 62/36/17 -f 745/37/18 747/43/18 37/44/18 36/38/18 -f 202/45/1 201/39/1 89/40/1 90/46/1 -f 746/41/19 748/47/19 64/48/19 63/42/19 -f 747/43/20 749/49/20 38/50/20 37/44/20 -f 203/51/6 202/45/6 90/46/6 91/52/6 -f 748/47/21 769/53/21 33/54/21 64/48/21 -f 749/49/22 750/55/22 39/56/22 38/50/22 -f 204/57/8 203/51/8 91/52/8 92/58/8 -f 205/59/9 195/60/9 66/61/9 65/62/9 -f 750/55/23 751/63/23 40/64/23 39/56/23 -f 206/65/11 204/57/11 92/58/11 93/66/11 -f 207/67/12 205/59/12 65/62/12 67/68/12 -f 751/63/24 752/69/24 41/70/24 40/64/24 -f 208/71/14 206/65/14 93/66/14 94/72/14 -f 209/73/15 207/67/15 67/68/15 68/74/15 -f 752/69/25 753/75/25 42/76/25 41/70/25 -f 210/77/17 208/71/17 94/72/17 95/78/17 -f 211/79/18 209/73/18 68/74/18 69/80/18 -f 753/75/26 754/81/26 43/82/26 42/76/26 -f 212/83/19 210/77/19 95/78/19 96/84/19 -f 213/85/20 211/79/20 69/80/20 70/86/20 -f 754/81/27 755/87/27 44/88/27 43/82/27 -f 195/89/21 212/83/21 96/84/21 66/90/21 -f 214/91/22 213/85/22 70/86/22 71/92/22 -f 755/87/28 756/93/28 45/94/28 44/88/28 -f 215/95/23 214/91/23 71/92/23 72/96/23 -f 756/93/29 757/97/29 46/98/29 45/94/29 -f 216/99/24 215/95/24 72/96/24 73/100/24 -f 757/97/30 758/101/30 47/102/30 46/98/30 -f 217/103/25 216/99/25 73/100/25 74/104/25 -f 758/101/31 759/105/31 48/106/31 47/102/31 -f 218/107/26 217/103/26 74/104/26 75/108/26 -f 759/105/32 760/109/32 49/110/32 48/106/32 -f 219/111/27 218/107/27 75/108/27 76/112/27 -f 760/109/33 761/113/33 50/114/33 49/110/33 -f 220/115/28 219/111/28 76/112/28 77/116/28 -f 761/113/34 762/117/34 51/118/34 50/114/34 -f 221/119/29 220/115/29 77/116/29 78/120/29 -f 762/117/2 763/121/2 52/122/2 51/118/2 -f 222/123/30 221/119/30 78/120/30 79/124/30 -f 763/121/5 764/125/5 53/126/5 52/122/5 -f 223/127/31 222/123/31 79/124/31 80/128/31 -f 764/125/7 765/129/7 54/130/7 53/126/7 -f 224/131/32 223/127/32 80/128/32 81/132/32 -f 765/129/10 766/133/10 55/134/10 54/130/10 -f 225/135/33 224/131/33 81/132/33 82/136/33 -f 766/133/13 767/137/13 56/138/13 55/134/13 -f 194/6/34 225/135/34 82/136/34 83/7/34 -f 767/137/16 768/1/16 57/4/16 56/138/16 -f 128/139/35 127/140/35 159/141/35 160/142/35 -f 72/96/36 71/92/36 103/143/36 104/144/36 -f 86/20/37 85/13/37 117/15/37 118/145/37 -f 73/100/38 72/96/38 104/144/38 105/146/38 -f 87/28/39 86/20/39 118/145/39 119/147/39 -f 74/104/40 73/100/40 105/146/40 106/148/40 -f 88/34/41 87/28/41 119/147/41 120/149/41 -f 75/108/42 74/104/42 106/148/42 107/150/42 -f 89/40/43 88/34/43 120/149/43 121/151/43 -f 76/112/44 75/108/44 107/150/44 108/152/44 -f 90/46/45 89/40/45 121/151/45 122/153/45 -f 77/116/46 76/112/46 108/152/46 109/154/46 -f 91/52/47 90/46/47 122/153/47 123/155/47 -f 78/120/48 77/116/48 109/154/48 110/156/48 -f 92/58/49 91/52/49 123/155/49 124/157/49 -f 79/124/50 78/120/50 110/156/50 111/158/50 -f 65/62/51 66/61/51 98/159/51 97/160/51 -f 93/66/52 92/58/52 124/157/52 125/161/52 -f 80/128/53 79/124/53 111/158/53 112/162/53 -f 67/68/54 65/62/54 97/160/54 99/163/54 -f 94/72/55 93/66/55 125/161/55 126/164/55 -f 81/132/56 80/128/56 112/162/56 113/165/56 -f 68/74/57 67/68/57 99/163/57 100/166/57 -f 95/78/58 94/72/58 126/164/58 127/140/58 -f 82/136/59 81/132/59 113/165/59 114/167/59 -f 69/80/60 68/74/60 100/166/60 101/168/60 -f 96/84/61 95/78/61 127/140/61 128/139/61 -f 83/7/62 82/136/62 114/167/62 115/169/62 -f 70/86/63 69/80/63 101/168/63 102/170/63 -f 66/90/64 96/84/64 128/139/64 98/171/64 -f 84/8/65 83/7/65 115/169/65 116/14/65 -f 71/92/66 70/86/66 102/170/66 103/143/66 -f 150/172/67 149/173/67 161/174/67 -f 115/169/68 114/167/68 146/175/68 147/176/68 -f 102/170/69 101/168/69 133/177/69 134/178/69 -f 98/171/70 128/139/70 160/142/70 130/179/70 -f 116/14/71 115/169/71 147/176/71 148/180/71 -f 103/143/72 102/170/72 134/178/72 135/181/72 -f 117/15/73 116/14/73 148/180/73 149/173/73 -f 104/144/74 103/143/74 135/181/74 136/182/74 -f 118/145/75 117/15/75 149/173/75 150/172/75 -f 105/146/76 104/144/76 136/182/76 137/183/76 -f 119/147/77 118/145/77 150/172/77 151/184/77 -f 106/148/78 105/146/78 137/183/78 138/185/78 -f 120/149/79 119/147/79 151/184/79 152/186/79 -f 107/150/80 106/148/80 138/185/80 139/187/80 -f 121/151/81 120/149/81 152/186/81 153/188/81 -f 108/152/82 107/150/82 139/187/82 140/189/82 -f 122/153/83 121/151/83 153/188/83 154/190/83 -f 109/154/84 108/152/84 140/189/84 141/191/84 -f 123/155/85 122/153/85 154/190/85 155/192/85 -f 110/156/86 109/154/86 141/191/86 142/193/86 -f 124/157/87 123/155/87 155/192/87 156/194/87 -f 111/158/88 110/156/88 142/193/88 143/195/88 -f 97/160/89 98/159/89 130/196/89 129/197/89 -f 125/161/90 124/157/90 156/194/90 157/198/90 -f 112/162/91 111/158/91 143/195/91 144/199/91 -f 99/163/92 97/160/92 129/197/92 131/200/92 -f 126/164/93 125/161/93 157/198/93 158/201/93 -f 113/165/94 112/162/94 144/199/94 145/202/94 -f 100/166/95 99/163/95 131/200/95 132/203/95 -f 127/140/96 126/164/96 158/201/96 159/141/96 -f 114/167/97 113/165/97 145/202/97 146/175/97 -f 101/168/98 100/166/98 132/203/98 133/177/98 -f 137/183/99 136/182/99 161/204/99 -f 151/184/100 150/172/100 161/205/100 -f 138/185/101 137/183/101 161/206/101 -f 152/186/102 151/184/102 161/207/102 -f 139/187/103 138/185/103 161/208/103 -f 153/188/104 152/186/104 161/209/104 -f 140/189/105 139/187/105 161/210/105 -f 154/190/106 153/188/106 161/211/106 -f 141/191/107 140/189/107 161/212/107 -f 155/192/108 154/190/108 161/213/108 -f 142/193/109 141/191/109 161/214/109 -f 156/194/110 155/192/110 161/215/110 -f 143/195/111 142/193/111 161/216/111 -f 129/197/112 130/196/112 161/217/112 -f 157/198/113 156/194/113 161/218/113 -f 144/199/114 143/195/114 161/219/114 -f 131/200/115 129/197/115 161/220/115 -f 158/201/116 157/198/116 161/221/116 -f 145/202/117 144/199/117 161/222/117 -f 132/203/118 131/200/118 161/223/118 -f 159/141/119 158/201/119 161/224/119 -f 146/175/120 145/202/120 161/225/120 -f 133/177/121 132/203/121 161/226/121 -f 160/142/122 159/141/122 161/227/122 -f 147/176/123 146/175/123 161/228/123 -f 134/178/124 133/177/124 161/229/124 -f 130/179/125 160/142/125 161/230/125 -f 148/180/126 147/176/126 161/231/126 -f 135/181/127 134/178/127 161/232/127 -f 149/173/128 148/180/128 161/233/128 -f 136/182/129 135/181/129 161/234/129 -f 597/235/130 574/236/130 225/135/130 194/6/130 -f 574/236/131 562/237/131 224/131/131 225/135/131 -f 562/237/132 550/238/132 223/127/132 224/131/132 -f 550/238/133 538/239/133 222/123/133 223/127/133 -f 538/239/134 526/240/134 221/119/134 222/123/134 -f 526/240/135 514/241/135 220/115/135 221/119/135 -f 514/241/136 502/242/136 219/111/136 220/115/136 -f 502/242/137 490/243/137 218/107/137 219/111/137 -f 490/243/138 478/244/138 217/103/138 218/107/138 -f 478/244/139 466/245/139 216/99/139 217/103/139 -f 466/245/140 454/246/140 215/95/140 216/99/140 -f 454/246/141 442/247/141 214/91/141 215/95/141 -f 442/247/142 430/248/142 213/85/142 214/91/142 -f 609/249/143 418/250/143 212/83/143 195/89/143 -f 430/248/144 406/251/144 211/79/144 213/85/144 -f 418/250/145 394/252/145 210/77/145 212/83/145 -f 406/251/146 382/253/146 209/73/146 211/79/146 -f 394/252/147 370/254/147 208/71/147 210/77/147 -f 382/253/148 358/255/148 207/67/148 209/73/148 -f 370/254/149 346/256/149 206/65/149 208/71/149 -f 358/255/150 334/257/150 205/59/150 207/67/150 -f 346/256/151 322/258/151 204/57/151 206/65/151 -f 334/257/152 609/259/152 195/60/152 205/59/152 -f 322/258/153 310/260/153 203/51/153 204/57/153 -f 310/260/154 298/261/154 202/45/154 203/51/154 -f 298/261/155 286/262/155 201/39/155 202/45/155 -f 286/262/156 274/263/156 200/33/156 201/39/156 -f 274/263/157 262/264/157 199/27/157 200/33/157 -f 262/264/158 250/265/158 198/19/158 199/27/158 -f 250/265/159 238/266/159 197/16/159 198/19/159 -f 238/266/160 226/267/160 196/5/160 197/16/160 -f 226/267/161 597/235/161 194/6/161 196/5/161 -f 163/268/162 162/269/162 586/270/162 237/271/162 -f 237/271/163 586/270/163 587/272/163 236/273/163 -f 236/273/2 587/272/2 588/274/2 235/275/2 -f 235/275/2 588/274/2 589/276/2 234/277/2 -f 674/278/164 704/279/164 590/280/164 233/281/164 -f 233/281/2 590/280/2 591/282/2 232/283/2 -f 642/284/164 672/285/164 592/286/164 231/287/164 -f 231/287/2 592/286/2 593/288/2 230/289/2 -f 610/290/164 640/291/164 594/292/164 229/293/164 -f 229/293/2 594/292/2 595/294/2 228/295/2 -f 228/295/2 595/294/2 596/296/2 227/297/2 -f 227/297/165 596/296/165 597/235/165 226/267/165 -f 164/298/166 163/268/166 237/271/166 249/299/166 -f 249/299/167 237/271/167 236/273/167 248/300/167 -f 248/300/5 236/273/5 235/275/5 247/301/5 -f 247/301/5 235/275/5 234/277/5 246/302/5 -f 675/303/168 674/278/168 233/281/168 245/304/168 -f 245/304/5 233/281/5 232/283/5 244/305/5 -f 643/306/168 642/284/168 231/287/168 243/307/168 -f 243/307/5 231/287/5 230/289/5 242/308/5 -f 611/309/168 610/290/168 229/293/168 241/310/168 -f 241/310/5 229/293/5 228/295/5 240/311/5 -f 240/311/5 228/295/5 227/297/5 239/312/5 -f 239/312/169 227/297/169 226/267/169 238/266/169 -f 165/313/170 164/298/170 249/299/170 261/314/170 -f 261/314/171 249/299/171 248/300/171 260/315/171 -f 260/315/7 248/300/7 247/301/7 259/316/7 -f 259/316/7 247/301/7 246/302/7 258/317/7 -f 676/318/172 675/303/172 245/304/172 257/319/172 -f 257/319/7 245/304/7 244/305/7 256/320/7 -f 644/321/172 643/306/172 243/307/172 255/322/172 -f 255/322/7 243/307/7 242/308/7 254/323/7 -f 612/324/172 611/309/172 241/310/172 253/325/172 -f 253/325/7 241/310/7 240/311/7 252/326/7 -f 252/326/7 240/311/7 239/312/7 251/327/7 -f 251/327/173 239/312/173 238/266/173 250/265/173 -f 166/328/174 165/313/174 261/314/174 273/329/174 -f 273/329/175 261/314/175 260/315/175 272/330/175 -f 272/330/10 260/315/10 259/316/10 271/331/10 -f 271/331/10 259/316/10 258/317/10 270/332/10 -f 677/333/176 676/318/176 257/319/176 269/334/176 -f 269/334/10 257/319/10 256/320/10 268/335/10 -f 645/336/176 644/321/176 255/322/176 267/337/176 -f 267/337/10 255/322/10 254/323/10 266/338/10 -f 613/339/176 612/324/176 253/325/176 265/340/176 -f 265/340/10 253/325/10 252/326/10 264/341/10 -f 264/341/10 252/326/10 251/327/10 263/342/10 -f 263/342/177 251/327/177 250/265/177 262/264/177 -f 167/343/178 166/328/178 273/329/178 285/344/178 -f 285/344/179 273/329/179 272/330/179 284/345/179 -f 284/345/13 272/330/13 271/331/13 283/346/13 -f 283/346/13 271/331/13 270/332/13 282/347/13 -f 678/348/180 677/333/180 269/334/180 281/349/180 -f 281/349/13 269/334/13 268/335/13 280/350/13 -f 646/351/180 645/336/180 267/337/180 279/352/180 -f 279/352/13 267/337/13 266/338/13 278/353/13 -f 614/354/180 613/339/180 265/340/180 277/355/180 -f 277/355/13 265/340/13 264/341/13 276/356/13 -f 276/356/13 264/341/13 263/342/13 275/357/13 -f 275/357/181 263/342/181 262/264/181 274/263/181 -f 168/358/182 167/343/182 285/344/182 297/359/182 -f 297/359/183 285/344/183 284/345/183 296/360/183 -f 296/360/16 284/345/16 283/346/16 295/361/16 -f 295/361/16 283/346/16 282/347/16 294/362/16 -f 679/363/184 678/348/184 281/349/184 293/364/184 -f 293/364/16 281/349/16 280/350/16 292/365/16 -f 647/366/184 646/351/184 279/352/184 291/367/184 -f 291/367/16 279/352/16 278/353/16 290/368/16 -f 615/369/184 614/354/184 277/355/184 289/370/184 -f 289/370/16 277/355/16 276/356/16 288/371/16 -f 288/371/16 276/356/16 275/357/16 287/372/16 -f 287/372/185 275/357/185 274/263/185 286/262/185 -f 169/373/186 168/358/186 297/359/186 309/374/186 -f 309/374/187 297/359/187 296/360/187 308/375/187 -f 308/375/1 296/360/1 295/361/1 307/376/1 -f 307/376/1 295/361/1 294/362/1 306/377/1 -f 680/378/188 679/363/188 293/364/188 305/379/188 -f 305/379/1 293/364/1 292/365/1 304/380/1 -f 648/381/189 647/366/189 291/367/189 303/382/189 -f 303/382/1 291/367/1 290/368/1 302/383/1 -f 616/384/189 615/369/189 289/370/189 301/385/189 -f 301/385/1 289/370/1 288/371/1 300/386/1 -f 300/386/1 288/371/1 287/372/1 299/387/1 -f 299/387/190 287/372/190 286/262/190 298/261/190 -f 170/388/191 169/373/191 309/374/191 321/389/191 -f 321/389/192 309/374/192 308/375/192 320/390/192 -f 320/390/6 308/375/6 307/376/6 319/391/6 -f 319/391/6 307/376/6 306/377/6 318/392/6 -f 681/393/193 680/378/193 305/379/193 317/394/193 -f 317/394/6 305/379/6 304/380/6 316/395/6 -f 649/396/193 648/381/193 303/382/193 315/397/193 -f 315/397/6 303/382/6 302/383/6 314/398/6 -f 617/399/193 616/384/193 301/385/193 313/400/193 -f 313/400/6 301/385/6 300/386/6 312/401/6 -f 312/401/6 300/386/6 299/387/6 311/402/6 -f 311/402/194 299/387/194 298/261/194 310/260/194 -f 171/403/195 170/388/195 321/389/195 333/404/195 -f 333/404/196 321/389/196 320/390/196 332/405/196 -f 332/405/8 320/390/8 319/391/8 331/406/8 -f 331/406/8 319/391/8 318/392/8 330/407/8 -f 682/408/197 681/393/197 317/394/197 329/409/197 -f 329/409/8 317/394/8 316/395/8 328/410/8 -f 650/411/197 649/396/197 315/397/197 327/412/197 -f 327/412/8 315/397/8 314/398/8 326/413/8 -f 618/414/197 617/399/197 313/400/197 325/415/197 -f 325/415/8 313/400/8 312/401/8 324/416/8 -f 324/416/8 312/401/8 311/402/8 323/417/8 -f 323/417/198 311/402/198 310/260/198 322/258/198 -f 173/418/199 172/419/199 598/420/199 345/421/199 -f 345/421/200 598/420/200 599/422/200 344/423/200 -f 344/423/9 599/422/9 600/424/9 343/425/9 -f 343/425/9 600/424/9 601/426/9 342/427/9 -f 683/428/201 705/429/201 602/430/201 341/431/201 -f 341/431/9 602/430/9 603/432/9 340/433/9 -f 651/434/202 673/435/202 604/436/202 339/437/202 -f 339/437/9 604/436/9 605/438/9 338/439/9 -f 619/440/201 641/441/201 606/442/201 337/443/201 -f 337/443/9 606/442/9 607/444/9 336/445/9 -f 336/445/9 607/444/9 608/446/9 335/447/9 -f 335/447/203 608/446/203 609/259/203 334/257/203 -f 174/448/204 171/403/204 333/404/204 357/449/204 -f 357/449/205 333/404/205 332/405/205 356/450/205 -f 356/450/11 332/405/11 331/406/11 355/451/11 -f 355/451/11 331/406/11 330/407/11 354/452/11 -f 684/453/206 682/408/206 329/409/206 353/454/206 -f 353/454/11 329/409/11 328/410/11 352/455/11 -f 652/456/206 650/411/206 327/412/206 351/457/206 -f 351/457/11 327/412/11 326/413/11 350/458/11 -f 620/459/206 618/414/206 325/415/206 349/460/206 -f 349/460/11 325/415/11 324/416/11 348/461/11 -f 348/461/11 324/416/11 323/417/11 347/462/11 -f 347/462/207 323/417/207 322/258/207 346/256/207 -f 175/463/208 173/418/208 345/421/208 369/464/208 -f 369/464/209 345/421/209 344/423/209 368/465/209 -f 368/465/12 344/423/12 343/425/12 367/466/12 -f 367/466/12 343/425/12 342/427/12 366/467/12 -f 685/468/210 683/428/210 341/431/210 365/469/210 -f 365/469/12 341/431/12 340/433/12 364/470/12 -f 653/471/210 651/434/210 339/437/210 363/472/210 -f 363/472/12 339/437/12 338/439/12 362/473/12 -f 621/474/210 619/440/210 337/443/210 361/475/210 -f 361/475/12 337/443/12 336/445/12 360/476/12 -f 360/476/12 336/445/12 335/447/12 359/477/12 -f 359/477/211 335/447/211 334/257/211 358/255/211 -f 176/478/212 174/448/212 357/449/212 381/479/212 -f 381/479/213 357/449/213 356/450/213 380/480/213 -f 380/480/14 356/450/14 355/451/14 379/481/14 -f 379/481/14 355/451/14 354/452/14 378/482/14 -f 686/483/214 684/453/214 353/454/214 377/484/214 -f 377/484/14 353/454/14 352/455/14 376/485/14 -f 654/486/214 652/456/214 351/457/214 375/487/214 -f 375/487/14 351/457/14 350/458/14 374/488/14 -f 622/489/214 620/459/214 349/460/214 373/490/214 -f 373/490/14 349/460/14 348/461/14 372/491/14 -f 372/491/14 348/461/14 347/462/14 371/492/14 -f 371/492/215 347/462/215 346/256/215 370/254/215 -f 177/493/216 175/463/216 369/464/216 393/494/216 -f 393/494/217 369/464/217 368/465/217 392/495/217 -f 392/495/15 368/465/15 367/466/15 391/496/15 -f 391/496/15 367/466/15 366/467/15 390/497/15 -f 687/498/218 685/468/218 365/469/218 389/499/218 -f 389/499/15 365/469/15 364/470/15 388/500/15 -f 655/501/218 653/471/218 363/472/218 387/502/218 -f 387/502/15 363/472/15 362/473/15 386/503/15 -f 623/504/218 621/474/218 361/475/218 385/505/218 -f 385/505/15 361/475/15 360/476/15 384/506/15 -f 384/506/15 360/476/15 359/477/15 383/507/15 -f 383/507/219 359/477/219 358/255/219 382/253/219 -f 178/508/220 176/478/220 381/479/220 405/509/220 -f 405/509/221 381/479/221 380/480/221 404/510/221 -f 404/510/17 380/480/17 379/481/17 403/511/17 -f 403/511/17 379/481/17 378/482/17 402/512/17 -f 688/513/222 686/483/222 377/484/222 401/514/222 -f 401/514/17 377/484/17 376/485/17 400/515/17 -f 656/516/222 654/486/222 375/487/222 399/517/222 -f 399/517/17 375/487/17 374/488/17 398/518/17 -f 624/519/222 622/489/222 373/490/222 397/520/222 -f 397/520/17 373/490/17 372/491/17 396/521/17 -f 396/521/17 372/491/17 371/492/17 395/522/17 -f 395/522/223 371/492/223 370/254/223 394/252/223 -f 179/523/224 177/493/224 393/494/224 417/524/224 -f 417/524/225 393/494/225 392/495/225 416/525/225 -f 416/525/18 392/495/18 391/496/18 415/526/18 -f 415/526/18 391/496/18 390/497/18 414/527/18 -f 689/528/226 687/498/226 389/499/226 413/529/226 -f 413/529/18 389/499/18 388/500/18 412/530/18 -f 657/531/226 655/501/226 387/502/226 411/532/226 -f 411/532/18 387/502/18 386/503/18 410/533/18 -f 625/534/226 623/504/226 385/505/226 409/535/226 -f 409/535/18 385/505/18 384/506/18 408/536/18 -f 408/536/18 384/506/18 383/507/18 407/537/18 -f 407/537/227 383/507/227 382/253/227 406/251/227 -f 180/538/228 178/508/228 405/509/228 429/539/228 -f 429/539/229 405/509/229 404/510/229 428/540/229 -f 428/540/19 404/510/19 403/511/19 427/541/19 -f 427/541/19 403/511/19 402/512/19 426/542/19 -f 690/543/230 688/513/230 401/514/230 425/544/230 -f 425/544/19 401/514/19 400/515/19 424/545/19 -f 658/546/230 656/516/230 399/517/230 423/547/230 -f 423/547/19 399/517/19 398/518/19 422/548/19 -f 626/549/230 624/519/230 397/520/230 421/550/230 -f 421/550/19 397/520/19 396/521/19 420/551/19 -f 420/551/19 396/521/19 395/522/19 419/552/19 -f 419/552/231 395/522/231 394/252/231 418/250/231 -f 181/553/232 179/523/232 417/524/232 441/554/232 -f 441/554/233 417/524/233 416/525/233 440/555/233 -f 440/555/20 416/525/20 415/526/20 439/556/20 -f 439/556/20 415/526/20 414/527/20 438/557/20 -f 691/558/234 689/528/234 413/529/234 437/559/234 -f 437/559/20 413/529/20 412/530/20 436/560/20 -f 659/561/234 657/531/234 411/532/234 435/562/234 -f 435/562/20 411/532/20 410/533/20 434/563/20 -f 627/564/234 625/534/234 409/535/234 433/565/234 -f 433/565/20 409/535/20 408/536/20 432/566/20 -f 432/566/20 408/536/20 407/537/20 431/567/20 -f 431/567/235 407/537/235 406/251/235 430/248/235 -f 172/568/236 180/538/236 429/539/236 598/569/236 -f 598/569/237 429/539/237 428/540/237 599/570/237 -f 599/570/21 428/540/21 427/541/21 600/571/21 -f 600/571/21 427/541/21 426/542/21 601/572/21 -f 705/573/238 690/543/238 425/544/238 602/574/238 -f 602/574/21 425/544/21 424/545/21 603/575/21 -f 673/576/239 658/546/239 423/547/239 604/577/239 -f 604/577/21 423/547/21 422/548/21 605/578/21 -f 641/579/238 626/549/238 421/550/238 606/580/238 -f 606/580/21 421/550/21 420/551/21 607/581/21 -f 607/581/21 420/551/21 419/552/21 608/582/21 -f 608/582/240 419/552/240 418/250/240 609/249/240 -f 182/583/241 181/553/241 441/554/241 453/584/241 -f 453/584/242 441/554/242 440/555/242 452/585/242 -f 452/585/22 440/555/22 439/556/22 451/586/22 -f 451/586/22 439/556/22 438/557/22 450/587/22 -f 692/588/243 691/558/243 437/559/243 449/589/243 -f 449/589/22 437/559/22 436/560/22 448/590/22 -f 660/591/243 659/561/243 435/562/243 447/592/243 -f 447/592/22 435/562/22 434/563/22 446/593/22 -f 628/594/243 627/564/243 433/565/243 445/595/243 -f 445/595/22 433/565/22 432/566/22 444/596/22 -f 444/596/22 432/566/22 431/567/22 443/597/22 -f 443/597/244 431/567/244 430/248/244 442/247/244 -f 183/598/245 182/583/245 453/584/245 465/599/245 -f 465/599/246 453/584/246 452/585/246 464/600/246 -f 464/600/23 452/585/23 451/586/23 463/601/23 -f 463/601/23 451/586/23 450/587/23 462/602/23 -f 693/603/247 692/588/247 449/589/247 461/604/247 -f 461/604/23 449/589/23 448/590/23 460/605/23 -f 661/606/247 660/591/247 447/592/247 459/607/247 -f 459/607/23 447/592/23 446/593/23 458/608/23 -f 629/609/247 628/594/247 445/595/247 457/610/247 -f 457/610/23 445/595/23 444/596/23 456/611/23 -f 456/611/23 444/596/23 443/597/23 455/612/23 -f 455/612/248 443/597/248 442/247/248 454/246/248 -f 184/613/249 183/598/249 465/599/249 477/614/249 -f 477/614/250 465/599/250 464/600/250 476/615/250 -f 476/615/24 464/600/24 463/601/24 475/616/24 -f 475/616/24 463/601/24 462/602/24 474/617/24 -f 694/618/251 693/603/251 461/604/251 473/619/251 -f 473/619/24 461/604/24 460/605/24 472/620/24 -f 662/621/251 661/606/251 459/607/251 471/622/251 -f 471/622/24 459/607/24 458/608/24 470/623/24 -f 630/624/251 629/609/251 457/610/251 469/625/251 -f 469/625/24 457/610/24 456/611/24 468/626/24 -f 468/626/24 456/611/24 455/612/24 467/627/24 -f 467/627/252 455/612/252 454/246/252 466/245/252 -f 185/628/253 184/613/253 477/614/253 489/629/253 -f 489/629/254 477/614/254 476/615/254 488/630/254 -f 488/630/25 476/615/25 475/616/25 487/631/25 -f 487/631/25 475/616/25 474/617/25 486/632/25 -f 695/633/255 694/618/255 473/619/255 485/634/255 -f 485/634/25 473/619/25 472/620/25 484/635/25 -f 663/636/255 662/621/255 471/622/255 483/637/255 -f 483/637/25 471/622/25 470/623/25 482/638/25 -f 631/639/255 630/624/255 469/625/255 481/640/255 -f 481/640/25 469/625/25 468/626/25 480/641/25 -f 480/641/25 468/626/25 467/627/25 479/642/25 -f 479/642/256 467/627/256 466/245/256 478/244/256 -f 186/643/257 185/628/257 489/629/257 501/644/257 -f 501/644/258 489/629/258 488/630/258 500/645/258 -f 500/645/26 488/630/26 487/631/26 499/646/26 -f 499/646/26 487/631/26 486/632/26 498/647/26 -f 696/648/259 695/633/259 485/634/259 497/649/259 -f 497/649/26 485/634/26 484/635/26 496/650/26 -f 664/651/259 663/636/259 483/637/259 495/652/259 -f 495/652/26 483/637/26 482/638/26 494/653/26 -f 632/654/259 631/639/259 481/640/259 493/655/259 -f 493/655/26 481/640/26 480/641/26 492/656/26 -f 492/656/26 480/641/26 479/642/26 491/657/26 -f 491/657/260 479/642/260 478/244/260 490/243/260 -f 187/658/261 186/643/261 501/644/261 513/659/261 -f 513/659/262 501/644/262 500/645/262 512/660/262 -f 512/660/27 500/645/27 499/646/27 511/661/27 -f 511/661/27 499/646/27 498/647/27 510/662/27 -f 697/663/263 696/648/263 497/649/263 509/664/263 -f 509/664/27 497/649/27 496/650/27 508/665/27 -f 665/666/263 664/651/263 495/652/263 507/667/263 -f 507/667/27 495/652/27 494/653/27 506/668/27 -f 633/669/263 632/654/263 493/655/263 505/670/263 -f 505/670/27 493/655/27 492/656/27 504/671/27 -f 504/671/27 492/656/27 491/657/27 503/672/27 -f 503/672/264 491/657/264 490/243/264 502/242/264 -f 188/673/265 187/658/265 513/659/265 525/674/265 -f 525/674/266 513/659/266 512/660/266 524/675/266 -f 524/675/28 512/660/28 511/661/28 523/676/28 -f 523/676/28 511/661/28 510/662/28 522/677/28 -f 698/678/267 697/663/267 509/664/267 521/679/267 -f 521/679/28 509/664/28 508/665/28 520/680/28 -f 666/681/267 665/666/267 507/667/267 519/682/267 -f 519/682/28 507/667/28 506/668/28 518/683/28 -f 634/684/267 633/669/267 505/670/267 517/685/267 -f 517/685/28 505/670/28 504/671/28 516/686/28 -f 516/686/28 504/671/28 503/672/28 515/687/28 -f 515/687/268 503/672/268 502/242/268 514/241/268 -f 189/688/269 188/673/269 525/674/269 537/689/269 -f 537/689/270 525/674/270 524/675/270 536/690/270 -f 536/690/29 524/675/29 523/676/29 535/691/29 -f 535/691/29 523/676/29 522/677/29 534/692/29 -f 699/693/271 698/678/271 521/679/271 533/694/271 -f 533/694/29 521/679/29 520/680/29 532/695/29 -f 667/696/271 666/681/271 519/682/271 531/697/271 -f 531/697/29 519/682/29 518/683/29 530/698/29 -f 635/699/271 634/684/271 517/685/271 529/700/271 -f 529/700/29 517/685/29 516/686/29 528/701/29 -f 528/701/29 516/686/29 515/687/29 527/702/29 -f 527/702/272 515/687/272 514/241/272 526/240/272 -f 190/703/273 189/688/273 537/689/273 549/704/273 -f 549/704/274 537/689/274 536/690/274 548/705/274 -f 548/705/30 536/690/30 535/691/30 547/706/30 -f 547/706/30 535/691/30 534/692/30 546/707/30 -f 700/708/275 699/693/275 533/694/275 545/709/275 -f 545/709/30 533/694/30 532/695/30 544/710/30 -f 668/711/275 667/696/275 531/697/275 543/712/275 -f 543/712/30 531/697/30 530/698/30 542/713/30 -f 636/714/275 635/699/275 529/700/275 541/715/275 -f 541/715/30 529/700/30 528/701/30 540/716/30 -f 540/716/30 528/701/30 527/702/30 539/717/30 -f 539/717/276 527/702/276 526/240/276 538/239/276 -f 191/718/277 190/703/277 549/704/277 561/719/277 -f 561/719/278 549/704/278 548/705/278 560/720/278 -f 560/720/31 548/705/31 547/706/31 559/721/31 -f 559/721/31 547/706/31 546/707/31 558/722/31 -f 701/723/279 700/708/279 545/709/279 557/724/279 -f 557/724/31 545/709/31 544/710/31 556/725/31 -f 669/726/279 668/711/279 543/712/279 555/727/279 -f 555/727/31 543/712/31 542/713/31 554/728/31 -f 637/729/279 636/714/279 541/715/279 553/730/279 -f 553/730/31 541/715/31 540/716/31 552/731/31 -f 552/731/31 540/716/31 539/717/31 551/732/31 -f 551/732/280 539/717/280 538/239/280 550/238/280 -f 192/733/281 191/718/281 561/719/281 573/734/281 -f 573/734/282 561/719/282 560/720/282 572/735/282 -f 572/735/32 560/720/32 559/721/32 571/736/32 -f 571/736/32 559/721/32 558/722/32 570/737/32 -f 702/738/283 701/723/283 557/724/283 569/739/283 -f 569/739/32 557/724/32 556/725/32 568/740/32 -f 670/741/283 669/726/283 555/727/283 567/742/283 -f 567/742/32 555/727/32 554/728/32 566/743/32 -f 638/744/283 637/729/283 553/730/283 565/745/283 -f 565/745/32 553/730/32 552/731/32 564/746/32 -f 564/746/32 552/731/32 551/732/32 563/747/32 -f 563/747/284 551/732/284 550/238/284 562/237/284 -f 193/748/285 192/733/285 573/734/285 585/749/285 -f 585/749/286 573/734/286 572/735/286 584/750/286 -f 584/750/33 572/735/33 571/736/33 583/751/33 -f 583/751/33 571/736/33 570/737/33 582/752/33 -f 703/753/287 702/738/287 569/739/287 581/754/287 -f 581/754/33 569/739/33 568/740/33 580/755/33 -f 671/756/287 670/741/287 567/742/287 579/757/287 -f 579/757/33 567/742/33 566/743/33 578/758/33 -f 639/759/287 638/744/287 565/745/287 577/760/287 -f 577/760/33 565/745/33 564/746/33 576/761/33 -f 576/761/33 564/746/33 563/747/33 575/762/33 -f 575/762/288 563/747/288 562/237/288 574/236/288 -f 162/269/289 193/748/289 585/749/289 586/270/289 -f 586/270/290 585/749/290 584/750/290 587/272/290 -f 587/272/34 584/750/34 583/751/34 588/274/34 -f 588/274/34 583/751/34 582/752/34 589/276/34 -f 704/279/291 703/753/291 581/754/291 590/280/291 -f 590/280/34 581/754/34 580/755/34 591/282/34 -f 672/285/291 671/756/291 579/757/291 592/286/291 -f 592/286/34 579/757/34 578/758/34 593/288/34 -f 640/291/291 639/759/291 577/760/291 594/292/291 -f 594/292/34 577/760/34 576/761/34 595/294/34 -f 595/294/34 576/761/34 575/762/34 596/296/34 -f 596/296/292 575/762/292 574/236/292 597/235/292 -f 593/288/293 578/758/293 639/759/293 640/291/293 -f 578/758/294 566/743/294 638/744/294 639/759/294 -f 566/743/295 554/728/295 637/729/295 638/744/295 -f 554/728/296 542/713/296 636/714/296 637/729/296 -f 542/713/297 530/698/297 635/699/297 636/714/297 -f 530/698/298 518/683/298 634/684/298 635/699/298 -f 518/683/299 506/668/299 633/669/299 634/684/299 -f 506/668/300 494/653/300 632/654/300 633/669/300 -f 494/653/301 482/638/301 631/639/301 632/654/301 -f 482/638/302 470/623/302 630/624/302 631/639/302 -f 470/623/303 458/608/303 629/609/303 630/624/303 -f 458/608/304 446/593/304 628/594/304 629/609/304 -f 446/593/305 434/563/305 627/564/305 628/594/305 -f 605/578/306 422/548/306 626/549/306 641/579/306 -f 434/563/307 410/533/307 625/534/307 627/564/307 -f 422/548/308 398/518/308 624/519/308 626/549/308 -f 410/533/309 386/503/309 623/504/309 625/534/309 -f 398/518/310 374/488/310 622/489/310 624/519/310 -f 386/503/311 362/473/311 621/474/311 623/504/311 -f 374/488/312 350/458/312 620/459/312 622/489/312 -f 362/473/313 338/439/313 619/440/313 621/474/313 -f 350/458/314 326/413/314 618/414/314 620/459/314 -f 338/439/315 605/438/315 641/441/315 619/440/315 -f 326/413/316 314/398/316 617/399/316 618/414/316 -f 314/398/317 302/383/317 616/384/317 617/399/317 -f 302/383/318 290/368/318 615/369/318 616/384/318 -f 290/368/319 278/353/319 614/354/319 615/369/319 -f 278/353/320 266/338/320 613/339/320 614/354/320 -f 266/338/321 254/323/321 612/324/321 613/339/321 -f 254/323/322 242/308/322 611/309/322 612/324/322 -f 242/308/323 230/289/323 610/290/323 611/309/323 -f 230/289/324 593/288/324 640/291/324 610/290/324 -f 591/282/325 580/755/325 671/756/325 672/285/325 -f 580/755/294 568/740/294 670/741/294 671/756/294 -f 568/740/295 556/725/295 669/726/295 670/741/295 -f 556/725/296 544/710/296 668/711/296 669/726/296 -f 544/710/297 532/695/297 667/696/297 668/711/297 -f 532/695/298 520/680/298 666/681/298 667/696/298 -f 520/680/299 508/665/299 665/666/299 666/681/299 -f 508/665/300 496/650/300 664/651/300 665/666/300 -f 496/650/301 484/635/301 663/636/301 664/651/301 -f 484/635/302 472/620/302 662/621/302 663/636/302 -f 472/620/303 460/605/303 661/606/303 662/621/303 -f 460/605/304 448/590/304 660/591/304 661/606/304 -f 448/590/305 436/560/305 659/561/305 660/591/305 -f 603/575/306 424/545/306 658/546/306 673/576/306 -f 436/560/307 412/530/307 657/531/307 659/561/307 -f 424/545/308 400/515/308 656/516/308 658/546/308 -f 412/530/309 388/500/309 655/501/309 657/531/309 -f 400/515/310 376/485/310 654/486/310 656/516/310 -f 388/500/311 364/470/311 653/471/311 655/501/311 -f 376/485/312 352/455/312 652/456/312 654/486/312 -f 364/470/313 340/433/313 651/434/313 653/471/313 -f 352/455/314 328/410/314 650/411/314 652/456/314 -f 340/433/315 603/432/315 673/435/315 651/434/315 -f 328/410/316 316/395/316 649/396/316 650/411/316 -f 316/395/317 304/380/317 648/381/317 649/396/317 -f 304/380/318 292/365/318 647/366/318 648/381/318 -f 292/365/326 280/350/326 646/351/326 647/366/326 -f 280/350/320 268/335/320 645/336/320 646/351/320 -f 268/335/321 256/320/321 644/321/321 645/336/321 -f 256/320/322 244/305/322 643/306/322 644/321/322 -f 244/305/323 232/283/323 642/284/323 643/306/323 -f 232/283/324 591/282/324 672/285/324 642/284/324 -f 589/276/293 582/752/293 703/753/293 704/279/293 -f 582/752/294 570/737/294 702/738/294 703/753/294 -f 570/737/327 558/722/327 701/723/327 702/738/327 -f 558/722/296 546/707/296 700/708/296 701/723/296 -f 546/707/297 534/692/297 699/693/297 700/708/297 -f 534/692/298 522/677/298 698/678/298 699/693/298 -f 522/677/299 510/662/299 697/663/299 698/678/299 -f 510/662/300 498/647/300 696/648/300 697/663/300 -f 498/647/301 486/632/301 695/633/301 696/648/301 -f 486/632/328 474/617/328 694/618/328 695/633/328 -f 474/617/329 462/602/329 693/603/329 694/618/329 -f 462/602/304 450/587/304 692/588/304 693/603/304 -f 450/587/305 438/557/305 691/558/305 692/588/305 -f 601/572/306 426/542/306 690/543/306 705/573/306 -f 438/557/307 414/527/307 689/528/307 691/558/307 -f 426/542/308 402/512/308 688/513/308 690/543/308 -f 414/527/309 390/497/309 687/498/309 689/528/309 -f 402/512/310 378/482/310 686/483/310 688/513/310 -f 390/497/311 366/467/311 685/468/311 687/498/311 -f 378/482/312 354/452/312 684/453/312 686/483/312 -f 366/467/313 342/427/313 683/428/313 685/468/313 -f 354/452/314 330/407/314 682/408/314 684/453/314 -f 342/427/315 601/426/315 705/429/315 683/428/315 -f 330/407/316 318/392/316 681/393/316 682/408/316 -f 318/392/317 306/377/317 680/378/317 681/393/317 -f 306/377/318 294/362/318 679/363/318 680/378/318 -f 294/362/330 282/347/330 678/348/330 679/363/330 -f 282/347/331 270/332/331 677/333/331 678/348/331 -f 270/332/321 258/317/321 676/318/321 677/333/321 -f 258/317/322 246/302/322 675/303/322 676/318/322 -f 246/302/323 234/277/323 674/278/323 675/303/323 -f 234/277/324 589/276/324 704/279/324 674/278/324 -f 24/763/16 25/764/16 707/765/16 737/766/16 -f 23/767/13 24/763/13 737/766/13 736/768/13 -f 22/769/10 23/767/10 736/768/10 735/770/10 -f 21/771/7 22/769/7 735/770/7 734/772/7 -f 20/773/5 21/771/5 734/772/5 733/774/5 -f 19/775/2 20/773/2 733/774/2 732/776/2 -f 18/777/34 19/775/34 732/776/34 731/778/34 -f 17/779/33 18/777/33 731/778/33 730/780/33 -f 16/781/32 17/779/32 730/780/32 729/782/32 -f 15/783/31 16/781/31 729/782/31 728/784/31 -f 14/785/30 15/783/30 728/784/30 727/786/30 -f 13/787/29 14/785/29 727/786/29 726/788/29 -f 12/789/28 13/787/28 726/788/28 725/790/28 -f 11/791/27 12/789/27 725/790/27 724/792/27 -f 10/793/26 11/791/26 724/792/26 723/794/26 -f 9/795/25 10/793/25 723/794/25 722/796/25 -f 8/797/24 9/795/24 722/796/24 721/798/24 -f 7/799/23 8/797/23 721/798/23 720/800/23 -f 6/801/22 7/799/22 720/800/22 719/802/22 -f 32/803/21 1/804/21 711/805/21 718/806/21 -f 5/807/20 6/801/20 719/802/20 717/808/20 -f 31/809/19 32/803/19 718/806/19 716/810/19 -f 4/811/18 5/807/18 717/808/18 715/812/18 -f 30/813/17 31/809/17 716/810/17 714/814/17 -f 3/815/15 4/811/15 715/812/15 713/816/15 -f 29/817/14 30/813/14 714/814/14 712/818/14 -f 2/819/12 3/815/12 713/816/12 710/820/12 -f 28/821/11 29/817/11 712/818/11 709/822/11 -f 1/823/9 2/819/9 710/820/9 711/824/9 -f 27/825/8 28/821/8 709/822/8 708/826/8 -f 26/827/6 27/825/6 708/826/6 706/828/6 -f 25/764/1 26/827/1 706/828/1 707/765/1 -f 1025/829/332 770/830/332 768/1/332 767/137/332 -f 1017/831/333 1025/829/333 767/137/333 766/133/333 -f 1009/832/334 1017/831/334 766/133/334 765/129/334 -f 1001/833/335 1009/832/335 765/129/335 764/125/335 -f 993/834/336 1001/833/336 764/125/336 763/121/336 -f 985/835/337 993/834/337 763/121/337 762/117/337 -f 977/836/338 985/835/338 762/117/338 761/113/338 -f 969/837/339 977/836/339 761/113/339 760/109/339 -f 961/838/340 969/837/340 760/109/340 759/105/340 -f 953/839/341 961/838/341 759/105/341 758/101/341 -f 945/840/342 953/839/342 758/101/342 757/97/342 -f 937/841/343 945/840/343 757/97/343 756/93/343 -f 929/842/344 937/841/344 756/93/344 755/87/344 -f 921/843/345 929/842/345 755/87/345 754/81/345 -f 913/844/346 921/843/346 754/81/346 753/75/346 -f 905/845/347 913/844/347 753/75/347 752/69/347 -f 897/846/348 905/845/348 752/69/348 751/63/348 -f 889/847/349 897/846/349 751/63/349 750/55/349 -f 881/848/350 889/847/350 750/55/350 749/49/350 -f 873/849/351 778/850/351 769/53/351 748/47/351 -f 865/851/352 881/848/352 749/49/352 747/43/352 -f 857/852/353 873/849/353 748/47/353 746/41/353 -f 849/853/354 865/851/354 747/43/354 745/37/354 -f 841/854/355 857/852/355 746/41/355 744/35/355 -f 833/855/356 849/853/356 745/37/356 743/31/356 -f 825/856/357 841/854/357 744/35/357 742/29/357 -f 817/857/358 833/855/358 743/31/358 741/24/358 -f 809/858/359 825/856/359 742/29/359 740/21/359 -f 778/859/360 817/857/360 741/24/360 769/23/360 -f 801/860/361 809/858/361 740/21/361 739/17/361 -f 793/861/362 801/860/362 739/17/362 738/2/362 -f 770/830/363 793/861/363 738/2/363 768/1/363 -f 707/765/364 706/828/364 786/862/364 777/863/364 -f 777/863/365 786/862/365 787/864/365 776/865/365 -f 776/865/1 787/864/1 788/866/1 775/867/1 -f 1058/868/366 1060/869/366 789/870/366 774/871/366 -f 774/871/1 789/870/1 790/872/1 773/873/1 -f 1026/874/367 1028/875/367 791/876/367 772/877/367 -f 772/877/1 791/876/1 792/878/1 771/879/1 -f 771/879/368 792/878/368 793/861/368 770/830/368 -f 706/828/369 708/826/369 794/880/369 786/862/369 -f 786/862/370 794/880/370 795/881/370 787/864/370 -f 787/864/6 795/881/6 796/882/6 788/866/6 -f 1060/869/371 1061/883/371 797/884/371 789/870/371 -f 789/870/6 797/884/6 798/885/6 790/872/6 -f 1028/875/371 1029/886/371 799/887/371 791/876/371 -f 791/876/6 799/887/6 800/888/6 792/878/6 -f 792/878/372 800/888/372 801/860/372 793/861/372 -f 708/826/373 709/822/373 802/889/373 794/880/373 -f 794/880/374 802/889/374 803/890/374 795/881/374 -f 795/881/8 803/890/8 804/891/8 796/882/8 -f 1061/883/375 1062/892/375 805/893/375 797/884/375 -f 797/884/8 805/893/8 806/894/8 798/885/8 -f 1029/886/375 1030/895/375 807/896/375 799/887/375 -f 799/887/8 807/896/8 808/897/8 800/888/8 -f 800/888/376 808/897/376 809/858/376 801/860/376 -f 711/824/377 710/820/377 810/898/377 785/899/377 -f 785/899/378 810/898/378 811/900/378 784/901/378 -f 784/901/9 811/900/9 812/902/9 783/903/9 -f 1059/904/379 1063/905/379 813/906/379 782/907/379 -f 782/907/9 813/906/9 814/908/9 781/909/9 -f 1027/910/380 1031/911/380 815/912/380 780/913/380 -f 780/913/9 815/912/9 816/914/9 779/915/9 -f 779/915/381 816/914/381 817/857/381 778/859/381 -f 709/822/382 712/818/382 818/916/382 802/889/382 -f 802/889/383 818/916/383 819/917/383 803/890/383 -f 803/890/11 819/917/11 820/918/11 804/891/11 -f 1062/892/384 1064/919/384 821/920/384 805/893/384 -f 805/893/11 821/920/11 822/921/11 806/894/11 -f 1030/895/384 1032/922/384 823/923/384 807/896/384 -f 807/896/11 823/923/11 824/924/11 808/897/11 -f 808/897/385 824/924/385 825/856/385 809/858/385 -f 710/820/386 713/816/386 826/925/386 810/898/386 -f 810/898/387 826/925/387 827/926/387 811/900/387 -f 811/900/12 827/926/12 828/927/12 812/902/12 -f 1063/905/388 1065/928/388 829/929/388 813/906/388 -f 813/906/12 829/929/12 830/930/12 814/908/12 -f 1031/911/388 1033/931/388 831/932/388 815/912/388 -f 815/912/12 831/932/12 832/933/12 816/914/12 -f 816/914/389 832/933/389 833/855/389 817/857/389 -f 712/818/390 714/814/390 834/934/390 818/916/390 -f 818/916/391 834/934/391 835/935/391 819/917/391 -f 819/917/14 835/935/14 836/936/14 820/918/14 -f 1064/919/392 1066/937/392 837/938/392 821/920/392 -f 821/920/14 837/938/14 838/939/14 822/921/14 -f 1032/922/392 1034/940/392 839/941/392 823/923/392 -f 823/923/14 839/941/14 840/942/14 824/924/14 -f 824/924/393 840/942/393 841/854/393 825/856/393 -f 713/816/394 715/812/394 842/943/394 826/925/394 -f 826/925/395 842/943/395 843/944/395 827/926/395 -f 827/926/15 843/944/15 844/945/15 828/927/15 -f 1065/928/396 1067/946/396 845/947/396 829/929/396 -f 829/929/15 845/947/15 846/948/15 830/930/15 -f 1033/931/396 1035/949/396 847/950/396 831/932/396 -f 831/932/15 847/950/15 848/951/15 832/933/15 -f 832/933/397 848/951/397 849/853/397 833/855/397 -f 714/814/398 716/810/398 850/952/398 834/934/398 -f 834/934/399 850/952/399 851/953/399 835/935/399 -f 835/935/17 851/953/17 852/954/17 836/936/17 -f 1066/937/400 1068/955/400 853/956/400 837/938/400 -f 837/938/17 853/956/17 854/957/17 838/939/17 -f 1034/940/400 1036/958/400 855/959/400 839/941/400 -f 839/941/17 855/959/17 856/960/17 840/942/17 -f 840/942/401 856/960/401 857/852/401 841/854/401 -f 715/812/402 717/808/402 858/961/402 842/943/402 -f 842/943/403 858/961/403 859/962/403 843/944/403 -f 843/944/18 859/962/18 860/963/18 844/945/18 -f 1067/946/404 1069/964/404 861/965/404 845/947/404 -f 845/947/18 861/965/18 862/966/18 846/948/18 -f 1035/949/404 1037/967/404 863/968/404 847/950/404 -f 847/950/18 863/968/18 864/969/18 848/951/18 -f 848/951/405 864/969/405 865/851/405 849/853/405 -f 716/810/406 718/806/406 866/970/406 850/952/406 -f 850/952/407 866/970/407 867/971/407 851/953/407 -f 851/953/19 867/971/19 868/972/19 852/954/19 -f 1068/955/408 1070/973/408 869/974/408 853/956/408 -f 853/956/19 869/974/19 870/975/19 854/957/19 -f 1036/958/408 1038/976/408 871/977/408 855/959/408 -f 855/959/19 871/977/19 872/978/19 856/960/19 -f 856/960/409 872/978/409 873/849/409 857/852/409 -f 717/808/410 719/802/410 874/979/410 858/961/410 -f 858/961/411 874/979/411 875/980/411 859/962/411 -f 859/962/20 875/980/20 876/981/20 860/963/20 -f 1069/964/412 1071/982/412 877/983/412 861/965/412 -f 861/965/20 877/983/20 878/984/20 862/966/20 -f 1037/967/412 1039/985/412 879/986/412 863/968/412 -f 863/968/20 879/986/20 880/987/20 864/969/20 -f 864/969/413 880/987/413 881/848/413 865/851/413 -f 718/806/414 711/805/414 785/988/414 866/970/414 -f 866/970/415 785/988/415 784/989/415 867/971/415 -f 867/971/21 784/989/21 783/990/21 868/972/21 -f 1070/973/416 1059/991/416 782/992/416 869/974/416 -f 869/974/21 782/992/21 781/993/21 870/975/21 -f 1038/976/417 1027/994/417 780/995/417 871/977/417 -f 871/977/21 780/995/21 779/996/21 872/978/21 -f 872/978/418 779/996/418 778/850/418 873/849/418 -f 719/802/419 720/800/419 882/997/419 874/979/419 -f 874/979/420 882/997/420 883/998/420 875/980/420 -f 875/980/22 883/998/22 884/999/22 876/981/22 -f 1071/982/421 1072/1000/421 885/1001/421 877/983/421 -f 877/983/22 885/1001/22 886/1002/22 878/984/22 -f 1039/985/421 1040/1003/421 887/1004/421 879/986/421 -f 879/986/22 887/1004/22 888/1005/22 880/987/22 -f 880/987/422 888/1005/422 889/847/422 881/848/422 -f 720/800/423 721/798/423 890/1006/423 882/997/423 -f 882/997/424 890/1006/424 891/1007/424 883/998/424 -f 883/998/23 891/1007/23 892/1008/23 884/999/23 -f 1072/1000/425 1073/1009/425 893/1010/425 885/1001/425 -f 885/1001/23 893/1010/23 894/1011/23 886/1002/23 -f 1040/1003/425 1041/1012/425 895/1013/425 887/1004/425 -f 887/1004/23 895/1013/23 896/1014/23 888/1005/23 -f 888/1005/426 896/1014/426 897/846/426 889/847/426 -f 721/798/427 722/796/427 898/1015/427 890/1006/427 -f 890/1006/428 898/1015/428 899/1016/428 891/1007/428 -f 891/1007/24 899/1016/24 900/1017/24 892/1008/24 -f 1073/1009/429 1074/1018/429 901/1019/429 893/1010/429 -f 893/1010/24 901/1019/24 902/1020/24 894/1011/24 -f 1041/1012/429 1042/1021/429 903/1022/429 895/1013/429 -f 895/1013/24 903/1022/24 904/1023/24 896/1014/24 -f 896/1014/430 904/1023/430 905/845/430 897/846/430 -f 722/796/431 723/794/431 906/1024/431 898/1015/431 -f 898/1015/432 906/1024/432 907/1025/432 899/1016/432 -f 899/1016/25 907/1025/25 908/1026/25 900/1017/25 -f 1074/1018/433 1075/1027/433 909/1028/433 901/1019/433 -f 901/1019/25 909/1028/25 910/1029/25 902/1020/25 -f 1042/1021/433 1043/1030/433 911/1031/433 903/1022/433 -f 903/1022/25 911/1031/25 912/1032/25 904/1023/25 -f 904/1023/434 912/1032/434 913/844/434 905/845/434 -f 723/794/435 724/792/435 914/1033/435 906/1024/435 -f 906/1024/436 914/1033/436 915/1034/436 907/1025/436 -f 907/1025/26 915/1034/26 916/1035/26 908/1026/26 -f 1075/1027/437 1076/1036/437 917/1037/437 909/1028/437 -f 909/1028/26 917/1037/26 918/1038/26 910/1029/26 -f 1043/1030/437 1044/1039/437 919/1040/437 911/1031/437 -f 911/1031/26 919/1040/26 920/1041/26 912/1032/26 -f 912/1032/438 920/1041/438 921/843/438 913/844/438 -f 724/792/439 725/790/439 922/1042/439 914/1033/439 -f 914/1033/440 922/1042/440 923/1043/440 915/1034/440 -f 915/1034/27 923/1043/27 924/1044/27 916/1035/27 -f 1076/1036/441 1077/1045/441 925/1046/441 917/1037/441 -f 917/1037/27 925/1046/27 926/1047/27 918/1038/27 -f 1044/1039/441 1045/1048/441 927/1049/441 919/1040/441 -f 919/1040/27 927/1049/27 928/1050/27 920/1041/27 -f 920/1041/442 928/1050/442 929/842/442 921/843/442 -f 725/790/443 726/788/443 930/1051/443 922/1042/443 -f 922/1042/444 930/1051/444 931/1052/444 923/1043/444 -f 923/1043/28 931/1052/28 932/1053/28 924/1044/28 -f 1077/1045/445 1078/1054/445 933/1055/445 925/1046/445 -f 925/1046/28 933/1055/28 934/1056/28 926/1047/28 -f 1045/1048/445 1046/1057/445 935/1058/445 927/1049/445 -f 927/1049/28 935/1058/28 936/1059/28 928/1050/28 -f 928/1050/446 936/1059/446 937/841/446 929/842/446 -f 726/788/447 727/786/447 938/1060/447 930/1051/447 -f 930/1051/448 938/1060/448 939/1061/448 931/1052/448 -f 931/1052/29 939/1061/29 940/1062/29 932/1053/29 -f 1078/1054/449 1079/1063/449 941/1064/449 933/1055/449 -f 933/1055/29 941/1064/29 942/1065/29 934/1056/29 -f 1046/1057/449 1047/1066/449 943/1067/449 935/1058/449 -f 935/1058/29 943/1067/29 944/1068/29 936/1059/29 -f 936/1059/450 944/1068/450 945/840/450 937/841/450 -f 727/786/451 728/784/451 946/1069/451 938/1060/451 -f 938/1060/452 946/1069/452 947/1070/452 939/1061/452 -f 939/1061/30 947/1070/30 948/1071/30 940/1062/30 -f 1079/1063/453 1080/1072/453 949/1073/453 941/1064/453 -f 941/1064/30 949/1073/30 950/1074/30 942/1065/30 -f 1047/1066/453 1048/1075/453 951/1076/453 943/1067/453 -f 943/1067/30 951/1076/30 952/1077/30 944/1068/30 -f 944/1068/454 952/1077/454 953/839/454 945/840/454 -f 728/784/455 729/782/455 954/1078/455 946/1069/455 -f 946/1069/456 954/1078/456 955/1079/456 947/1070/456 -f 947/1070/31 955/1079/31 956/1080/31 948/1071/31 -f 1080/1072/457 1081/1081/457 957/1082/457 949/1073/457 -f 949/1073/31 957/1082/31 958/1083/31 950/1074/31 -f 1048/1075/457 1049/1084/457 959/1085/457 951/1076/457 -f 951/1076/31 959/1085/31 960/1086/31 952/1077/31 -f 952/1077/458 960/1086/458 961/838/458 953/839/458 -f 729/782/459 730/780/459 962/1087/459 954/1078/459 -f 954/1078/460 962/1087/460 963/1088/460 955/1079/460 -f 955/1079/32 963/1088/32 964/1089/32 956/1080/32 -f 1081/1081/461 1082/1090/461 965/1091/461 957/1082/461 -f 957/1082/32 965/1091/32 966/1092/32 958/1083/32 -f 1049/1084/461 1050/1093/461 967/1094/461 959/1085/461 -f 959/1085/32 967/1094/32 968/1095/32 960/1086/32 -f 960/1086/462 968/1095/462 969/837/462 961/838/462 -f 730/780/463 731/778/463 970/1096/463 962/1087/463 -f 962/1087/464 970/1096/464 971/1097/464 963/1088/464 -f 963/1088/33 971/1097/33 972/1098/33 964/1089/33 -f 1082/1090/465 1083/1099/465 973/1100/465 965/1091/465 -f 965/1091/33 973/1100/33 974/1101/33 966/1092/33 -f 1050/1093/465 1051/1102/465 975/1103/465 967/1094/465 -f 967/1094/33 975/1103/33 976/1104/33 968/1095/33 -f 968/1095/466 976/1104/466 977/836/466 969/837/466 -f 731/778/467 732/776/467 978/1105/467 970/1096/467 -f 970/1096/468 978/1105/468 979/1106/468 971/1097/468 -f 971/1097/34 979/1106/34 980/1107/34 972/1098/34 -f 1083/1099/469 1084/1108/469 981/1109/469 973/1100/469 -f 973/1100/34 981/1109/34 982/1110/34 974/1101/34 -f 1051/1102/470 1052/1111/470 983/1112/470 975/1103/470 -f 975/1103/34 983/1112/34 984/1113/34 976/1104/34 -f 976/1104/471 984/1113/471 985/835/471 977/836/471 -f 732/776/472 733/774/472 986/1114/472 978/1105/472 -f 978/1105/473 986/1114/473 987/1115/473 979/1106/473 -f 979/1106/2 987/1115/2 988/1116/2 980/1107/2 -f 1084/1108/474 1085/1117/474 989/1118/474 981/1109/474 -f 981/1109/2 989/1118/2 990/1119/2 982/1110/2 -f 1052/1111/474 1053/1120/474 991/1121/474 983/1112/474 -f 983/1112/2 991/1121/2 992/1122/2 984/1113/2 -f 984/1113/475 992/1122/475 993/834/475 985/835/475 -f 733/774/476 734/772/476 994/1123/476 986/1114/476 -f 986/1114/477 994/1123/477 995/1124/477 987/1115/477 -f 987/1115/5 995/1124/5 996/1125/5 988/1116/5 -f 1085/1117/478 1086/1126/478 997/1127/478 989/1118/478 -f 989/1118/5 997/1127/5 998/1128/5 990/1119/5 -f 1053/1120/479 1054/1129/479 999/1130/479 991/1121/479 -f 991/1121/5 999/1130/5 1000/1131/5 992/1122/5 -f 992/1122/480 1000/1131/480 1001/833/480 993/834/480 -f 734/772/481 735/770/481 1002/1132/481 994/1123/481 -f 994/1123/482 1002/1132/482 1003/1133/482 995/1124/482 -f 995/1124/7 1003/1133/7 1004/1134/7 996/1125/7 -f 1086/1126/483 1087/1135/483 1005/1136/483 997/1127/483 -f 997/1127/7 1005/1136/7 1006/1137/7 998/1128/7 -f 1054/1129/483 1055/1138/483 1007/1139/483 999/1130/483 -f 999/1130/7 1007/1139/7 1008/1140/7 1000/1131/7 -f 1000/1131/484 1008/1140/484 1009/832/484 1001/833/484 -f 735/770/485 736/768/485 1010/1141/485 1002/1132/485 -f 1002/1132/486 1010/1141/486 1011/1142/486 1003/1133/486 -f 1003/1133/10 1011/1142/10 1012/1143/10 1004/1134/10 -f 1087/1135/487 1088/1144/487 1013/1145/487 1005/1136/487 -f 1005/1136/10 1013/1145/10 1014/1146/10 1006/1137/10 -f 1055/1138/487 1056/1147/487 1015/1148/487 1007/1139/487 -f 1007/1139/10 1015/1148/10 1016/1149/10 1008/1140/10 -f 1008/1140/488 1016/1149/488 1017/831/488 1009/832/488 -f 736/768/489 737/766/489 1018/1150/489 1010/1141/489 -f 1010/1141/490 1018/1150/490 1019/1151/490 1011/1142/490 -f 1011/1142/13 1019/1151/13 1020/1152/13 1012/1143/13 -f 1088/1144/491 1089/1153/491 1021/1154/491 1013/1145/491 -f 1013/1145/13 1021/1154/13 1022/1155/13 1014/1146/13 -f 1056/1147/491 1057/1156/491 1023/1157/491 1015/1148/491 -f 1015/1148/13 1023/1157/13 1024/1158/13 1016/1149/13 -f 1016/1149/492 1024/1158/492 1025/829/492 1017/831/492 -f 737/766/493 707/765/493 777/863/493 1018/1150/493 -f 1018/1150/494 777/863/494 776/865/494 1019/1151/494 -f 1019/1151/16 776/865/16 775/867/16 1020/1152/16 -f 1089/1153/495 1058/868/495 774/871/495 1021/1154/495 -f 1021/1154/16 774/871/16 773/873/16 1022/1155/16 -f 1057/1156/496 1026/874/496 772/877/496 1023/1157/496 -f 1023/1157/16 772/877/16 771/879/16 1024/1158/16 -f 1024/1158/497 771/879/497 770/830/497 1025/829/497 -f 1022/1155/498 773/873/498 1026/874/498 1057/1156/498 -f 1014/1146/499 1022/1155/499 1057/1156/499 1056/1147/499 -f 1006/1137/500 1014/1146/500 1056/1147/500 1055/1138/500 -f 998/1128/501 1006/1137/501 1055/1138/501 1054/1129/501 -f 990/1119/502 998/1128/502 1054/1129/502 1053/1120/502 -f 982/1110/503 990/1119/503 1053/1120/503 1052/1111/503 -f 974/1101/504 982/1110/504 1052/1111/504 1051/1102/504 -f 966/1092/505 974/1101/505 1051/1102/505 1050/1093/505 -f 958/1083/506 966/1092/506 1050/1093/506 1049/1084/506 -f 950/1074/507 958/1083/507 1049/1084/507 1048/1075/507 -f 942/1065/508 950/1074/508 1048/1075/508 1047/1066/508 -f 934/1056/509 942/1065/509 1047/1066/509 1046/1057/509 -f 926/1047/510 934/1056/510 1046/1057/510 1045/1048/510 -f 918/1038/511 926/1047/511 1045/1048/511 1044/1039/511 -f 910/1029/512 918/1038/512 1044/1039/512 1043/1030/512 -f 902/1020/513 910/1029/513 1043/1030/513 1042/1021/513 -f 894/1011/514 902/1020/514 1042/1021/514 1041/1012/514 -f 886/1002/515 894/1011/515 1041/1012/515 1040/1003/515 -f 878/984/516 886/1002/516 1040/1003/516 1039/985/516 -f 870/975/517 781/993/517 1027/994/517 1038/976/517 -f 862/966/518 878/984/518 1039/985/518 1037/967/518 -f 854/957/519 870/975/519 1038/976/519 1036/958/519 -f 846/948/520 862/966/520 1037/967/520 1035/949/520 -f 838/939/521 854/957/521 1036/958/521 1034/940/521 -f 830/930/522 846/948/522 1035/949/522 1033/931/522 -f 822/921/523 838/939/523 1034/940/523 1032/922/523 -f 814/908/524 830/930/524 1033/931/524 1031/911/524 -f 806/894/525 822/921/525 1032/922/525 1030/895/525 -f 781/909/526 814/908/526 1031/911/526 1027/910/526 -f 798/885/527 806/894/527 1030/895/527 1029/886/527 -f 790/872/528 798/885/528 1029/886/528 1028/875/528 -f 773/873/529 790/872/529 1028/875/529 1026/874/529 -f 1020/1152/498 775/867/498 1058/868/498 1089/1153/498 -f 1012/1143/499 1020/1152/499 1089/1153/499 1088/1144/499 -f 1004/1134/500 1012/1143/500 1088/1144/500 1087/1135/500 -f 996/1125/501 1004/1134/501 1087/1135/501 1086/1126/501 -f 988/1116/502 996/1125/502 1086/1126/502 1085/1117/502 -f 980/1107/503 988/1116/503 1085/1117/503 1084/1108/503 -f 972/1098/504 980/1107/504 1084/1108/504 1083/1099/504 -f 964/1089/505 972/1098/505 1083/1099/505 1082/1090/505 -f 956/1080/506 964/1089/506 1082/1090/506 1081/1081/506 -f 948/1071/507 956/1080/507 1081/1081/507 1080/1072/507 -f 940/1062/508 948/1071/508 1080/1072/508 1079/1063/508 -f 932/1053/509 940/1062/509 1079/1063/509 1078/1054/509 -f 924/1044/510 932/1053/510 1078/1054/510 1077/1045/510 -f 916/1035/511 924/1044/511 1077/1045/511 1076/1036/511 -f 908/1026/512 916/1035/512 1076/1036/512 1075/1027/512 -f 900/1017/530 908/1026/530 1075/1027/530 1074/1018/530 -f 892/1008/514 900/1017/514 1074/1018/514 1073/1009/514 -f 884/999/515 892/1008/515 1073/1009/515 1072/1000/515 -f 876/981/531 884/999/531 1072/1000/531 1071/982/531 -f 868/972/517 783/990/517 1059/991/517 1070/973/517 -f 860/963/518 876/981/518 1071/982/518 1069/964/518 -f 852/954/519 868/972/519 1070/973/519 1068/955/519 -f 844/945/520 860/963/520 1069/964/520 1067/946/520 -f 836/936/521 852/954/521 1068/955/521 1066/937/521 -f 828/927/522 844/945/522 1067/946/522 1065/928/522 -f 820/918/523 836/936/523 1066/937/523 1064/919/523 -f 812/902/524 828/927/524 1065/928/524 1063/905/524 -f 804/891/525 820/918/525 1064/919/525 1062/892/525 -f 783/903/526 812/902/526 1063/905/526 1059/904/526 -f 796/882/532 804/891/532 1062/892/532 1061/883/532 -f 788/866/533 796/882/533 1061/883/533 1060/869/533 -f 775/867/529 788/866/529 1060/869/529 1058/868/529 -f 1215/1159/534 1186/1160/534 1148/1161/534 1147/1162/534 -f 1221/1163/535 1220/1164/535 1102/1165/535 1101/1166/535 -f 1218/10/536 1222/1167/536 1116/1168/536 1115/11/536 -f 1220/1164/537 1223/1169/537 1103/1170/537 1102/1165/537 -f 1222/1167/538 1224/1171/538 1117/1172/538 1116/1168/538 -f 1223/1169/539 1225/1173/539 1104/1174/539 1103/1170/539 -f 1227/1175/540 1226/1176/540 1091/1177/540 1090/1178/540 -f 1224/1171/541 1228/1179/541 1118/1180/541 1117/1172/541 -f 1225/1173/542 1229/1181/542 1105/1182/542 1104/1174/542 -f 1226/1176/543 1230/1183/543 1092/1184/543 1091/1177/543 -f 1228/1179/544 1231/1185/544 1119/1186/544 1118/1180/544 -f 1229/1181/545 1232/1187/545 1106/1188/545 1105/1182/545 -f 1230/1183/546 1233/1189/546 1093/1190/546 1092/1184/546 -f 1231/1185/547 1234/1191/547 1120/1192/547 1119/1186/547 -f 1232/1187/548 1235/1193/548 1107/1194/548 1106/1188/548 -f 1233/1189/549 1236/1195/549 1094/1196/549 1093/1190/549 -f 1234/1191/550 1237/1197/550 1121/1198/550 1120/1192/550 -f 1235/1193/551 1238/1199/551 1108/1200/551 1107/1194/551 -f 1236/1195/552 1239/1201/552 1095/1202/552 1094/1196/552 -f 1237/1197/553 1227/1203/553 1090/1204/553 1121/1198/553 -f 1238/1199/554 1240/1205/554 1109/1206/554 1108/1200/554 -f 1239/1201/555 1241/1207/555 1096/1208/555 1095/1202/555 -f 1240/1205/556 1242/1209/556 1110/1210/556 1109/1206/556 -f 1241/1207/557 1243/1211/557 1097/1212/557 1096/1208/557 -f 1242/1209/558 1244/1213/558 1111/1214/558 1110/1210/558 -f 1243/1211/559 1245/1215/559 1098/1216/559 1097/1212/559 -f 1244/1213/560 1246/1217/560 1112/1218/560 1111/1214/560 -f 1245/1215/561 1247/1219/561 1099/1220/561 1098/1216/561 -f 1246/1217/562 1248/1221/562 1113/1222/562 1112/1218/562 -f 1247/1219/563 1249/1223/563 1100/1224/563 1099/1220/563 -f 1248/1221/564 1219/9/564 1114/12/564 1113/1222/564 -f 1249/1223/565 1221/1163/565 1101/1166/565 1100/1224/565 -f 1122/1225/566 1123/1226/566 1124/1227/566 1125/1228/566 1126/1229/566 1127/1230/566 1128/1231/566 1129/1232/566 1130/1233/566 1131/1234/566 1132/1235/566 1133/1236/566 1134/1237/566 1135/1238/566 1136/1239/566 1137/1240/566 1138/1241/566 1139/1242/566 1140/1243/566 1141/1244/566 1142/1245/566 1143/1246/566 1144/1247/566 1145/1248/566 1146/1249/566 1147/1250/566 1148/1251/566 1149/1252/566 1150/1253/566 1151/1254/566 1152/1255/566 1153/1256/566 -f 1216/1257/567 1187/1258/567 1135/1259/567 1134/1260/567 -f 1186/1160/568 1188/1261/568 1149/1262/568 1148/1161/568 -f 1187/1258/569 1189/1263/569 1136/1264/569 1135/1259/569 -f 1217/1265/570 1190/1266/570 1123/1267/570 1122/1268/570 -f 1188/1261/571 1191/1269/571 1150/1270/571 1149/1262/571 -f 1189/1263/572 1192/1271/572 1137/1272/572 1136/1264/572 -f 1190/1266/573 1193/1273/573 1124/1274/573 1123/1267/573 -f 1191/1269/574 1194/1275/574 1151/1276/574 1150/1270/574 -f 1192/1271/575 1195/1277/575 1138/1278/575 1137/1272/575 -f 1193/1273/576 1196/1279/576 1125/1280/576 1124/1274/576 -f 1194/1275/577 1197/1281/577 1152/1282/577 1151/1276/577 -f 1195/1277/578 1198/1283/578 1139/1284/578 1138/1278/578 -f 1196/1279/579 1199/1285/579 1126/1286/579 1125/1280/579 -f 1197/1281/580 1200/1287/580 1153/1288/580 1152/1282/580 -f 1198/1283/581 1201/1289/581 1140/1290/581 1139/1284/581 -f 1199/1285/582 1202/1291/582 1127/1292/582 1126/1286/582 -f 1200/1287/583 1217/1293/583 1122/1294/583 1153/1288/583 -f 1201/1289/584 1203/1295/584 1141/1296/584 1140/1290/584 -f 1202/1291/585 1204/1297/585 1128/1298/585 1127/1292/585 -f 1203/1295/586 1205/1299/586 1142/1300/586 1141/1296/586 -f 1204/1297/587 1206/1301/587 1129/1302/587 1128/1298/587 -f 1205/1299/588 1207/1303/588 1143/1304/588 1142/1300/588 -f 1206/1301/589 1208/1305/589 1130/1306/589 1129/1302/589 -f 1207/1303/590 1209/1307/590 1144/1308/590 1143/1304/590 -f 1208/1305/591 1210/1309/591 1131/1310/591 1130/1306/591 -f 1209/1307/592 1211/1311/592 1145/1312/592 1144/1308/592 -f 1210/1309/593 1212/1313/593 1132/1314/593 1131/1310/593 -f 1211/1311/594 1213/1315/594 1146/1316/594 1145/1312/594 -f 1212/1313/595 1214/1317/595 1133/1318/595 1132/1314/595 -f 1213/1315/596 1215/1159/596 1147/1162/596 1146/1316/596 -f 1214/1317/597 1216/1257/597 1134/1260/597 1133/1318/597 -f 1310/1319/598 1312/1320/598 1157/1321/598 1185/1322/598 -f 1309/1323/599 1311/1324/599 1155/1325/599 1184/1326/599 -f 1308/1327/600 1310/1319/600 1185/1322/600 1183/1328/600 -f 1307/1329/601 1309/1323/601 1184/1326/601 1182/1330/601 -f 1306/1331/602 1308/1327/602 1183/1328/602 1181/1332/602 -f 1305/1333/603 1307/1329/603 1182/1330/603 1180/1334/603 -f 1304/1335/604 1306/1331/604 1181/1332/604 1179/1336/604 -f 1303/1337/605 1305/1333/605 1180/1334/605 1178/1338/605 -f 1302/1339/606 1304/1335/606 1179/1336/606 1177/1340/606 -f 1301/1341/607 1303/1337/607 1178/1338/607 1176/1342/607 -f 1300/1343/608 1302/1339/608 1177/1340/608 1175/1344/608 -f 1299/1345/609 1301/1341/609 1176/1342/609 1174/1346/609 -f 1298/1347/610 1300/1343/610 1175/1344/610 1173/1348/610 -f 1297/1349/611 1299/1345/611 1174/1346/611 1172/1350/611 -f 1296/1351/612 1313/1352/612 1161/1353/612 1171/1354/612 -f 1295/1355/613 1298/1347/613 1173/1348/613 1170/1356/613 -f 1294/1357/614 1297/1349/614 1172/1350/614 1169/1358/614 -f 1293/1359/615 1296/1351/615 1171/1354/615 1168/1360/615 -f 1292/1361/616 1295/1355/616 1170/1356/616 1167/1362/616 -f 1291/1363/617 1294/1357/617 1169/1358/617 1166/1364/617 -f 1290/1365/618 1293/1359/618 1168/1360/618 1165/1366/618 -f 1289/1367/619 1292/1361/619 1167/1362/619 1164/1368/619 -f 1288/1369/620 1291/1363/620 1166/1364/620 1163/1370/620 -f 1287/1371/621 1290/1365/621 1165/1366/621 1162/1372/621 -f 1286/1373/622 1289/1367/622 1164/1368/622 1160/1374/622 -f 1285/1375/623 1288/1369/623 1163/1370/623 1159/1376/623 -f 1284/1377/624 1287/1371/624 1162/1372/624 1158/1378/624 -f 1313/1379/625 1286/1373/625 1160/1374/625 1161/1380/625 -f 1283/1381/626 1285/1375/626 1159/1376/626 1156/1382/626 -f 1282/1383/627 1284/1377/627 1158/1378/627 1154/1384/627 -f 1312/1320/628 1283/1381/628 1156/1382/628 1157/1321/628 -f 1311/1324/629 1282/1383/629 1154/1384/629 1155/1325/629 -f 1185/1322/630 1157/1321/630 1216/1257/630 1214/1317/630 -f 1184/1326/631 1155/1325/631 1215/1159/631 1213/1315/631 -f 1183/1328/632 1185/1322/632 1214/1317/632 1212/1313/632 -f 1182/1330/633 1184/1326/633 1213/1315/633 1211/1311/633 -f 1181/1332/634 1183/1328/634 1212/1313/634 1210/1309/634 -f 1180/1334/635 1182/1330/635 1211/1311/635 1209/1307/635 -f 1179/1336/636 1181/1332/636 1210/1309/636 1208/1305/636 -f 1178/1338/637 1180/1334/637 1209/1307/637 1207/1303/637 -f 1177/1340/638 1179/1336/638 1208/1305/638 1206/1301/638 -f 1176/1342/639 1178/1338/639 1207/1303/639 1205/1299/639 -f 1175/1344/640 1177/1340/640 1206/1301/640 1204/1297/640 -f 1174/1346/641 1176/1342/641 1205/1299/641 1203/1295/641 -f 1173/1348/642 1175/1344/642 1204/1297/642 1202/1291/642 -f 1172/1350/643 1174/1346/643 1203/1295/643 1201/1289/643 -f 1171/1354/644 1161/1353/644 1217/1293/644 1200/1287/644 -f 1170/1356/645 1173/1348/645 1202/1291/645 1199/1285/645 -f 1169/1358/646 1172/1350/646 1201/1289/646 1198/1283/646 -f 1168/1360/647 1171/1354/647 1200/1287/647 1197/1281/647 -f 1167/1362/648 1170/1356/648 1199/1285/648 1196/1279/648 -f 1166/1364/649 1169/1358/649 1198/1283/649 1195/1277/649 -f 1165/1366/650 1168/1360/650 1197/1281/650 1194/1275/650 -f 1164/1368/651 1167/1362/651 1196/1279/651 1193/1273/651 -f 1163/1370/652 1166/1364/652 1195/1277/652 1192/1271/652 -f 1162/1372/653 1165/1366/653 1194/1275/653 1191/1269/653 -f 1160/1374/654 1164/1368/654 1193/1273/654 1190/1266/654 -f 1159/1376/655 1163/1370/655 1192/1271/655 1189/1263/655 -f 1158/1378/656 1162/1372/656 1191/1269/656 1188/1261/656 -f 1161/1380/657 1160/1374/657 1190/1266/657 1217/1265/657 -f 1156/1382/658 1159/1376/658 1189/1263/658 1187/1258/658 -f 1154/1384/659 1158/1378/659 1188/1261/659 1186/1160/659 -f 1157/1321/660 1156/1382/660 1187/1258/660 1216/1257/660 -f 1155/1325/661 1154/1384/661 1186/1160/661 1215/1159/661 -f 43/82/27 44/88/27 1221/1163/27 1249/1223/27 -f 56/138/16 57/4/16 1219/9/16 1248/1221/16 -f 42/76/26 43/82/26 1249/1223/26 1247/1219/26 -f 55/134/13 56/138/13 1248/1221/13 1246/1217/13 -f 41/70/25 42/76/25 1247/1219/25 1245/1215/25 -f 54/130/10 55/134/10 1246/1217/10 1244/1213/10 -f 40/64/24 41/70/24 1245/1215/24 1243/1211/24 -f 53/126/7 54/130/7 1244/1213/7 1242/1209/7 -f 39/56/23 40/64/23 1243/1211/23 1241/1207/23 -f 52/122/5 53/126/5 1242/1209/5 1240/1205/5 -f 38/50/22 39/56/22 1241/1207/22 1239/1201/22 -f 51/118/2 52/122/2 1240/1205/2 1238/1199/2 -f 64/48/21 33/54/21 1227/1203/21 1237/1197/21 -f 37/44/20 38/50/20 1239/1201/20 1236/1195/20 -f 50/114/34 51/118/34 1238/1199/34 1235/1193/34 -f 63/42/19 64/48/19 1237/1197/19 1234/1191/19 -f 36/38/18 37/44/18 1236/1195/18 1233/1189/18 -f 49/110/33 50/114/33 1235/1193/33 1232/1187/33 -f 62/36/17 63/42/17 1234/1191/17 1231/1185/17 -f 35/32/15 36/38/15 1233/1189/15 1230/1183/15 -f 48/106/32 49/110/32 1232/1187/32 1229/1181/32 -f 61/30/14 62/36/14 1231/1185/14 1228/1179/14 -f 34/25/12 35/32/12 1230/1183/12 1226/1176/12 -f 47/102/31 48/106/31 1229/1181/31 1225/1173/31 -f 60/22/11 61/30/11 1228/1179/11 1224/1171/11 -f 33/26/9 34/25/9 1226/1176/9 1227/1175/9 -f 46/98/30 47/102/30 1225/1173/30 1223/1169/30 -f 59/18/8 60/22/8 1224/1171/8 1222/1167/8 -f 45/94/29 46/98/29 1223/1169/29 1220/1164/29 -f 58/3/6 59/18/6 1222/1167/6 1218/10/6 -f 44/88/28 45/94/28 1220/1164/28 1221/1163/28 -f 57/4/1 58/3/1 1218/10/1 1219/9/1 -f 1115/11/662 1116/1168/662 1253/1385/662 1250/1386/662 -f 1102/1165/663 1103/1170/663 1254/1387/663 1251/1388/663 -f 1116/1168/664 1117/1172/664 1255/1389/664 1253/1385/664 -f 1103/1170/665 1104/1174/665 1256/1390/665 1254/1387/665 -f 1090/1178/666 1091/1177/666 1257/1391/666 1252/1392/666 -f 1117/1172/667 1118/1180/667 1258/1393/667 1255/1389/667 -f 1104/1174/668 1105/1182/668 1259/1394/668 1256/1390/668 -f 1091/1177/669 1092/1184/669 1260/1395/669 1257/1391/669 -f 1118/1180/670 1119/1186/670 1261/1396/670 1258/1393/670 -f 1105/1182/671 1106/1188/671 1262/1397/671 1259/1394/671 -f 1092/1184/672 1093/1190/672 1263/1398/672 1260/1395/672 -f 1119/1186/673 1120/1192/673 1264/1399/673 1261/1396/673 -f 1106/1188/674 1107/1194/674 1265/1400/674 1262/1397/674 -f 1093/1190/675 1094/1196/675 1266/1401/675 1263/1398/675 -f 1120/1192/676 1121/1198/676 1267/1402/676 1264/1399/676 -f 1107/1194/677 1108/1200/677 1268/1403/677 1265/1400/677 -f 1094/1196/678 1095/1202/678 1269/1404/678 1266/1401/678 -f 1121/1198/679 1090/1204/679 1252/1405/679 1267/1402/679 -f 1108/1200/680 1109/1206/680 1270/1406/680 1268/1403/680 -f 1095/1202/681 1096/1208/681 1271/1407/681 1269/1404/681 -f 1109/1206/682 1110/1210/682 1272/1408/682 1270/1406/682 -f 1096/1208/683 1097/1212/683 1273/1409/683 1271/1407/683 -f 1110/1210/684 1111/1214/684 1274/1410/684 1272/1408/684 -f 1097/1212/685 1098/1216/685 1275/1411/685 1273/1409/685 -f 1111/1214/686 1112/1218/686 1276/1412/686 1274/1410/686 -f 1098/1216/687 1099/1220/687 1277/1413/687 1275/1411/687 -f 1112/1218/688 1113/1222/688 1278/1414/688 1276/1412/688 -f 1099/1220/689 1100/1224/689 1279/1415/689 1277/1413/689 -f 1113/1222/690 1114/12/690 1280/1416/690 1278/1414/690 -f 1100/1224/691 1101/1166/691 1281/1417/691 1279/1415/691 -f 1114/12/692 1115/11/692 1250/1386/692 1280/1416/692 -f 1101/1166/693 1102/1165/693 1251/1388/693 1281/1417/693 -f 1314/1418/694 1361/1419/694 1282/1383/694 1311/1324/694 -f 1326/1420/695 1373/1421/695 1283/1381/695 1312/1320/695 -f 1361/1419/696 1385/1422/696 1284/1377/696 1282/1383/696 -f 1373/1421/697 1397/1423/697 1285/1375/697 1283/1381/697 -f 1338/1424/698 1409/1425/698 1286/1373/698 1313/1379/698 -f 1385/1422/699 1421/1426/699 1287/1371/699 1284/1377/699 -f 1397/1423/700 1433/1427/700 1288/1369/700 1285/1375/700 -f 1409/1425/701 1445/1428/701 1289/1367/701 1286/1373/701 -f 1421/1426/702 1457/1429/702 1290/1365/702 1287/1371/702 -f 1433/1427/703 1469/1430/703 1291/1363/703 1288/1369/703 -f 1445/1428/704 1481/1431/704 1292/1361/704 1289/1367/704 -f 1457/1429/705 1493/1432/705 1293/1359/705 1290/1365/705 -f 1469/1430/706 1505/1433/706 1294/1357/706 1291/1363/706 -f 1481/1431/707 1517/1434/707 1295/1355/707 1292/1361/707 -f 1493/1432/708 1529/1435/708 1296/1351/708 1293/1359/708 -f 1505/1433/709 1541/1436/709 1297/1349/709 1294/1357/709 -f 1517/1434/710 1553/1437/710 1298/1347/710 1295/1355/710 -f 1529/1435/711 1338/1438/711 1313/1352/711 1296/1351/711 -f 1541/1436/712 1565/1439/712 1299/1345/712 1297/1349/712 -f 1553/1437/713 1577/1440/713 1300/1343/713 1298/1347/713 -f 1565/1439/714 1589/1441/714 1301/1341/714 1299/1345/714 -f 1577/1440/715 1601/1442/715 1302/1339/715 1300/1343/715 -f 1589/1441/716 1613/1443/716 1303/1337/716 1301/1341/716 -f 1601/1442/717 1625/1444/717 1304/1335/717 1302/1339/717 -f 1613/1443/718 1637/1445/718 1305/1333/718 1303/1337/718 -f 1625/1444/719 1649/1446/719 1306/1331/719 1304/1335/719 -f 1637/1445/720 1661/1447/720 1307/1329/720 1305/1333/720 -f 1649/1446/721 1673/1448/721 1308/1327/721 1306/1331/721 -f 1661/1447/722 1685/1449/722 1309/1323/722 1307/1329/722 -f 1673/1448/723 1697/1450/723 1310/1319/723 1308/1327/723 -f 1685/1449/724 1314/1418/724 1311/1324/724 1309/1323/724 -f 1697/1450/725 1326/1420/725 1312/1320/725 1310/1319/725 -f 1281/1417/726 1251/1388/726 1337/1451/726 1686/1452/726 -f 1686/1452/727 1337/1451/727 1336/1453/727 1687/1454/727 -f 1687/1454/728 1336/1453/728 1335/1455/728 1688/1456/728 -f 1688/1456/729 1335/1455/729 1334/1457/729 1689/1458/729 -f 1689/1458/728 1334/1457/728 1333/1459/728 1690/1460/728 -f 1690/1460/729 1333/1459/729 1332/1461/729 1691/1462/729 -f 1691/1462/730 1332/1461/730 1331/1463/730 1692/1464/730 -f 1692/1464/731 1331/1463/731 1330/1465/731 1693/1466/731 -f 1693/1466/728 1330/1465/728 1329/1467/728 1694/1468/728 -f 1694/1468/729 1329/1467/729 1328/1469/729 1695/1470/729 -f 1695/1470/728 1328/1469/728 1327/1471/728 1696/1472/728 -f 1696/1472/729 1327/1471/729 1326/1420/729 1697/1450/729 -f 1280/1416/732 1250/1386/732 1325/1473/732 1674/1474/732 -f 1674/1474/733 1325/1473/733 1324/1475/733 1675/1476/733 -f 1675/1476/734 1324/1475/734 1323/1477/734 1676/1478/734 -f 1676/1478/735 1323/1477/735 1322/1479/735 1677/1480/735 -f 1677/1480/734 1322/1479/734 1321/1481/734 1678/1482/734 -f 1678/1482/735 1321/1481/735 1320/1483/735 1679/1484/735 -f 1679/1484/736 1320/1483/736 1319/1485/736 1680/1486/736 -f 1680/1486/737 1319/1485/737 1318/1487/737 1681/1488/737 -f 1681/1488/734 1318/1487/734 1317/1489/734 1682/1490/734 -f 1682/1490/735 1317/1489/735 1316/1491/735 1683/1492/735 -f 1683/1492/738 1316/1491/738 1315/1493/738 1684/1494/738 -f 1684/1494/735 1315/1493/735 1314/1418/735 1685/1449/735 -f 1279/1415/739 1281/1417/739 1686/1452/739 1662/1495/739 -f 1662/1495/740 1686/1452/740 1687/1454/740 1663/1496/740 -f 1663/1496/741 1687/1454/741 1688/1456/741 1664/1497/741 -f 1664/1497/742 1688/1456/742 1689/1458/742 1665/1498/742 -f 1665/1498/741 1689/1458/741 1690/1460/741 1666/1499/741 -f 1666/1499/742 1690/1460/742 1691/1462/742 1667/1500/742 -f 1667/1500/743 1691/1462/743 1692/1464/743 1668/1501/743 -f 1668/1501/744 1692/1464/744 1693/1466/744 1669/1502/744 -f 1669/1502/741 1693/1466/741 1694/1468/741 1670/1503/741 -f 1670/1503/745 1694/1468/745 1695/1470/745 1671/1504/745 -f 1671/1504/741 1695/1470/741 1696/1472/741 1672/1505/741 -f 1672/1505/745 1696/1472/745 1697/1450/745 1673/1448/745 -f 1278/1414/746 1280/1416/746 1674/1474/746 1650/1506/746 -f 1650/1506/747 1674/1474/747 1675/1476/747 1651/1507/747 -f 1651/1507/748 1675/1476/748 1676/1478/748 1652/1508/748 -f 1652/1508/749 1676/1478/749 1677/1480/749 1653/1509/749 -f 1653/1509/748 1677/1480/748 1678/1482/748 1654/1510/748 -f 1654/1510/749 1678/1482/749 1679/1484/749 1655/1511/749 -f 1655/1511/750 1679/1484/750 1680/1486/750 1656/1512/750 -f 1656/1512/751 1680/1486/751 1681/1488/751 1657/1513/751 -f 1657/1513/748 1681/1488/748 1682/1490/748 1658/1514/748 -f 1658/1514/749 1682/1490/749 1683/1492/749 1659/1515/749 -f 1659/1515/748 1683/1492/748 1684/1494/748 1660/1516/748 -f 1660/1516/749 1684/1494/749 1685/1449/749 1661/1447/749 -f 1277/1413/752 1279/1415/752 1662/1495/752 1638/1517/752 -f 1638/1517/753 1662/1495/753 1663/1496/753 1639/1518/753 -f 1639/1518/754 1663/1496/754 1664/1497/754 1640/1519/754 -f 1640/1519/755 1664/1497/755 1665/1498/755 1641/1520/755 -f 1641/1520/754 1665/1498/754 1666/1499/754 1642/1521/754 -f 1642/1521/756 1666/1499/756 1667/1500/756 1643/1522/756 -f 1643/1522/757 1667/1500/757 1668/1501/757 1644/1523/757 -f 1644/1523/758 1668/1501/758 1669/1502/758 1645/1524/758 -f 1645/1524/759 1669/1502/759 1670/1503/759 1646/1525/759 -f 1646/1525/756 1670/1503/756 1671/1504/756 1647/1526/756 -f 1647/1526/759 1671/1504/759 1672/1505/759 1648/1527/759 -f 1648/1527/755 1672/1505/755 1673/1448/755 1649/1446/755 -f 1276/1412/760 1278/1414/760 1650/1506/760 1626/1528/760 -f 1626/1528/761 1650/1506/761 1651/1507/761 1627/1529/761 -f 1627/1529/762 1651/1507/762 1652/1508/762 1628/1530/762 -f 1628/1530/763 1652/1508/763 1653/1509/763 1629/1531/763 -f 1629/1531/764 1653/1509/764 1654/1510/764 1630/1532/764 -f 1630/1532/765 1654/1510/765 1655/1511/765 1631/1533/765 -f 1631/1533/766 1655/1511/766 1656/1512/766 1632/1534/766 -f 1632/1534/767 1656/1512/767 1657/1513/767 1633/1535/767 -f 1633/1535/762 1657/1513/762 1658/1514/762 1634/1536/762 -f 1634/1536/763 1658/1514/763 1659/1515/763 1635/1537/763 -f 1635/1537/762 1659/1515/762 1660/1516/762 1636/1538/762 -f 1636/1538/763 1660/1516/763 1661/1447/763 1637/1445/763 -f 1275/1411/768 1277/1413/768 1638/1517/768 1614/1539/768 -f 1614/1539/769 1638/1517/769 1639/1518/769 1615/1540/769 -f 1615/1540/770 1639/1518/770 1640/1519/770 1616/1541/770 -f 1616/1541/771 1640/1519/771 1641/1520/771 1617/1542/771 -f 1617/1542/770 1641/1520/770 1642/1521/770 1618/1543/770 -f 1618/1543/771 1642/1521/771 1643/1522/771 1619/1544/771 -f 1619/1544/772 1643/1522/772 1644/1523/772 1620/1545/772 -f 1620/1545/773 1644/1523/773 1645/1524/773 1621/1546/773 -f 1621/1546/770 1645/1524/770 1646/1525/770 1622/1547/770 -f 1622/1547/771 1646/1525/771 1647/1526/771 1623/1548/771 -f 1623/1548/770 1647/1526/770 1648/1527/770 1624/1549/770 -f 1624/1549/771 1648/1527/771 1649/1446/771 1625/1444/771 -f 1274/1410/774 1276/1412/774 1626/1528/774 1602/1550/774 -f 1602/1550/775 1626/1528/775 1627/1529/775 1603/1551/775 -f 1603/1551/776 1627/1529/776 1628/1530/776 1604/1552/776 -f 1604/1552/777 1628/1530/777 1629/1531/777 1605/1553/777 -f 1605/1553/778 1629/1531/778 1630/1532/778 1606/1554/778 -f 1606/1554/777 1630/1532/777 1631/1533/777 1607/1555/777 -f 1607/1555/779 1631/1533/779 1632/1534/779 1608/1556/779 -f 1608/1556/780 1632/1534/780 1633/1535/780 1609/1557/780 -f 1609/1557/776 1633/1535/776 1634/1536/776 1610/1558/776 -f 1610/1558/781 1634/1536/781 1635/1537/781 1611/1559/781 -f 1611/1559/776 1635/1537/776 1636/1538/776 1612/1560/776 -f 1612/1560/781 1636/1538/781 1637/1445/781 1613/1443/781 -f 1273/1409/782 1275/1411/782 1614/1539/782 1590/1561/782 -f 1590/1561/783 1614/1539/783 1615/1540/783 1591/1562/783 -f 1591/1562/784 1615/1540/784 1616/1541/784 1592/1563/784 -f 1592/1563/785 1616/1541/785 1617/1542/785 1593/1564/785 -f 1593/1564/784 1617/1542/784 1618/1543/784 1594/1565/784 -f 1594/1565/785 1618/1543/785 1619/1544/785 1595/1566/785 -f 1595/1566/786 1619/1544/786 1620/1545/786 1596/1567/786 -f 1596/1567/787 1620/1545/787 1621/1546/787 1597/1568/787 -f 1597/1568/784 1621/1546/784 1622/1547/784 1598/1569/784 -f 1598/1569/785 1622/1547/785 1623/1548/785 1599/1570/785 -f 1599/1570/784 1623/1548/784 1624/1549/784 1600/1571/784 -f 1600/1571/785 1624/1549/785 1625/1444/785 1601/1442/785 -f 1272/1408/788 1274/1410/788 1602/1550/788 1578/1572/788 -f 1578/1572/789 1602/1550/789 1603/1551/789 1579/1573/789 -f 1579/1573/790 1603/1551/790 1604/1552/790 1580/1574/790 -f 1580/1574/791 1604/1552/791 1605/1553/791 1581/1575/791 -f 1581/1575/790 1605/1553/790 1606/1554/790 1582/1576/790 -f 1582/1576/791 1606/1554/791 1607/1555/791 1583/1577/791 -f 1583/1577/792 1607/1555/792 1608/1556/792 1584/1578/792 -f 1584/1578/793 1608/1556/793 1609/1557/793 1585/1579/793 -f 1585/1579/790 1609/1557/790 1610/1558/790 1586/1580/790 -f 1586/1580/791 1610/1558/791 1611/1559/791 1587/1581/791 -f 1587/1581/790 1611/1559/790 1612/1560/790 1588/1582/790 -f 1588/1582/791 1612/1560/791 1613/1443/791 1589/1441/791 -f 1271/1407/794 1273/1409/794 1590/1561/794 1566/1583/794 -f 1566/1583/795 1590/1561/795 1591/1562/795 1567/1584/795 -f 1567/1584/796 1591/1562/796 1592/1563/796 1568/1585/796 -f 1568/1585/797 1592/1563/797 1593/1564/797 1569/1586/797 -f 1569/1586/798 1593/1564/798 1594/1565/798 1570/1587/798 -f 1570/1587/799 1594/1565/799 1595/1566/799 1571/1588/799 -f 1571/1588/800 1595/1566/800 1596/1567/800 1572/1589/800 -f 1572/1589/801 1596/1567/801 1597/1568/801 1573/1590/801 -f 1573/1590/796 1597/1568/796 1598/1569/796 1574/1591/796 -f 1574/1591/797 1598/1569/797 1599/1570/797 1575/1592/797 -f 1575/1592/796 1599/1570/796 1600/1571/796 1576/1593/796 -f 1576/1593/797 1600/1571/797 1601/1442/797 1577/1440/797 -f 1270/1406/802 1272/1408/802 1578/1572/802 1554/1594/802 -f 1554/1594/803 1578/1572/803 1579/1573/803 1555/1595/803 -f 1555/1595/804 1579/1573/804 1580/1574/804 1556/1596/804 -f 1556/1596/805 1580/1574/805 1581/1575/805 1557/1597/805 -f 1557/1597/804 1581/1575/804 1582/1576/804 1558/1598/804 -f 1558/1598/805 1582/1576/805 1583/1577/805 1559/1599/805 -f 1559/1599/806 1583/1577/806 1584/1578/806 1560/1600/806 -f 1560/1600/807 1584/1578/807 1585/1579/807 1561/1601/807 -f 1561/1601/804 1585/1579/804 1586/1580/804 1562/1602/804 -f 1562/1602/805 1586/1580/805 1587/1581/805 1563/1603/805 -f 1563/1603/804 1587/1581/804 1588/1582/804 1564/1604/804 -f 1564/1604/805 1588/1582/805 1589/1441/805 1565/1439/805 -f 1269/1404/808 1271/1407/808 1566/1583/808 1542/1605/808 -f 1542/1605/809 1566/1583/809 1567/1584/809 1543/1606/809 -f 1543/1606/810 1567/1584/810 1568/1585/810 1544/1607/810 -f 1544/1607/811 1568/1585/811 1569/1586/811 1545/1608/811 -f 1545/1608/810 1569/1586/810 1570/1587/810 1546/1609/810 -f 1546/1609/811 1570/1587/811 1571/1588/811 1547/1610/811 -f 1547/1610/812 1571/1588/812 1572/1589/812 1548/1611/812 -f 1548/1611/813 1572/1589/813 1573/1590/813 1549/1612/813 -f 1549/1612/814 1573/1590/814 1574/1591/814 1550/1613/814 -f 1550/1613/811 1574/1591/811 1575/1592/811 1551/1614/811 -f 1551/1614/810 1575/1592/810 1576/1593/810 1552/1615/810 -f 1552/1615/815 1576/1593/815 1577/1440/815 1553/1437/815 -f 1268/1403/816 1270/1406/816 1554/1594/816 1530/1616/816 -f 1530/1616/817 1554/1594/817 1555/1595/817 1531/1617/817 -f 1531/1617/818 1555/1595/818 1556/1596/818 1532/1618/818 -f 1532/1618/819 1556/1596/819 1557/1597/819 1533/1619/819 -f 1533/1619/818 1557/1597/818 1558/1598/818 1534/1620/818 -f 1534/1620/819 1558/1598/819 1559/1599/819 1535/1621/819 -f 1535/1621/820 1559/1599/820 1560/1600/820 1536/1622/820 -f 1536/1622/821 1560/1600/821 1561/1601/821 1537/1623/821 -f 1537/1623/818 1561/1601/818 1562/1602/818 1538/1624/818 -f 1538/1624/822 1562/1602/822 1563/1603/822 1539/1625/822 -f 1539/1625/818 1563/1603/818 1564/1604/818 1540/1626/818 -f 1540/1626/822 1564/1604/822 1565/1439/822 1541/1436/822 -f 1267/1402/823 1252/1405/823 1349/1627/823 1518/1628/823 -f 1518/1628/824 1349/1627/824 1348/1629/824 1519/1630/824 -f 1519/1630/825 1348/1629/825 1347/1631/825 1520/1632/825 -f 1520/1632/826 1347/1631/826 1346/1633/826 1521/1634/826 -f 1521/1634/825 1346/1633/825 1345/1635/825 1522/1636/825 -f 1522/1636/826 1345/1635/826 1344/1637/826 1523/1638/826 -f 1523/1638/827 1344/1637/827 1343/1639/827 1524/1640/827 -f 1524/1640/828 1343/1639/828 1342/1641/828 1525/1642/828 -f 1525/1642/825 1342/1641/825 1341/1643/825 1526/1644/825 -f 1526/1644/826 1341/1643/826 1340/1645/826 1527/1646/826 -f 1527/1646/825 1340/1645/825 1339/1647/825 1528/1648/825 -f 1528/1648/829 1339/1647/829 1338/1438/829 1529/1435/829 -f 1266/1401/830 1269/1404/830 1542/1605/830 1506/1649/830 -f 1506/1649/831 1542/1605/831 1543/1606/831 1507/1650/831 -f 1507/1650/832 1543/1606/832 1544/1607/832 1508/1651/832 -f 1508/1651/833 1544/1607/833 1545/1608/833 1509/1652/833 -f 1509/1652/832 1545/1608/832 1546/1609/832 1510/1653/832 -f 1510/1653/833 1546/1609/833 1547/1610/833 1511/1654/833 -f 1511/1654/834 1547/1610/834 1548/1611/834 1512/1655/834 -f 1512/1655/835 1548/1611/835 1549/1612/835 1513/1656/835 -f 1513/1656/832 1549/1612/832 1550/1613/832 1514/1657/832 -f 1514/1657/833 1550/1613/833 1551/1614/833 1515/1658/833 -f 1515/1658/832 1551/1614/832 1552/1615/832 1516/1659/832 -f 1516/1659/833 1552/1615/833 1553/1437/833 1517/1434/833 -f 1265/1400/836 1268/1403/836 1530/1616/836 1494/1660/836 -f 1494/1660/837 1530/1616/837 1531/1617/837 1495/1661/837 -f 1495/1661/838 1531/1617/838 1532/1618/838 1496/1662/838 -f 1496/1662/839 1532/1618/839 1533/1619/839 1497/1663/839 -f 1497/1663/840 1533/1619/840 1534/1620/840 1498/1664/840 -f 1498/1664/839 1534/1620/839 1535/1621/839 1499/1665/839 -f 1499/1665/841 1535/1621/841 1536/1622/841 1500/1666/841 -f 1500/1666/842 1536/1622/842 1537/1623/842 1501/1667/842 -f 1501/1667/838 1537/1623/838 1538/1624/838 1502/1668/838 -f 1502/1668/843 1538/1624/843 1539/1625/843 1503/1669/843 -f 1503/1669/838 1539/1625/838 1540/1626/838 1504/1670/838 -f 1504/1670/843 1540/1626/843 1541/1436/843 1505/1433/843 -f 1264/1399/844 1267/1402/844 1518/1628/844 1482/1671/844 -f 1482/1671/845 1518/1628/845 1519/1630/845 1483/1672/845 -f 1483/1672/846 1519/1630/846 1520/1632/846 1484/1673/846 -f 1484/1673/847 1520/1632/847 1521/1634/847 1485/1674/847 -f 1485/1674/846 1521/1634/846 1522/1636/846 1486/1675/846 -f 1486/1675/848 1522/1636/848 1523/1638/848 1487/1676/848 -f 1487/1676/849 1523/1638/849 1524/1640/849 1488/1677/849 -f 1488/1677/850 1524/1640/850 1525/1642/850 1489/1678/850 -f 1489/1678/851 1525/1642/851 1526/1644/851 1490/1679/851 -f 1490/1679/847 1526/1644/847 1527/1646/847 1491/1680/847 -f 1491/1680/851 1527/1646/851 1528/1648/851 1492/1681/851 -f 1492/1681/847 1528/1648/847 1529/1435/847 1493/1432/847 -f 1263/1398/852 1266/1401/852 1506/1649/852 1470/1682/852 -f 1470/1682/853 1506/1649/853 1507/1650/853 1471/1683/853 -f 1471/1683/854 1507/1650/854 1508/1651/854 1472/1684/854 -f 1472/1684/855 1508/1651/855 1509/1652/855 1473/1685/855 -f 1473/1685/854 1509/1652/854 1510/1653/854 1474/1686/854 -f 1474/1686/855 1510/1653/855 1511/1654/855 1475/1687/855 -f 1475/1687/856 1511/1654/856 1512/1655/856 1476/1688/856 -f 1476/1688/857 1512/1655/857 1513/1656/857 1477/1689/857 -f 1477/1689/854 1513/1656/854 1514/1657/854 1478/1690/854 -f 1478/1690/855 1514/1657/855 1515/1658/855 1479/1691/855 -f 1479/1691/854 1515/1658/854 1516/1659/854 1480/1692/854 -f 1480/1692/855 1516/1659/855 1517/1434/855 1481/1431/855 -f 1262/1397/858 1265/1400/858 1494/1660/858 1458/1693/858 -f 1458/1693/859 1494/1660/859 1495/1661/859 1459/1694/859 -f 1459/1694/860 1495/1661/860 1496/1662/860 1460/1695/860 -f 1460/1695/861 1496/1662/861 1497/1663/861 1461/1696/861 -f 1461/1696/860 1497/1663/860 1498/1664/860 1462/1697/860 -f 1462/1697/861 1498/1664/861 1499/1665/861 1463/1698/861 -f 1463/1698/862 1499/1665/862 1500/1666/862 1464/1699/862 -f 1464/1699/863 1500/1666/863 1501/1667/863 1465/1700/863 -f 1465/1700/860 1501/1667/860 1502/1668/860 1466/1701/860 -f 1466/1701/861 1502/1668/861 1503/1669/861 1467/1702/861 -f 1467/1702/860 1503/1669/860 1504/1670/860 1468/1703/860 -f 1468/1703/861 1504/1670/861 1505/1433/861 1469/1430/861 -f 1261/1396/864 1264/1399/864 1482/1671/864 1446/1704/864 -f 1446/1704/865 1482/1671/865 1483/1672/865 1447/1705/865 -f 1447/1705/866 1483/1672/866 1484/1673/866 1448/1706/866 -f 1448/1706/867 1484/1673/867 1485/1674/867 1449/1707/867 -f 1449/1707/866 1485/1674/866 1486/1675/866 1450/1708/866 -f 1450/1708/868 1486/1675/868 1487/1676/868 1451/1709/868 -f 1451/1709/869 1487/1676/869 1488/1677/869 1452/1710/869 -f 1452/1710/870 1488/1677/870 1489/1678/870 1453/1711/870 -f 1453/1711/871 1489/1678/871 1490/1679/871 1454/1712/871 -f 1454/1712/868 1490/1679/868 1491/1680/868 1455/1713/868 -f 1455/1713/871 1491/1680/871 1492/1681/871 1456/1714/871 -f 1456/1714/868 1492/1681/868 1493/1432/868 1457/1429/868 -f 1260/1395/872 1263/1398/872 1470/1682/872 1434/1715/872 -f 1434/1715/873 1470/1682/873 1471/1683/873 1435/1716/873 -f 1435/1716/874 1471/1683/874 1472/1684/874 1436/1717/874 -f 1436/1717/875 1472/1684/875 1473/1685/875 1437/1718/875 -f 1437/1718/874 1473/1685/874 1474/1686/874 1438/1719/874 -f 1438/1719/875 1474/1686/875 1475/1687/875 1439/1720/875 -f 1439/1720/876 1475/1687/876 1476/1688/876 1440/1721/876 -f 1440/1721/877 1476/1688/877 1477/1689/877 1441/1722/877 -f 1441/1722/878 1477/1689/878 1478/1690/878 1442/1723/878 -f 1442/1723/879 1478/1690/879 1479/1691/879 1443/1724/879 -f 1443/1724/874 1479/1691/874 1480/1692/874 1444/1725/874 -f 1444/1725/879 1480/1692/879 1481/1431/879 1445/1428/879 -f 1259/1394/880 1262/1397/880 1458/1693/880 1422/1726/880 -f 1422/1726/881 1458/1693/881 1459/1694/881 1423/1727/881 -f 1423/1727/882 1459/1694/882 1460/1695/882 1424/1728/882 -f 1424/1728/883 1460/1695/883 1461/1696/883 1425/1729/883 -f 1425/1729/882 1461/1696/882 1462/1697/882 1426/1730/882 -f 1426/1730/883 1462/1697/883 1463/1698/883 1427/1731/883 -f 1427/1731/884 1463/1698/884 1464/1699/884 1428/1732/884 -f 1428/1732/885 1464/1699/885 1465/1700/885 1429/1733/885 -f 1429/1733/882 1465/1700/882 1466/1701/882 1430/1734/882 -f 1430/1734/886 1466/1701/886 1467/1702/886 1431/1735/886 -f 1431/1735/882 1467/1702/882 1468/1703/882 1432/1736/882 -f 1432/1736/886 1468/1703/886 1469/1430/886 1433/1427/886 -f 1258/1393/887 1261/1396/887 1446/1704/887 1410/1737/887 -f 1410/1737/888 1446/1704/888 1447/1705/888 1411/1738/888 -f 1411/1738/889 1447/1705/889 1448/1706/889 1412/1739/889 -f 1412/1739/890 1448/1706/890 1449/1707/890 1413/1740/890 -f 1413/1740/889 1449/1707/889 1450/1708/889 1414/1741/889 -f 1414/1741/890 1450/1708/890 1451/1709/890 1415/1742/890 -f 1415/1742/891 1451/1709/891 1452/1710/891 1416/1743/891 -f 1416/1743/892 1452/1710/892 1453/1711/892 1417/1744/892 -f 1417/1744/893 1453/1711/893 1454/1712/893 1418/1745/893 -f 1418/1745/890 1454/1712/890 1455/1713/890 1419/1746/890 -f 1419/1746/889 1455/1713/889 1456/1714/889 1420/1747/889 -f 1420/1747/890 1456/1714/890 1457/1429/890 1421/1426/890 -f 1257/1391/894 1260/1395/894 1434/1715/894 1398/1748/894 -f 1398/1748/895 1434/1715/895 1435/1716/895 1399/1749/895 -f 1399/1749/896 1435/1716/896 1436/1717/896 1400/1750/896 -f 1400/1750/897 1436/1717/897 1437/1718/897 1401/1751/897 -f 1401/1751/896 1437/1718/896 1438/1719/896 1402/1752/896 -f 1402/1752/898 1438/1719/898 1439/1720/898 1403/1753/898 -f 1403/1753/899 1439/1720/899 1440/1721/899 1404/1754/899 -f 1404/1754/900 1440/1721/900 1441/1722/900 1405/1755/900 -f 1405/1755/901 1441/1722/901 1442/1723/901 1406/1756/901 -f 1406/1756/897 1442/1723/897 1443/1724/897 1407/1757/897 -f 1407/1757/901 1443/1724/901 1444/1725/901 1408/1758/901 -f 1408/1758/897 1444/1725/897 1445/1428/897 1409/1425/897 -f 1256/1390/902 1259/1394/902 1422/1726/902 1386/1759/902 -f 1386/1759/903 1422/1726/903 1423/1727/903 1387/1760/903 -f 1387/1760/904 1423/1727/904 1424/1728/904 1388/1761/904 -f 1388/1761/905 1424/1728/905 1425/1729/905 1389/1762/905 -f 1389/1762/904 1425/1729/904 1426/1730/904 1390/1763/904 -f 1390/1763/905 1426/1730/905 1427/1731/905 1391/1764/905 -f 1391/1764/906 1427/1731/906 1428/1732/906 1392/1765/906 -f 1392/1765/907 1428/1732/907 1429/1733/907 1393/1766/907 -f 1393/1766/908 1429/1733/908 1430/1734/908 1394/1767/908 -f 1394/1767/909 1430/1734/909 1431/1735/909 1395/1768/909 -f 1395/1768/908 1431/1735/908 1432/1736/908 1396/1769/908 -f 1396/1769/909 1432/1736/909 1433/1427/909 1397/1423/909 -f 1255/1389/910 1258/1393/910 1410/1737/910 1374/1770/910 -f 1374/1770/911 1410/1737/911 1411/1738/911 1375/1771/911 -f 1375/1771/912 1411/1738/912 1412/1739/912 1376/1772/912 -f 1376/1772/913 1412/1739/913 1413/1740/913 1377/1773/913 -f 1377/1773/912 1413/1740/912 1414/1741/912 1378/1774/912 -f 1378/1774/913 1414/1741/913 1415/1742/913 1379/1775/913 -f 1379/1775/914 1415/1742/914 1416/1743/914 1380/1776/914 -f 1380/1776/915 1416/1743/915 1417/1744/915 1381/1777/915 -f 1381/1777/916 1417/1744/916 1418/1745/916 1382/1778/916 -f 1382/1778/913 1418/1745/913 1419/1746/913 1383/1779/913 -f 1383/1779/912 1419/1746/912 1420/1747/912 1384/1780/912 -f 1384/1780/913 1420/1747/913 1421/1426/913 1385/1422/913 -f 1252/1392/917 1257/1391/917 1398/1748/917 1349/1781/917 -f 1349/1781/918 1398/1748/918 1399/1749/918 1348/1782/918 -f 1348/1782/919 1399/1749/919 1400/1750/919 1347/1783/919 -f 1347/1783/920 1400/1750/920 1401/1751/920 1346/1784/920 -f 1346/1784/921 1401/1751/921 1402/1752/921 1345/1785/921 -f 1345/1785/920 1402/1752/920 1403/1753/920 1344/1786/920 -f 1344/1786/922 1403/1753/922 1404/1754/922 1343/1787/922 -f 1343/1787/923 1404/1754/923 1405/1755/923 1342/1788/923 -f 1342/1788/919 1405/1755/919 1406/1756/919 1341/1789/919 -f 1341/1789/920 1406/1756/920 1407/1757/920 1340/1790/920 -f 1340/1790/919 1407/1757/919 1408/1758/919 1339/1791/919 -f 1339/1791/924 1408/1758/924 1409/1425/924 1338/1424/924 -f 1254/1387/925 1256/1390/925 1386/1759/925 1362/1792/925 -f 1362/1792/926 1386/1759/926 1387/1760/926 1363/1793/926 -f 1363/1793/927 1387/1760/927 1388/1761/927 1364/1794/927 -f 1364/1794/928 1388/1761/928 1389/1762/928 1365/1795/928 -f 1365/1795/929 1389/1762/929 1390/1763/929 1366/1796/929 -f 1366/1796/928 1390/1763/928 1391/1764/928 1367/1797/928 -f 1367/1797/930 1391/1764/930 1392/1765/930 1368/1798/930 -f 1368/1798/931 1392/1765/931 1393/1766/931 1369/1799/931 -f 1369/1799/929 1393/1766/929 1394/1767/929 1370/1800/929 -f 1370/1800/928 1394/1767/928 1395/1768/928 1371/1801/928 -f 1371/1801/929 1395/1768/929 1396/1769/929 1372/1802/929 -f 1372/1802/932 1396/1769/932 1397/1423/932 1373/1421/932 -f 1253/1385/933 1255/1389/933 1374/1770/933 1350/1803/933 -f 1350/1803/934 1374/1770/934 1375/1771/934 1351/1804/934 -f 1351/1804/935 1375/1771/935 1376/1772/935 1352/1805/935 -f 1352/1805/936 1376/1772/936 1377/1773/936 1353/1806/936 -f 1353/1806/935 1377/1773/935 1378/1774/935 1354/1807/935 -f 1354/1807/936 1378/1774/936 1379/1775/936 1355/1808/936 -f 1355/1808/937 1379/1775/937 1380/1776/937 1356/1809/937 -f 1356/1809/938 1380/1776/938 1381/1777/938 1357/1810/938 -f 1357/1810/935 1381/1777/935 1382/1778/935 1358/1811/935 -f 1358/1811/939 1382/1778/939 1383/1779/939 1359/1812/939 -f 1359/1812/935 1383/1779/935 1384/1780/935 1360/1813/935 -f 1360/1813/939 1384/1780/939 1385/1422/939 1361/1419/939 -f 1251/1388/940 1254/1387/940 1362/1792/940 1337/1451/940 -f 1337/1451/941 1362/1792/941 1363/1793/941 1336/1453/941 -f 1336/1453/942 1363/1793/942 1364/1794/942 1335/1455/942 -f 1335/1455/943 1364/1794/943 1365/1795/943 1334/1457/943 -f 1334/1457/942 1365/1795/942 1366/1796/942 1333/1459/942 -f 1333/1459/943 1366/1796/943 1367/1797/943 1332/1461/943 -f 1332/1461/944 1367/1797/944 1368/1798/944 1331/1463/944 -f 1331/1463/945 1368/1798/945 1369/1799/945 1330/1465/945 -f 1330/1465/942 1369/1799/942 1370/1800/942 1329/1467/942 -f 1329/1467/943 1370/1800/943 1371/1801/943 1328/1469/943 -f 1328/1469/942 1371/1801/942 1372/1802/942 1327/1471/942 -f 1327/1471/943 1372/1802/943 1373/1421/943 1326/1420/943 -f 1250/1386/946 1253/1385/946 1350/1803/946 1325/1473/946 -f 1325/1473/947 1350/1803/947 1351/1804/947 1324/1475/947 -f 1324/1475/948 1351/1804/948 1352/1805/948 1323/1477/948 -f 1323/1477/949 1352/1805/949 1353/1806/949 1322/1479/949 -f 1322/1479/948 1353/1806/948 1354/1807/948 1321/1481/948 -f 1321/1481/950 1354/1807/950 1355/1808/950 1320/1483/950 -f 1320/1483/951 1355/1808/951 1356/1809/951 1319/1485/951 -f 1319/1485/952 1356/1809/952 1357/1810/952 1318/1487/952 -f 1318/1487/948 1357/1810/948 1358/1811/948 1317/1489/948 -f 1317/1489/950 1358/1811/950 1359/1812/950 1316/1491/950 -f 1316/1491/948 1359/1812/948 1360/1813/948 1315/1493/948 -f 1315/1493/953 1360/1813/953 1361/1419/953 1314/1418/953 -f 173/418/12 175/463/12 3/815/12 2/819/12 -f 175/463/15 177/493/15 4/811/15 3/815/15 -f 177/493/18 179/523/18 5/807/18 4/811/18 -f 179/523/20 181/553/20 6/801/20 5/807/20 -f 181/553/22 182/583/22 7/799/22 6/801/22 -f 182/583/23 183/598/23 8/797/23 7/799/23 -f 183/598/24 184/613/24 9/795/24 8/797/24 -f 184/613/25 185/628/25 10/793/25 9/795/25 -f 185/628/26 186/643/26 11/791/26 10/793/26 -f 186/643/27 187/658/27 12/789/27 11/791/27 -f 187/658/28 188/673/28 13/787/28 12/789/28 -f 188/673/29 189/688/29 14/785/29 13/787/29 -f 189/688/30 190/703/30 15/783/30 14/785/30 -f 190/703/31 191/718/31 16/781/31 15/783/31 -f 191/718/32 192/733/32 17/779/32 16/781/32 -f 192/733/33 193/748/33 18/777/33 17/779/33 -f 193/748/34 162/269/34 19/775/34 18/777/34 -f 162/269/2 163/268/2 20/773/2 19/775/2 -f 163/268/5 164/298/5 21/771/5 20/773/5 -f 164/298/7 165/313/7 22/769/7 21/771/7 -f 165/313/10 166/328/10 23/767/10 22/769/10 -f 166/328/13 167/343/13 24/763/13 23/767/13 -f 167/343/16 168/358/16 25/764/16 24/763/16 -f 168/358/1 169/373/1 26/827/1 25/764/1 -f 169/373/6 170/388/6 27/825/6 26/827/6 -f 170/388/8 171/403/8 28/821/8 27/825/8 -f 171/403/11 174/448/11 29/817/11 28/821/11 -f 174/448/14 176/478/14 30/813/14 29/817/14 -f 176/478/17 178/508/17 31/809/17 30/813/17 -f 178/508/19 180/538/19 32/803/19 31/809/19 -f 180/538/21 172/568/21 1/804/21 32/803/21 -f 172/419/9 173/418/9 2/819/9 1/823/9 -f 1698/1814/954 1699/1815/954 1701/1816/954 1700/1817/954 -f 1700/1817/955 1701/1816/955 1703/1818/955 1702/1819/955 -f 1702/1819/956 1703/1818/956 1705/1820/956 1704/1821/956 -f 1704/1821/957 1705/1820/957 1707/1822/957 1706/1823/957 -f 1706/1823/958 1707/1822/958 1709/1824/958 1708/1825/958 -f 1708/1825/959 1709/1824/959 1711/1826/959 1710/1827/959 -f 1710/1827/960 1711/1826/960 1713/1828/960 1712/1829/960 -f 1712/1829/961 1713/1828/961 1715/1830/961 1714/1831/961 -f 1714/1831/962 1715/1830/962 1717/1832/962 1716/1833/962 -f 1716/1833/963 1717/1832/963 1719/1834/963 1718/1835/963 -f 1718/1835/964 1719/1834/964 1721/1836/964 1720/1837/964 -f 1720/1837/965 1721/1836/965 1723/1838/965 1722/1839/965 -f 1722/1839/966 1723/1838/966 1725/1840/966 1724/1841/966 -f 1724/1841/967 1725/1840/967 1727/1842/967 1726/1843/967 -f 1726/1843/968 1727/1842/968 1729/1844/968 1728/1845/968 -f 1728/1845/969 1729/1844/969 1731/1846/969 1730/1847/969 -f 1730/1847/970 1731/1846/970 1733/1848/970 1732/1849/970 -f 1732/1849/971 1733/1848/971 1735/1850/971 1734/1851/971 -f 1734/1851/972 1735/1850/972 1737/1852/972 1736/1853/972 -f 1736/1853/973 1737/1852/973 1739/1854/973 1738/1855/973 -f 1738/1855/974 1739/1854/974 1741/1856/974 1740/1857/974 -f 1740/1857/975 1741/1856/975 1743/1858/975 1742/1859/975 -f 1742/1859/976 1743/1858/976 1745/1860/976 1744/1861/976 -f 1744/1861/977 1745/1860/977 1747/1862/977 1746/1863/977 -f 1746/1863/978 1747/1862/978 1749/1864/978 1748/1865/978 -f 1748/1865/979 1749/1864/979 1751/1866/979 1750/1867/979 -f 1750/1867/980 1751/1866/980 1753/1868/980 1752/1869/980 -f 1752/1869/981 1753/1868/981 1755/1870/981 1754/1871/981 -f 1754/1871/982 1755/1870/982 1757/1872/982 1756/1873/982 -f 1756/1873/983 1757/1872/983 1759/1874/983 1758/1875/983 -f 1719/1834/984 1717/1832/984 1771/1876/984 1772/1877/984 -f 1758/1875/985 1759/1874/985 1761/1878/985 1760/1879/985 -f 1760/1879/986 1761/1878/986 1699/1880/986 1698/1881/986 -f 1708/1825/566 1710/1827/566 1832/1882/566 1831/1883/566 -f 1776/1884/987 1775/1885/987 1794/1886/987 -f 1737/1852/988 1735/1850/988 1780/1887/988 1781/1888/988 -f 1755/1870/989 1753/1868/989 1789/1889/989 1790/1890/989 -f 1711/1826/990 1709/1824/990 1767/1891/990 1768/1892/990 -f 1729/1844/991 1727/1842/991 1776/1884/991 1777/1893/991 -f 1747/1862/992 1745/1860/992 1785/1894/992 1786/1895/992 -f 1703/1818/993 1701/1816/993 1762/1896/993 1764/1897/993 -f 1721/1836/994 1719/1834/994 1772/1877/994 1773/1898/994 -f 1739/1854/995 1737/1852/995 1781/1888/995 1782/1899/995 -f 1757/1872/996 1755/1870/996 1790/1890/996 1791/1900/996 -f 1713/1828/997 1711/1826/997 1768/1892/997 1769/1901/997 -f 1731/1846/998 1729/1844/998 1777/1893/998 1778/1902/998 -f 1749/1864/999 1747/1862/999 1786/1895/999 1787/1903/999 -f 1705/1820/1000 1703/1818/1000 1764/1897/1000 1765/1904/1000 -f 1723/1838/1001 1721/1836/1001 1773/1898/1001 1774/1905/1001 -f 1741/1856/1002 1739/1854/1002 1782/1899/1002 1783/1906/1002 -f 1759/1874/1003 1757/1872/1003 1791/1900/1003 1792/1907/1003 -f 1715/1830/1004 1713/1828/1004 1769/1901/1004 1770/1908/1004 -f 1733/1848/1005 1731/1846/1005 1778/1902/1005 1779/1909/1005 -f 1751/1866/1006 1749/1864/1006 1787/1903/1006 1788/1910/1006 -f 1707/1822/1007 1705/1820/1007 1765/1904/1007 1766/1911/1007 -f 1725/1840/1008 1723/1838/1008 1774/1905/1008 1775/1885/1008 -f 1743/1858/1009 1741/1856/1009 1783/1906/1009 1784/1912/1009 -f 1761/1878/1010 1759/1874/1010 1792/1907/1010 1793/1913/1010 -f 1717/1832/1011 1715/1830/1011 1770/1908/1011 1771/1876/1011 -f 1735/1850/1012 1733/1848/1012 1779/1909/1012 1780/1887/1012 -f 1753/1868/1013 1751/1866/1013 1788/1910/1013 1789/1889/1013 -f 1709/1824/1014 1707/1822/1014 1766/1911/1014 1767/1891/1014 -f 1727/1842/1015 1725/1840/1015 1775/1885/1015 1776/1884/1015 -f 1745/1860/1016 1743/1858/1016 1784/1912/1016 1785/1894/1016 -f 1701/1816/1017 1699/1815/1017 1763/1914/1017 1762/1896/1017 -f 1699/1880/1018 1761/1878/1018 1793/1913/1018 1763/1915/1018 -f 1948/1916/1019 1950/1917/1019 1795/1918/1019 1796/1919/1019 -f 1762/1896/1020 1763/1914/1020 1794/1920/1020 -f 1790/1890/1021 1789/1889/1021 1794/1921/1021 -f 1777/1893/1022 1776/1884/1022 1794/1922/1022 -f 1764/1897/1023 1762/1896/1023 1794/1923/1023 -f 1791/1900/1024 1790/1890/1024 1794/1924/1024 -f 1778/1902/1025 1777/1893/1025 1794/1925/1025 -f 1765/1904/1026 1764/1897/1026 1794/1926/1026 -f 1792/1907/1027 1791/1900/1027 1794/1927/1027 -f 1779/1909/1028 1778/1902/1028 1794/1928/1028 -f 1766/1911/1029 1765/1904/1029 1794/1929/1029 -f 1793/1913/1030 1792/1907/1030 1794/1930/1030 -f 1780/1887/1031 1779/1909/1031 1794/1931/1031 -f 1767/1891/1032 1766/1911/1032 1794/1932/1032 -f 1763/1915/1033 1793/1913/1033 1794/1933/1033 -f 1781/1888/1034 1780/1887/1034 1794/1934/1034 -f 1768/1892/1035 1767/1891/1035 1794/1935/1035 -f 1782/1899/1036 1781/1888/1036 1794/1936/1036 -f 1769/1901/1037 1768/1892/1037 1794/1937/1037 -f 1783/1906/1038 1782/1899/1038 1794/1938/1038 -f 1770/1908/1039 1769/1901/1039 1794/1939/1039 -f 1784/1912/1040 1783/1906/1040 1794/1940/1040 -f 1771/1876/1041 1770/1908/1041 1794/1941/1041 -f 1785/1894/1042 1784/1912/1042 1794/1942/1042 -f 1772/1877/1043 1771/1876/1043 1794/1943/1043 -f 1786/1895/1044 1785/1894/1044 1794/1944/1044 -f 1773/1898/1045 1772/1877/1045 1794/1945/1045 -f 1787/1903/1046 1786/1895/1046 1794/1946/1046 -f 1774/1905/1047 1773/1898/1047 1794/1947/1047 -f 1788/1910/1048 1787/1903/1048 1794/1948/1048 -f 1775/1885/1049 1774/1905/1049 1794/1949/1049 -f 1789/1889/1050 1788/1910/1050 1794/1950/1050 -f 1890/1951/1051 1893/1952/1051 1857/1953/1051 1826/1954/1051 -f 1726/1843/566 1728/1845/566 1841/1955/566 1840/1956/566 -f 1744/1861/566 1746/1863/566 1850/1957/566 1849/1958/566 -f 1700/1817/566 1702/1819/566 1828/1959/566 1827/1960/566 -f 1718/1835/566 1720/1837/566 1837/1961/566 1836/1962/566 -f 1736/1853/566 1738/1855/566 1846/1963/566 1845/1964/566 -f 1754/1871/566 1756/1873/566 1855/1965/566 1854/1966/566 -f 1710/1827/566 1712/1829/566 1833/1967/566 1832/1882/566 -f 1728/1845/566 1730/1847/566 1842/1968/566 1841/1955/566 -f 1746/1863/566 1748/1865/566 1851/1969/566 1850/1957/566 -f 1702/1819/566 1704/1821/566 1829/1970/566 1828/1959/566 -f 1720/1837/566 1722/1839/566 1838/1971/566 1837/1961/566 -f 1738/1855/566 1740/1857/566 1847/1972/566 1846/1963/566 -f 1756/1873/566 1758/1875/566 1856/1973/566 1855/1965/566 -f 1712/1829/566 1714/1831/566 1834/1974/566 1833/1967/566 -f 1730/1847/566 1732/1849/566 1843/1975/566 1842/1968/566 -f 1748/1865/566 1750/1867/566 1852/1976/566 1851/1969/566 -f 1704/1821/566 1706/1823/566 1830/1977/566 1829/1970/566 -f 1722/1839/566 1724/1841/566 1839/1978/566 1838/1971/566 -f 1740/1857/566 1742/1859/566 1848/1979/566 1847/1972/566 -f 1758/1875/566 1760/1879/566 1857/1953/566 1856/1973/566 -f 1714/1831/566 1716/1833/566 1835/1980/566 1834/1974/566 -f 1732/1849/566 1734/1851/566 1844/1981/566 1843/1975/566 -f 1750/1867/566 1752/1869/566 1853/1982/566 1852/1976/566 -f 1706/1823/566 1708/1825/566 1831/1883/566 1830/1977/566 -f 1724/1841/566 1726/1843/566 1840/1956/566 1839/1978/566 -f 1742/1859/566 1744/1861/566 1849/1958/566 1848/1979/566 -f 1698/1814/566 1700/1817/566 1827/1960/566 1826/1983/566 -f 1760/1879/566 1698/1881/566 1826/1954/566 1857/1953/566 -f 1716/1833/566 1718/1835/566 1836/1962/566 1835/1980/566 -f 1734/1851/566 1736/1853/566 1845/1964/566 1844/1981/566 -f 1752/1869/566 1754/1871/566 1854/1966/566 1853/1982/566 -f 1858/1984/566 1859/1985/566 1860/1986/566 1861/1987/566 1862/1988/566 1863/1989/566 1864/1990/566 1865/1991/566 1866/1992/566 1867/1993/566 1868/1994/566 1869/1995/566 1870/1996/566 1871/1997/566 1872/1998/566 1873/1999/566 1874/2000/566 1875/2001/566 1876/2002/566 1877/2003/566 1878/2004/566 1879/2005/566 1880/2006/566 1881/2007/566 1882/2008/566 1883/2009/566 1884/2010/566 1885/2011/566 1886/2012/566 1887/2013/566 1888/2014/566 1889/2015/566 -f 1893/1952/1052 1895/2016/1052 1856/1973/1052 1857/1953/1052 -f 1895/2016/1053 1897/2017/1053 1855/1965/1053 1856/1973/1053 -f 1897/2017/1054 1899/2018/1054 1854/1966/1054 1855/1965/1054 -f 1899/2018/1055 1901/2019/1055 1853/1982/1055 1854/1966/1055 -f 1901/2019/1056 1903/2020/1056 1852/1976/1056 1853/1982/1056 -f 1903/2020/1057 1905/2021/1057 1851/1969/1057 1852/1976/1057 -f 1905/2021/1058 1907/2022/1058 1850/1957/1058 1851/1969/1058 -f 1907/2022/1059 1909/2023/1059 1849/1958/1059 1850/1957/1059 -f 1909/2023/1060 1911/2024/1060 1848/1979/1060 1849/1958/1060 -f 1911/2024/1061 1913/2025/1061 1847/1972/1061 1848/1979/1061 -f 1913/2025/1062 1915/2026/1062 1846/1963/1062 1847/1972/1062 -f 1915/2026/1063 1917/2027/1063 1845/1964/1063 1846/1963/1063 -f 1917/2027/1064 1919/2028/1064 1844/1981/1064 1845/1964/1064 -f 1919/2028/1065 1921/2029/1065 1843/1975/1065 1844/1981/1065 -f 1921/2029/1066 1923/2030/1066 1842/1968/1066 1843/1975/1066 -f 1923/2030/1067 1925/2031/1067 1841/1955/1067 1842/1968/1067 -f 1925/2031/1068 1927/2032/1068 1840/1956/1068 1841/1955/1068 -f 1927/2032/1069 1929/2033/1069 1839/1978/1069 1840/1956/1069 -f 1929/2033/1070 1931/2034/1070 1838/1971/1070 1839/1978/1070 -f 1931/2034/1071 1933/2035/1071 1837/1961/1071 1838/1971/1071 -f 1933/2035/1072 1935/2036/1072 1836/1962/1072 1837/1961/1072 -f 1935/2036/1073 1937/2037/1073 1835/1980/1073 1836/1962/1073 -f 1937/2037/1074 1939/2038/1074 1834/1974/1074 1835/1980/1074 -f 1939/2038/1075 1941/2039/1075 1833/1967/1075 1834/1974/1075 -f 1941/2039/1076 1943/2040/1076 1832/1882/1076 1833/1967/1076 -f 1943/2040/1077 1945/2041/1077 1831/1883/1077 1832/1882/1077 -f 1945/2041/1078 1947/2042/1078 1830/1977/1078 1831/1883/1078 -f 1947/2042/1079 1949/2043/1079 1829/1970/1079 1830/1977/1079 -f 1949/2043/1080 1951/2044/1080 1828/1959/1080 1829/1970/1080 -f 1951/2044/1081 1953/2045/1081 1827/1960/1081 1828/1959/1081 -f 1953/2045/1082 1890/2046/1082 1826/1983/1082 1827/1960/1082 -f 1986/2047/1083 1955/2048/1083 1891/2049/1083 1952/2050/1083 -f 1954/2051/1084 1825/2052/1084 1890/2046/1084 1953/2045/1084 -f 1985/2053/1085 1986/2047/1085 1952/2050/1085 1950/1917/1085 -f 1795/1918/1086 1954/2051/1086 1953/2045/1086 1951/2044/1086 -f 1984/2054/1087 1985/2053/1087 1950/1917/1087 1948/1916/1087 -f 1796/1919/1088 1795/1918/1088 1951/2044/1088 1949/2043/1088 -f 1983/2055/1089 1984/2054/1089 1948/1916/1089 1946/2056/1089 -f 1797/2057/1090 1796/1919/1090 1949/2043/1090 1947/2042/1090 -f 1982/2058/1091 1983/2055/1091 1946/2056/1091 1944/2059/1091 -f 1798/2060/1092 1797/2057/1092 1947/2042/1092 1945/2041/1092 -f 1981/2061/1093 1982/2058/1093 1944/2059/1093 1942/2062/1093 -f 1799/2063/1094 1798/2060/1094 1945/2041/1094 1943/2040/1094 -f 1980/2064/1095 1981/2061/1095 1942/2062/1095 1940/2065/1095 -f 1800/2066/1096 1799/2063/1096 1943/2040/1096 1941/2039/1096 -f 1979/2067/1097 1980/2064/1097 1940/2065/1097 1938/2068/1097 -f 1801/2069/1098 1800/2066/1098 1941/2039/1098 1939/2038/1098 -f 1978/2070/1099 1979/2067/1099 1938/2068/1099 1936/2071/1099 -f 1802/2072/1100 1801/2069/1100 1939/2038/1100 1937/2037/1100 -f 1977/2073/1101 1978/2070/1101 1936/2071/1101 1934/2074/1101 -f 1803/2075/1102 1802/2072/1102 1937/2037/1102 1935/2036/1102 -f 1976/2076/1103 1977/2073/1103 1934/2074/1103 1932/2077/1103 -f 1804/2078/1104 1803/2075/1104 1935/2036/1104 1933/2035/1104 -f 1975/2079/1105 1976/2076/1105 1932/2077/1105 1930/2080/1105 -f 1805/2081/1106 1804/2078/1106 1933/2035/1106 1931/2034/1106 -f 1974/2082/1107 1975/2079/1107 1930/2080/1107 1928/2083/1107 -f 1806/2084/1108 1805/2081/1108 1931/2034/1108 1929/2033/1108 -f 1973/2085/1109 1974/2082/1109 1928/2083/1109 1926/2086/1109 -f 1807/2087/1110 1806/2084/1110 1929/2033/1110 1927/2032/1110 -f 1972/2088/1111 1973/2085/1111 1926/2086/1111 1924/2089/1111 -f 1808/2090/1112 1807/2087/1112 1927/2032/1112 1925/2031/1112 -f 1971/2091/1113 1972/2088/1113 1924/2089/1113 1922/2092/1113 -f 1809/2093/1114 1808/2090/1114 1925/2031/1114 1923/2030/1114 -f 1970/2094/1115 1971/2091/1115 1922/2092/1115 1920/2095/1115 -f 1810/2096/1116 1809/2093/1116 1923/2030/1116 1921/2029/1116 -f 1969/2097/1117 1970/2094/1117 1920/2095/1117 1918/2098/1117 -f 1811/2099/1118 1810/2096/1118 1921/2029/1118 1919/2028/1118 -f 1968/2100/1119 1969/2097/1119 1918/2098/1119 1916/2101/1119 -f 1812/2102/1120 1811/2099/1120 1919/2028/1120 1917/2027/1120 -f 1967/2103/1121 1968/2100/1121 1916/2101/1121 1914/2104/1121 -f 1813/2105/1122 1812/2102/1122 1917/2027/1122 1915/2026/1122 -f 1966/2106/1123 1967/2103/1123 1914/2104/1123 1912/2107/1123 -f 1814/2108/1124 1813/2105/1124 1915/2026/1124 1913/2025/1124 -f 1965/2109/1125 1966/2106/1125 1912/2107/1125 1910/2110/1125 -f 1815/2111/1126 1814/2108/1126 1913/2025/1126 1911/2024/1126 -f 1964/2112/1127 1965/2109/1127 1910/2110/1127 1908/2113/1127 -f 1816/2114/1128 1815/2111/1128 1911/2024/1128 1909/2023/1128 -f 1963/2115/1129 1964/2112/1129 1908/2113/1129 1906/2116/1129 -f 1817/2117/1130 1816/2114/1130 1909/2023/1130 1907/2022/1130 -f 1962/2118/1131 1963/2115/1131 1906/2116/1131 1904/2119/1131 -f 1818/2120/1132 1817/2117/1132 1907/2022/1132 1905/2021/1132 -f 1961/2121/1133 1962/2118/1133 1904/2119/1133 1902/2122/1133 -f 1819/2123/1134 1818/2120/1134 1905/2021/1134 1903/2020/1134 -f 1960/2124/1135 1961/2121/1135 1902/2122/1135 1900/2125/1135 -f 1820/2126/1136 1819/2123/1136 1903/2020/1136 1901/2019/1136 -f 1959/2127/1137 1960/2124/1137 1900/2125/1137 1898/2128/1137 -f 1821/2129/1138 1820/2126/1138 1901/2019/1138 1899/2018/1138 -f 1958/2130/1139 1959/2127/1139 1898/2128/1139 1896/2131/1139 -f 1822/2132/1140 1821/2129/1140 1899/2018/1140 1897/2017/1140 -f 1957/2133/1141 1958/2130/1141 1896/2131/1141 1894/2134/1141 -f 1823/2135/1142 1822/2132/1142 1897/2017/1142 1895/2016/1142 -f 1956/2136/1143 1957/2133/1143 1894/2134/1143 1892/2137/1143 -f 1824/2138/1144 1823/2135/1144 1895/2016/1144 1893/1952/1144 -f 1955/2139/1145 1956/2136/1145 1892/2137/1145 1891/2140/1145 -f 1825/2141/1146 1824/2138/1146 1893/1952/1146 1890/1951/1146 -f 1946/2056/1147 1948/1916/1147 1796/1919/1147 1797/2057/1147 -f 1944/2059/1148 1946/2056/1148 1797/2057/1148 1798/2060/1148 -f 1942/2062/1149 1944/2059/1149 1798/2060/1149 1799/2063/1149 -f 1940/2065/1150 1942/2062/1150 1799/2063/1150 1800/2066/1150 -f 1938/2068/1151 1940/2065/1151 1800/2066/1151 1801/2069/1151 -f 1936/2071/1152 1938/2068/1152 1801/2069/1152 1802/2072/1152 -f 1934/2074/1153 1936/2071/1153 1802/2072/1153 1803/2075/1153 -f 1932/2077/1154 1934/2074/1154 1803/2075/1154 1804/2078/1154 -f 1930/2080/1155 1932/2077/1155 1804/2078/1155 1805/2081/1155 -f 1928/2083/1156 1930/2080/1156 1805/2081/1156 1806/2084/1156 -f 1926/2086/1157 1928/2083/1157 1806/2084/1157 1807/2087/1157 -f 1924/2089/1158 1926/2086/1158 1807/2087/1158 1808/2090/1158 -f 1922/2092/1159 1924/2089/1159 1808/2090/1159 1809/2093/1159 -f 1920/2095/1160 1922/2092/1160 1809/2093/1160 1810/2096/1160 -f 1918/2098/1161 1920/2095/1161 1810/2096/1161 1811/2099/1161 -f 1916/2101/1162 1918/2098/1162 1811/2099/1162 1812/2102/1162 -f 1914/2104/1163 1916/2101/1163 1812/2102/1163 1813/2105/1163 -f 1912/2107/1164 1914/2104/1164 1813/2105/1164 1814/2108/1164 -f 1910/2110/1165 1912/2107/1165 1814/2108/1165 1815/2111/1165 -f 1908/2113/1166 1910/2110/1166 1815/2111/1166 1816/2114/1166 -f 1906/2116/1167 1908/2113/1167 1816/2114/1167 1817/2117/1167 -f 1904/2119/1168 1906/2116/1168 1817/2117/1168 1818/2120/1168 -f 1902/2122/1169 1904/2119/1169 1818/2120/1169 1819/2123/1169 -f 1900/2125/1170 1902/2122/1170 1819/2123/1170 1820/2126/1170 -f 1898/2128/1171 1900/2125/1171 1820/2126/1171 1821/2129/1171 -f 1896/2131/1172 1898/2128/1172 1821/2129/1172 1822/2132/1172 -f 1894/2134/1173 1896/2131/1173 1822/2132/1173 1823/2135/1173 -f 1892/2137/1174 1894/2134/1174 1823/2135/1174 1824/2138/1174 -f 1891/2140/1175 1892/2137/1175 1824/2138/1175 1825/2141/1175 -f 1950/1917/1176 1952/2050/1176 1954/2051/1176 1795/1918/1176 -f 1952/2050/1177 1891/2049/1177 1825/2052/1177 1954/2051/1177 -f 1858/1984/1178 1889/2015/1178 1956/2136/1178 1955/2139/1178 -f 1889/2015/1179 1888/2014/1179 1957/2133/1179 1956/2136/1179 -f 1888/2014/1180 1887/2013/1180 1958/2130/1180 1957/2133/1180 -f 1887/2013/1181 1886/2012/1181 1959/2127/1181 1958/2130/1181 -f 1886/2012/1182 1885/2011/1182 1960/2124/1182 1959/2127/1182 -f 1885/2011/1183 1884/2010/1183 1961/2121/1183 1960/2124/1183 -f 1884/2010/1184 1883/2009/1184 1962/2118/1184 1961/2121/1184 -f 1883/2009/1185 1882/2008/1185 1963/2115/1185 1962/2118/1185 -f 1882/2008/1186 1881/2007/1186 1964/2112/1186 1963/2115/1186 -f 1881/2007/1187 1880/2006/1187 1965/2109/1187 1964/2112/1187 -f 1880/2006/1188 1879/2005/1188 1966/2106/1188 1965/2109/1188 -f 1879/2005/1189 1878/2004/1189 1967/2103/1189 1966/2106/1189 -f 1878/2004/1190 1877/2003/1190 1968/2100/1190 1967/2103/1190 -f 1877/2003/1191 1876/2002/1191 1969/2097/1191 1968/2100/1191 -f 1876/2002/1192 1875/2001/1192 1970/2094/1192 1969/2097/1192 -f 1875/2001/1193 1874/2000/1193 1971/2091/1193 1970/2094/1193 -f 1874/2000/1194 1873/1999/1194 1972/2088/1194 1971/2091/1194 -f 1873/1999/1195 1872/1998/1195 1973/2085/1195 1972/2088/1195 -f 1872/1998/1196 1871/1997/1196 1974/2082/1196 1973/2085/1196 -f 1871/1997/1197 1870/1996/1197 1975/2079/1197 1974/2082/1197 -f 1870/1996/1198 1869/1995/1198 1976/2076/1198 1975/2079/1198 -f 1869/1995/1199 1868/1994/1199 1977/2073/1199 1976/2076/1199 -f 1868/1994/1200 1867/1993/1200 1978/2070/1200 1977/2073/1200 -f 1867/1993/1201 1866/1992/1201 1979/2067/1201 1978/2070/1201 -f 1866/1992/1202 1865/1991/1202 1980/2064/1202 1979/2067/1202 -f 1865/1991/1203 1864/1990/1203 1981/2061/1203 1980/2064/1203 -f 1864/1990/1204 1863/1989/1204 1982/2058/1204 1981/2061/1204 -f 1863/1989/1205 1862/1988/1205 1983/2055/1205 1982/2058/1205 -f 1862/1988/1206 1861/1987/1206 1984/2054/1206 1983/2055/1206 -f 1861/1987/1207 1860/1986/1207 1985/2053/1207 1984/2054/1207 -f 1860/1986/1208 1859/1985/1208 1986/2047/1208 1985/2053/1208 -f 1859/1985/1209 1858/1984/1209 1955/2048/1209 1986/2047/1209 -f 1987/2142/1210 1989/2143/1210 1990/2144/1210 1988/2145/1210 -f 1989/2143/1211 1991/2146/1211 1992/2147/1211 1990/2144/1211 -f 1991/2146/1212 1993/2148/1212 1994/2149/1212 1992/2147/1212 -f 1993/2148/1213 1995/2150/1213 1996/2151/1213 1994/2149/1213 -f 1995/2150/1214 1997/2152/1214 1998/2153/1214 1996/2151/1214 -f 1997/2152/1215 1999/2154/1215 2000/2155/1215 1998/2153/1215 -f 1999/2154/1216 2001/2156/1216 2002/2157/1216 2000/2155/1216 -f 2001/2156/1217 2003/2158/1217 2004/2159/1217 2002/2157/1217 -f 2003/2158/1218 2005/2160/1218 2006/2161/1218 2004/2159/1218 -f 2005/2160/1219 2007/2162/1219 2008/2163/1219 2006/2161/1219 -f 2007/2162/1220 2009/2164/1220 2010/2165/1220 2008/2163/1220 -f 2009/2164/1221 2011/2166/1221 2012/2167/1221 2010/2165/1221 -f 2011/2166/1222 2013/2168/1222 2014/2169/1222 2012/2167/1222 -f 2013/2168/1223 2015/2170/1223 2016/2171/1223 2014/2169/1223 -f 2015/2170/1224 2017/2172/1224 2018/2173/1224 2016/2171/1224 -f 2017/2172/1225 2019/2174/1225 2020/2175/1225 2018/2173/1225 -f 2019/2174/1226 2021/2176/1226 2022/2177/1226 2020/2175/1226 -f 2021/2176/1227 2023/2178/1227 2024/2179/1227 2022/2177/1227 -f 2023/2178/1228 2025/2180/1228 2026/2181/1228 2024/2179/1228 -f 2025/2180/1229 2027/2182/1229 2028/2183/1229 2026/2181/1229 -f 2027/2182/1230 2029/2184/1230 2030/2185/1230 2028/2183/1230 -f 2029/2184/1231 2031/2186/1231 2032/2187/1231 2030/2185/1231 -f 2031/2186/1232 2033/2188/1232 2034/2189/1232 2032/2187/1232 -f 2033/2188/1233 2035/2190/1233 2036/2191/1233 2034/2189/1233 -f 2035/2190/1234 2037/2192/1234 2038/2193/1234 2036/2191/1234 -f 2037/2192/1235 2039/2194/1235 2040/2195/1235 2038/2193/1235 -f 2039/2194/1236 2041/2196/1236 2042/2197/1236 2040/2195/1236 -f 2041/2196/1237 2043/2198/1237 2044/2199/1237 2042/2197/1237 -f 2043/2198/1238 2045/2200/1238 2046/2201/1238 2044/2199/1238 -f 2045/2200/1239 2047/2202/1239 2048/2203/1239 2046/2201/1239 -f 2008/2163/1240 2061/2204/1240 2060/2205/1240 2006/2161/1240 -f 2047/2202/1241 2049/2206/1241 2050/2207/1241 2048/2203/1241 -f 2049/2206/1242 1987/2208/1242 1988/2209/1242 2050/2207/1242 -f 1997/2152/566 2120/2210/566 2121/2211/566 1999/2154/566 -f 2065/2212/1026 2083/2213/1026 2064/2214/1026 -f 2026/2181/1243 2070/2215/1243 2069/2216/1243 2024/2179/1243 -f 2044/2199/1244 2079/2217/1244 2078/2218/1244 2042/2197/1244 -f 2000/2155/1245 2057/2219/1245 2056/2220/1245 1998/2153/1245 -f 2018/2173/1246 2066/2221/1246 2065/2212/1246 2016/2171/1246 -f 2036/2191/1247 2075/2222/1247 2074/2223/1247 2034/2189/1247 -f 1992/2147/1248 2053/2224/1248 2051/2225/1248 1990/2144/1248 -f 2010/2165/1249 2062/2226/1249 2061/2204/1249 2008/2163/1249 -f 2028/2183/1250 2071/2227/1250 2070/2215/1250 2026/2181/1250 -f 2046/2201/1251 2080/2228/1251 2079/2217/1251 2044/2199/1251 -f 2002/2157/1252 2058/2229/1252 2057/2219/1252 2000/2155/1252 -f 2020/2175/1253 2067/2230/1253 2066/2221/1253 2018/2173/1253 -f 2038/2193/1254 2076/2231/1254 2075/2222/1254 2036/2191/1254 -f 1994/2149/1255 2054/2232/1255 2053/2224/1255 1992/2147/1255 -f 2012/2167/1256 2063/2233/1256 2062/2226/1256 2010/2165/1256 -f 2030/2185/1257 2072/2234/1257 2071/2227/1257 2028/2183/1257 -f 2048/2203/1258 2081/2235/1258 2080/2228/1258 2046/2201/1258 -f 2004/2159/1259 2059/2236/1259 2058/2229/1259 2002/2157/1259 -f 2022/2177/1260 2068/2237/1260 2067/2230/1260 2020/2175/1260 -f 2040/2195/1261 2077/2238/1261 2076/2231/1261 2038/2193/1261 -f 1996/2151/1262 2055/2239/1262 2054/2232/1262 1994/2149/1262 -f 2014/2169/1263 2064/2214/1263 2063/2233/1263 2012/2167/1263 -f 2032/2187/1264 2073/2240/1264 2072/2234/1264 2030/2185/1264 -f 2050/2207/1265 2082/2241/1265 2081/2235/1265 2048/2203/1265 -f 2006/2161/1266 2060/2205/1266 2059/2236/1266 2004/2159/1266 -f 2024/2179/1267 2069/2216/1267 2068/2237/1267 2022/2177/1267 -f 2042/2197/1268 2078/2218/1268 2077/2238/1268 2040/2195/1268 -f 1998/2153/1269 2056/2220/1269 2055/2239/1269 1996/2151/1269 -f 2016/2171/1270 2065/2212/1270 2064/2214/1270 2014/2169/1270 -f 2034/2189/1271 2074/2223/1271 2073/2240/1271 2032/2187/1271 -f 1990/2144/1272 2051/2225/1272 2052/2242/1272 1988/2145/1272 -f 1988/2209/1273 2052/2243/1273 2082/2241/1273 2050/2207/1273 -f 2237/2244/1274 2085/2245/1274 2084/2246/1274 2239/2247/1274 -f 2051/2225/1025 2083/2248/1025 2052/2242/1025 -f 2079/2217/1038 2083/2249/1038 2078/2218/1038 -f 2066/2221/1023 2083/2250/1023 2065/2212/1023 -f 2053/2224/1022 2083/2251/1022 2051/2225/1022 -f 2080/2228/1036 2083/2252/1036 2079/2217/1036 -f 2067/2230/1020 2083/2253/1020 2066/2221/1020 -f 2054/2232/1275 2083/2254/1275 2053/2224/1275 -f 2081/2235/1276 2083/2255/1276 2080/2228/1276 -f 2068/2237/1033 2083/2256/1033 2067/2230/1033 -f 2055/2239/1049 2083/2257/1049 2054/2232/1049 -f 2082/2241/1031 2083/2258/1031 2081/2235/1031 -f 2069/2216/1030 2083/2259/1030 2068/2237/1030 -f 2056/2220/1047 2083/2260/1047 2055/2239/1047 -f 2052/2243/1028 2083/2261/1028 2082/2241/1028 -f 2070/2215/1027 2083/2262/1027 2069/2216/1027 -f 2057/2219/1045 2083/2263/1045 2056/2220/1045 -f 2071/2227/1024 2083/2264/1024 2070/2215/1024 -f 2058/2229/1043 2083/2265/1043 2057/2219/1043 -f 2072/2234/1021 2083/2266/1021 2071/2227/1021 -f 2059/2236/1041 2083/2267/1041 2058/2229/1041 -f 2073/2240/1050 2083/2268/1050 2072/2234/1050 -f 2060/2205/1039 2083/2269/1039 2059/2236/1039 -f 2074/2223/1048 2083/2270/1048 2073/2240/1048 -f 2061/2204/1037 2083/2271/1037 2060/2205/1037 -f 2075/2222/1046 2083/2272/1046 2074/2223/1046 -f 2062/2226/1035 2083/2273/1035 2061/2204/1035 -f 2076/2231/1044 2083/2274/1044 2075/2222/1044 -f 2063/2233/1032 2083/2275/1032 2062/2226/1032 -f 2077/2238/1042 2083/2276/1042 2076/2231/1042 -f 2064/2214/1029 2083/2277/1029 2063/2233/1029 -f 2078/2218/1040 2083/2278/1040 2077/2238/1040 -f 2179/2279/1277 2115/2280/1277 2146/2281/1277 2182/2282/1277 -f 2015/2170/566 2129/2283/566 2130/2284/566 2017/2172/566 -f 2033/2188/566 2138/2285/566 2139/2286/566 2035/2190/566 -f 1989/2143/566 2116/2287/566 2117/2288/566 1991/2146/566 -f 2007/2162/566 2125/2289/566 2126/2290/566 2009/2164/566 -f 2025/2180/566 2134/2291/566 2135/2292/566 2027/2182/566 -f 2043/2198/566 2143/2293/566 2144/2294/566 2045/2200/566 -f 1999/2154/566 2121/2211/566 2122/2295/566 2001/2156/566 -f 2017/2172/566 2130/2284/566 2131/2296/566 2019/2174/566 -f 2035/2190/566 2139/2286/566 2140/2297/566 2037/2192/566 -f 1991/2146/566 2117/2288/566 2118/2298/566 1993/2148/566 -f 2009/2164/566 2126/2290/566 2127/2299/566 2011/2166/566 -f 2027/2182/566 2135/2292/566 2136/2300/566 2029/2184/566 -f 2045/2200/566 2144/2294/566 2145/2301/566 2047/2202/566 -f 2001/2156/566 2122/2295/566 2123/2302/566 2003/2158/566 -f 2019/2174/566 2131/2296/566 2132/2303/566 2021/2176/566 -f 2037/2192/566 2140/2297/566 2141/2304/566 2039/2194/566 -f 1993/2148/566 2118/2298/566 2119/2305/566 1995/2150/566 -f 2011/2166/566 2127/2299/566 2128/2306/566 2013/2168/566 -f 2029/2184/566 2136/2300/566 2137/2307/566 2031/2186/566 -f 2047/2202/566 2145/2301/566 2146/2281/566 2049/2206/566 -f 2003/2158/566 2123/2302/566 2124/2308/566 2005/2160/566 -f 2021/2176/566 2132/2303/566 2133/2309/566 2023/2178/566 -f 2039/2194/566 2141/2304/566 2142/2310/566 2041/2196/566 -f 1995/2150/566 2119/2305/566 2120/2210/566 1997/2152/566 -f 2013/2168/566 2128/2306/566 2129/2283/566 2015/2170/566 -f 2031/2186/566 2137/2307/566 2138/2285/566 2033/2188/566 -f 1987/2142/566 2115/2311/566 2116/2287/566 1989/2143/566 -f 2049/2206/566 2146/2281/566 2115/2280/566 1987/2208/566 -f 2005/2160/566 2124/2308/566 2125/2289/566 2007/2162/566 -f 2023/2178/566 2133/2309/566 2134/2291/566 2025/2180/566 -f 2041/2196/566 2142/2310/566 2143/2293/566 2043/2198/566 -f 2147/2312/1278 2178/2313/1278 2177/2314/1278 2176/2315/1278 2175/2316/1278 2174/2317/1278 2173/2318/1278 2172/2319/1278 2171/2320/1278 2170/2321/1278 2169/2322/1278 2168/2323/1278 2167/2324/1278 2166/2325/1278 2165/2326/1278 2164/2327/1278 2163/2328/1278 2162/2329/1278 2161/2330/1278 2160/2331/1278 2159/2332/1278 2158/2333/1278 2157/2334/1278 2156/2335/1278 2155/2336/1278 2154/2337/1278 2153/2338/1278 2152/2339/1278 2151/2340/1278 2150/2341/1278 2149/2342/1278 2148/2343/1278 -f 2182/2282/1279 2146/2281/1279 2145/2301/1279 2184/2344/1279 -f 2184/2344/1280 2145/2301/1280 2144/2294/1280 2186/2345/1280 -f 2186/2345/1281 2144/2294/1281 2143/2293/1281 2188/2346/1281 -f 2188/2346/1282 2143/2293/1282 2142/2310/1282 2190/2347/1282 -f 2190/2347/1283 2142/2310/1283 2141/2304/1283 2192/2348/1283 -f 2192/2348/1284 2141/2304/1284 2140/2297/1284 2194/2349/1284 -f 2194/2349/1285 2140/2297/1285 2139/2286/1285 2196/2350/1285 -f 2196/2350/1286 2139/2286/1286 2138/2285/1286 2198/2351/1286 -f 2198/2351/1287 2138/2285/1287 2137/2307/1287 2200/2352/1287 -f 2200/2352/1288 2137/2307/1288 2136/2300/1288 2202/2353/1288 -f 2202/2353/1289 2136/2300/1289 2135/2292/1289 2204/2354/1289 -f 2204/2354/1290 2135/2292/1290 2134/2291/1290 2206/2355/1290 -f 2206/2355/1291 2134/2291/1291 2133/2309/1291 2208/2356/1291 -f 2208/2356/1292 2133/2309/1292 2132/2303/1292 2210/2357/1292 -f 2210/2357/1293 2132/2303/1293 2131/2296/1293 2212/2358/1293 -f 2212/2358/1294 2131/2296/1294 2130/2284/1294 2214/2359/1294 -f 2214/2359/1295 2130/2284/1295 2129/2283/1295 2216/2360/1295 -f 2216/2360/1296 2129/2283/1296 2128/2306/1296 2218/2361/1296 -f 2218/2361/1297 2128/2306/1297 2127/2299/1297 2220/2362/1297 -f 2220/2362/1298 2127/2299/1298 2126/2290/1298 2222/2363/1298 -f 2222/2363/1299 2126/2290/1299 2125/2289/1299 2224/2364/1299 -f 2224/2364/1300 2125/2289/1300 2124/2308/1300 2226/2365/1300 -f 2226/2365/1301 2124/2308/1301 2123/2302/1301 2228/2366/1301 -f 2228/2366/1302 2123/2302/1302 2122/2295/1302 2230/2367/1302 -f 2230/2367/1303 2122/2295/1303 2121/2211/1303 2232/2368/1303 -f 2232/2368/1304 2121/2211/1304 2120/2210/1304 2234/2369/1304 -f 2234/2369/1305 2120/2210/1305 2119/2305/1305 2236/2370/1305 -f 2236/2370/1306 2119/2305/1306 2118/2298/1306 2238/2371/1306 -f 2238/2371/1307 2118/2298/1307 2117/2288/1307 2240/2372/1307 -f 2240/2372/1308 2117/2288/1308 2116/2287/1308 2242/2373/1308 -f 2242/2373/1309 2116/2287/1309 2115/2311/1309 2179/2374/1309 -f 2275/2375/1310 2241/2376/1310 2180/2377/1310 2244/2378/1310 -f 2243/2379/1311 2242/2373/1311 2179/2374/1311 2114/2380/1311 -f 2274/2381/1312 2239/2247/1312 2241/2376/1312 2275/2375/1312 -f 2084/2246/1313 2240/2372/1313 2242/2373/1313 2243/2379/1313 -f 2273/2382/1314 2237/2244/1314 2239/2247/1314 2274/2381/1314 -f 2085/2245/1315 2238/2371/1315 2240/2372/1315 2084/2246/1315 -f 2272/2383/1316 2235/2384/1316 2237/2244/1316 2273/2382/1316 -f 2086/2385/1317 2236/2370/1317 2238/2371/1317 2085/2245/1317 -f 2271/2386/1318 2233/2387/1318 2235/2384/1318 2272/2383/1318 -f 2087/2388/1319 2234/2369/1319 2236/2370/1319 2086/2385/1319 -f 2270/2389/1320 2231/2390/1320 2233/2387/1320 2271/2386/1320 -f 2088/2391/1321 2232/2368/1321 2234/2369/1321 2087/2388/1321 -f 2269/2392/1322 2229/2393/1322 2231/2390/1322 2270/2389/1322 -f 2089/2394/1323 2230/2367/1323 2232/2368/1323 2088/2391/1323 -f 2268/2395/1324 2227/2396/1324 2229/2393/1324 2269/2392/1324 -f 2090/2397/1325 2228/2366/1325 2230/2367/1325 2089/2394/1325 -f 2267/2398/1326 2225/2399/1326 2227/2396/1326 2268/2395/1326 -f 2091/2400/1327 2226/2365/1327 2228/2366/1327 2090/2397/1327 -f 2266/2401/1328 2223/2402/1328 2225/2399/1328 2267/2398/1328 -f 2092/2403/1329 2224/2364/1329 2226/2365/1329 2091/2400/1329 -f 2265/2404/1330 2221/2405/1330 2223/2402/1330 2266/2401/1330 -f 2093/2406/1331 2222/2363/1331 2224/2364/1331 2092/2403/1331 -f 2264/2407/1332 2219/2408/1332 2221/2405/1332 2265/2404/1332 -f 2094/2409/1333 2220/2362/1333 2222/2363/1333 2093/2406/1333 -f 2263/2410/1334 2217/2411/1334 2219/2408/1334 2264/2407/1334 -f 2095/2412/1335 2218/2361/1335 2220/2362/1335 2094/2409/1335 -f 2262/2413/1336 2215/2414/1336 2217/2411/1336 2263/2410/1336 -f 2096/2415/1337 2216/2360/1337 2218/2361/1337 2095/2412/1337 -f 2261/2416/1338 2213/2417/1338 2215/2414/1338 2262/2413/1338 -f 2097/2418/1339 2214/2359/1339 2216/2360/1339 2096/2415/1339 -f 2260/2419/1340 2211/2420/1340 2213/2417/1340 2261/2416/1340 -f 2098/2421/1341 2212/2358/1341 2214/2359/1341 2097/2418/1341 -f 2259/2422/1342 2209/2423/1342 2211/2420/1342 2260/2419/1342 -f 2099/2424/1343 2210/2357/1343 2212/2358/1343 2098/2421/1343 -f 2258/2425/1344 2207/2426/1344 2209/2423/1344 2259/2422/1344 -f 2100/2427/1345 2208/2356/1345 2210/2357/1345 2099/2424/1345 -f 2257/2428/1346 2205/2429/1346 2207/2426/1346 2258/2425/1346 -f 2101/2430/1347 2206/2355/1347 2208/2356/1347 2100/2427/1347 -f 2256/2431/1348 2203/2432/1348 2205/2429/1348 2257/2428/1348 -f 2102/2433/1349 2204/2354/1349 2206/2355/1349 2101/2430/1349 -f 2255/2434/1350 2201/2435/1350 2203/2432/1350 2256/2431/1350 -f 2103/2436/1351 2202/2353/1351 2204/2354/1351 2102/2433/1351 -f 2254/2437/1352 2199/2438/1352 2201/2435/1352 2255/2434/1352 -f 2104/2439/1353 2200/2352/1353 2202/2353/1353 2103/2436/1353 -f 2253/2440/1354 2197/2441/1354 2199/2438/1354 2254/2437/1354 -f 2105/2442/1355 2198/2351/1355 2200/2352/1355 2104/2439/1355 -f 2252/2443/1356 2195/2444/1356 2197/2441/1356 2253/2440/1356 -f 2106/2445/1357 2196/2350/1357 2198/2351/1357 2105/2442/1357 -f 2251/2446/1358 2193/2447/1358 2195/2444/1358 2252/2443/1358 -f 2107/2448/1359 2194/2349/1359 2196/2350/1359 2106/2445/1359 -f 2250/2449/1360 2191/2450/1360 2193/2447/1360 2251/2446/1360 -f 2108/2451/1361 2192/2348/1361 2194/2349/1361 2107/2448/1361 -f 2249/2452/1362 2189/2453/1362 2191/2450/1362 2250/2449/1362 -f 2109/2454/1363 2190/2347/1363 2192/2348/1363 2108/2451/1363 -f 2248/2455/1364 2187/2456/1364 2189/2453/1364 2249/2452/1364 -f 2110/2457/1365 2188/2346/1365 2190/2347/1365 2109/2454/1365 -f 2247/2458/1366 2185/2459/1366 2187/2456/1366 2248/2455/1366 -f 2111/2460/1367 2186/2345/1367 2188/2346/1367 2110/2457/1367 -f 2246/2461/1368 2183/2462/1368 2185/2459/1368 2247/2458/1368 -f 2112/2463/1369 2184/2344/1369 2186/2345/1369 2111/2460/1369 -f 2245/2464/1370 2181/2465/1370 2183/2462/1370 2246/2461/1370 -f 2113/2466/1371 2182/2282/1371 2184/2344/1371 2112/2463/1371 -f 2244/2467/1372 2180/2468/1372 2181/2465/1372 2245/2464/1372 -f 2114/2469/1373 2179/2279/1373 2182/2282/1373 2113/2466/1373 -f 2235/2384/1374 2086/2385/1374 2085/2245/1374 2237/2244/1374 -f 2233/2387/1375 2087/2388/1375 2086/2385/1375 2235/2384/1375 -f 2231/2390/1376 2088/2391/1376 2087/2388/1376 2233/2387/1376 -f 2229/2393/1377 2089/2394/1377 2088/2391/1377 2231/2390/1377 -f 2227/2396/1378 2090/2397/1378 2089/2394/1378 2229/2393/1378 -f 2225/2399/1379 2091/2400/1379 2090/2397/1379 2227/2396/1379 -f 2223/2402/1380 2092/2403/1380 2091/2400/1380 2225/2399/1380 -f 2221/2405/1381 2093/2406/1381 2092/2403/1381 2223/2402/1381 -f 2219/2408/1382 2094/2409/1382 2093/2406/1382 2221/2405/1382 -f 2217/2411/1383 2095/2412/1383 2094/2409/1383 2219/2408/1383 -f 2215/2414/1384 2096/2415/1384 2095/2412/1384 2217/2411/1384 -f 2213/2417/1385 2097/2418/1385 2096/2415/1385 2215/2414/1385 -f 2211/2420/1386 2098/2421/1386 2097/2418/1386 2213/2417/1386 -f 2209/2423/1387 2099/2424/1387 2098/2421/1387 2211/2420/1387 -f 2207/2426/1388 2100/2427/1388 2099/2424/1388 2209/2423/1388 -f 2205/2429/1389 2101/2430/1389 2100/2427/1389 2207/2426/1389 -f 2203/2432/1390 2102/2433/1390 2101/2430/1390 2205/2429/1390 -f 2201/2435/1391 2103/2436/1391 2102/2433/1391 2203/2432/1391 -f 2199/2438/1392 2104/2439/1392 2103/2436/1392 2201/2435/1392 -f 2197/2441/1393 2105/2442/1393 2104/2439/1393 2199/2438/1393 -f 2195/2444/1394 2106/2445/1394 2105/2442/1394 2197/2441/1394 -f 2193/2447/1395 2107/2448/1395 2106/2445/1395 2195/2444/1395 -f 2191/2450/1396 2108/2451/1396 2107/2448/1396 2193/2447/1396 -f 2189/2453/1397 2109/2454/1397 2108/2451/1397 2191/2450/1397 -f 2187/2456/1398 2110/2457/1398 2109/2454/1398 2189/2453/1398 -f 2185/2459/1399 2111/2460/1399 2110/2457/1399 2187/2456/1399 -f 2183/2462/1400 2112/2463/1400 2111/2460/1400 2185/2459/1400 -f 2181/2465/1401 2113/2466/1401 2112/2463/1401 2183/2462/1401 -f 2180/2468/1402 2114/2469/1402 2113/2466/1402 2181/2465/1402 -f 2239/2247/1403 2084/2246/1403 2243/2379/1403 2241/2376/1403 -f 2241/2376/1404 2243/2379/1404 2114/2380/1404 2180/2377/1404 -f 2147/2312/1405 2244/2467/1405 2245/2464/1405 2178/2313/1405 -f 2178/2313/1406 2245/2464/1406 2246/2461/1406 2177/2314/1406 -f 2177/2314/1407 2246/2461/1407 2247/2458/1407 2176/2315/1407 -f 2176/2315/1408 2247/2458/1408 2248/2455/1408 2175/2316/1408 -f 2175/2316/1409 2248/2455/1409 2249/2452/1409 2174/2317/1409 -f 2174/2317/1410 2249/2452/1410 2250/2449/1410 2173/2318/1410 -f 2173/2318/1411 2250/2449/1411 2251/2446/1411 2172/2319/1411 -f 2172/2319/1412 2251/2446/1412 2252/2443/1412 2171/2320/1412 -f 2171/2320/1413 2252/2443/1413 2253/2440/1413 2170/2321/1413 -f 2170/2321/1414 2253/2440/1414 2254/2437/1414 2169/2322/1414 -f 2169/2322/1415 2254/2437/1415 2255/2434/1415 2168/2323/1415 -f 2168/2323/1416 2255/2434/1416 2256/2431/1416 2167/2324/1416 -f 2167/2324/1417 2256/2431/1417 2257/2428/1417 2166/2325/1417 -f 2166/2325/1418 2257/2428/1418 2258/2425/1418 2165/2326/1418 -f 2165/2326/1419 2258/2425/1419 2259/2422/1419 2164/2327/1419 -f 2164/2327/1420 2259/2422/1420 2260/2419/1420 2163/2328/1420 -f 2163/2328/1421 2260/2419/1421 2261/2416/1421 2162/2329/1421 -f 2162/2329/1422 2261/2416/1422 2262/2413/1422 2161/2330/1422 -f 2161/2330/1423 2262/2413/1423 2263/2410/1423 2160/2331/1423 -f 2160/2331/1424 2263/2410/1424 2264/2407/1424 2159/2332/1424 -f 2159/2332/1425 2264/2407/1425 2265/2404/1425 2158/2333/1425 -f 2158/2333/1426 2265/2404/1426 2266/2401/1426 2157/2334/1426 -f 2157/2334/1427 2266/2401/1427 2267/2398/1427 2156/2335/1427 -f 2156/2335/1428 2267/2398/1428 2268/2395/1428 2155/2336/1428 -f 2155/2336/1429 2268/2395/1429 2269/2392/1429 2154/2337/1429 -f 2154/2337/1430 2269/2392/1430 2270/2389/1430 2153/2338/1430 -f 2153/2338/1431 2270/2389/1431 2271/2386/1431 2152/2339/1431 -f 2152/2339/1432 2271/2386/1432 2272/2383/1432 2151/2340/1432 -f 2151/2340/1433 2272/2383/1433 2273/2382/1433 2150/2341/1433 -f 2150/2341/1434 2273/2382/1434 2274/2381/1434 2149/2342/1434 -f 2149/2342/1435 2274/2381/1435 2275/2375/1435 2148/2343/1435 -f 2148/2343/1436 2275/2375/1436 2244/2378/1436 2147/2312/1436 -f 2276/2470/954 2277/2471/954 2279/2472/954 2278/2473/954 -f 2278/2473/955 2279/2472/955 2281/2474/955 2280/2475/955 -f 2280/2475/956 2281/2474/956 2283/2476/956 2282/2477/956 -f 2282/2477/957 2283/2476/957 2285/2478/957 2284/2479/957 -f 2284/2479/958 2285/2478/958 2287/2480/958 2286/2481/958 -f 2286/2481/959 2287/2480/959 2289/2482/959 2288/2483/959 -f 2288/2483/960 2289/2482/960 2291/2484/960 2290/2485/960 -f 2290/2485/961 2291/2484/961 2293/2486/961 2292/2487/961 -f 2292/2487/962 2293/2486/962 2295/2488/962 2294/2489/962 -f 2294/2489/963 2295/2488/963 2297/2490/963 2296/2491/963 -f 2296/2491/964 2297/2490/964 2299/2492/964 2298/2493/964 -f 2298/2493/965 2299/2492/965 2301/2494/965 2300/2495/965 -f 2300/2495/966 2301/2494/966 2303/2496/966 2302/2497/966 -f 2302/2497/967 2303/2496/967 2305/2498/967 2304/2499/967 -f 2304/2499/968 2305/2498/968 2307/2500/968 2306/2501/968 -f 2306/2501/969 2307/2500/969 2309/2502/969 2308/2503/969 -f 2308/2503/970 2309/2502/970 2311/2504/970 2310/2505/970 -f 2310/2505/971 2311/2504/971 2313/2506/971 2312/2507/971 -f 2312/2507/972 2313/2506/972 2315/2508/972 2314/2509/972 -f 2314/2509/973 2315/2508/973 2317/2510/973 2316/2511/973 -f 2316/2511/974 2317/2510/974 2319/2512/974 2318/2513/974 -f 2318/2513/975 2319/2512/975 2321/2514/975 2320/2515/975 -f 2320/2515/976 2321/2514/976 2323/2516/976 2322/2517/976 -f 2322/2517/977 2323/2516/977 2325/2518/977 2324/2519/977 -f 2324/2519/978 2325/2518/978 2327/2520/978 2326/2521/978 -f 2326/2521/979 2327/2520/979 2329/2522/979 2328/2523/979 -f 2328/2523/980 2329/2522/980 2331/2524/980 2330/2525/980 -f 2330/2525/981 2331/2524/981 2333/2526/981 2332/2527/981 -f 2332/2527/982 2333/2526/982 2335/2528/982 2334/2529/982 -f 2334/2529/983 2335/2528/983 2337/2530/983 2336/2531/983 -f 2297/2490/984 2295/2488/984 2349/2532/984 2350/2533/984 -f 2336/2531/985 2337/2530/985 2339/2534/985 2338/2535/985 -f 2338/2535/986 2339/2534/986 2277/2536/986 2276/2537/986 -f 2286/2481/566 2288/2483/566 2410/2538/566 2409/2539/566 -f 2354/2540/987 2353/2541/987 2372/2542/987 -f 2315/2508/1437 2313/2506/1437 2358/2543/1437 2359/2544/1437 -f 2333/2526/989 2331/2524/989 2367/2545/989 2368/2546/989 -f 2289/2482/990 2287/2480/990 2345/2547/990 2346/2548/990 -f 2307/2500/991 2305/2498/991 2354/2540/991 2355/2549/991 -f 2325/2518/992 2323/2516/992 2363/2550/992 2364/2551/992 -f 2281/2474/993 2279/2472/993 2340/2552/993 2342/2553/993 -f 2299/2492/994 2297/2490/994 2350/2533/994 2351/2554/994 -f 2317/2510/995 2315/2508/995 2359/2544/995 2360/2555/995 -f 2335/2528/996 2333/2526/996 2368/2546/996 2369/2556/996 -f 2291/2484/997 2289/2482/997 2346/2548/997 2347/2557/997 -f 2309/2502/998 2307/2500/998 2355/2549/998 2356/2558/998 -f 2327/2520/999 2325/2518/999 2364/2551/999 2365/2559/999 -f 2283/2476/1438 2281/2474/1438 2342/2553/1438 2343/2560/1438 -f 2301/2494/1001 2299/2492/1001 2351/2554/1001 2352/2561/1001 -f 2319/2512/1002 2317/2510/1002 2360/2555/1002 2361/2562/1002 -f 2337/2530/1003 2335/2528/1003 2369/2556/1003 2370/2563/1003 -f 2293/2486/1004 2291/2484/1004 2347/2557/1004 2348/2564/1004 -f 2311/2504/1005 2309/2502/1005 2356/2558/1005 2357/2565/1005 -f 2329/2522/1006 2327/2520/1006 2365/2559/1006 2366/2566/1006 -f 2285/2478/1007 2283/2476/1007 2343/2560/1007 2344/2567/1007 -f 2303/2496/1008 2301/2494/1008 2352/2561/1008 2353/2541/1008 -f 2321/2514/1009 2319/2512/1009 2361/2562/1009 2362/2568/1009 -f 2339/2534/1010 2337/2530/1010 2370/2563/1010 2371/2569/1010 -f 2295/2488/1011 2293/2486/1011 2348/2564/1011 2349/2532/1011 -f 2313/2506/1012 2311/2504/1012 2357/2565/1012 2358/2543/1012 -f 2331/2524/1013 2329/2522/1013 2366/2566/1013 2367/2545/1013 -f 2287/2480/1014 2285/2478/1014 2344/2567/1014 2345/2547/1014 -f 2305/2498/1015 2303/2496/1015 2353/2541/1015 2354/2540/1015 -f 2323/2516/1016 2321/2514/1016 2362/2568/1016 2363/2550/1016 -f 2279/2472/1017 2277/2471/1017 2341/2570/1017 2340/2552/1017 -f 2277/2536/1018 2339/2534/1018 2371/2569/1018 2341/2571/1018 -f 2526/2572/1439 2528/2573/1439 2373/2574/1439 2374/2575/1439 -f 2340/2552/1020 2341/2570/1020 2372/2576/1020 -f 2368/2546/1021 2367/2545/1021 2372/2577/1021 -f 2355/2549/1022 2354/2540/1022 2372/2578/1022 -f 2342/2553/1023 2340/2552/1023 2372/2579/1023 -f 2369/2556/1024 2368/2546/1024 2372/2580/1024 -f 2356/2558/1025 2355/2549/1025 2372/2581/1025 -f 2343/2560/1026 2342/2553/1026 2372/2582/1026 -f 2370/2563/1027 2369/2556/1027 2372/2583/1027 -f 2357/2565/1028 2356/2558/1028 2372/2584/1028 -f 2344/2567/1029 2343/2560/1029 2372/2585/1029 -f 2371/2569/1030 2370/2563/1030 2372/2586/1030 -f 2358/2543/1031 2357/2565/1031 2372/2587/1031 -f 2345/2547/1032 2344/2567/1032 2372/2588/1032 -f 2341/2571/1033 2371/2569/1033 2372/2589/1033 -f 2359/2544/1034 2358/2543/1034 2372/2590/1034 -f 2346/2548/1035 2345/2547/1035 2372/2591/1035 -f 2360/2555/1036 2359/2544/1036 2372/2592/1036 -f 2347/2557/1037 2346/2548/1037 2372/2593/1037 -f 2361/2562/1038 2360/2555/1038 2372/2594/1038 -f 2348/2564/1039 2347/2557/1039 2372/2595/1039 -f 2362/2568/1040 2361/2562/1040 2372/2596/1040 -f 2349/2532/1041 2348/2564/1041 2372/2597/1041 -f 2363/2550/1042 2362/2568/1042 2372/2598/1042 -f 2350/2533/1043 2349/2532/1043 2372/2599/1043 -f 2364/2551/1044 2363/2550/1044 2372/2600/1044 -f 2351/2554/1045 2350/2533/1045 2372/2601/1045 -f 2365/2559/1046 2364/2551/1046 2372/2602/1046 -f 2352/2561/1047 2351/2554/1047 2372/2603/1047 -f 2366/2566/1048 2365/2559/1048 2372/2604/1048 -f 2353/2541/1049 2352/2561/1049 2372/2605/1049 -f 2367/2545/1050 2366/2566/1050 2372/2606/1050 -f 2468/2607/1440 2471/2608/1440 2435/2609/1440 2404/2610/1440 -f 2304/2499/566 2306/2501/566 2419/2611/566 2418/2612/566 -f 2322/2517/566 2324/2519/566 2428/2613/566 2427/2614/566 -f 2278/2473/566 2280/2475/566 2406/2615/566 2405/2616/566 -f 2296/2491/566 2298/2493/566 2415/2617/566 2414/2618/566 -f 2314/2509/566 2316/2511/566 2424/2619/566 2423/2620/566 -f 2332/2527/566 2334/2529/566 2433/2621/566 2432/2622/566 -f 2288/2483/566 2290/2485/566 2411/2623/566 2410/2538/566 -f 2306/2501/566 2308/2503/566 2420/2624/566 2419/2611/566 -f 2324/2519/566 2326/2521/566 2429/2625/566 2428/2613/566 -f 2280/2475/566 2282/2477/566 2407/2626/566 2406/2615/566 -f 2298/2493/566 2300/2495/566 2416/2627/566 2415/2617/566 -f 2316/2511/566 2318/2513/566 2425/2628/566 2424/2619/566 -f 2334/2529/566 2336/2531/566 2434/2629/566 2433/2621/566 -f 2290/2485/566 2292/2487/566 2412/2630/566 2411/2623/566 -f 2308/2503/566 2310/2505/566 2421/2631/566 2420/2624/566 -f 2326/2521/566 2328/2523/566 2430/2632/566 2429/2625/566 -f 2282/2477/566 2284/2479/566 2408/2633/566 2407/2626/566 -f 2300/2495/566 2302/2497/566 2417/2634/566 2416/2627/566 -f 2318/2513/566 2320/2515/566 2426/2635/566 2425/2628/566 -f 2336/2531/566 2338/2535/566 2435/2609/566 2434/2629/566 -f 2292/2487/566 2294/2489/566 2413/2636/566 2412/2630/566 -f 2310/2505/566 2312/2507/566 2422/2637/566 2421/2631/566 -f 2328/2523/566 2330/2525/566 2431/2638/566 2430/2632/566 -f 2284/2479/566 2286/2481/566 2409/2539/566 2408/2633/566 -f 2302/2497/566 2304/2499/566 2418/2612/566 2417/2634/566 -f 2320/2515/566 2322/2517/566 2427/2614/566 2426/2635/566 -f 2276/2470/566 2278/2473/566 2405/2616/566 2404/2639/566 -f 2338/2535/566 2276/2537/566 2404/2610/566 2435/2609/566 -f 2294/2489/566 2296/2491/566 2414/2618/566 2413/2636/566 -f 2312/2507/566 2314/2509/566 2423/2620/566 2422/2637/566 -f 2330/2525/566 2332/2527/566 2432/2622/566 2431/2638/566 -f 2448/2640/1441 2449/2641/1441 2578/2642/1441 2577/2643/1441 -f 2471/2608/1442 2473/2644/1442 2434/2629/1442 2435/2609/1442 -f 2473/2644/1443 2475/2645/1443 2433/2621/1443 2434/2629/1443 -f 2475/2645/1444 2477/2646/1444 2432/2622/1444 2433/2621/1444 -f 2477/2646/1445 2479/2647/1445 2431/2638/1445 2432/2622/1445 -f 2479/2647/1446 2481/2648/1446 2430/2632/1446 2431/2638/1446 -f 2481/2648/1447 2483/2649/1447 2429/2625/1447 2430/2632/1447 -f 2483/2649/1448 2485/2650/1448 2428/2613/1448 2429/2625/1448 -f 2485/2650/1449 2487/2651/1449 2427/2614/1449 2428/2613/1449 -f 2487/2651/1450 2489/2652/1450 2426/2635/1450 2427/2614/1450 -f 2489/2652/1451 2491/2653/1451 2425/2628/1451 2426/2635/1451 -f 2491/2653/1452 2493/2654/1452 2424/2619/1452 2425/2628/1452 -f 2493/2654/1453 2495/2655/1453 2423/2620/1453 2424/2619/1453 -f 2495/2655/1454 2497/2656/1454 2422/2637/1454 2423/2620/1454 -f 2497/2656/1455 2499/2657/1455 2421/2631/1455 2422/2637/1455 -f 2499/2657/1456 2501/2658/1456 2420/2624/1456 2421/2631/1456 -f 2501/2658/1457 2503/2659/1457 2419/2611/1457 2420/2624/1457 -f 2503/2659/1458 2505/2660/1458 2418/2612/1458 2419/2611/1458 -f 2505/2660/1459 2507/2661/1459 2417/2634/1459 2418/2612/1459 -f 2507/2661/1460 2509/2662/1460 2416/2627/1460 2417/2634/1460 -f 2509/2662/1461 2511/2663/1461 2415/2617/1461 2416/2627/1461 -f 2511/2663/1462 2513/2664/1462 2414/2618/1462 2415/2617/1462 -f 2513/2664/1463 2515/2665/1463 2413/2636/1463 2414/2618/1463 -f 2515/2665/1464 2517/2666/1464 2412/2630/1464 2413/2636/1464 -f 2517/2666/1465 2519/2667/1465 2411/2623/1465 2412/2630/1465 -f 2519/2667/1466 2521/2668/1466 2410/2538/1466 2411/2623/1466 -f 2521/2668/1467 2523/2669/1467 2409/2539/1467 2410/2538/1467 -f 2523/2669/1468 2525/2670/1468 2408/2633/1468 2409/2539/1468 -f 2525/2670/1469 2527/2671/1469 2407/2626/1469 2408/2633/1469 -f 2527/2671/1470 2529/2672/1470 2406/2615/1470 2407/2626/1470 -f 2529/2672/1471 2531/2673/1471 2405/2616/1471 2406/2615/1471 -f 2531/2673/1472 2468/2674/1472 2404/2639/1472 2405/2616/1472 -f 2564/2675/1473 2533/2676/1473 2469/2677/1473 2530/2678/1473 -f 2532/2679/1474 2403/2680/1474 2468/2674/1474 2531/2673/1474 -f 2563/2681/1475 2564/2675/1475 2530/2678/1475 2528/2573/1475 -f 2373/2574/1476 2532/2679/1476 2531/2673/1476 2529/2672/1476 -f 2562/2682/1477 2563/2681/1477 2528/2573/1477 2526/2572/1477 -f 2374/2575/1478 2373/2574/1478 2529/2672/1478 2527/2671/1478 -f 2561/2683/1479 2562/2682/1479 2526/2572/1479 2524/2684/1479 -f 2375/2685/1480 2374/2575/1480 2527/2671/1480 2525/2670/1480 -f 2560/2686/1481 2561/2683/1481 2524/2684/1481 2522/2687/1481 -f 2376/2688/1482 2375/2685/1482 2525/2670/1482 2523/2669/1482 -f 2559/2689/1483 2560/2686/1483 2522/2687/1483 2520/2690/1483 -f 2377/2691/1484 2376/2688/1484 2523/2669/1484 2521/2668/1484 -f 2558/2692/1485 2559/2689/1485 2520/2690/1485 2518/2693/1485 -f 2378/2694/1486 2377/2691/1486 2521/2668/1486 2519/2667/1486 -f 2557/2695/1487 2558/2692/1487 2518/2693/1487 2516/2696/1487 -f 2379/2697/1488 2378/2694/1488 2519/2667/1488 2517/2666/1488 -f 2556/2698/1489 2557/2695/1489 2516/2696/1489 2514/2699/1489 -f 2380/2700/1490 2379/2697/1490 2517/2666/1490 2515/2665/1490 -f 2555/2701/1491 2556/2698/1491 2514/2699/1491 2512/2702/1491 -f 2381/2703/1492 2380/2700/1492 2515/2665/1492 2513/2664/1492 -f 2554/2704/1493 2555/2701/1493 2512/2702/1493 2510/2705/1493 -f 2382/2706/1494 2381/2703/1494 2513/2664/1494 2511/2663/1494 -f 2553/2707/1495 2554/2704/1495 2510/2705/1495 2508/2708/1495 -f 2383/2709/1496 2382/2706/1496 2511/2663/1496 2509/2662/1496 -f 2552/2710/1497 2553/2707/1497 2508/2708/1497 2506/2711/1497 -f 2384/2712/1498 2383/2709/1498 2509/2662/1498 2507/2661/1498 -f 2551/2713/1499 2552/2710/1499 2506/2711/1499 2504/2714/1499 -f 2385/2715/1500 2384/2712/1500 2507/2661/1500 2505/2660/1500 -f 2550/2716/1501 2551/2713/1501 2504/2714/1501 2502/2717/1501 -f 2386/2718/1502 2385/2715/1502 2505/2660/1502 2503/2659/1502 -f 2549/2719/1503 2550/2716/1503 2502/2717/1503 2500/2720/1503 -f 2387/2721/1504 2386/2718/1504 2503/2659/1504 2501/2658/1504 -f 2548/2722/1505 2549/2719/1505 2500/2720/1505 2498/2723/1505 -f 2388/2724/1506 2387/2721/1506 2501/2658/1506 2499/2657/1506 -f 2547/2725/1507 2548/2722/1507 2498/2723/1507 2496/2726/1507 -f 2389/2727/1508 2388/2724/1508 2499/2657/1508 2497/2656/1508 -f 2546/2728/1509 2547/2725/1509 2496/2726/1509 2494/2729/1509 -f 2390/2730/1510 2389/2727/1510 2497/2656/1510 2495/2655/1510 -f 2545/2731/1511 2546/2728/1511 2494/2729/1511 2492/2732/1511 -f 2391/2733/1512 2390/2730/1512 2495/2655/1512 2493/2654/1512 -f 2544/2734/1513 2545/2731/1513 2492/2732/1513 2490/2735/1513 -f 2392/2736/1514 2391/2733/1514 2493/2654/1514 2491/2653/1514 -f 2543/2737/1515 2544/2734/1515 2490/2735/1515 2488/2738/1515 -f 2393/2739/1516 2392/2736/1516 2491/2653/1516 2489/2652/1516 -f 2542/2740/1517 2543/2737/1517 2488/2738/1517 2486/2741/1517 -f 2394/2742/1518 2393/2739/1518 2489/2652/1518 2487/2651/1518 -f 2541/2743/1519 2542/2740/1519 2486/2741/1519 2484/2744/1519 -f 2395/2745/1520 2394/2742/1520 2487/2651/1520 2485/2650/1520 -f 2540/2746/1521 2541/2743/1521 2484/2744/1521 2482/2747/1521 -f 2396/2748/1522 2395/2745/1522 2485/2650/1522 2483/2649/1522 -f 2539/2749/1523 2540/2746/1523 2482/2747/1523 2480/2750/1523 -f 2397/2751/1524 2396/2748/1524 2483/2649/1524 2481/2648/1524 -f 2538/2752/1525 2539/2749/1525 2480/2750/1525 2478/2753/1525 -f 2398/2754/1526 2397/2751/1526 2481/2648/1526 2479/2647/1526 -f 2537/2755/1527 2538/2752/1527 2478/2753/1527 2476/2756/1527 -f 2399/2757/1528 2398/2754/1528 2479/2647/1528 2477/2646/1528 -f 2536/2758/1529 2537/2755/1529 2476/2756/1529 2474/2759/1529 -f 2400/2760/1530 2399/2757/1530 2477/2646/1530 2475/2645/1530 -f 2535/2761/1531 2536/2758/1531 2474/2759/1531 2472/2762/1531 -f 2401/2763/1532 2400/2760/1532 2475/2645/1532 2473/2644/1532 -f 2534/2764/1533 2535/2761/1533 2472/2762/1533 2470/2765/1533 -f 2402/2766/1534 2401/2763/1534 2473/2644/1534 2471/2608/1534 -f 2533/2767/1535 2534/2764/1535 2470/2765/1535 2469/2768/1535 -f 2403/2769/1536 2402/2766/1536 2471/2608/1536 2468/2607/1536 -f 2524/2684/1537 2526/2572/1537 2374/2575/1537 2375/2685/1537 -f 2522/2687/1538 2524/2684/1538 2375/2685/1538 2376/2688/1538 -f 2520/2690/1539 2522/2687/1539 2376/2688/1539 2377/2691/1539 -f 2518/2693/1540 2520/2690/1540 2377/2691/1540 2378/2694/1540 -f 2516/2696/1541 2518/2693/1541 2378/2694/1541 2379/2697/1541 -f 2514/2699/1542 2516/2696/1542 2379/2697/1542 2380/2700/1542 -f 2512/2702/1543 2514/2699/1543 2380/2700/1543 2381/2703/1543 -f 2510/2705/1544 2512/2702/1544 2381/2703/1544 2382/2706/1544 -f 2508/2708/1545 2510/2705/1545 2382/2706/1545 2383/2709/1545 -f 2506/2711/1546 2508/2708/1546 2383/2709/1546 2384/2712/1546 -f 2504/2714/1547 2506/2711/1547 2384/2712/1547 2385/2715/1547 -f 2502/2717/1548 2504/2714/1548 2385/2715/1548 2386/2718/1548 -f 2500/2720/1549 2502/2717/1549 2386/2718/1549 2387/2721/1549 -f 2498/2723/1550 2500/2720/1550 2387/2721/1550 2388/2724/1550 -f 2496/2726/1551 2498/2723/1551 2388/2724/1551 2389/2727/1551 -f 2494/2729/1552 2496/2726/1552 2389/2727/1552 2390/2730/1552 -f 2492/2732/1553 2494/2729/1553 2390/2730/1553 2391/2733/1553 -f 2490/2735/1554 2492/2732/1554 2391/2733/1554 2392/2736/1554 -f 2488/2738/1555 2490/2735/1555 2392/2736/1555 2393/2739/1555 -f 2486/2741/1556 2488/2738/1556 2393/2739/1556 2394/2742/1556 -f 2484/2744/1557 2486/2741/1557 2394/2742/1557 2395/2745/1557 -f 2482/2747/1558 2484/2744/1558 2395/2745/1558 2396/2748/1558 -f 2480/2750/1559 2482/2747/1559 2396/2748/1559 2397/2751/1559 -f 2478/2753/1560 2480/2750/1560 2397/2751/1560 2398/2754/1560 -f 2476/2756/1561 2478/2753/1561 2398/2754/1561 2399/2757/1561 -f 2474/2759/1562 2476/2756/1562 2399/2757/1562 2400/2760/1562 -f 2472/2762/1563 2474/2759/1563 2400/2760/1563 2401/2763/1563 -f 2470/2765/1564 2472/2762/1564 2401/2763/1564 2402/2766/1564 -f 2469/2768/1565 2470/2765/1565 2402/2766/1565 2403/2769/1565 -f 2528/2573/1566 2530/2678/1566 2532/2679/1566 2373/2574/1566 -f 2530/2678/1567 2469/2677/1567 2403/2680/1567 2532/2679/1567 -f 2436/2770/1568 2467/2771/1568 2534/2764/1568 2533/2767/1568 -f 2467/2771/1569 2466/2772/1569 2535/2761/1569 2534/2764/1569 -f 2466/2772/1570 2465/2773/1570 2536/2758/1570 2535/2761/1570 -f 2465/2773/1571 2464/2774/1571 2537/2755/1571 2536/2758/1571 -f 2464/2774/1572 2463/2775/1572 2538/2752/1572 2537/2755/1572 -f 2463/2775/1573 2462/2776/1573 2539/2749/1573 2538/2752/1573 -f 2462/2776/1574 2461/2777/1574 2540/2746/1574 2539/2749/1574 -f 2461/2777/1575 2460/2778/1575 2541/2743/1575 2540/2746/1575 -f 2460/2778/1576 2459/2779/1576 2542/2740/1576 2541/2743/1576 -f 2459/2779/1577 2458/2780/1577 2543/2737/1577 2542/2740/1577 -f 2458/2780/1578 2457/2781/1578 2544/2734/1578 2543/2737/1578 -f 2457/2781/1579 2456/2782/1579 2545/2731/1579 2544/2734/1579 -f 2456/2782/1580 2455/2783/1580 2546/2728/1580 2545/2731/1580 -f 2455/2783/1581 2454/2784/1581 2547/2725/1581 2546/2728/1581 -f 2454/2784/1582 2453/2785/1582 2548/2722/1582 2547/2725/1582 -f 2453/2785/1583 2452/2786/1583 2549/2719/1583 2548/2722/1583 -f 2452/2786/1584 2451/2787/1584 2550/2716/1584 2549/2719/1584 -f 2451/2787/1585 2450/2788/1585 2551/2713/1585 2550/2716/1585 -f 2450/2788/1586 2449/2641/1586 2552/2710/1586 2551/2713/1586 -f 2449/2641/1587 2448/2640/1587 2553/2707/1587 2552/2710/1587 -f 2448/2640/1588 2447/2789/1588 2554/2704/1588 2553/2707/1588 -f 2447/2789/1589 2446/2790/1589 2555/2701/1589 2554/2704/1589 -f 2446/2790/1590 2445/2791/1590 2556/2698/1590 2555/2701/1590 -f 2445/2791/1591 2444/2792/1591 2557/2695/1591 2556/2698/1591 -f 2444/2792/1592 2443/2793/1592 2558/2692/1592 2557/2695/1592 -f 2443/2793/1593 2442/2794/1593 2559/2689/1593 2558/2692/1593 -f 2442/2794/1594 2441/2795/1594 2560/2686/1594 2559/2689/1594 -f 2441/2795/1595 2440/2796/1595 2561/2683/1595 2560/2686/1595 -f 2440/2796/1596 2439/2797/1596 2562/2682/1596 2561/2683/1596 -f 2439/2797/1597 2438/2798/1597 2563/2681/1597 2562/2682/1597 -f 2438/2798/1598 2437/2799/1598 2564/2675/1598 2563/2681/1598 -f 2437/2799/1599 2436/2770/1599 2533/2676/1599 2564/2675/1599 -f 2565/2800/566 2566/2801/566 2567/2802/566 2568/2803/566 2569/2804/566 2570/2805/566 2571/2806/566 2572/2807/566 2573/2808/566 2574/2809/566 2575/2810/566 2576/2811/566 2577/2643/566 2578/2642/566 2579/2812/566 2580/2813/566 2581/2814/566 2582/2815/566 2583/2816/566 2584/2817/566 2585/2818/566 2586/2819/566 2587/2820/566 2588/2821/566 2589/2822/566 2590/2823/566 2591/2824/566 2592/2825/566 2593/2826/566 2594/2827/566 2595/2828/566 2596/2829/566 -f 2462/2776/1600 2463/2775/1600 2592/2825/1600 2591/2824/1600 -f 2449/2641/1601 2450/2788/1601 2579/2812/1601 2578/2642/1601 -f 2436/2770/1602 2437/2799/1602 2566/2801/1602 2565/2800/1602 -f 2463/2775/1603 2464/2774/1603 2593/2826/1603 2592/2825/1603 -f 2450/2788/1604 2451/2787/1604 2580/2813/1604 2579/2812/1604 -f 2437/2799/1605 2438/2798/1605 2567/2802/1605 2566/2801/1605 -f 2464/2774/1606 2465/2773/1606 2594/2827/1606 2593/2826/1606 -f 2451/2787/1607 2452/2786/1607 2581/2814/1607 2580/2813/1607 -f 2438/2798/1608 2439/2797/1608 2568/2803/1608 2567/2802/1608 -f 2465/2773/1609 2466/2772/1609 2595/2828/1609 2594/2827/1609 -f 2452/2786/1610 2453/2785/1610 2582/2815/1610 2581/2814/1610 -f 2439/2797/1611 2440/2796/1611 2569/2804/1611 2568/2803/1611 -f 2466/2772/1612 2467/2771/1612 2596/2829/1612 2595/2828/1612 -f 2453/2785/1613 2454/2784/1613 2583/2816/1613 2582/2815/1613 -f 2440/2796/1614 2441/2795/1614 2570/2805/1614 2569/2804/1614 -f 2467/2771/1615 2436/2770/1615 2565/2800/1615 2596/2829/1615 -f 2454/2784/1616 2455/2783/1616 2584/2817/1616 2583/2816/1616 -f 2441/2795/1617 2442/2794/1617 2571/2806/1617 2570/2805/1617 -f 2455/2783/1618 2456/2782/1618 2585/2818/1618 2584/2817/1618 -f 2442/2794/1619 2443/2793/1619 2572/2807/1619 2571/2806/1619 -f 2456/2782/1620 2457/2781/1620 2586/2819/1620 2585/2818/1620 -f 2443/2793/1621 2444/2792/1621 2573/2808/1621 2572/2807/1621 -f 2457/2781/1622 2458/2780/1622 2587/2820/1622 2586/2819/1622 -f 2444/2792/1623 2445/2791/1623 2574/2809/1623 2573/2808/1623 -f 2458/2780/1624 2459/2779/1624 2588/2821/1624 2587/2820/1624 -f 2445/2791/1625 2446/2790/1625 2575/2810/1625 2574/2809/1625 -f 2459/2779/1626 2460/2778/1626 2589/2822/1626 2588/2821/1626 -f 2446/2790/1627 2447/2789/1627 2576/2811/1627 2575/2810/1627 -f 2460/2778/1628 2461/2777/1628 2590/2823/1628 2589/2822/1628 -f 2447/2789/1629 2448/2640/1629 2577/2643/1629 2576/2811/1629 -f 2461/2777/1630 2462/2776/1630 2591/2824/1630 2590/2823/1630 -f 2597/2830/1210 2599/2831/1210 2600/2832/1210 2598/2833/1210 -f 2599/2831/1211 2601/2834/1211 2602/2835/1211 2600/2832/1211 -f 2601/2834/1212 2603/2836/1212 2604/2837/1212 2602/2835/1212 -f 2603/2836/1213 2605/2838/1213 2606/2839/1213 2604/2837/1213 -f 2605/2838/1214 2607/2840/1214 2608/2841/1214 2606/2839/1214 -f 2607/2840/1215 2609/2842/1215 2610/2843/1215 2608/2841/1215 -f 2609/2842/1216 2611/2844/1216 2612/2845/1216 2610/2843/1216 -f 2611/2844/1217 2613/2846/1217 2614/2847/1217 2612/2845/1217 -f 2613/2846/1218 2615/2848/1218 2616/2849/1218 2614/2847/1218 -f 2615/2848/1219 2617/2850/1219 2618/2851/1219 2616/2849/1219 -f 2617/2850/1220 2619/2852/1220 2620/2853/1220 2618/2851/1220 -f 2619/2852/1221 2621/2854/1221 2622/2855/1221 2620/2853/1221 -f 2621/2854/1222 2623/2856/1222 2624/2857/1222 2622/2855/1222 -f 2623/2856/1223 2625/2858/1223 2626/2859/1223 2624/2857/1223 -f 2625/2858/1224 2627/2860/1224 2628/2861/1224 2626/2859/1224 -f 2627/2860/1225 2629/2862/1225 2630/2863/1225 2628/2861/1225 -f 2629/2862/1226 2631/2864/1226 2632/2865/1226 2630/2863/1226 -f 2631/2864/1227 2633/2866/1227 2634/2867/1227 2632/2865/1227 -f 2633/2866/1228 2635/2868/1228 2636/2869/1228 2634/2867/1228 -f 2635/2868/1229 2637/2870/1229 2638/2871/1229 2636/2869/1229 -f 2637/2870/1230 2639/2872/1230 2640/2873/1230 2638/2871/1230 -f 2639/2872/1231 2641/2874/1231 2642/2875/1231 2640/2873/1231 -f 2641/2874/1232 2643/2876/1232 2644/2877/1232 2642/2875/1232 -f 2643/2876/1233 2645/2878/1233 2646/2879/1233 2644/2877/1233 -f 2645/2878/1234 2647/2880/1234 2648/2881/1234 2646/2879/1234 -f 2647/2880/1235 2649/2882/1235 2650/2883/1235 2648/2881/1235 -f 2649/2882/1236 2651/2884/1236 2652/2885/1236 2650/2883/1236 -f 2651/2884/1237 2653/2886/1237 2654/2887/1237 2652/2885/1237 -f 2653/2886/1238 2655/2888/1238 2656/2889/1238 2654/2887/1238 -f 2655/2888/1239 2657/2890/1239 2658/2891/1239 2656/2889/1239 -f 2618/2851/1240 2671/2892/1240 2670/2893/1240 2616/2849/1240 -f 2657/2890/1241 2659/2894/1241 2660/2895/1241 2658/2891/1241 -f 2659/2894/1242 2597/2896/1242 2598/2897/1242 2660/2895/1242 -f 2607/2840/566 2730/2898/566 2731/2899/566 2609/2842/566 -f 2675/2900/1026 2693/2901/1026 2674/2902/1026 -f 2636/2869/1243 2680/2903/1243 2679/2904/1243 2634/2867/1243 -f 2654/2887/1244 2689/2905/1244 2688/2906/1244 2652/2885/1244 -f 2610/2843/1245 2667/2907/1245 2666/2908/1245 2608/2841/1245 -f 2628/2861/1246 2676/2909/1246 2675/2900/1246 2626/2859/1246 -f 2646/2879/1247 2685/2910/1247 2684/2911/1247 2644/2877/1247 -f 2602/2835/1248 2663/2912/1248 2661/2913/1248 2600/2832/1248 -f 2620/2853/1249 2672/2914/1249 2671/2892/1249 2618/2851/1249 -f 2638/2871/1250 2681/2915/1250 2680/2903/1250 2636/2869/1250 -f 2656/2889/1251 2690/2916/1251 2689/2905/1251 2654/2887/1251 -f 2612/2845/1252 2668/2917/1252 2667/2907/1252 2610/2843/1252 -f 2630/2863/1253 2677/2918/1253 2676/2909/1253 2628/2861/1253 -f 2648/2881/1254 2686/2919/1254 2685/2910/1254 2646/2879/1254 -f 2604/2837/1631 2664/2920/1631 2663/2912/1631 2602/2835/1631 -f 2622/2855/1256 2673/2921/1256 2672/2914/1256 2620/2853/1256 -f 2640/2873/1632 2682/2922/1632 2681/2915/1632 2638/2871/1632 -f 2658/2891/1633 2691/2923/1633 2690/2916/1633 2656/2889/1633 -f 2614/2847/1259 2669/2924/1259 2668/2917/1259 2612/2845/1259 -f 2632/2865/1260 2678/2925/1260 2677/2918/1260 2630/2863/1260 -f 2650/2883/1261 2687/2926/1261 2686/2919/1261 2648/2881/1261 -f 2606/2839/1262 2665/2927/1262 2664/2920/1262 2604/2837/1262 -f 2624/2857/1263 2674/2902/1263 2673/2921/1263 2622/2855/1263 -f 2642/2875/1264 2683/2928/1264 2682/2922/1264 2640/2873/1264 -f 2660/2895/1265 2692/2929/1265 2691/2923/1265 2658/2891/1265 -f 2616/2849/1266 2670/2893/1266 2669/2924/1266 2614/2847/1266 -f 2634/2867/1267 2679/2904/1267 2678/2925/1267 2632/2865/1267 -f 2652/2885/1268 2688/2906/1268 2687/2926/1268 2650/2883/1268 -f 2608/2841/1269 2666/2908/1269 2665/2927/1269 2606/2839/1269 -f 2626/2859/1270 2675/2900/1270 2674/2902/1270 2624/2857/1270 -f 2644/2877/1271 2684/2911/1271 2683/2928/1271 2642/2875/1271 -f 2600/2832/1272 2661/2913/1272 2662/2930/1272 2598/2833/1272 -f 2598/2897/1273 2662/2931/1273 2692/2929/1273 2660/2895/1273 -f 2847/2932/1634 2695/2933/1634 2694/2934/1634 2849/2935/1634 -f 2661/2913/1025 2693/2936/1025 2662/2930/1025 -f 2689/2905/1038 2693/2937/1038 2688/2906/1038 -f 2676/2909/1023 2693/2938/1023 2675/2900/1023 -f 2663/2912/1022 2693/2939/1022 2661/2913/1022 -f 2690/2916/1036 2693/2940/1036 2689/2905/1036 -f 2677/2918/1020 2693/2941/1020 2676/2909/1020 -f 2664/2920/987 2693/2942/987 2663/2912/987 -f 2691/2923/1034 2693/2943/1034 2690/2916/1034 -f 2678/2925/1033 2693/2944/1033 2677/2918/1033 -f 2665/2927/1049 2693/2945/1049 2664/2920/1049 -f 2692/2929/1031 2693/2946/1031 2691/2923/1031 -f 2679/2904/1030 2693/2947/1030 2678/2925/1030 -f 2666/2908/1047 2693/2948/1047 2665/2927/1047 -f 2662/2931/1028 2693/2949/1028 2692/2929/1028 -f 2680/2903/1027 2693/2950/1027 2679/2904/1027 -f 2667/2907/1045 2693/2951/1045 2666/2908/1045 -f 2681/2915/1024 2693/2952/1024 2680/2903/1024 -f 2668/2917/1043 2693/2953/1043 2667/2907/1043 -f 2682/2922/1021 2693/2954/1021 2681/2915/1021 -f 2669/2924/1041 2693/2955/1041 2668/2917/1041 -f 2683/2928/1050 2693/2956/1050 2682/2922/1050 -f 2670/2893/1039 2693/2957/1039 2669/2924/1039 -f 2684/2911/1048 2693/2958/1048 2683/2928/1048 -f 2671/2892/1037 2693/2959/1037 2670/2893/1037 -f 2685/2910/1046 2693/2960/1046 2684/2911/1046 -f 2672/2914/1035 2693/2961/1035 2671/2892/1035 -f 2686/2919/1044 2693/2962/1044 2685/2910/1044 -f 2673/2921/1032 2693/2963/1032 2672/2914/1032 -f 2687/2926/1042 2693/2964/1042 2686/2919/1042 -f 2674/2902/1029 2693/2965/1029 2673/2921/1029 -f 2688/2906/1040 2693/2966/1040 2687/2926/1040 -f 2789/2967/1635 2725/2968/1635 2756/2969/1635 2792/2970/1635 -f 2625/2858/566 2739/2971/566 2740/2972/566 2627/2860/566 -f 2643/2876/566 2748/2973/566 2749/2974/566 2645/2878/566 -f 2599/2831/566 2726/2975/566 2727/2976/566 2601/2834/566 -f 2617/2850/566 2735/2977/566 2736/2978/566 2619/2852/566 -f 2635/2868/566 2744/2979/566 2745/2980/566 2637/2870/566 -f 2653/2886/566 2753/2981/566 2754/2982/566 2655/2888/566 -f 2609/2842/566 2731/2899/566 2732/2983/566 2611/2844/566 -f 2627/2860/566 2740/2972/566 2741/2984/566 2629/2862/566 -f 2645/2878/566 2749/2974/566 2750/2985/566 2647/2880/566 -f 2601/2834/566 2727/2976/566 2728/2986/566 2603/2836/566 -f 2619/2852/566 2736/2978/566 2737/2987/566 2621/2854/566 -f 2637/2870/566 2745/2980/566 2746/2988/566 2639/2872/566 -f 2655/2888/566 2754/2982/566 2755/2989/566 2657/2890/566 -f 2611/2844/566 2732/2983/566 2733/2990/566 2613/2846/566 -f 2629/2862/566 2741/2984/566 2742/2991/566 2631/2864/566 -f 2647/2880/566 2750/2985/566 2751/2992/566 2649/2882/566 -f 2603/2836/566 2728/2986/566 2729/2993/566 2605/2838/566 -f 2621/2854/566 2737/2987/566 2738/2994/566 2623/2856/566 -f 2639/2872/566 2746/2988/566 2747/2995/566 2641/2874/566 -f 2657/2890/566 2755/2989/566 2756/2969/566 2659/2894/566 -f 2613/2846/566 2733/2990/566 2734/2996/566 2615/2848/566 -f 2631/2864/566 2742/2991/566 2743/2997/566 2633/2866/566 -f 2649/2882/566 2751/2992/566 2752/2998/566 2651/2884/566 -f 2605/2838/566 2729/2993/566 2730/2898/566 2607/2840/566 -f 2623/2856/566 2738/2994/566 2739/2971/566 2625/2858/566 -f 2641/2874/566 2747/2995/566 2748/2973/566 2643/2876/566 -f 2597/2830/566 2725/2999/566 2726/2975/566 2599/2831/566 -f 2659/2894/566 2756/2969/566 2725/2968/566 2597/2896/566 -f 2615/2848/566 2734/2996/566 2735/2977/566 2617/2850/566 -f 2633/2866/566 2743/2997/566 2744/2979/566 2635/2868/566 -f 2651/2884/566 2752/2998/566 2753/2981/566 2653/2886/566 -f 2769/3000/1636 2898/3001/1636 2899/3002/1636 2770/3003/1636 -f 2792/2970/1637 2756/2969/1637 2755/2989/1637 2794/3004/1637 -f 2794/3004/1638 2755/2989/1638 2754/2982/1638 2796/3005/1638 -f 2796/3005/1639 2754/2982/1639 2753/2981/1639 2798/3006/1639 -f 2798/3006/1640 2753/2981/1640 2752/2998/1640 2800/3007/1640 -f 2800/3007/1641 2752/2998/1641 2751/2992/1641 2802/3008/1641 -f 2802/3008/1642 2751/2992/1642 2750/2985/1642 2804/3009/1642 -f 2804/3009/1643 2750/2985/1643 2749/2974/1643 2806/3010/1643 -f 2806/3010/1644 2749/2974/1644 2748/2973/1644 2808/3011/1644 -f 2808/3011/1645 2748/2973/1645 2747/2995/1645 2810/3012/1645 -f 2810/3012/1646 2747/2995/1646 2746/2988/1646 2812/3013/1646 -f 2812/3013/1647 2746/2988/1647 2745/2980/1647 2814/3014/1647 -f 2814/3014/1648 2745/2980/1648 2744/2979/1648 2816/3015/1648 -f 2816/3015/1649 2744/2979/1649 2743/2997/1649 2818/3016/1649 -f 2818/3016/1650 2743/2997/1650 2742/2991/1650 2820/3017/1650 -f 2820/3017/1651 2742/2991/1651 2741/2984/1651 2822/3018/1651 -f 2822/3018/1652 2741/2984/1652 2740/2972/1652 2824/3019/1652 -f 2824/3019/1653 2740/2972/1653 2739/2971/1653 2826/3020/1653 -f 2826/3020/1654 2739/2971/1654 2738/2994/1654 2828/3021/1654 -f 2828/3021/1655 2738/2994/1655 2737/2987/1655 2830/3022/1655 -f 2830/3022/1656 2737/2987/1656 2736/2978/1656 2832/3023/1656 -f 2832/3023/1657 2736/2978/1657 2735/2977/1657 2834/3024/1657 -f 2834/3024/1658 2735/2977/1658 2734/2996/1658 2836/3025/1658 -f 2836/3025/1659 2734/2996/1659 2733/2990/1659 2838/3026/1659 -f 2838/3026/1660 2733/2990/1660 2732/2983/1660 2840/3027/1660 -f 2840/3027/1661 2732/2983/1661 2731/2899/1661 2842/3028/1661 -f 2842/3028/1662 2731/2899/1662 2730/2898/1662 2844/3029/1662 -f 2844/3029/1663 2730/2898/1663 2729/2993/1663 2846/3030/1663 -f 2846/3030/1664 2729/2993/1664 2728/2986/1664 2848/3031/1664 -f 2848/3031/1665 2728/2986/1665 2727/2976/1665 2850/3032/1665 -f 2850/3032/1666 2727/2976/1666 2726/2975/1666 2852/3033/1666 -f 2852/3033/1667 2726/2975/1667 2725/2999/1667 2789/3034/1667 -f 2885/3035/1668 2851/3036/1668 2790/3037/1668 2854/3038/1668 -f 2853/3039/1669 2852/3033/1669 2789/3034/1669 2724/3040/1669 -f 2884/3041/1670 2849/2935/1670 2851/3036/1670 2885/3035/1670 -f 2694/2934/1671 2850/3032/1671 2852/3033/1671 2853/3039/1671 -f 2883/3042/1672 2847/2932/1672 2849/2935/1672 2884/3041/1672 -f 2695/2933/1673 2848/3031/1673 2850/3032/1673 2694/2934/1673 -f 2882/3043/1674 2845/3044/1674 2847/2932/1674 2883/3042/1674 -f 2696/3045/1675 2846/3030/1675 2848/3031/1675 2695/2933/1675 -f 2881/3046/1676 2843/3047/1676 2845/3044/1676 2882/3043/1676 -f 2697/3048/1677 2844/3029/1677 2846/3030/1677 2696/3045/1677 -f 2880/3049/1678 2841/3050/1678 2843/3047/1678 2881/3046/1678 -f 2698/3051/1679 2842/3028/1679 2844/3029/1679 2697/3048/1679 -f 2879/3052/1680 2839/3053/1680 2841/3050/1680 2880/3049/1680 -f 2699/3054/1681 2840/3027/1681 2842/3028/1681 2698/3051/1681 -f 2878/3055/1682 2837/3056/1682 2839/3053/1682 2879/3052/1682 -f 2700/3057/1683 2838/3026/1683 2840/3027/1683 2699/3054/1683 -f 2877/3058/1684 2835/3059/1684 2837/3056/1684 2878/3055/1684 -f 2701/3060/1685 2836/3025/1685 2838/3026/1685 2700/3057/1685 -f 2876/3061/1686 2833/3062/1686 2835/3059/1686 2877/3058/1686 -f 2702/3063/1687 2834/3024/1687 2836/3025/1687 2701/3060/1687 -f 2875/3064/1688 2831/3065/1688 2833/3062/1688 2876/3061/1688 -f 2703/3066/1689 2832/3023/1689 2834/3024/1689 2702/3063/1689 -f 2874/3067/1690 2829/3068/1690 2831/3065/1690 2875/3064/1690 -f 2704/3069/1691 2830/3022/1691 2832/3023/1691 2703/3066/1691 -f 2873/3070/1692 2827/3071/1692 2829/3068/1692 2874/3067/1692 -f 2705/3072/1693 2828/3021/1693 2830/3022/1693 2704/3069/1693 -f 2872/3073/1694 2825/3074/1694 2827/3071/1694 2873/3070/1694 -f 2706/3075/1695 2826/3020/1695 2828/3021/1695 2705/3072/1695 -f 2871/3076/1696 2823/3077/1696 2825/3074/1696 2872/3073/1696 -f 2707/3078/1697 2824/3019/1697 2826/3020/1697 2706/3075/1697 -f 2870/3079/1698 2821/3080/1698 2823/3077/1698 2871/3076/1698 -f 2708/3081/1699 2822/3018/1699 2824/3019/1699 2707/3078/1699 -f 2869/3082/1700 2819/3083/1700 2821/3080/1700 2870/3079/1700 -f 2709/3084/1701 2820/3017/1701 2822/3018/1701 2708/3081/1701 -f 2868/3085/1702 2817/3086/1702 2819/3083/1702 2869/3082/1702 -f 2710/3087/1703 2818/3016/1703 2820/3017/1703 2709/3084/1703 -f 2867/3088/1704 2815/3089/1704 2817/3086/1704 2868/3085/1704 -f 2711/3090/1705 2816/3015/1705 2818/3016/1705 2710/3087/1705 -f 2866/3091/1706 2813/3092/1706 2815/3089/1706 2867/3088/1706 -f 2712/3093/1707 2814/3014/1707 2816/3015/1707 2711/3090/1707 -f 2865/3094/1708 2811/3095/1708 2813/3092/1708 2866/3091/1708 -f 2713/3096/1709 2812/3013/1709 2814/3014/1709 2712/3093/1709 -f 2864/3097/1710 2809/3098/1710 2811/3095/1710 2865/3094/1710 -f 2714/3099/1711 2810/3012/1711 2812/3013/1711 2713/3096/1711 -f 2863/3100/1712 2807/3101/1712 2809/3098/1712 2864/3097/1712 -f 2715/3102/1713 2808/3011/1713 2810/3012/1713 2714/3099/1713 -f 2862/3103/1714 2805/3104/1714 2807/3101/1714 2863/3100/1714 -f 2716/3105/1715 2806/3010/1715 2808/3011/1715 2715/3102/1715 -f 2861/3106/1716 2803/3107/1716 2805/3104/1716 2862/3103/1716 -f 2717/3108/1717 2804/3009/1717 2806/3010/1717 2716/3105/1717 -f 2860/3109/1718 2801/3110/1718 2803/3107/1718 2861/3106/1718 -f 2718/3111/1719 2802/3008/1719 2804/3009/1719 2717/3108/1719 -f 2859/3112/1720 2799/3113/1720 2801/3110/1720 2860/3109/1720 -f 2719/3114/1721 2800/3007/1721 2802/3008/1721 2718/3111/1721 -f 2858/3115/1722 2797/3116/1722 2799/3113/1722 2859/3112/1722 -f 2720/3117/1723 2798/3006/1723 2800/3007/1723 2719/3114/1723 -f 2857/3118/1724 2795/3119/1724 2797/3116/1724 2858/3115/1724 -f 2721/3120/1725 2796/3005/1725 2798/3006/1725 2720/3117/1725 -f 2856/3121/1726 2793/3122/1726 2795/3119/1726 2857/3118/1726 -f 2722/3123/1727 2794/3004/1727 2796/3005/1727 2721/3120/1727 -f 2855/3124/1728 2791/3125/1728 2793/3122/1728 2856/3121/1728 -f 2723/3126/1729 2792/2970/1729 2794/3004/1729 2722/3123/1729 -f 2854/3127/1730 2790/3128/1730 2791/3125/1730 2855/3124/1730 -f 2724/3129/1731 2789/2967/1731 2792/2970/1731 2723/3126/1731 -f 2845/3044/1732 2696/3045/1732 2695/2933/1732 2847/2932/1732 -f 2843/3047/1733 2697/3048/1733 2696/3045/1733 2845/3044/1733 -f 2841/3050/1734 2698/3051/1734 2697/3048/1734 2843/3047/1734 -f 2839/3053/1735 2699/3054/1735 2698/3051/1735 2841/3050/1735 -f 2837/3056/1736 2700/3057/1736 2699/3054/1736 2839/3053/1736 -f 2835/3059/1737 2701/3060/1737 2700/3057/1737 2837/3056/1737 -f 2833/3062/1738 2702/3063/1738 2701/3060/1738 2835/3059/1738 -f 2831/3065/1739 2703/3066/1739 2702/3063/1739 2833/3062/1739 -f 2829/3068/1740 2704/3069/1740 2703/3066/1740 2831/3065/1740 -f 2827/3071/1741 2705/3072/1741 2704/3069/1741 2829/3068/1741 -f 2825/3074/1742 2706/3075/1742 2705/3072/1742 2827/3071/1742 -f 2823/3077/1743 2707/3078/1743 2706/3075/1743 2825/3074/1743 -f 2821/3080/1744 2708/3081/1744 2707/3078/1744 2823/3077/1744 -f 2819/3083/1745 2709/3084/1745 2708/3081/1745 2821/3080/1745 -f 2817/3086/1746 2710/3087/1746 2709/3084/1746 2819/3083/1746 -f 2815/3089/1747 2711/3090/1747 2710/3087/1747 2817/3086/1747 -f 2813/3092/1748 2712/3093/1748 2711/3090/1748 2815/3089/1748 -f 2811/3095/1749 2713/3096/1749 2712/3093/1749 2813/3092/1749 -f 2809/3098/1750 2714/3099/1750 2713/3096/1750 2811/3095/1750 -f 2807/3101/1751 2715/3102/1751 2714/3099/1751 2809/3098/1751 -f 2805/3104/1752 2716/3105/1752 2715/3102/1752 2807/3101/1752 -f 2803/3107/1753 2717/3108/1753 2716/3105/1753 2805/3104/1753 -f 2801/3110/1754 2718/3111/1754 2717/3108/1754 2803/3107/1754 -f 2799/3113/1755 2719/3114/1755 2718/3111/1755 2801/3110/1755 -f 2797/3116/1756 2720/3117/1756 2719/3114/1756 2799/3113/1756 -f 2795/3119/1757 2721/3120/1757 2720/3117/1757 2797/3116/1757 -f 2793/3122/1758 2722/3123/1758 2721/3120/1758 2795/3119/1758 -f 2791/3125/1759 2723/3126/1759 2722/3123/1759 2793/3122/1759 -f 2790/3128/1760 2724/3129/1760 2723/3126/1760 2791/3125/1760 -f 2849/2935/1761 2694/2934/1761 2853/3039/1761 2851/3036/1761 -f 2851/3036/1762 2853/3039/1762 2724/3040/1762 2790/3037/1762 -f 2757/3130/1763 2854/3127/1763 2855/3124/1763 2788/3131/1763 -f 2788/3131/1764 2855/3124/1764 2856/3121/1764 2787/3132/1764 -f 2787/3132/1765 2856/3121/1765 2857/3118/1765 2786/3133/1765 -f 2786/3133/1766 2857/3118/1766 2858/3115/1766 2785/3134/1766 -f 2785/3134/1767 2858/3115/1767 2859/3112/1767 2784/3135/1767 -f 2784/3135/1768 2859/3112/1768 2860/3109/1768 2783/3136/1768 -f 2783/3136/1769 2860/3109/1769 2861/3106/1769 2782/3137/1769 -f 2782/3137/1770 2861/3106/1770 2862/3103/1770 2781/3138/1770 -f 2781/3138/1771 2862/3103/1771 2863/3100/1771 2780/3139/1771 -f 2780/3139/1772 2863/3100/1772 2864/3097/1772 2779/3140/1772 -f 2779/3140/1773 2864/3097/1773 2865/3094/1773 2778/3141/1773 -f 2778/3141/1774 2865/3094/1774 2866/3091/1774 2777/3142/1774 -f 2777/3142/1775 2866/3091/1775 2867/3088/1775 2776/3143/1775 -f 2776/3143/1776 2867/3088/1776 2868/3085/1776 2775/3144/1776 -f 2775/3144/1777 2868/3085/1777 2869/3082/1777 2774/3145/1777 -f 2774/3145/1778 2869/3082/1778 2870/3079/1778 2773/3146/1778 -f 2773/3146/1779 2870/3079/1779 2871/3076/1779 2772/3147/1779 -f 2772/3147/1780 2871/3076/1780 2872/3073/1780 2771/3148/1780 -f 2771/3148/1781 2872/3073/1781 2873/3070/1781 2770/3003/1781 -f 2770/3003/1782 2873/3070/1782 2874/3067/1782 2769/3000/1782 -f 2769/3000/1783 2874/3067/1783 2875/3064/1783 2768/3149/1783 -f 2768/3149/1784 2875/3064/1784 2876/3061/1784 2767/3150/1784 -f 2767/3150/1785 2876/3061/1785 2877/3058/1785 2766/3151/1785 -f 2766/3151/1786 2877/3058/1786 2878/3055/1786 2765/3152/1786 -f 2765/3152/1787 2878/3055/1787 2879/3052/1787 2764/3153/1787 -f 2764/3153/1788 2879/3052/1788 2880/3049/1788 2763/3154/1788 -f 2763/3154/1789 2880/3049/1789 2881/3046/1789 2762/3155/1789 -f 2762/3155/1790 2881/3046/1790 2882/3043/1790 2761/3156/1790 -f 2761/3156/1791 2882/3043/1791 2883/3042/1791 2760/3157/1791 -f 2760/3157/1792 2883/3042/1792 2884/3041/1792 2759/3158/1792 -f 2759/3158/1793 2884/3041/1793 2885/3035/1793 2758/3159/1793 -f 2758/3159/1794 2885/3035/1794 2854/3038/1794 2757/3130/1794 -f 2886/3160/1278 2917/3161/1278 2916/3162/1278 2915/3163/1278 2914/3164/1278 2913/3165/1278 2912/3166/1278 2911/3167/1278 2910/3168/1278 2909/3169/1278 2908/3170/1278 2907/3171/1278 2906/3172/1278 2905/3173/1278 2904/3174/1278 2903/3175/1278 2902/3176/1278 2901/3177/1278 2900/3178/1278 2899/3002/1278 2898/3001/1278 2897/3179/1278 2896/3180/1278 2895/3181/1278 2894/3182/1278 2893/3183/1278 2892/3184/1278 2891/3185/1278 2890/3186/1278 2889/3187/1278 2888/3188/1278 2887/3189/1278 -f 2783/3136/1795 2912/3166/1795 2913/3165/1795 2784/3135/1795 -f 2770/3003/1796 2899/3002/1796 2900/3178/1796 2771/3148/1796 -f 2757/3130/1797 2886/3160/1797 2887/3189/1797 2758/3159/1797 -f 2784/3135/1798 2913/3165/1798 2914/3164/1798 2785/3134/1798 -f 2771/3148/1799 2900/3178/1799 2901/3177/1799 2772/3147/1799 -f 2758/3159/1800 2887/3189/1800 2888/3188/1800 2759/3158/1800 -f 2785/3134/1801 2914/3164/1801 2915/3163/1801 2786/3133/1801 -f 2772/3147/1802 2901/3177/1802 2902/3176/1802 2773/3146/1802 -f 2759/3158/1803 2888/3188/1803 2889/3187/1803 2760/3157/1803 -f 2786/3133/1804 2915/3163/1804 2916/3162/1804 2787/3132/1804 -f 2773/3146/1805 2902/3176/1805 2903/3175/1805 2774/3145/1805 -f 2760/3157/1806 2889/3187/1806 2890/3186/1806 2761/3156/1806 -f 2787/3132/1807 2916/3162/1807 2917/3161/1807 2788/3131/1807 -f 2774/3145/1808 2903/3175/1808 2904/3174/1808 2775/3144/1808 -f 2761/3156/1809 2890/3186/1809 2891/3185/1809 2762/3155/1809 -f 2788/3131/1810 2917/3161/1810 2886/3160/1810 2757/3130/1810 -f 2775/3144/1811 2904/3174/1811 2905/3173/1811 2776/3143/1811 -f 2762/3155/1812 2891/3185/1812 2892/3184/1812 2763/3154/1812 -f 2776/3143/1813 2905/3173/1813 2906/3172/1813 2777/3142/1813 -f 2763/3154/1814 2892/3184/1814 2893/3183/1814 2764/3153/1814 -f 2777/3142/1815 2906/3172/1815 2907/3171/1815 2778/3141/1815 -f 2764/3153/1816 2893/3183/1816 2894/3182/1816 2765/3152/1816 -f 2778/3141/1817 2907/3171/1817 2908/3170/1817 2779/3140/1817 -f 2765/3152/1818 2894/3182/1818 2895/3181/1818 2766/3151/1818 -f 2779/3140/1819 2908/3170/1819 2909/3169/1819 2780/3139/1819 -f 2766/3151/1820 2895/3181/1820 2896/3180/1820 2767/3150/1820 -f 2780/3139/1821 2909/3169/1821 2910/3168/1821 2781/3138/1821 -f 2767/3150/1822 2896/3180/1822 2897/3179/1822 2768/3149/1822 -f 2781/3138/1823 2910/3168/1823 2911/3167/1823 2782/3137/1823 -f 2768/3149/1824 2897/3179/1824 2898/3001/1824 2769/3000/1824 -f 2782/3137/1825 2911/3167/1825 2912/3166/1825 2783/3136/1825 +f 45/1/1 94/2/1 2/3/1 1/4/1 +f 2/5/2 4/6/2 5/7/2 8/8/2 +f 4/9/3 3/10/3 16/11/3 15/12/3 +f 6/13/4 7/14/4 12/15/4 10/16/4 +f 9/17/2 5/7/2 18/18/2 21/19/2 +f 3/20/4 1/21/4 7/14/4 6/13/4 +f 173/22/5 172/23/5 34/24/5 33/25/5 +f 3/20/4 6/13/4 19/26/4 16/27/4 +f 2/5/2 8/8/2 17/28/2 13/29/2 +f 8/8/2 5/7/2 9/17/2 11/30/2 +f 14/31/1 13/32/1 17/33/1 20/34/1 +f 15/35/5 16/36/5 19/37/5 18/38/5 +f 24/39/4 20/40/4 28/41/4 32/42/4 +f 21/19/2 18/18/2 25/43/2 29/44/2 +f 11/45/6 12/46/6 24/47/6 23/48/6 +f 5/7/2 4/6/2 15/49/2 18/18/2 +f 1/50/3 2/51/3 13/52/3 14/53/3 +f 10/54/6 9/55/6 21/56/6 22/57/6 +f 8/8/2 11/30/2 23/58/2 17/28/2 +f 12/15/4 7/14/4 20/40/4 24/39/4 +f 7/14/4 1/21/4 14/59/4 20/40/4 +f 6/13/4 10/16/4 22/60/4 19/26/4 +f 25/61/5 26/62/5 30/63/5 29/64/5 +f 28/65/1 27/66/1 31/67/1 32/68/1 +f 148/69/4 147/70/4 38/71/4 40/72/4 +f 18/73/3 19/74/3 26/75/3 25/76/3 +f 17/28/2 23/58/2 31/77/2 27/78/2 +f 19/26/4 22/60/4 30/79/4 26/80/4 +f 160/81/4 159/82/4 44/83/4 42/84/4 +f 20/85/3 17/86/3 27/87/3 28/88/3 +f 36/89/6 35/90/6 33/91/6 34/92/6 +f 181/93/1 180/94/1 35/95/1 36/96/1 +f 180/97/2 173/98/2 33/99/2 35/100/2 +f 172/101/4 181/102/4 36/103/4 34/104/4 +f 38/105/6 37/106/6 39/107/6 40/108/6 +f 147/109/1 153/110/1 37/111/1 38/112/1 +f 154/113/5 148/114/5 40/115/5 39/116/5 +f 153/117/2 154/118/2 39/119/2 37/120/2 +f 41/121/6 42/122/6 44/123/6 43/124/6 +f 163/125/5 160/126/5 42/127/5 41/128/5 +f 159/129/1 168/130/1 43/131/1 44/132/1 +f 168/133/2 163/134/2 41/135/2 43/136/2 +f 4/6/2 2/5/2 94/137/2 120/138/2 +f 120/138/2 94/137/2 93/139/2 121/140/2 +f 121/140/2 93/139/2 92/141/2 122/142/2 +f 122/142/2 92/141/2 91/143/2 123/144/2 +f 123/144/2 91/143/2 90/145/2 124/146/2 +f 124/146/2 90/145/2 89/147/2 125/148/2 +f 125/148/2 89/147/2 88/149/2 126/150/2 +f 126/150/2 88/149/2 87/151/2 127/152/2 +f 127/152/2 87/151/2 86/153/2 128/154/2 +f 128/154/2 86/153/2 85/155/2 129/156/2 +f 129/156/2 85/155/2 84/157/2 130/158/2 +f 130/158/2 84/157/2 83/159/2 131/160/2 +f 131/160/2 83/159/2 82/161/2 132/162/2 +f 132/162/2 82/161/2 81/163/2 133/164/2 +f 133/164/2 81/163/2 80/165/2 134/166/2 +f 134/166/2 80/165/2 79/167/2 135/168/2 +f 135/168/2 79/167/2 78/169/2 136/170/2 +f 136/170/2 78/169/2 77/171/2 137/172/2 +f 137/172/2 77/171/2 76/173/2 138/174/2 +f 138/174/2 76/173/2 75/175/2 139/176/2 +f 139/176/2 75/175/2 74/177/2 140/178/2 +f 140/178/2 74/177/2 73/179/2 141/180/2 +f 141/180/2 73/179/2 72/181/2 142/182/2 +f 142/182/2 72/181/2 71/183/2 143/184/2 +f 143/184/2 71/183/2 70/185/2 144/186/2 +f 1/21/4 3/20/4 119/187/4 45/188/4 +f 45/188/4 119/187/4 118/189/4 46/190/4 +f 46/190/4 118/189/4 117/191/4 47/192/4 +f 47/192/4 117/191/4 116/193/4 48/194/4 +f 48/194/4 116/193/4 115/195/4 49/196/4 +f 49/196/4 115/195/4 114/197/4 50/198/4 +f 50/198/4 114/197/4 113/199/4 51/200/4 +f 51/200/4 113/199/4 112/201/4 52/202/4 +f 52/202/4 112/201/4 111/203/4 53/204/4 +f 53/204/4 111/203/4 110/205/4 54/206/4 +f 54/206/4 110/205/4 109/207/4 55/208/4 +f 55/208/4 109/207/4 108/209/4 56/210/4 +f 56/210/4 108/209/4 107/211/4 57/212/4 +f 57/212/4 107/211/4 106/213/4 58/214/4 +f 58/214/4 106/213/4 105/215/4 59/216/4 +f 59/216/4 105/215/4 104/217/4 60/218/4 +f 60/218/4 104/217/4 103/219/4 61/220/4 +f 61/220/4 103/219/4 102/221/4 62/222/4 +f 62/222/4 102/221/4 101/223/4 63/224/4 +f 63/224/4 101/223/4 100/225/4 64/226/4 +f 64/226/4 100/225/4 99/227/4 65/228/4 +f 65/228/4 99/227/4 98/229/4 66/230/4 +f 66/230/4 98/229/4 97/231/4 67/232/4 +f 67/232/4 97/231/4 96/233/4 68/234/4 +f 68/234/4 96/233/4 95/235/4 69/236/4 +f 3/237/5 4/238/5 120/239/5 119/240/5 +f 119/240/5 120/239/5 121/241/5 118/242/5 +f 118/242/5 121/241/5 122/243/5 117/244/5 +f 117/244/5 122/243/5 123/245/5 116/246/5 +f 116/246/5 123/245/5 124/247/5 115/248/5 +f 115/248/5 124/247/5 125/249/5 114/250/5 +f 114/250/5 125/249/5 126/251/5 113/252/5 +f 113/252/5 126/251/5 127/253/5 112/254/5 +f 112/254/5 127/253/5 128/255/5 111/256/5 +f 111/256/5 128/255/5 129/257/5 110/258/5 +f 110/258/5 129/257/5 130/259/5 109/260/5 +f 109/260/5 130/259/5 131/261/5 108/262/5 +f 108/262/5 131/261/5 132/263/5 107/264/5 +f 107/264/5 132/263/5 133/265/5 106/266/5 +f 106/266/5 133/265/5 134/267/5 105/268/5 +f 105/268/5 134/267/5 135/269/5 104/270/5 +f 104/270/5 135/269/5 136/271/5 103/272/5 +f 103/272/5 136/271/5 137/273/5 102/274/5 +f 102/274/5 137/273/5 138/275/5 101/276/5 +f 101/276/5 138/275/5 139/277/5 100/278/5 +f 100/278/5 139/277/5 140/279/5 99/280/5 +f 99/280/5 140/279/5 141/281/5 98/282/5 +f 98/282/5 141/281/5 142/283/5 97/284/5 +f 97/284/5 142/283/5 143/285/5 96/286/5 +f 96/286/5 143/285/5 144/287/5 95/288/5 +f 70/289/3 69/290/3 95/291/3 144/292/3 +f 69/293/1 70/294/1 71/295/1 68/296/1 +f 68/296/1 71/295/1 72/297/1 67/298/1 +f 67/298/1 72/297/1 73/299/1 66/300/1 +f 66/300/1 73/299/1 74/301/1 65/302/1 +f 65/302/1 74/301/1 75/303/1 64/304/1 +f 64/304/1 75/303/1 76/305/1 63/306/1 +f 63/306/1 76/305/1 77/307/1 62/308/1 +f 62/308/1 77/307/1 78/309/1 61/310/1 +f 61/310/1 78/309/1 79/311/1 60/312/1 +f 60/312/1 79/311/1 80/313/1 59/314/1 +f 59/314/1 80/313/1 81/315/1 58/316/1 +f 58/316/1 81/315/1 82/317/1 57/318/1 +f 57/318/1 82/317/1 83/319/1 56/320/1 +f 56/320/1 83/319/1 84/321/1 55/322/1 +f 55/322/1 84/321/1 85/323/1 54/324/1 +f 54/324/1 85/323/1 86/325/1 53/326/1 +f 53/326/1 86/325/1 87/327/1 52/328/1 +f 52/328/1 87/327/1 88/329/1 51/330/1 +f 51/330/1 88/329/1 89/331/1 50/332/1 +f 50/332/1 89/331/1 90/333/1 49/334/1 +f 49/334/1 90/333/1 91/335/1 48/336/1 +f 48/336/1 91/335/1 92/337/1 47/338/1 +f 47/338/1 92/337/1 93/339/1 46/340/1 +f 46/340/1 93/339/1 94/2/1 45/1/1 +f 21/19/2 29/44/2 156/341/2 151/342/2 +f 151/342/2 156/341/2 155/343/2 152/344/2 +f 152/344/2 155/343/2 154/118/2 153/117/2 +f 29/64/5 30/63/5 150/345/5 156/346/5 +f 156/346/5 150/345/5 149/347/5 155/348/5 +f 155/348/5 149/347/5 148/114/5 154/113/5 +f 22/349/1 21/350/1 151/351/1 145/352/1 +f 145/352/1 151/351/1 152/353/1 146/354/1 +f 146/354/1 152/353/1 153/110/1 147/109/1 +f 30/79/4 22/60/4 145/355/4 150/356/4 +f 150/356/4 145/355/4 146/357/4 149/358/4 +f 149/358/4 146/357/4 147/70/4 148/69/4 +f 31/77/2 23/58/2 165/359/2 166/360/2 +f 166/360/2 165/359/2 164/361/2 167/362/2 +f 167/362/2 164/361/2 163/134/2 168/133/2 +f 32/68/1 31/67/1 166/363/1 157/364/1 +f 157/364/1 166/363/1 167/365/1 158/366/1 +f 158/366/1 167/365/1 168/130/1 159/129/1 +f 23/367/5 24/368/5 162/369/5 165/370/5 +f 165/370/5 162/369/5 161/371/5 164/372/5 +f 164/372/5 161/371/5 160/126/5 163/125/5 +f 24/39/4 32/42/4 157/373/4 162/374/4 +f 162/374/4 157/373/4 158/375/4 161/376/4 +f 161/376/4 158/375/4 159/82/4 160/81/4 +f 10/16/4 12/15/4 184/377/4 169/378/4 +f 169/378/4 184/377/4 183/379/4 170/380/4 +f 170/380/4 183/379/4 182/381/4 171/382/4 +f 171/382/4 182/381/4 181/102/4 172/101/4 +f 11/30/2 9/17/2 176/383/2 177/384/2 +f 177/384/2 176/383/2 175/385/2 178/386/2 +f 178/386/2 175/385/2 174/387/2 179/388/2 +f 179/388/2 174/387/2 173/98/2 180/97/2 +f 12/389/1 11/390/1 177/391/1 184/392/1 +f 184/392/1 177/391/1 178/393/1 183/394/1 +f 183/394/1 178/393/1 179/395/1 182/396/1 +f 182/396/1 179/395/1 180/94/1 181/93/1 +f 9/397/5 10/398/5 169/399/5 176/400/5 +f 176/400/5 169/399/5 170/401/5 175/402/5 +f 175/402/5 170/401/5 171/403/5 174/404/5 +f 174/404/5 171/403/5 172/23/5 173/22/5 diff --git a/mods/ITEMS/mcl_tridents/textures/mcl_trident.png b/mods/ITEMS/mcl_tridents/textures/mcl_trident.png index 1cc256d00..db1b7d90f 100644 Binary files a/mods/ITEMS/mcl_tridents/textures/mcl_trident.png and b/mods/ITEMS/mcl_tridents/textures/mcl_trident.png differ diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr index 445c8f7b3..878058790 100644 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr @@ -3,13 +3,13 @@ A piece of wall. It cannot be jumped over with a simple jump. When multiple of t Cobblestone Wall=Muret de Pierres Mossy Cobblestone Wall=Muret de Pierres Moussu Andesite Wall=Muret d'Andésite -Granite Wall=Muret de Granit +Granite Wall=Muret de Granite Diorite Wall=Muret de Diorite Brick Wall=Muret en Brique Sandstone Wall=Muret de Grès Red Sandstone Wall=Muret de Grès Rouge Stone Brick Wall=Muret de Pierre Taillé -Mossy Stone Brick Wall=Muret de Pierre Taillé Moussue +Mossy Stone Brick Wall=Muret de Pierre Taillée Moussue Prismarine Wall=Muret de Prismarine End Stone Brick Wall=Muret de Brique de l'End Nether Brick Wall=Muret de Brique du Nether diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr index deb0fa289..910ea989f 100644 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr @@ -1,16 +1,16 @@ # textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Часть стены. Её нельзя перепрыгнуть простым прыжком. Когда несколько из них будут расположены рядом друг с другом, они автоматически создадут хорошую структуру стены. +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Часть стены. Её нельзя перепрыгнуть. Когда несколько блоков стены расположены по соседству, они визуально соединяются друг с другом в структуру. Cobblestone Wall=Стена из булыжника -Mossy Cobblestone Wall=Стена из мшистого булыжника +Mossy Cobblestone Wall=Стена из замшелого булыжника Andesite Wall=Андезитовая стена Granite Wall=Гранитная стена Diorite Wall=Диоритовая стена Brick Wall=Кирпичная стена Sandstone Wall=Стена из песчаника Red Sandstone Wall=Стена из красного песчаника -Stone Brick Wall=Стена из каменного блока -Mossy Stone Brick Wall=Стена из мшистого каменного блока +Stone Brick Wall=Стена из каменных кирпичей +Mossy Stone Brick Wall=Стена из замшелого каменного блока Prismarine Wall=Призмариновая стена -End Stone Brick Wall=Стена из камня Предела +End Stone Brick Wall=Стена из кирпичей Края Nether Brick Wall=Стена из адского кирпича -Red Nether Brick Wall=Стена из красного адского кирпича +Red Nether Brick Wall=Стена из адского красного кирпича diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.fr.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.fr.tr index 6b93eab08..2509325ce 100644 --- a/mods/ITEMS/mcl_wool/locale/mcl_wool.fr.tr +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.fr.tr @@ -34,4 +34,4 @@ Lime Carpet=Tapis Vert Clair Light Blue Wool=Laine Bleu Clair Light Blue Carpet=Tapis Bleu Clair Wool is a decorative block which comes in many different colors.=La laine est un bloc décoratif disponible en différentes couleurs. -Carpets are thin floor covers which come in many different colors.=Les tapis sont des revêtements de sol minces qui viennent dans de nombreuses couleurs différentes. +Carpets are thin floor covers which come in many different colors.=Les tapis sont des revêtements de sol minces qui existent dans de nombreuses couleurs différentes. diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr index 6b05812a2..1a6a3ad37 100644 --- a/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr @@ -15,23 +15,23 @@ Yellow Wool=Жёлтая шерсть Yellow Carpet=Жёлтый ковёр Green Wool=Зелёная шерсть Green Carpet=Зелёный ковёр -Cyan Wool=Голубая шерсть -Cyan Carpet=Голубой ковёр +Cyan Wool=Бирюзовая шерсть +Cyan Carpet=Бирюзовый ковёр Blue Wool=Синяя шерсть Blue Carpet=Синий ковёр -Magenta Wool=Фиолетовая шерсть -Magenta Carpet=Фиолетовый ковёр +Magenta Wool=Сиреневая шерсть +Magenta Carpet=Сиреневый ковёр Orange Wool=Оранжевая шерсть Orange Carpet=Оранжевый ковёр -Purple Wool=Пурпурная шерсть -Purple Carpet=Пурпурный ковёр +Purple Wool=Фиолетовая шерсть +Purple Carpet=Фиолетовый ковёр Brown Wool=Коричневая шерсть Brown Carpet=Коричневый ковёр Pink Wool=Розовая шерсть Pink Carpet=Розовый ковёр -Lime Wool=Зелёная лаймовая шерсть -Lime Carpet=Зелёный лаймовый ковёр -Light Blue Wool=Светло-голубая шерсть -Light Blue Carpet=Светло-голубой ковёр +Lime Wool=Лаймовая шерсть +Lime Carpet=Лаймовый ковёр +Light Blue Wool=Голубая шерсть +Light Blue Carpet=Голубой ковёр Wool is a decorative block which comes in many different colors.=Шерсть это декоративный блок, который может быть разных цветов. Carpets are thin floor covers which come in many different colors.=Ковры это тонкие напольные покрытия, которые бывают разных цветов. diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.fr.tr b/mods/ITEMS/mclx_core/locale/mclx_core.fr.tr index eaabebecf..55acd8af3 100644 --- a/mods/ITEMS/mclx_core/locale/mclx_core.fr.tr +++ b/mods/ITEMS/mclx_core/locale/mclx_core.fr.tr @@ -1,5 +1,5 @@ # textdomain: mclx_core River Water Source=Source d'eau de rivière River water has the same properties as water, but has a reduced flowing distance and is not renewable.=L'eau de rivière a les mêmes propriétés que l'eau, mais a une distance d'écoulement réduite et n'est pas renouvelable. -River Water=L'eau de rivière +River Water=Eau de rivière Flowing River Water=Eau de rivière qui coule diff --git a/mods/ITEMS/mclx_fences/init.lua b/mods/ITEMS/mclx_fences/init.lua index e78c7ef7f..53aab68b2 100644 --- a/mods/ITEMS/mclx_fences/init.lua +++ b/mods/ITEMS/mclx_fences/init.lua @@ -1,6 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) --- Red Nether Brick Fence +-- Red Nether Brick Fence and Fence Gate mcl_fences.register_fence_and_fence_gate( "red_nether_brick_fence", @@ -13,6 +13,8 @@ mcl_fences.register_fence_and_fence_gate( mcl_sounds.node_sound_stone_defaults(), "mcl_fences_nether_brick_fence_gate_open", "mcl_fences_nether_brick_fence_gate_close", 1, 1, "mcl_fences_fence_gate_red_nether_brick.png") +-- Nether Brick Fence Gate + mcl_fences.register_fence_gate( "nether_brick_fence", S("Nether Brick Fence Gate"), @@ -22,6 +24,33 @@ mcl_fences.register_fence_gate( minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_blast_resistance, mcl_sounds.node_sound_stone_defaults(), "mcl_fences_nether_brick_fence_gate_open", "mcl_fences_nether_brick_fence_gate_close", 1, 1) +-- Crimson Wood Fence and Fence Gate + +mcl_fences.register_fence_and_fence_gate( + "crimson_wood_fence", + S("Crimson Hyphae Wood Fence"), S("Crimson Hyphae Wood Fence Gate"), + "mcl_fences_fence_crimson.png", + {handy=1,axey=1, flammable=2,fence_wood=1, fire_encouragement=5, fire_flammability=20}, + minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + {"group:fence_wood"}, + mcl_sounds.node_sound_wood_defaults(), "mcl_fences_nether_brick_gate_open", "mcl_fences_nether_brick_fence_gate_close", 1, 1, + "mcl_fences_fence_gate_crimson.png") + +-- Warped Wood Fence and Fence Gate + +mcl_fences.register_fence_and_fence_gate( + "warped_wood_fence", + S("Warped Hyphae Wood Fence"), S("Warped Hyphae Wood Fence Gate"), + "mcl_fences_fence_warped.png", + {handy=1,axey=1, flammable=2,fence_wood=1, fire_encouragement=5, fire_flammability=20}, + minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + {"group:fence_wood"}, + mcl_sounds.node_sound_wood_defaults(), "mcl_fences_nether_brick_fence_gate_open", "mcl_fences_nether_brick_fence_gate_close", 1, 1, + "mcl_fences_fence_gate_warped.png") + + -- Crafting minetest.register_craft({ @@ -33,14 +62,23 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "mclx_fences:red_nether_brick_fence_gate", + output = "mclx_fences:crimson_wood_fence 3", recipe = { - {"mcl_nether:nether_wart_item", "mcl_nether:red_nether_brick", "mcl_nether:netherbrick"}, - {"mcl_nether:netherbrick", "mcl_nether:red_nether_brick", "mcl_nether:nether_wart_item"}, + {"mcl_mushroom:crimson_hyphae_wood", "mcl_core:stick", "mcl_mushroom:crimson_hyphae_wood"}, + {"mcl_mushroom:crimson_hyphae_wood", "mcl_core:stick", "mcl_mushroom:crimson_hyphae_wood"}, } }) + minetest.register_craft({ - output = "mclx_fences:red_nether_brick_fence_gate", + output = "mclx_fences:warped_wood_fence 3", + recipe = { + {"mcl_mushroom:warped_hyphae_wood", "mcl_core:stick", "mcl_mushroom:warped_hyphae_wood"}, + {"mcl_mushroom:warped_hyphae_wood", "mcl_core:stick", "mcl_mushroom:warped_hyphae_wood"}, + } +}) + +minetest.register_craft({ + output = "mclx_fences:red_nether_brick_fence_gate 2", recipe = { {"mcl_nether:netherbrick", "mcl_nether:red_nether_brick", "mcl_nether:nether_wart_item"}, {"mcl_nether:nether_wart_item", "mcl_nether:red_nether_brick", "mcl_nether:netherbrick"}, @@ -55,6 +93,21 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "mclx_fences:crimson_wood_fence_gate", + recipe = { + {"mcl_core:stick", "mcl_mushroom:crimson_hyphae_wood", "mcl_core:stick"}, + {"mcl_core:stick", "mcl_mushroom:crimson_hyphae_wood", "mcl_core:stick"}, + } +}) + +minetest.register_craft({ + output = "mclx_fences:warped_wood_fence_gate", + recipe = { + {"mcl_core:stick", "mcl_mushroom:warped_hyphae_wood", "mcl_core:stick"}, + {"mcl_core:stick", "mcl_mushroom:warped_hyphae_wood", "mcl_core:stick"}, + } +}) -- Aliases for mcl_supplemental minetest.register_alias("mcl_supplemental:red_nether_brick_fence", "mclx_fences:red_nether_brick_fence") @@ -64,3 +117,13 @@ minetest.register_alias("mcl_supplemental:nether_brick_fence_gate_open", "mclx_f minetest.register_alias("mcl_supplemental:red_nether_brick_fence_gate", "mclx_fences:red_nether_brick_fence_gate") minetest.register_alias("mcl_supplemental:red_nether_brick_fence_gate_open", "mclx_fences:red_nether_brick_fence_gate_open") + +minetest.register_alias("mcl_supplemental:crimson_wood_fence", "mclx_fences:crimson_wood_fence") + +minetest.register_alias("mcl_supplemental:crimson_wood_fence_gate", "mclx_fences:crimson_wood_fence_gate") +minetest.register_alias("mcl_supplemental:crimson_wood_fence_gate_open", "mclx_fences:crimson_wood_fence_gate_open") + +minetest.register_alias("mcl_supplemental:warped_wood_fence", "mclx_fences:warped_wood_fence") + +minetest.register_alias("mcl_supplemental:warped_wood_fence_gate", "mclx_fences:warped_wood_fence_gate") +minetest.register_alias("mcl_supplemental:warped_wood_fence_gate_open", "mclx_fences:warped_wood_fence_gate_open") \ No newline at end of file diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr index 9aab02648..a120c1362 100644 --- a/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.de.tr @@ -2,3 +2,7 @@ Red Nether Brick Fence=Roter Netherziegelzaun Red Nether Brick Fence Gate=Rotes Netherziegelzauntor Nether Brick Fence Gate=Netherziegelzauntor +Crimson Hyphae Wood Fence= +Crimson Hyphae Wood Fence Gate= +Warped Hyphae Wood Fence= +Warped Hyphae Wood Fence Gate= \ No newline at end of file diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.es.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.es.tr index 4531435bf..341489630 100644 --- a/mods/ITEMS/mclx_fences/locale/mclx_fences.es.tr +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.es.tr @@ -2,3 +2,7 @@ Red Nether Brick Fence=Valla de ladrillo abisal rojo Red Nether Brick Fence Gate=Puerta de ladrillo abisal rojo Nether Brick Fence Gate=Puerta de ladrillo abisal +Crimson Hyphae Wood Fence= +Crimson Hyphae Wood Fence Gate= +Warped Hyphae Wood Fence= +Warped Hyphae Wood Fence Gate= \ No newline at end of file diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr index 244b588c1..ace92a6a7 100644 --- a/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.fr.tr @@ -1,4 +1,8 @@ # textdomain: mclx_fences Red Nether Brick Fence=Barrière en Brique Rouge du Nether -Red Nether Brick Fence Gate=Porte de Barrière en Brique Rouge du Nether -Nether Brick Fence Gate=Porte de Barrière en Brique du Nether +Red Nether Brick Fence Gate=Portillon en Brique Rouge du Nether +Nether Brick Fence Gate=Portillon en Brique du Nether +Crimson Hyphae Wood Fence=Barrière Ecarlate +Crimson Hyphae Wood Fence Gate=Portillon Ecarlate +Warped Hyphae Wood Fence=Barrière Tordue +Warped Hyphae Wood Fence Gate=Portillon Tordu diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.pl.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.pl.tr index ecdd84562..456b88050 100644 --- a/mods/ITEMS/mclx_fences/locale/mclx_fences.pl.tr +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.pl.tr @@ -2,3 +2,7 @@ Red Nether Brick Fence=Płot z czerwonej netherowej cegły Red Nether Brick Fence Gate=Furtka z czerwonej netherowej cegły Nether Brick Fence Gate=Furtka z netherowej cegły +Crimson Hyphae Wood Fence= +Crimson Hyphae Wood Fence Gate= +Warped Hyphae Wood Fence= +Warped Hyphae Wood Fence Gate= \ No newline at end of file diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr index 146fb4dd7..c30e90808 100644 --- a/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr @@ -1,4 +1,8 @@ # textdomain: mclx_fences -Red Nether Brick Fence=Забор из красного адского кирпича -Red Nether Brick Fence Gate=Ворота из красного адского кирпича -Nether Brick Fence Gate=Ворота из адского кирпича +Red Nether Brick Fence=Забор из адского красного кирпича +Red Nether Brick Fence Gate=Калитка из адского красного кирпича +Nether Brick Fence Gate=Калитка из адского кирпича +Crimson Hyphae Wood Fence= +Crimson Hyphae Wood Fence Gate= +Warped Hyphae Wood Fence= +Warped Hyphae Wood Fence Gate= \ No newline at end of file diff --git a/mods/ITEMS/mclx_fences/locale/template.txt b/mods/ITEMS/mclx_fences/locale/template.txt index e6c05c7f7..2de552267 100644 --- a/mods/ITEMS/mclx_fences/locale/template.txt +++ b/mods/ITEMS/mclx_fences/locale/template.txt @@ -2,3 +2,7 @@ Red Nether Brick Fence= Red Nether Brick Fence Gate= Nether Brick Fence Gate= +Crimson Hyphae Wood Fence= +Crimson Hyphae Wood Fence Gate= +Warped Hyphae Wood Fence= +Warped Hyphae Wood Fence Gate= \ No newline at end of file diff --git a/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_crimson.png b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_crimson.png new file mode 100644 index 000000000..39d91225f Binary files /dev/null and b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_crimson.png differ diff --git a/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_crimson.png b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_crimson.png new file mode 100644 index 000000000..81166b1b5 Binary files /dev/null and b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_crimson.png differ diff --git a/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_warped.png b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_warped.png new file mode 100644 index 000000000..30a1dd1fa Binary files /dev/null and b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_gate_warped.png differ diff --git a/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_warped.png b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_warped.png new file mode 100644 index 000000000..12aedf7ef Binary files /dev/null and b/mods/ITEMS/mclx_fences/textures/mcl_fences_fence_warped.png differ diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr index 98becd492..f8f86b1a1 100644 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr @@ -1,21 +1,21 @@ # textdomain: mclx_stairs Oak Bark Stairs=Escalier en écorse de Chêne -Oak Bark Slab=Plaque d'écorce de Chêne +Oak Bark Slab=Dalle d'écorce de Chêne Double Oak Bark Slab=Double Dalle d'écorce de Chêne Acacia Bark Stairs=Escalier en écorce d'Acacia -Acacia Bark Slab=Plaque d'écorce d'Acacia +Acacia Bark Slab=Dalle d'écorce d'Acacia Double Acacia Bark Slab=Double Dalle d'écorce d'Acacia Spruce Bark Stairs=Escalier en écorse de Sapin -Spruce Bark Slab=Plaque d'écorce de Sapin +Spruce Bark Slab=Dalle d'écorce de Sapin Double Spruce Bark Slab=Double Dalle d'écorce de Sapin Birch Bark Stairs=Escalier en écorse de Bouleau -Birch Bark Slab=Plaque d'écorce de Bouleau +Birch Bark Slab=Dalle d'écorce de Bouleau Double Birch Bark Slab=Double Dalle d'écorce de Bouleau Jungle Bark Stairs=Escalier en écorse d'Acajou -Jungle Bark Slab=Plaque d'écorce d'Acajou +Jungle Bark Slab=Dalle d'écorce d'Acajou Double Jungle Bark Slab=Double Dalle d'écorce d'Acajou Dark Oak Bark Stairs=Escalier en écorse de Chêne Noir -Dark Oak Bark Slab=Plaque d'écorce de Chêne Noir +Dark Oak Bark Slab=Dalle d'écorce de Chêne Noir Double Dark Oak Bark Slab=Double Dalle d'écorce de Chêne Noir Lapis Lazuli Slab=Dalle de Lapis Lazuli Double Lapis Lazuli Slab=Double Dalle de Lapis Lazuli diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr index 7dca54dd1..7f8675603 100644 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr @@ -1,82 +1,82 @@ # textdomain: mclx_stairs -Oak Bark Stairs=Ступеньки из дубовой коры +Oak Bark Stairs=Ступени из дубовой коры Oak Bark Slab=Плита из дубовой коры Double Oak Bark Slab=Двойная плита из дубовой коры -Acacia Bark Stairs=Ступеньки из коры акации +Acacia Bark Stairs=Ступени из коры акации Acacia Bark Slab=Плита из коры акации Double Acacia Bark Slab=Двойная плита из коры акации -Spruce Bark Stairs=Ступеньки из еловой коры +Spruce Bark Stairs=Ступени из еловой коры Spruce Bark Slab=Плита из еловой коры Double Spruce Bark Slab=Двойная плита из еловой коры -Birch Bark Stairs=Ступеньки из берёзовой коры +Birch Bark Stairs=Ступени из берёзовой коры Birch Bark Slab=Плита из берёзовой коры Double Birch Bark Slab=Двойная плита из берёзовой коры -Jungle Bark Stairs=Ступеньки из коры дерева джунглей -Jungle Bark Slab=Плита из коры дерева джунглей -Double Jungle Bark Slab=Двойная плита из коры дерева джунглей -Dark Oak Bark Stairs=Ступеньки из коры тёмного дуба +Jungle Bark Stairs=Ступени из коры тропического дерева +Jungle Bark Slab=Плита из коры тропического дерева +Double Jungle Bark Slab=Двойная плита из коры тропического дерева +Dark Oak Bark Stairs=Ступени из коры тёмного дуба Dark Oak Bark Slab=Плита из коры тёмного дуба Double Dark Oak Bark Slab=Двойная плита из коры тёмного дуба -Lapis Lazuli Slab=Ляпис-лазурная плита -Double Lapis Lazuli Slab=Двойная ляпис-лазурная плита -Lapis Lazuli Stairs=Ляпис-лазурные ступеньки +Lapis Lazuli Slab=Лазуритовая плита +Double Lapis Lazuli Slab=Двойная лазуритовая плита +Lapis Lazuli Stairs=Лазуритовые ступени Slab of Gold=Золотая плита Double Slab of Gold=Двойная золотая плита -Stairs of Gold=Золотые ступеньки +Stairs of Gold=Золотые ступени Slab of Iron=Железная плита Double Slab of Iron=Двойная железная плита -Stairs of Iron=Железные ступеньки -Cracked Stone Brick Stairs=Ступеньки из треснутого камня -Cracked Stone Brick Slab=Плита из треснутого камня -Double Cracked Stone Brick Slab=Двойная плита из треснутого камня -White Concrete Stairs=Белые бетонные ступеньки +Stairs of Iron=Железные ступени +Cracked Stone Brick Stairs=Ступени из потрескавшихся каменных кирпичей +Cracked Stone Brick Slab=Плита из потрескавшихся каменных кирпичей +Double Cracked Stone Brick Slab=Двойная плита из потрескавшихся каменных кирпичей +White Concrete Stairs=Белые бетонные ступени White Concrete Slab=Белая бетонная панель Double White Concrete Slab=Белая двойная бетонная панель -Grey Concrete Stairs=Серые бетонные ступеньки +Grey Concrete Stairs=Серые бетонные ступени Grey Concrete Slab=Серая бетонная панель Double Grey Concrete Slab=Серая двойная бетонная панель -Light Grey Concrete Stairs=Светло-серые бетонные ступеньки +Light Grey Concrete Stairs=Светло-серые бетонные ступени Light Grey Concrete Slab=Светло-серая бетонная панель Double Light Grey Concrete Slab=Светло-серая двойная бетонная панель -Black Concrete Stairs=Чёрные бетонные ступеньки +Black Concrete Stairs=Чёрные бетонные ступени Black Concrete Slab=Чёрная бетонная панель Double Black Concrete Slab=Черная двойная бетонная панель -Red Concrete Stairs=Красные бетонные ступеньки +Red Concrete Stairs=Красные бетонные ступени Red Concrete Slab=Красная бетонная панель Double Red Concrete Slab=Красная двойная бетонная панель -Yellow Concrete Stairs=Жёлтые бетонные ступеньки +Yellow Concrete Stairs=Жёлтые бетонные ступени Yellow Concrete Slab=Жёлтая бетонная панель Double Yellow Concrete Slab=Жёлтая двойная бетонная панель -Green Concrete Stairs=Зелёные бетонные ступеньки +Green Concrete Stairs=Зелёные бетонные ступени Green Concrete Slab=Зелёная бетонная панель Double Green Concrete Slab=Зелёная двойная бетонная панель -Cyan Concrete Stairs=Голубые бетонные ступеньки -Cyan Concrete Slab=Голубая бетонная панель -Double Cyan Concrete Slab=Голубая двойная бетонная панель -Blue Concrete Stairs=Синие бетонные ступеньки +Cyan Concrete Stairs=Бирюзовые бетонные ступени +Cyan Concrete Slab=Бирюзовая бетонная панель +Double Cyan Concrete Slab=Бирюзовая двойная бетонная панель +Blue Concrete Stairs=Синие бетонные ступени Blue Concrete Slab=Синяя бетонная панель Double Blue Concrete Slab=Синяя двойная бетонная панель -Magenta Concrete Stairs=Фиолетовые бетонные ступеньки -Magenta Concrete Slab=Фиолетовая бетонная панель -Double Magenta Concrete Slab=Фиолетовая двойная бетонная панель -Orange Concrete Stairs=Оранжевые бетонные ступеньки +Magenta Concrete Stairs=Сиреневые бетонные ступени +Magenta Concrete Slab=Сиреневая бетонная панель +Double Magenta Concrete Slab=Сиреневая двойная бетонная панель +Orange Concrete Stairs=Оранжевые бетонные ступени Orange Concrete Slab=Оранжевая бетонная панель Double Orange Concrete Slab=Оранжевая двойная бетонная панель -Purple Concrete Stairs=Пурпурные бетонные ступеньки -Purple Concrete Slab=Пурпурная бетонная панель -Double Purple Concrete Slab=Пурпурная двойная бетонная панель -Brown Concrete Stairs=Коричневые бетонные ступеньки +Purple Concrete Stairs=Фиолетовые бетонные ступени +Purple Concrete Slab=Фиолетовая бетонная панель +Double Purple Concrete Slab=Фиолетовая двойная бетонная панель +Brown Concrete Stairs=Коричневые бетонные ступени Brown Concrete Slab=Коричневая бетонная панель Double Brown Concrete Slab=Коричневая двойная бетонная панель -Pink Concrete Stairs=Розовые бетонные ступеньки +Pink Concrete Stairs=Розовые бетонные ступени Pink Concrete Slab=Розовая бетонная панель Double Pink Concrete Slab=Розовая двойная бетонная панель -Lime Concrete Stairs=Зелёные лаймовые бетонные ступеньки -Lime Concrete Slab=Зелёная лаймовая бетонная панель -Double Lime Concrete Slab=Зелёная лаймовая двойная бетонная панель -Light Blue Concrete Stairs=Светло-голубые бетонные ступеньки -Light Blue Concrete Slab=Светло-голубая бетонная панель -Double Light Blue Concrete Slab=Светло-голубая двойная бетонная панель +Lime Concrete Stairs=Лаймовые бетонные ступени +Lime Concrete Slab=Лаймовая бетонная панель +Double Lime Concrete Slab=Лаймовая двойная бетонная панель +Light Blue Concrete Stairs=Голубые бетонные ступени +Light Blue Concrete Slab=Голубая бетонная панель +Double Light Blue Concrete Slab=Голубая двойная бетонная панель Concrete Slab=Бетонная панель Double Concrete Slab=Двойная бетонная панель -Concrete Stairs=Бетонные ступеньки +Concrete Stairs=Бетонные ступени diff --git a/mods/ITEMS/xpanes/locale/xpanes.fr.tr b/mods/ITEMS/xpanes/locale/xpanes.fr.tr index 6b2fe43f3..7cb4aa867 100644 --- a/mods/ITEMS/xpanes/locale/xpanes.fr.tr +++ b/mods/ITEMS/xpanes/locale/xpanes.fr.tr @@ -1,8 +1,8 @@ # textdomain: xpanes -Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Les vitres sont de fines couches de verre qui se connectent parfaitement à leurs voisins lorsque vous les construisez. -Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Les vitres teintées sont de fines couches de verre teinté qui se connectent parfaitement à leurs voisins lorsque vous les construisez. Ils viennent dans de nombreuses couleurs différentes. +Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Les vitres sont de fines couches de verre qui se connectent parfaitement à leurs voisines lorsque vous les construisez. +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Les vitres teintées sont de fines couches de verre teinté qui se connectent parfaitement à leurs voisines lorsque vous les construisez. Elles viennent dans de nombreuses couleurs différentes. Iron Bars=Barres de fer -Iron bars neatly connect to their neighbors as you build them.=Les barres de fer se connectent parfaitement à leurs voisins lorsque vous les construisez. +Iron bars neatly connect to their neighbors as you build them.=Les barres de fer se connectent parfaitement à leurs voisines lorsque vous les construisez. Glass Pane=Vitre Stained Glass Pane=Vitre Teintée Red Stained Glass Pane=Vitre Teintée Rouge diff --git a/mods/ITEMS/xpanes/locale/xpanes.ru.tr b/mods/ITEMS/xpanes/locale/xpanes.ru.tr index 47702516d..a127cc32a 100644 --- a/mods/ITEMS/xpanes/locale/xpanes.ru.tr +++ b/mods/ITEMS/xpanes/locale/xpanes.ru.tr @@ -1,23 +1,23 @@ # textdomain: xpanes Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Стеклянные панели это тонкие стёкла, которые аккуратно присоединяются к соседним блокам, когда вы устанавливаете их. -Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Витражи это тонкие стёкла, которые аккуратно присоединяются к соседним блокам, когда вы устанавливаете их. Они могут быть разных цветов. -Iron Bars=Железные слитки -Iron bars neatly connect to their neighbors as you build them.=Железные слитки аккуратно присоединяются к соседним блокам, когда вы устанавливаете их. +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Окрашенная стеклянная панель это тонкое стёкло, которое аккуратно присоединяется к соседним блокам, когда вы устанавливаете его. Может быть разных цветов. +Iron Bars=Железная решётка +Iron bars neatly connect to their neighbors as you build them.=Железная решётка аккуратно присоединяется к соседним блокам, когда вы устанавливаете её. Glass Pane=Стеклянная панель -Stained Glass Pane=Витраж -Red Stained Glass Pane=Красный витраж -Green Stained Glass Pane=Зелёный витраж -Blue Stained Glass Pane=Синий витраж -Light Blue Stained Glass Pane=Светло-голубой витраж -Black Stained Glass Pane=Чёрный витраж -White Stained Glass Pane=Белый витраж -Yellow Stained Glass Pane=Жёлтый витраж -Brown Stained Glass Pane=Коричневый витраж -Orange Stained Glass Pane=Оранжевый витраж -Pink Stained Glass Pane=Розовый витраж -Grey Stained Glass Pane=Серый витраж -Lime Stained Glass Pane=Зелёный лаймовый витраж -Light Grey Stained Glass Pane=Светло-серый витраж -Magenta Stained Glass Pane=Фиолетовый витраж -Purple Stained Glass Pane=Пурпурный витраж -Cyan Stained Glass Pane=Голубой витраж +Stained Glass Pane=Цветное стекло +Red Stained Glass Pane=Красная окрашенная стеклянная панель +Green Stained Glass Pane=Зелёная окрашенная стеклянная панель +Blue Stained Glass Pane=Синяя окрашенная стеклянная панель +Light Blue Stained Glass Pane=Голубая окрашенная стеклянная панель +Black Stained Glass Pane=Чёрная окрашенная стеклянная панель +White Stained Glass Pane=Белая окрашенная стеклянная панель +Yellow Stained Glass Pane=Жёлтая окрашенная стеклянная панель +Brown Stained Glass Pane=Коричневая окрашенная стеклянная панель +Orange Stained Glass Pane=Оранжевая окрашенная стеклянная панель +Pink Stained Glass Pane=Розовая окрашенная стеклянная панель +Grey Stained Glass Pane=Серая окрашенная стеклянная панель +Lime Stained Glass Pane=Лаймовая окрашенная стеклянная панель +Light Grey Stained Glass Pane=Светло-серая окрашенная стеклянная панель +Magenta Stained Glass Pane=Сиреневая окрашенная стеклянная панель +Purple Stained Glass Pane=Фиолетовая окрашенная стеклянная панель +Cyan Stained Glass Pane=Бирюзовая окрашенная стеклянная панель \ No newline at end of file diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index d2a65ec33..56a3cfe11 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,8 +1,7 @@ -local mg_name = minetest.get_mapgen_setting("mg_name") -local mg_seed = minetest.get_mapgen_setting("seed") +local mg_seed = mcl_mapgen.seed -- Some mapgen settings -local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" +local superflat = mcl_mapgen.superflat local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_logs", false) @@ -36,8 +35,8 @@ local function register_classic_superflat_biome() node_filler = "mcl_core:dirt", depth_filler = 3, node_stone = "mcl_core:dirt", - y_min = mcl_vars.mg_overworld_min - 512, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min - 512, + y_max = mcl_mapgen.overworld.max, humidity_point = 50, heat_point = 50, _mcl_biome_type = "medium", @@ -140,7 +139,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 24, heat_point = -5, _mcl_biome_type = "snowy", @@ -174,7 +173,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 3, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 58, heat_point = 8, _mcl_biome_type = "snowy", @@ -245,7 +244,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 76, heat_point = 10, _mcl_biome_type = "cold", @@ -277,7 +276,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 100, heat_point = 8, _mcl_biome_type = "cold", @@ -310,7 +309,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 4, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 10, heat_point = 45, _mcl_biome_type = "cold", @@ -360,7 +359,7 @@ local function register_biomes() node_riverbed = "mcl_core:gravel", depth_riverbed = 3, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 0, heat_point = 25, _mcl_biome_type = "cold", @@ -413,7 +412,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 4, y_min = 42, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 24, heat_point = 25, _mcl_biome_type = "cold", @@ -443,7 +442,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 1, y_min = -7, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 0, heat_point = 8, _mcl_biome_type = "cold", @@ -479,7 +478,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 24, heat_point = 8, _mcl_biome_type = "snowy", @@ -511,7 +510,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 3, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 39, heat_point = 58, _mcl_biome_type = "medium", @@ -558,7 +557,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 28, heat_point = 45, _mcl_biome_type = "medium", @@ -590,7 +589,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 58, heat_point = 22, _mcl_biome_type = "cold", @@ -637,7 +636,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 61, heat_point = 45, _mcl_biome_type = "medium", @@ -684,7 +683,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 3, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 44, heat_point = 32, _mcl_biome_type = "medium", @@ -731,7 +730,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 78, heat_point = 31, _mcl_biome_type = "medium", @@ -763,7 +762,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 77, heat_point = 27, _mcl_biome_type = "medium", @@ -796,7 +795,7 @@ local function register_biomes() depth_riverbed = 2, node_stone = "mcl_core:sandstone", y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 26, heat_point = 94, _mcl_biome_type = "hot", @@ -828,7 +827,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 94, heat_point = 27, _mcl_biome_type = "medium", @@ -861,7 +860,7 @@ local function register_biomes() depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay", y_min = 11, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 0, heat_point = 100, _mcl_biome_type = "hot", @@ -911,7 +910,7 @@ local function register_biomes() depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay", y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = -5, heat_point = 100, _mcl_biome_type = "hot", @@ -983,7 +982,7 @@ local function register_biomes() depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay", y_min = 30, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 0, heat_point = 60, _mcl_biome_type = "hot", @@ -1053,7 +1052,7 @@ local function register_biomes() depth_riverbed = 1, node_stone = "mcl_colorblocks:hardened_clay", y_min = 30, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = -5, heat_point = 60, _mcl_biome_type = "hot", @@ -1105,7 +1104,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 36, heat_point = 79, _mcl_biome_type = "hot", @@ -1154,7 +1153,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 48, heat_point = 100, _mcl_biome_type = "hot", @@ -1186,7 +1185,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 88, heat_point = 81, _mcl_biome_type = "medium", @@ -1235,7 +1234,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 92, heat_point = 81, _mcl_biome_type = "medium", @@ -1283,7 +1282,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 88, heat_point = 76, _mcl_biome_type = "medium", @@ -1318,7 +1317,7 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, humidity_point = 90, heat_point = 79, _mcl_biome_type = "medium", @@ -1468,7 +1467,7 @@ local function register_biomes() name = biome .. "_underground", heat_point = minetest.registered_biomes[biome].heat_point, humidity_point = minetest.registered_biomes[biome].humidity_point, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = DEEP_OCEAN_MIN - 1, _mcl_biome_type = minetest.registered_biomes[biome]._mcl_biome_type, _mcl_palette_index = minetest.registered_biomes[biome]._mcl_palette_index, @@ -1489,10 +1488,10 @@ local function register_dimension_biomes() node_water = "air", node_river_water = "air", node_cave_liquid = "air", - y_min = mcl_vars.mg_nether_min, + y_min = mcl_mapgen.nether.min, -- FIXME: For some reason the Nether stops generating early if this constant is not added. -- Figure out why. - y_max = mcl_vars.mg_nether_max + 80, + y_max = mcl_mapgen.nether.max + 80, heat_point = 100, humidity_point = 0, _mcl_biome_type = "hot", @@ -1509,8 +1508,8 @@ local function register_dimension_biomes() node_cave_liquid = "air", -- FIXME: For some reason the End stops generating early if this constant is not added. -- Figure out why. - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max + 80, + y_min = mcl_mapgen.end_.min, + y_max = mcl_mapgen.end_.max + 80, heat_point = 50, humidity_point = 50, _mcl_biome_type = "medium", @@ -1543,7 +1542,7 @@ local function register_biome_ores() -- Rarely replace stone with stone monster eggs. -- In v6 this can happen anywhere, in other mapgens only in Extreme Hills. local monster_egg_scarcity - if mg_name == "v6" then + if mcl_mapgen.v6 then monster_egg_scarcity = 28 * 28 * 28 else monster_egg_scarcity = 26 * 26 * 26 @@ -1555,7 +1554,7 @@ local function register_biome_ores() clust_scarcity = monster_egg_scarcity, clust_num_ores = 3, clust_size = 2, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(61), biomes = { "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", @@ -1565,7 +1564,7 @@ local function register_biome_ores() }) -- Bonus gold spawn in Mesa - if mg_name ~= "v6" then + if not mcl_mapgen.v6 then minetest.register_ore({ ore_type = "scatter", ore = "mcl_core:stone_with_gold", @@ -1594,8 +1593,8 @@ local function register_biomelike_ores() clust_scarcity = 1, clust_num_ores = 12, clust_size = 10, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_threshold = 0.2, noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}, biomes = { "MegaTaiga" }, @@ -1607,8 +1606,8 @@ local function register_biomelike_ores() wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, column_height_max = 1, column_midpoint_factor = 0.0, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_threshold = 0.0, noise_params = {offset=0, scale=15, spread={x=250, y=250, z=250}, seed=24, octaves=3, persist=0.70}, biomes = { "MesaPlateauF_grasstop" }, @@ -1620,8 +1619,8 @@ local function register_biomelike_ores() clust_scarcity = 1500, clust_num_ores = 25, clust_size = 7, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -1640,8 +1639,8 @@ local function register_biomelike_ores() wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, column_height_max = 1, column_midpoint_factor = 0.0, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_threshold = -2.5, noise_params = {offset=1, scale=15, spread={x=250, y=250, z=250}, seed=24, octaves=3, persist=0.80}, biomes = { "MesaPlateauFM_grasstop" }, @@ -1653,8 +1652,8 @@ local function register_biomelike_ores() clust_scarcity = 1800, clust_num_ores = 65, clust_size = 15, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -1674,8 +1673,8 @@ local function register_biomelike_ores() wherein = {"group:hardened_clay", "group:sand","mcl_core:coarse_dirt"}, clust_scarcity = 4000, clust_size = 5, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -1694,8 +1693,8 @@ local function register_biomelike_ores() wherein = {"mcl_colorblocks:hardened_clay_orange"}, clust_scarcity = 300, clust_size = 8, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -1716,8 +1715,8 @@ local function register_biomelike_ores() clust_scarcity = 1, clust_num_ores = 12, clust_size = 10, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_threshold = 0.1, noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=95, octaves=3, persist=0.70}, biomes = { "MesaPlateauFM" }, @@ -1728,8 +1727,8 @@ local function register_biomelike_ores() wherein = {"group:hardened_clay"}, clust_scarcity = 1500, clust_size = 4, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -1752,8 +1751,8 @@ local function register_biomelike_ores() clust_scarcity = 5000, clust_num_ores = 12, clust_size = 4, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_threshold = 0.2, noise_params = {offset=0, scale=5, spread={x=250, y=250, z=250}, seed=64, octaves=3, persist=0.60}, biomes = { "ExtremeHillsM" }, @@ -1951,7 +1950,7 @@ local function register_dimension_ores() wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 13 * 13 * 13, clust_size = 5, - y_min = mcl_vars.mg_nether_min, + y_min = mcl_mapgen.nether.min, y_max = mcl_worlds.layer_to_y(64, "nether"), noise_threshold = 0.0, noise_params = { @@ -2013,8 +2012,8 @@ local function register_dimension_ores() wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 26 * 26 * 26, clust_size = 5, - y_min = mcl_vars.mg_lava_nether_max + 10, - y_max = mcl_vars.mg_nether_max, + y_min = mcl_mapgen.nether.lava_max + 10, + y_max = mcl_mapgen.nether.max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -2057,8 +2056,8 @@ local function register_dimension_ores() clust_scarcity = 850, clust_num_ores = 4, -- MC cluster amount: 4-10 clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, + y_min = mcl_mapgen.nether.min, + y_max = mcl_mapgen.nether.max, }) minetest.register_ore({ ore_type = "scatter", @@ -2067,8 +2066,8 @@ local function register_dimension_ores() clust_scarcity = 1650, clust_num_ores = 8, -- MC cluster amount: 4-10 clust_size = 4, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, + y_min = mcl_mapgen.nether.min, + y_max = mcl_mapgen.nether.max, }) end @@ -2094,8 +2093,8 @@ local function register_dimension_ores() clust_scarcity = 500, clust_num_ores = 1, clust_size = 1, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_lava_nether_max + 1, + y_min = mcl_mapgen.nether.min, + y_max = mcl_mapgen.nether.lava_max + 1, }) minetest.register_ore({ @@ -2105,8 +2104,8 @@ local function register_dimension_ores() clust_scarcity = 1000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 2, - y_max = mcl_vars.mg_lava_nether_max + 12, + y_min = mcl_mapgen.nether.lava_max + 2, + y_max = mcl_mapgen.nether.lava_max + 12, }) minetest.register_ore({ @@ -2116,8 +2115,8 @@ local function register_dimension_ores() clust_scarcity = 2000, clust_num_ores = 1, clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 13, - y_max = mcl_vars.mg_lava_nether_max + 48, + y_min = mcl_mapgen.nether.lava_max + 13, + y_max = mcl_mapgen.nether.lava_max + 48, }) minetest.register_ore({ ore_type = "scatter", @@ -2126,8 +2125,8 @@ local function register_dimension_ores() clust_scarcity = 3500, clust_num_ores = 1, clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 49, - y_max = mcl_vars.mg_nether_max, + y_min = mcl_mapgen.nether.lava_max + 49, + y_max = mcl_mapgen.nether.max, }) --[[ THE END ]] @@ -2137,7 +2136,7 @@ local function register_dimension_ores() -- FIXME: Broken lighting in v6 mapgen local end_wherein - if mg_name == "v6" then + if mcl_mapgen.v6 then end_wherein = {"air", "mcl_core:stone"} else end_wherein = {"air"} @@ -2147,11 +2146,11 @@ local function register_dimension_ores() ore_type = "stratum", ore = "mcl_end:end_stone", wherein = end_wherein, - y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, + y_min = mcl_mapgen.end_.min+64, + y_max = mcl_mapgen.end_.min+80, noise_params = { - offset = mcl_vars.mg_end_min+70, + offset = mcl_mapgen.end_.min+70, scale = -1, spread = {x=126, y=126, z=126}, seed = mg_seed+9999, @@ -2174,11 +2173,11 @@ local function register_dimension_ores() ore_type = "stratum", ore = "mcl_end:end_stone", wherein = end_wherein, - y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, + y_min = mcl_mapgen.end_.min+64, + y_max = mcl_mapgen.end_.min+80, noise_params = { - offset = mcl_vars.mg_end_min+72, + offset = mcl_mapgen.end_.min+72, scale = -3, spread = {x=84, y=84, z=84}, seed = mg_seed+999, @@ -2200,11 +2199,11 @@ local function register_dimension_ores() ore_type = "stratum", ore = "mcl_end:end_stone", wherein = end_wherein, - y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, + y_min = mcl_mapgen.end_.min+64, + y_max = mcl_mapgen.end_.min+80, noise_params = { - offset = mcl_vars.mg_end_min+70, + offset = mcl_mapgen.end_.min+70, scale = -2, spread = {x=84, y=84, z=84}, seed = mg_seed+99, @@ -2257,7 +2256,7 @@ local function register_grass_decoration(grasstype, offset, scale, biomes) noise_params = noise, biomes = { biomes[b] }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = node, param2 = param2, }) @@ -2324,7 +2323,7 @@ local function register_decorations() }, biomes = {"IcePlainsSpikes"}, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_structures.."/schematics/mcl_structures_ice_spike_large.mts", rotation = "random", flags = "place_center_x, place_center_z", @@ -2345,7 +2344,7 @@ local function register_decorations() }, biomes = {"IcePlainsSpikes"}, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_structures.."/schematics/mcl_structures_ice_spike_small.mts", rotation = "random", flags = "place_center_x, place_center_z", @@ -2368,7 +2367,7 @@ local function register_decorations() }, biomes = {"Forest"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_large_"..i..".mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2388,7 +2387,7 @@ local function register_decorations() }, biomes = {"ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_large_"..i..".mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2409,7 +2408,7 @@ local function register_decorations() }, biomes = {"Forest"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2428,7 +2427,7 @@ local function register_decorations() }, biomes = {"FlowerForest"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2447,7 +2446,7 @@ local function register_decorations() }, biomes = {"ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2467,7 +2466,7 @@ local function register_decorations() }, biomes = {"ExtremeHills+", "ExtremeHills+_snowtop"}, y_min = 50, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2486,7 +2485,7 @@ local function register_decorations() }, biomes = {"MesaPlateauF_grasstop"}, y_min = 30, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2505,7 +2504,7 @@ local function register_decorations() }, biomes = {"MesaPlateauFM_grasstop"}, y_min = 30, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2525,7 +2524,7 @@ local function register_decorations() }, biomes = {"IcePlains"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2537,7 +2536,7 @@ local function register_decorations() fill_ratio = 0.004, biomes = {"Jungle", "JungleM"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2549,7 +2548,7 @@ local function register_decorations() fill_ratio = 0.0004, biomes = {"JungleEdge", "JungleEdgeM", "Savanna"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2571,7 +2570,7 @@ local function register_decorations() }, biomes = {"Forest"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_balloon.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2592,7 +2591,7 @@ local function register_decorations() }, biomes = {"Swampland", "Swampland_shore"}, y_min = 0, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_oak_swamp.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2609,7 +2608,7 @@ local function register_decorations() fill_ratio = 0.00125, biomes = {"Jungle"}, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree_huge_"..i..".mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2621,7 +2620,7 @@ local function register_decorations() fill_ratio = 0.004, biomes = {"JungleM"}, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree_huge_"..i..".mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2636,7 +2635,7 @@ local function register_decorations() fill_ratio = 0.045, biomes = {"Jungle"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2648,7 +2647,7 @@ local function register_decorations() fill_ratio = 0.0045, biomes = {"JungleEdge", "JungleEdgeM"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2661,7 +2660,7 @@ local function register_decorations() fill_ratio = 0.09, biomes = {"JungleM"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2686,7 +2685,7 @@ local function register_decorations() }, biomes = biomes, y_min = y, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/"..sprucename, flags = "place_center_x, place_center_z", }) @@ -2740,7 +2739,7 @@ local function register_decorations() }, biomes = {"Taiga", "ColdTaiga"}, y_min = 2, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_spruce_lollipop.mts", flags = "place_center_x, place_center_z", }) @@ -2760,7 +2759,7 @@ local function register_decorations() }, biomes = {"Taiga", "ColdTaiga"}, y_min = 3, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_spruce_matchstick.mts", flags = "place_center_x, place_center_z", }) @@ -2780,7 +2779,7 @@ local function register_decorations() }, biomes = {"IcePlains"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_spruce_5.mts", flags = "place_center_x, place_center_z", }) @@ -2794,7 +2793,7 @@ local function register_decorations() fill_ratio = 0.0002, biomes = {"Savanna", "SavannaM"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_acacia_"..a..".mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2816,7 +2815,7 @@ local function register_decorations() }, biomes = {"BirchForest"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_birch.mts", flags = "place_center_x, place_center_z", }) @@ -2834,7 +2833,7 @@ local function register_decorations() }, biomes = {"BirchForestM"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_birch_tall.mts", flags = "place_center_x, place_center_z", }) @@ -2853,7 +2852,7 @@ local function register_decorations() }, biomes = {"Forest", "FlowerForest"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_birch.mts", flags = "place_center_x, place_center_z", }) @@ -2873,7 +2872,7 @@ local function register_decorations() }, biomes = {"RoofedForest"}, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_core.."/schematics/mcl_core_dark_oak.mts", flags = "place_center_x, place_center_z", rotation = "random", @@ -2895,7 +2894,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_huge, biomes = { "RoofedForest" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_brown.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -2907,7 +2906,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_giant, biomes = { "RoofedForest" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_brown.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -2920,7 +2919,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_mycelium_huge, biomes = { "MushroomIsland", "MushroomIslandShore" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_brown.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -2932,7 +2931,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_mycelium_giant, biomes = { "MushroomIsland", "MushroomIslandShore" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_brown.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -2946,7 +2945,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_huge, biomes = { "RoofedForest" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_red.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -2958,7 +2957,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_giant, biomes = { "RoofedForest" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_red.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -2971,7 +2970,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_mycelium_huge, biomes = { "MushroomIsland", "MushroomIslandShore" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_red.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -2983,7 +2982,7 @@ local function register_decorations() fill_ratio = ratio_mushroom_mycelium_giant, biomes = { "MushroomIsland", "MushroomIslandShore" }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_red.mts", flags = "place_center_x, place_center_z", rotation = "0", @@ -3004,7 +3003,7 @@ local function register_decorations() }, biomes = {"MegaTaiga", "MegaSpruceTaiga"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_structures.."/schematics/mcl_structures_boulder.mts", flags = "place_center_x, place_center_z", }) @@ -3024,7 +3023,7 @@ local function register_decorations() }, biomes = {"MegaTaiga", "MegaSpruceTaiga"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = mod_mcl_structures.."/schematics/mcl_structures_boulder_small.mts", flags = "place_center_x, place_center_z", }) @@ -3043,7 +3042,7 @@ local function register_decorations() persist = 0.6 }, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_core:cactus", biomes = {"Desert", "Mesa","Mesa_sandlevel", @@ -3067,7 +3066,7 @@ local function register_decorations() persist = 0.7 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_core:reeds", height = 1, height_max = 3, @@ -3088,7 +3087,7 @@ local function register_decorations() }, biomes = {"Swampland", "Swampland_shore"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_core:reeds", height = 1, height_max = 3, @@ -3122,7 +3121,7 @@ local function register_decorations() persist = 0.6, }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = { biomes[b] }, }) end @@ -3157,7 +3156,7 @@ local function register_decorations() persist = 0.66, }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = biomes[b], }) end @@ -3206,7 +3205,7 @@ local function register_decorations() persist = 0.62, }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, flags = "", biomes = b, }) @@ -3234,7 +3233,7 @@ local function register_decorations() }, biomes = {"Jungle"}, y_min = 3, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = jungle_bush_schematic, flags = "place_center_x, place_center_z", }) @@ -3252,7 +3251,7 @@ local function register_decorations() }, biomes = {"JungleM"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = jungle_bush_schematic, flags = "place_center_x, place_center_z", }) @@ -3270,7 +3269,7 @@ local function register_decorations() }, biomes = {"JungleEdge", "JungleEdgeM"}, y_min = 3, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = jungle_bush_schematic, flags = "place_center_x, place_center_z", }) @@ -3293,7 +3292,7 @@ local function register_decorations() }, biomes = {"MegaTaiga", "MegaSpruceTaiga", "Taiga"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = { size = {x = 3, y = 3, z = 1}, data = { @@ -3326,7 +3325,7 @@ local function register_decorations() }, biomes = {"ColdTaiga"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = { size = {x = 3, y = 3, z = 1}, data = { @@ -3359,7 +3358,7 @@ local function register_decorations() }, biomes = {"BirchForest", "BirchForestM",}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = { size = {x = 3, y = 3, z = 1}, data = { @@ -3385,7 +3384,7 @@ local function register_decorations() fill_ratio = 0.005, biomes = {"Jungle", "JungleM"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = { size = {x = 3, y = 3, z = 1}, data = { @@ -3418,7 +3417,7 @@ local function register_decorations() }, biomes = {"Forest"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = { size = {x = 3, y = 3, z = 1}, data = { @@ -3491,7 +3490,7 @@ local function register_decorations() persist = 0.6 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_farming:melon", biomes = { "Jungle" }, }) @@ -3508,7 +3507,7 @@ local function register_decorations() persist = 0.6 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_farming:melon", biomes = { "JungleM" }, }) @@ -3525,7 +3524,7 @@ local function register_decorations() persist = 0.6 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_farming:melon", biomes = { "JungleEdge", "JungleEdgeM" }, }) @@ -3544,7 +3543,7 @@ local function register_decorations() persist = 0.6 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_farming:melon", biomes = { "JungleEdgeM" }, }) @@ -3566,7 +3565,7 @@ local function register_decorations() persist = 0.666 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, }) -- Grasses and ferns @@ -3642,7 +3641,7 @@ local function register_decorations() persist = 0.666 }, flags = "force_placement", - y_min = mcl_vars.mg_lava_overworld_max + 5, + y_min = mcl_mapgen.overworld.lava_max + 5, y_max = -20, }) @@ -3661,7 +3660,7 @@ local function register_decorations() }, biomes = {"IcePlains"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = { size = { x=1, y=2, z=1 }, data = { @@ -3684,7 +3683,7 @@ local function register_decorations() }, biomes = {"ExtremeHills+_snowtop"}, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, schematic = { size = { x=1, y=2, z=1 }, data = { @@ -3709,7 +3708,7 @@ local function register_decorations() persist = 0.6 }, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = {"Desert", "Mesa", "Mesa_sandlevel", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_grasstop","MesaBryce","Taiga", "MegaTaiga"}, decoration = "mcl_core:deadbush", height = 1, @@ -3727,7 +3726,7 @@ local function register_decorations() persist = 0.6 }, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = {"MesaPlateauFM_grasstop"}, decoration = "mcl_core:deadbush", height = 1, @@ -3745,7 +3744,7 @@ local function register_decorations() persist = 0.6 }, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = {"MesaPlateauFM","MesaPlateauFM_sandlevel"}, decoration = "mcl_core:deadbush", height = 1, @@ -3763,7 +3762,7 @@ local function register_decorations() persist = 0.6 }, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = {"MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_grasstop"}, decoration = "mcl_core:deadbush", height = 1, @@ -3777,8 +3776,8 @@ local function register_decorations() fill_ratio = 0.009, biomes = {"MushroomIsland", "MushroomIslandShore"}, noise_threshold = 2.0, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_mushrooms:mushroom_red", }) minetest.register_decoration({ @@ -3787,8 +3786,8 @@ local function register_decorations() sidelen = 80, fill_ratio = 0.009, biomes = {"MushroomIsland", "MushroomIslandShore"}, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_mushrooms:mushroom_brown", }) @@ -3799,8 +3798,8 @@ local function register_decorations() sidelen = 80, fill_ratio = 0.003, biomes = {"Taiga", "MegaTaiga", "MegaSpruceTaiga"}, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_mushrooms:mushroom_red", }) minetest.register_decoration({ @@ -3809,8 +3808,8 @@ local function register_decorations() sidelen = 80, fill_ratio = 0.003, biomes = {"Taiga", "MegaTaiga", "MegaSpruceTaiga"}, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_mushrooms:mushroom_brown", }) @@ -3833,7 +3832,7 @@ local function register_decorations() persist = 0.66, }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = mushrooms[m], spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree" }, num_spawn_by = 1, @@ -3853,7 +3852,7 @@ local function register_decorations() persist = 0.6, }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = mushrooms[m], biomes = { "Swampland"}, spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree" }, @@ -3878,7 +3877,7 @@ local function register_decorations() persist = 0.6 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = biomes, decoration = "mcl_flowers:"..name, }) @@ -3897,7 +3896,7 @@ local function register_decorations() persist = 0.6, }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, biomes = {"FlowerForest"}, decoration = "mcl_flowers:"..name, }) @@ -3944,8 +3943,8 @@ local function register_dimension_decorations() octaves = 3, persist = 0.6 }, - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max, + y_min = mcl_mapgen.end_.min, + y_max = mcl_mapgen.end_.max, decoration = "mcl_end:chorus_flower", height = 1, biomes = { "End" }, @@ -3962,14 +3961,15 @@ end -- -- Detect mapgen to select functions -- -if mg_name ~= "singlenode" then + +if not mcl_mapgen.singlenode then if not superflat then - if mg_name ~= "v6" then + if not mcl_mapgen.v6 then register_biomes() register_biomelike_ores() end register_biome_ores() - if mg_name ~= "v6" then + if not mcl_mapgen.v6 then register_decorations() end else @@ -3990,21 +3990,16 @@ if mg_name ~= "singlenode" then -- Overworld decorations for v6 are handled in mcl_mapgen_core if deco_id_chorus_plant then - mcl_mapgen_core.register_generator("chorus_grow", nil, function(minp, maxp, blockseed) - local gennotify = minetest.get_mapgen_object("gennotify") - --local poslist = {} - local pr = PseudoRandom(blockseed + 14) - for _, pos in ipairs(gennotify["decoration#"..deco_id_chorus_plant] or {}) do - local x, y, z = pos.x, pos.y, pos.z - if x < -2 or x > 2 or z < -2 or z > 2 then - local realpos = { x = x, y = y + 1, z = z } - local node = minetest.get_node(realpos) - if node and node.name == "mcl_end:chorus_flower" then - mcl_end.grow_chorus_plant(realpos, node, pr) - end - end + mcl_mapgen.register_mapgen_block_lvm(function(vm_context) + vm_context.gennotify = vm_context.gennotify or minetest.get_mapgen_object("gennotify") + local gennotify = vm_context.gennotify + for _, pos in pairs(gennotify["decoration#"..deco_id_chorus_plant] or {}) do + local realpos = { x = pos.x, y = pos.y + 1, z = pos.z } + local pr = PseudoRandom(vm_context.blockseed) + minetest.after(1, mcl_end.grow_chorus_plant, realpos, false, pr) end - end) + return vm_context + end, mcl_mapgen.order.CHORUS) end end diff --git a/mods/MAPGEN/mcl_biomes/mod.conf b/mods/MAPGEN/mcl_biomes/mod.conf index 0c6095f3d..d389640a8 100644 --- a/mods/MAPGEN/mcl_biomes/mod.conf +++ b/mods/MAPGEN/mcl_biomes/mod.conf @@ -1,4 +1,4 @@ name = mcl_biomes author = maikerumine description = Adds the various biomes and biome-related things for non-v6 map generators. -depends = mcl_init, mcl_mapgen_core, mcl_core, mcl_worlds, mcl_farming, mcl_flowers, mcl_end, mcl_ocean +depends = mcl_mapgen, mcl_mapgen_core, mcl_core, mcl_worlds, mcl_farming, mcl_flowers, mcl_end, mcl_ocean diff --git a/mods/MAPGEN/mcl_debrisgen/init.lua b/mods/MAPGEN/mcl_debrisgen/init.lua index 4e80c2504..9d177cdbc 100644 --- a/mods/MAPGEN/mcl_debrisgen/init.lua +++ b/mods/MAPGEN/mcl_debrisgen/init.lua @@ -1,44 +1,31 @@ -local c_debris = minetest.get_content_id("mcl_nether:ancient_debris") -local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") -local c_air = minetest.get_content_id("air") +local minetest_find_nodes_in_area = minetest.find_nodes_in_area +local minetest_get_node = minetest.get_node +local minetest_set_node = minetest.set_node +local debris_name = "mcl_nether:ancient_debris" +local netherrack_name = "mcl_nether:netherrack" +local air_name = "air" -local facedir = { - vector.new(0, 0, 1), - vector.new(0, 1, 0), - vector.new(1, 0, 0), - vector.new(0, 0, -1), - vector.new(0, -1, 0), - vector.new(-1, 0, 0), -} +local min, max = mcl_mapgen.nether.min, mcl_mapgen.nether.max -minetest.register_on_generated(function(minp, maxp) - if maxp.y < mcl_vars.mg_nether_min or minp.y > mcl_vars.mg_nether_max then - return - end - - local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - local data = vm:get_data() - local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax}) - - for idx in area:iter(minp.x, math.max(minp.y, mcl_vars.mg_nether_min), minp.z, maxp.x, math.min(maxp.y, mcl_vars.mg_nether_max), maxp.z) do - if data[idx] == c_debris then - local pos = area:position(idx) - local exposed = false - for _, dir in pairs(facedir) do - if data[area:indexp(vector.add(pos, dir))] == c_air then - exposed = true - break - end - end - if exposed then - data[idx] = c_netherrack - end - end - end - - vm:set_data(data) - vm:calc_lighting() - vm:update_liquids() - vm:write_to_map() +mcl_mapgen.register_mapgen_block(function(minp, maxp) + local minp = minp + local minp_y = minp.y + if minp_y > max then return end + local maxp = maxp + local maxp_y = maxp.y + if maxp_y < min then return end + local nodes = minetest_find_nodes_in_area(minp, maxp, debris_name) + if nodes then + for _, pos in pairs(nodes) do + local x, y, z = pos.x, pos.y, pos.z + if minetest_get_node({x = x-1, y = y, z = z}).name == air_name + or minetest_get_node({x = x+1, y = y, z = z}).name == air_name + or minetest_get_node({x = x, y = y-1, z = z}).name == air_name + or minetest_get_node({x = x, y = y+1, z = z}).name == air_name + or minetest_get_node({x = x, y = y, z = z-1}).name == air_name + or minetest_get_node({x = x, y = y, z = z+1}).name == air_name then + minetest_set_node(pos, {name = netherrack_name}) + end + end + end end) - diff --git a/mods/MAPGEN/mcl_debrisgen/mod.conf b/mods/MAPGEN/mcl_debrisgen/mod.conf index cc5455208..9407fedc9 100644 --- a/mods/MAPGEN/mcl_debrisgen/mod.conf +++ b/mods/MAPGEN/mcl_debrisgen/mod.conf @@ -1,4 +1,4 @@ name = mcl_debrisgen author = Fleckenstein description = Make sure ancient debris is not generated exposed to air -depends = mcl_mapgen_core, mcl_nether +depends = mcl_mapgen, mcl_nether diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index 905e26396..c3e406ca1 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -2,21 +2,19 @@ mcl_dungeons = {} -local mg_name = minetest.get_mapgen_setting("mg_name") - -- Are dungeons disabled? -if mcl_vars.mg_dungeons == false or mg_name == "singlenode" then +if mcl_mapgen.dungeons == false or mcl_mapgen.singlenode == true then return end --lua locals --minetest +local minetest_find_nodes_in_area = minetest.find_nodes_in_area local registered_nodes = minetest.registered_nodes local swap_node = minetest.swap_node local set_node = minetest.set_node local dir_to_facedir = minetest.dir_to_facedir local get_meta = minetest.get_meta -local emerge_area = minetest.emerge_area --vector local vector_add = vector.add @@ -32,15 +30,15 @@ local math_max = math.max local math_ceil = math.ceil --custom mcl_vars -local get_node = mcl_vars.get_node +local get_node = mcl_mapgen.get_far_node -local min_y = math_max(mcl_vars.mg_overworld_min, mcl_vars.mg_bedrock_overworld_max) + 1 -local max_y = mcl_vars.mg_overworld_max - 1 +local min_y = math_max(mcl_mapgen.overworld.min, mcl_mapgen.overworld.bedrock_max) + 1 +local max_y = mcl_mapgen.overworld.max - 1 -- Calculate the number of dungeon spawn attempts -- In Minecraft, there 8 dungeon spawn attempts Minecraft chunk (16*256*16 = 65536 blocks). -- Minetest chunks don't have this size, so scale the number accordingly. -local attempts = math_ceil(((mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE) ^ 3) / 8192) -- 63 = 80*80*80/8192 +local attempts = math_ceil((mcl_mapgen.CS_NODES ^ 3) / 8192) -- 63 = 80*80*80/8192 local dungeonsizes = { { x=5, y=4, z=5}, @@ -112,7 +110,7 @@ local loottable = } -- Bonus loot for v6 mapgen: Otherwise unobtainable saplings. -if mg_name == "v6" then +if mcl_mapgen.v6 then table.insert(loottable, { stacks_min = 1, stacks_max = 3, @@ -124,20 +122,28 @@ if mg_name == "v6" then }) end -local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) - if calls_remaining >= 1 then return end +--local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) +-- if calls_remaining >= 1 then return end +-- local p1, _, dim, pr = param.p1, param.p2, param.dim, param.pr +-- local check = not (param.dontcheck or false) +local m1, m2 = 0, 0 +local function spawn_dungeon(p1, p2, dim, pr, dontcheck) - local p1, _, dim, pr = param.p1, param.p2, param.dim, param.pr local x, y, z = p1.x, p1.y, p1.z - local check = not (param.dontcheck or false) + local check = not (dontcheck or false) -- Check floor and ceiling: Must be *completely* solid local y_floor = y local y_ceiling = y + dim.y + 1 - if check then for tx = x+1, x+dim.x do for tz = z+1, z+dim.z do - if not registered_nodes[get_node({x = tx, y = y_floor , z = tz}).name].walkable - or not registered_nodes[get_node({x = tx, y = y_ceiling, z = tz}).name].walkable then return false end - end end end + + if check then + local dim_x, dim_z = dim.x, dim.z + local size = dim_z*dim_x + if #minetest_find_nodes_in_area({x=x+1,y=y_floor,z=z+1}, {x=x+dim_z,y=y_floor,z=z+dim_z}, "group:walkabke") < size + or #minetest_find_nodes_in_area({x=x+1,y=y_floor,z=z+1}, {x=x+dim_z,y=y_floor,z=z+dim_z}, "group:walkabke") < size then + return + end + end -- Check for air openings (2 stacked air at ground level) in wall positions local openings_counter = 0 @@ -404,8 +410,7 @@ local function dungeons_nodes(minp, maxp, blockseed) local z = pr:next(minp.z, maxp.z-dim.z-1) local p1 = {x=x,y=y,z=z} local p2 = {x = x+dim.x+1, y = y+dim.y+1, z = z+dim.z+1} - minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) - emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr}) + spawn_dungeon(p1, p2, dim, pr) end end @@ -413,8 +418,7 @@ function mcl_dungeons.spawn_dungeon(p1, _, pr) if not p1 or not pr or not p1.x or not p1.y or not p1.z then return end local dim = dungeonsizes[pr:next(1, #dungeonsizes)] local p2 = {x = p1.x+dim.x+1, y = p1.y+dim.y+1, z = p1.z+dim.z+1} - minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) - emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr, dontcheck=true}) + spawn_dungeon(p1, p2, dim, pr, true) end -mcl_mapgen_core.register_generator("dungeons", nil, dungeons_nodes, 999999) +mcl_mapgen.register_mapgen(dungeons_nodes, mcl_mapgen.order.DUNGEONS) diff --git a/mods/MAPGEN/mcl_dungeons/mod.conf b/mods/MAPGEN/mcl_dungeons/mod.conf index fe02286fa..e7a7d921c 100644 --- a/mods/MAPGEN/mcl_dungeons/mod.conf +++ b/mods/MAPGEN/mcl_dungeons/mod.conf @@ -1,4 +1,4 @@ name = mcl_dungeons author = Wuzzy description = Generates random dungeons in the world -depends = mcl_init, mcl_core, mcl_chests, mcl_mobs, mcl_mobspawners, mcl_mapgen_core, mobs_mc +depends = mcl_mapgen, mcl_core, mcl_chests, mcl_mobs, mcl_mobspawners, mcl_mapgen_core, mobs_mc diff --git a/mods/MAPGEN/mcl_end_island/init.lua b/mods/MAPGEN/mcl_end_island/init.lua index 730176257..5a0bde2c7 100644 --- a/mods/MAPGEN/mcl_end_island/init.lua +++ b/mods/MAPGEN/mcl_end_island/init.lua @@ -10,25 +10,21 @@ local noisemap = PerlinNoiseMap({ local c_end_stone = minetest.get_content_id("mcl_end:end_stone") local y_offset = -2 -minetest.register_on_generated(function(minp, maxp) +mcl_mapgen.register_on_generated(function(vm_context) + local minp, maxp = vm_context.minp, vm_context.maxp if maxp.y < (-27025 + y_offset) or minp.y > (-27000 + y_offset + 4) or maxp.x < -75 or minp.x > 75 or maxp.z < -75 or minp.z > 75 then return end - - local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - local data = vm:get_data() - local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax}) - + local data = vm_context.data + local area = vm_context.area + local write = false for idx in area:iter(math.max(minp.x, -75), math.max(minp.y, -27025 + y_offset + 4), math.max(minp.z, -75), math.min(maxp.x, 75), math.min(maxp.y, -27000 + y_offset), math.min(maxp.z, 75)) do local pos = area:position(idx) local y = 27025 + pos.y - y_offset if noisemap[pos.x + 75 + 1][y + 1][pos.z + 75 + 1] > (math.abs(1 - y / 25) ^ 2 + math.abs(pos.x / 75) ^ 2 + math.abs(pos.z / 75) ^ 2) then data[idx] = c_end_stone + write = true end end - - vm:set_data(data) - vm:calc_lighting() - vm:update_liquids() - vm:write_to_map() + vm_context.write = vm_context.write or write end) diff --git a/mods/MAPGEN/mcl_mapgen_core/biomes.lua b/mods/MAPGEN/mcl_mapgen_core/biomes.lua new file mode 100644 index 000000000..16a19f160 --- /dev/null +++ b/mods/MAPGEN/mcl_mapgen_core/biomes.lua @@ -0,0 +1,51 @@ +local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass") +local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow") +local c_top_snow = minetest.get_content_id("mcl_core:snow") +local c_snow_block = minetest.get_content_id("mcl_core:snowblock") + +mcl_mapgen.register_on_generated(function(vm_context) + local minp, maxp = vm_context.minp, vm_context.maxp + local min_y, max_y = minp.y, maxp.y + if min_y > mcl_mapgen.overworld.max or max_y < mcl_mapgen.overworld.min then return end + + vm_context.param2_data = vm_context.param2_data or vm:get_param2_data(vm_context.lvm_param2_buffer) + vm_context.biomemap = vm_context.biomemap or minetest.get_mapgen_object("biomemap") + local param2_data = vm_context.param2_data + local biomemap = vm_context.biomemap + local vm, data, area = vm_context.vm, vm_context.data, vm_context.area + + local min_x, min_z = minp.x, minp.z + local chunksize = max_y - min_y + 1 + + ----- Interactive block fixing section ----- + ----- The section to perform basic block overrides of the core mapgen generated world. ----- + + -- Snow and sand fixes. This code implements snow consistency + -- and fixes floating sand and cut plants. + -- A snowy grass block must be below a top snow or snow block at all times. + + -- Set param2 (=color) of grass blocks. + -- Clear snowy grass blocks without snow above to ensure consistency. + local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}) + + for n=1, #nodes do + local pos = nodes[n] + local x, y, z = pos.x, pos.y, pos.z + local p_pos = area:index(x, y, z) + local p_pos_above = area:index(x, y + 1, z) + local biomemap_offset = (z - min_z) * chunksize + x - min_x + 1 + local biome_id = biomemap[biomemap_offset] + local biome_name = minetest.get_biome_name(biome_id) + if biome_name then + local biome = minetest.registered_biomes[biome_name] + if biome and biome._mcl_biome_type then + param2_data[p_pos] = biome._mcl_palette_index + vm_context.write_param2 = true + end + end + if data[p_pos] == c_dirt_with_grass_snow and p_pos_above and data[p_pos_above] ~= c_top_snow and data[p_pos_above] ~= c_snow_block then + data[p_pos] = c_dirt_with_grass + vm_context.write = true + end + end +end, 999999999) diff --git a/mods/MAPGEN/mcl_mapgen_core/clay.lua b/mods/MAPGEN/mcl_mapgen_core/clay.lua new file mode 100644 index 000000000..56e0e023f --- /dev/null +++ b/mods/MAPGEN/mcl_mapgen_core/clay.lua @@ -0,0 +1,63 @@ +local c_water = minetest.get_content_id("mcl_core:water_source") +local c_dirt = minetest.get_content_id("mcl_core:dirt") +local c_clay = minetest.get_content_id("mcl_core:clay") + +local perlin_clay + +local math_max = math.max +local math_min = math.min +local math_floor = math.floor +local math_abs = math.abs +local offset = math_floor(mcl_mapgen.BS / 2) +local minetest_get_item_group = minetest.get_item_group +local minetest_get_name_from_content_id = minetest.get_name_from_content_id + +mcl_mapgen.register_mapgen_block_lvm(function(c) + local minp, maxp, blockseed, voxelmanip_data, voxelmanip_area = c.minp, c.maxp, c.blockseed, c.data, c.area + local max_y = maxp.y + if max_y < -7 then return end + local min_y = minp.y + if min_y > 0 then return end + + c.vm = c.vm or mcl_mapgen.get_voxel_manip(c) + + local pr = PseudoRandom(blockseed) + + perlin_clay = perlin_clay or minetest.get_perlin({ + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }) + + for y = math_max(min_y, -8), math_min(max_y, 0) do + -- Assume X and Z lengths are equal + local x = minp.x + offset + pr:next(-2, 2) + local z = minp.z + offset + pr:next(-2, 2) + if perlin_clay:get_3d({x = x, y = y, z = z}) + pr:next(1, 20) > 19 then + -- Get position and shift it a bit randomly so the clay do not obviously appear in a grid + local water_pos = voxelmanip_area:index(x, y + 1, z) + local water_node = voxelmanip_data[water_pos] + if water_node == c_water or water_node == c_clay then + local surface_pos = voxelmanip_area:index(x, y, z) + local surface_node = voxelmanip_data[surface_pos] + if (surface_node == c_dirt or surface_node == c_clay or minetest_get_item_group(minetest_get_name_from_content_id(surface_node), "sand") == 1) then + local diamondsize = pr:next(1, 3) + for x1 = -diamondsize, diamondsize do + local abs_x1 = math_abs(x1) + for z1 = -(diamondsize - abs_x1), diamondsize - abs_x1 do + local ccpos = voxelmanip_area:index(x + x1, y, z + z1) + local claycandidate = voxelmanip_data[ccpos] + if voxelmanip_data[ccpos] == c_dirt or minetest_get_item_group(minetest_get_name_from_content_id(claycandidate), "sand") == 1 then + voxelmanip_data[ccpos] = c_clay + c.write = true + end + end + end + end + end + end + end +end) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 04448d3f1..f8a5d1b53 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1,13 +1,11 @@ mcl_mapgen_core = {} -local registered_generators = {} - -local lvm, nodes, param2 = 0, 0, 0 -local lvm_buffer = {} -- -- Aliases for map generator outputs -- +local mcl_mushrooms = minetest.get_modpath("mcl_mushrooms") + minetest.register_alias("mapgen_air", "air") minetest.register_alias("mapgen_stone", "mcl_core:stone") minetest.register_alias("mapgen_tree", "mcl_core:tree") @@ -28,7 +26,9 @@ minetest.register_alias("mapgen_clay", "mcl_core:clay") minetest.register_alias("mapgen_lava_source", "air") -- Built-in lava generator is too unpredictable, we generate lava on our own minetest.register_alias("mapgen_cobble", "mcl_core:cobble") minetest.register_alias("mapgen_mossycobble", "mcl_core:mossycobble") -minetest.register_alias("mapgen_junglegrass", "mcl_flowers:fern") +if minetest.get_modpath("mcl_flowers") then + minetest.register_alias("mapgen_junglegrass", "mcl_flowers:fern") +end minetest.register_alias("mapgen_stone_with_coal", "mcl_core:stone_with_coal") minetest.register_alias("mapgen_stone_with_iron", "mcl_core:stone_with_iron") minetest.register_alias("mapgen_desert_sand", "mcl_core:sand") @@ -43,47 +43,36 @@ minetest.register_alias("mapgen_snow", "mcl_core:snow") minetest.register_alias("mapgen_snowblock", "mcl_core:snowblock") minetest.register_alias("mapgen_ice", "mcl_core:ice") -minetest.register_alias("mapgen_stair_cobble", "mcl_stairs:stair_cobble") minetest.register_alias("mapgen_sandstonebrick", "mcl_core:sandstonesmooth") -minetest.register_alias("mapgen_stair_sandstonebrick", "mcl_stairs:stair_sandstone") -minetest.register_alias("mapgen_stair_sandstone_block", "mcl_stairs:stair_sandstone") -minetest.register_alias("mapgen_stair_desert_stone", "mcl_stairs:stair_sandstone") -local mg_name = minetest.get_mapgen_setting("mg_name") -local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" +if minetest.get_modpath("mcl_stairs") then + minetest.register_alias("mapgen_stair_cobble", "mcl_stairs:stair_cobble") + minetest.register_alias("mapgen_stair_sandstonebrick", "mcl_stairs:stair_sandstone") + minetest.register_alias("mapgen_stair_sandstone_block", "mcl_stairs:stair_sandstone") + minetest.register_alias("mapgen_stair_desert_stone", "mcl_stairs:stair_sandstone") +end -local WITCH_HUT_HEIGHT = 3 -- Exact Y level to spawn witch huts at. This height refers to the height of the floor - --- End exit portal position -local END_EXIT_PORTAL_POS = vector.new(-3, -27003, -3) +local mg_name = mcl_mapgen.name +local superflat = mcl_mapgen.superflat +local v6 = mcl_mapgen.v6 +local singlenode = mcl_mapgen.singlenode +local flat = mcl_mapgen.flat -- Content IDs local c_bedrock = minetest.get_content_id("mcl_core:bedrock") -local c_obsidian = minetest.get_content_id("mcl_core:obsidian") -local c_stone = minetest.get_content_id("mcl_core:stone") -local c_dirt = minetest.get_content_id("mcl_core:dirt") -local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass") -local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow") -local c_sand = minetest.get_content_id("mcl_core:sand") ---local c_sandstone = minetest.get_content_id("mcl_core:sandstone") local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") -local c_water = minetest.get_content_id("mcl_core:water_source") -local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") -local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") -local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") ---local c_end_stone = minetest.get_content_id("mcl_end:end_stone") + +local c_nether = nil +if minetest.get_modpath("mcl_nether") then + c_nether = { + soul_sand = minetest.get_content_id("mcl_nether:soul_sand"), + netherrack = minetest.get_content_id("mcl_nether:netherrack"), + lava = minetest.get_content_id("mcl_nether:nether_lava_source") + } +end + local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") -local c_top_snow = minetest.get_content_id("mcl_core:snow") -local c_snow_block = minetest.get_content_id("mcl_core:snowblock") -local c_clay = minetest.get_content_id("mcl_core:clay") -local c_leaves = minetest.get_content_id("mcl_core:leaves") -local c_jungleleaves = minetest.get_content_id("mcl_core:jungleleaves") ---local c_jungletree = minetest.get_content_id("mcl_core:jungletree") -local c_cocoa_1 = minetest.get_content_id("mcl_cocoas:cocoa_1") -local c_cocoa_2 = minetest.get_content_id("mcl_cocoas:cocoa_2") -local c_cocoa_3 = minetest.get_content_id("mcl_cocoas:cocoa_3") -local c_vine = minetest.get_content_id("mcl_core:vine") local c_air = minetest.CONTENT_AIR -- @@ -101,8 +90,8 @@ for s=1, #specialstones do clust_scarcity = 15*15*15, clust_num_ores = 33, clust_size = 5, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -121,8 +110,8 @@ for s=1, #specialstones do clust_scarcity = 10*10*10, clust_num_ores = 58, clust_size = 7, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -146,8 +135,8 @@ minetest.register_ore({ clust_scarcity = 15*15*15, clust_num_ores = 33, clust_size = 4, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, noise_params = { offset = 0, scale = 1, @@ -168,7 +157,7 @@ minetest.register_ore({ clust_scarcity = 14*14*14, clust_num_ores = 33, clust_size = 5, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(111), noise_params = { offset = 0, @@ -195,7 +184,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 525*3, clust_num_ores = 5, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(50), }) minetest.register_ore({ @@ -205,7 +194,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 510*3, clust_num_ores = 8, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(50), }) minetest.register_ore({ @@ -215,7 +204,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 500*3, clust_num_ores = 12, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(50), }) @@ -293,7 +282,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 830, clust_num_ores = 5, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(39), }) minetest.register_ore({ @@ -319,7 +308,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 4775, clust_num_ores = 5, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(30), }) minetest.register_ore({ @@ -329,7 +318,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 6560, clust_num_ores = 7, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(30), }) @@ -357,7 +346,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 10000, clust_num_ores = 4, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(12), }) minetest.register_ore({ @@ -367,7 +356,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 5000, clust_num_ores = 2, clust_size = 2, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(12), }) minetest.register_ore({ @@ -377,7 +366,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 10000, clust_num_ores = 8, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(12), }) @@ -415,7 +404,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 500, clust_num_ores = 4, clust_size = 3, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(13), }) minetest.register_ore({ @@ -425,7 +414,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 800, clust_num_ores = 7, clust_size = 4, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(13), }) @@ -455,7 +444,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then -- Emerald -- - if mg_name == "v6" then + if v6 then -- Generate everywhere in v6, but rarely. -- Common spawn @@ -466,7 +455,7 @@ if minetest.settings:get_bool("mcl_generate_ores", true) then clust_scarcity = 14340, clust_num_ores = 1, clust_size = 1, - y_min = mcl_vars.mg_overworld_min, + y_min = mcl_mapgen.overworld.min, y_max = mcl_worlds.layer_to_y(29), }) -- Rare spawn @@ -682,7 +671,7 @@ local function register_mgv6_decorations() persist = 0.6 }, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_core:cactus", height = 1, height_max = 3, @@ -702,7 +691,7 @@ local function register_mgv6_decorations() persist = 0.7 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_core:reeds", height = 1, height_max = 3, @@ -710,343 +699,332 @@ local function register_mgv6_decorations() num_spawn_by = 1, }) - -- Doubletall grass - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_grass", param1 = 255, }, - { name = "mcl_flowers:double_grass_top", param1 = 255, }, - }, - }, - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - noise_params = { - offset = -0.0025, - scale = 0.03, - spread = {x = 100, y = 100, z = 100}, - seed = 420, - octaves = 3, - persist = 0.0, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - }) - - -- Large ferns - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_fern", param1=255, }, - { name = "mcl_flowers:double_fern_top", param1=255, }, - }, - }, - -- v6 hack: This makes sure large ferns only appear in jungles - spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, - num_spawn_by = 1, - place_on = {"group:grass_block_no_snow"}, - - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.01, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 2, - persist = 0.66, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - }) - - -- Large flowers - local function register_large_flower(name, seed, offset) + if minetest.get_modpath("mcl_flowers") then + -- Doubletall grass minetest.register_decoration({ deco_type = "schematic", schematic = { size = { x=1, y=3, z=1 }, data = { { name = "air", prob = 0 }, - { name = "mcl_flowers:"..name, param1=255, }, - { name = "mcl_flowers:"..name.."_top", param1=255, }, + { name = "mcl_flowers:double_grass", param1 = 255, }, + { name = "mcl_flowers:double_grass_top", param1 = 255, }, }, }, place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + noise_params = { + offset = -0.0025, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.0, + }, + y_min = 1, + y_max = mcl_mapgen.overworld.max, + }) + + -- Large ferns + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:double_fern", param1=255, }, + { name = "mcl_flowers:double_fern_top", param1=255, }, + }, + }, + -- v6 hack: This makes sure large ferns only appear in jungles + spawn_by = spawn_by_in_jungle, + num_spawn_by = 1, + place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { - offset = offset, + offset = 0, scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 2, + persist = 0.66, }, y_min = 1, - y_max = mcl_vars.overworld_max, - flags = "", + y_max = mcl_mapgen.overworld.max, + }) + + -- Large flowers + local function register_large_flower(name, seed, offset) + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:"..name, param1=255, }, + { name = "mcl_flowers:"..name.."_top", param1=255, }, + }, + }, + place_on = {"group:grass_block_no_snow"}, + + sidelen = 16, + noise_params = { + offset = offset, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_mapgen.overworld.max, + flags = "", + }) + end + + register_large_flower("rose_bush", 9350, -0.008) + register_large_flower("peony", 10450, -0.008) + register_large_flower("lilac", 10600, -0.007) + register_large_flower("sunflower", 2940, -0.005) + + -- Lily pad + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "mcl_core:water_source", prob = 0 }, + { name = "mcl_core:water_source" }, + { name = "mcl_flowers:waterlily", param1 = 255 }, + }, + }, + place_on = "mcl_core:dirt", + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 503, + octaves = 6, + persist = 0.7, + }, + y_min = 0, + y_max = 0, + rotation = "random", }) end - register_large_flower("rose_bush", 9350, -0.008) - register_large_flower("peony", 10450, -0.008) - register_large_flower("lilac", 10600, -0.007) - register_large_flower("sunflower", 2940, -0.005) - - -- Lily pad - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "mcl_core:water_source", prob = 0 }, - { name = "mcl_core:water_source" }, - { name = "mcl_flowers:waterlily", param1 = 255 }, + if minetest.get_modpath("mcl_farming") then + -- Pumpkin + minetest.register_decoration({ + deco_type = "simple", + decoration = "mcl_farming:pumpkin_face", + param2 = 0, + param2_max = 3, + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = -0.008, + scale = 0.00666, + spread = {x = 250, y = 250, z = 250}, + seed = 666, + octaves = 6, + persist = 0.666 }, - }, - place_on = "mcl_core:dirt", - sidelen = 16, - noise_params = { - offset = -0.12, - scale = 0.3, - spread = {x = 200, y = 200, z = 200}, - seed = 503, - octaves = 6, - persist = 0.7, - }, - y_min = 0, - y_max = 0, - rotation = "random", - }) + y_min = 1, + y_max = mcl_mapgen.overworld.max, + }) - -- Pumpkin - minetest.register_decoration({ - deco_type = "simple", - decoration = "mcl_farming:pumpkin_face", - param2 = 0, - param2_max = 3, - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = -0.008, - scale = 0.00666, - spread = {x = 250, y = 250, z = 250}, - seed = 666, - octaves = 6, - persist = 0.666 - }, - y_min = 1, - y_max = mcl_vars.overworld_max, - }) - - -- Melon - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.002, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 3, - persist = 0.6 - }, - -- Small trick to make sure melon spawn in jungles - spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, - num_spawn_by = 1, - y_min = 1, - y_max = 40, - decoration = "mcl_farming:melon", - }) + -- Melon + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = 0.002, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 3, + persist = 0.6 + }, + -- Small trick to make sure melon spawn in jungles + spawn_by = spawn_by_in_jungle, + num_spawn_by = 1, + y_min = 1, + y_max = 40, + decoration = "mcl_farming:melon", + }) + end -- Tall grass - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - noise_params = { - offset = 0.01, - scale = 0.3, - spread = {x = 100, y = 100, z = 100}, - seed = 420, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.overworld_max, - decoration = "mcl_flowers:tallgrass", - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - noise_params = { - offset = 0.04, - scale = 0.03, - spread = {x = 100, y = 100, z = 100}, - seed = 420, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.overworld_max, - decoration = "mcl_flowers:tallgrass", - }) - - -- Seagrass and kelp - local materials = {"dirt","sand"} - for i=1, #materials do - local mat = materials[i] - + if minetest.get_modpath("mcl_flowers") then minetest.register_decoration({ deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:"..mat}, + place_on = {"group:grass_block_no_snow"}, sidelen = 8, noise_params = { - offset = 0.04, + offset = 0.01, scale = 0.3, spread = {x = 100, y = 100, z = 100}, - seed = 421, - octaves = 3, - persist = 0.6 - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = 0, - decoration = "mcl_ocean:seagrass_"..mat, - }) - minetest.register_decoration({ - deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:mat"}, - sidelen = 8, - noise_params = { - offset = 0.08, - scale = 0.03, - spread = {x = 100, y = 100, z = 100}, - seed = 421, - octaves = 3, - persist = 0.6 - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = -5, - decoration = "mcl_ocean:seagrass_"..mat, - }) - - minetest.register_decoration({ - deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:"..mat}, - sidelen = 16, - noise_params = { - offset = 0.01, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = 505, - octaves = 5, - persist = 0.62, - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = -6, - decoration = "mcl_ocean:kelp_"..mat, - param2 = 16, - param2_max = 96, - }) - minetest.register_decoration({ - deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:"..mat}, - sidelen = 16, - noise_params = { - offset = 0.01, - scale = 0.01, - spread = {x = 100, y = 100, z = 100}, - seed = 506, - octaves = 5, - persist = 0.62, - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = -15, - decoration = "mcl_ocean:kelp_"..mat, - param2 = 32, - param2_max = 160, - }) - - end - - -- Wet Sponge - -- TODO: Remove this when we got ocean monuments - minetest.register_decoration({ - deco_type = "simple", - decoration = "mcl_sponges:sponge_wet", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:dirt","mcl_core:sand"}, - sidelen = 16, - noise_params = { - offset = 0.00295, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 999, - octaves = 3, - persist = 0.666 - }, - flags = "force_placement", - y_min = mcl_vars.mg_lava_overworld_max + 5, - y_max = -20, - }) - - -- Add a small amount of tall grass everywhere to avoid areas completely empty devoid of tall grass - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - fill_ratio = 0.004, - y_min = 1, - y_max = mcl_vars.overworld_max, - decoration = "mcl_flowers:tallgrass", - }) - - local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} - local mseeds = { 7133, 8244 } - for m=1, #mushrooms do - -- Mushrooms next to trees - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, - sidelen = 16, - noise_params = { - offset = 0.04, - scale = 0.04, - spread = {x = 100, y = 100, z = 100}, - seed = mseeds[m], + seed = 420, octaves = 3, persist = 0.6 }, y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = mushrooms[m], - spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", }, - num_spawn_by = 1, + y_max = mcl_mapgen.overworld.max, + decoration = "mcl_flowers:tallgrass", }) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + noise_params = { + offset = 0.04, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 420, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_mapgen.overworld.max, + decoration = "mcl_flowers:tallgrass", + }) + end + + -- Seagrass and kelp + if minetest.get_modpath("mcl_ocean") then + local materials = {"dirt","sand"} + for i=1, #materials do + local mat = materials[i] + + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:"..mat}, + sidelen = 8, + noise_params = { + offset = 0.04, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 421, + octaves = 3, + persist = 0.6 + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_mapgen.overworld.min, + y_max = 0, + decoration = "mcl_ocean:seagrass_"..mat, + }) + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:mat"}, + sidelen = 8, + noise_params = { + offset = 0.08, + scale = 0.03, + spread = {x = 100, y = 100, z = 100}, + seed = 421, + octaves = 3, + persist = 0.6 + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_mapgen.overworld.min, + y_max = -5, + decoration = "mcl_ocean:seagrass_"..mat, + }) + + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:"..mat}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = 505, + octaves = 5, + persist = 0.62, + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_mapgen.overworld.min, + y_max = -6, + decoration = "mcl_ocean:kelp_"..mat, + param2 = 16, + param2_max = 96, + }) + minetest.register_decoration({ + deco_type = "simple", + spawn_by = {"group:water"}, + num_spawn_by = 1, + place_on = {"mcl_core:"..mat}, + sidelen = 16, + noise_params = { + offset = 0.01, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 506, + octaves = 5, + persist = 0.62, + }, + flags = "force_placement", + place_offset_y = -1, + y_min = mcl_mapgen.overworld.min, + y_max = -15, + decoration = "mcl_ocean:kelp_"..mat, + param2 = 32, + param2_max = 160, + }) + end + end + + -- Add a small amount of tall grass everywhere to avoid areas completely empty devoid of tall grass + if minetest.get_modpath("mcl_flowers") then + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 8, + fill_ratio = 0.004, + y_min = 1, + y_max = mcl_mapgen.overworld.max, + decoration = "mcl_flowers:tallgrass", + }) + end + + if mcl_mushrooms then + local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} + local mseeds = { 7133, 8244 } + for m=1, #mushrooms do + -- Mushrooms next to trees + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = mseeds[m], + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_mapgen.overworld.max, + decoration = mushrooms[m], + spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", }, + num_spawn_by = 1, + }) + end end -- Dead bushes @@ -1063,50 +1041,52 @@ local function register_mgv6_decorations() persist = 0.6 }, y_min = 4, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_core:deadbush", }) - local function register_mgv6_flower(name, seed, offset, y_max) - if offset == nil then - offset = 0 + if minetest.get_modpath("mcl_flowers") then + local function register_mgv6_flower(name, seed, offset, y_max) + if offset == nil then + offset = 0 + end + if y_max == nil then + y_max = mcl_mapgen.overworld.max + end + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:grass_block_no_snow"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = y_max, + decoration = "mcl_flowers:"..name, + }) end - if y_max == nil then - y_max = mcl_vars.mg_overworld_max - end - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = offset, - scale = 0.006, - spread = {x = 100, y = 100, z = 100}, - seed = seed, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = y_max, - decoration = "mcl_flowers:"..name, - }) - end - register_mgv6_flower("tulip_red", 436) - register_mgv6_flower("tulip_orange", 536) - register_mgv6_flower("tulip_pink", 636) - register_mgv6_flower("tulip_white", 736) - register_mgv6_flower("azure_bluet", 800) - register_mgv6_flower("dandelion", 8) - -- Allium is supposed to only appear in flower forest in MC. There are no flower forests in v6. - -- We compensate by making it slightly rarer in v6. - register_mgv6_flower("allium", 0, -0.001) - --[[ Blue orchid is supposed to appear in swamplands. There are no swamplands in v6. - We emulate swamplands by limiting the height to 5 levels above sea level, - which should be close to the water. ]] - register_mgv6_flower("blue_orchid", 64500, nil, mcl_worlds.layer_to_y(67)) - register_mgv6_flower("oxeye_daisy", 3490) - register_mgv6_flower("poppy", 9439) + register_mgv6_flower("tulip_red", 436) + register_mgv6_flower("tulip_orange", 536) + register_mgv6_flower("tulip_pink", 636) + register_mgv6_flower("tulip_white", 736) + register_mgv6_flower("azure_bluet", 800) + register_mgv6_flower("dandelion", 8) + -- Allium is supposed to only appear in flower forest in MC. There are no flower forests in v6. + -- We compensate by making it slightly rarer in v6. + register_mgv6_flower("allium", 0, -0.001) + --[[ Blue orchid is supposed to appear in swamplands. There are no swamplands in v6. + We emulate swamplands by limiting the height to 5 levels above sea level, + which should be close to the water. ]] + register_mgv6_flower("blue_orchid", 64500, nil, mcl_worlds.layer_to_y(67)) + register_mgv6_flower("oxeye_daisy", 3490) + register_mgv6_flower("poppy", 9439) + end -- Put top snow on snowy grass blocks. The v6 mapgen does not generate the top snow on its own. minetest.register_decoration({ @@ -1115,7 +1095,7 @@ local function register_mgv6_decorations() sidelen = 16, fill_ratio = 11.0, -- complete coverage y_min = 1, - y_max = mcl_vars.mg_overworld_max, + y_max = mcl_mapgen.overworld.max, decoration = "mcl_core:snow", }) @@ -1124,13 +1104,13 @@ end local mg_flags = minetest.settings:get_flags("mg_flags") -- Inform other mods of dungeon setting for MCL2-style dungeons -mcl_vars.mg_dungeons = mg_flags.dungeons and not superflat +mcl_vars.mg_dungeons = mcl_mapgen.dungeons -- Disable builtin dungeons, we provide our own dungeons mg_flags.dungeons = false -- Apply mapgen-specific mapgen code -if mg_name == "v6" then +if v6 then register_mgv6_decorations() elseif superflat then -- Enforce superflat-like mapgen: no caves, decor, lakes and hills @@ -1151,773 +1131,19 @@ if string.len(mg_flags_str) > 0 then end minetest.set_mapgen_setting("mg_flags", mg_flags_str, true) --- Helper function for converting a MC probability to MT, with --- regards to MapBlocks. --- Some MC generated structures are generated on per-chunk --- probability. --- The MC probability is 1/x per Minecraft chunk (16×16). - --- x: The MC probability is 1/x. --- minp, maxp: MapBlock limits --- returns: Probability (1/return_value) for a single MT mapblock -local function minecraft_chunk_probability(x, minp, maxp) - -- 256 is the MC chunk height - return x * (((maxp.x-minp.x+1)*(maxp.z-minp.z+1)) / 256) -end - --- Takes an index of a biomemap table (from minetest.get_mapgen_object), --- minp and maxp (from an on_generated callback) and returns the real world coordinates --- as X, Z. --- Inverse function of xz_to_biomemap ---[[local function biomemap_to_xz(index, minp, maxp) - local xwidth = maxp.x - minp.x + 1 - local zwidth = maxp.z - minp.z + 1 - local x = ((index-1) % xwidth) + minp.x - local z = ((index-1) / zwidth) + minp.z - return x, z -end]] - --- Takes x and z coordinates and minp and maxp of a generated chunk --- (in on_generated callback) and returns a biomemap index) --- Inverse function of biomemap_to_xz -local function xz_to_biomemap_index(x, z, minp, maxp) - local xwidth = maxp.x - minp.x + 1 - local zwidth = maxp.z - minp.z + 1 - local minix = x % xwidth - local miniz = z % zwidth - - return (minix + miniz * zwidth) + 1 -end - --- Perlin noise objects -local perlin_structures -local perlin_vines, perlin_vines_fine, perlin_vines_upwards, perlin_vines_length, perlin_vines_density -local perlin_clay - -local function generate_clay(minp, maxp, blockseed, voxelmanip_data, voxelmanip_area, lvm_used) - -- TODO: Make clay generation reproducible for same seed. - if maxp.y < -5 or minp.y > 0 then - return lvm_used - end - - local pr = PseudoRandom(blockseed) - - perlin_clay = perlin_clay or minetest.get_perlin({ - offset = 0.5, - scale = 0.2, - spread = {x = 5, y = 5, z = 5}, - seed = -316, - octaves = 1, - persist = 0.0 - }) - - for y=math.max(minp.y, 0), math.min(maxp.y, -8), -1 do - -- Assume X and Z lengths are equal - local divlen = 4 - local divs = (maxp.x-minp.x)/divlen+1; - for divx=0+1,divs-2 do - for divz=0+1,divs-2 do - -- Get position and shift it a bit randomly so the clay do not obviously appear in a grid - local cx = minp.x + math.floor((divx+0.5)*divlen) + pr:next(-1,1) - local cz = minp.z + math.floor((divz+0.5)*divlen) + pr:next(-1,1) - - local water_pos = voxelmanip_area:index(cx, y+1, cz) - local waternode = voxelmanip_data[water_pos] - local surface_pos = voxelmanip_area:index(cx, y, cz) - local surfacenode = voxelmanip_data[surface_pos] - - local genrnd = pr:next(1, 20) - if genrnd == 1 and perlin_clay:get_3d({x=cx,y=y,z=cz}) > 0 and waternode == c_water and - (surfacenode == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(surfacenode), "sand") == 1) then - local diamondsize = pr:next(1, 3) - for x1 = -diamondsize, diamondsize do - for z1 = -(diamondsize - math.abs(x1)), diamondsize - math.abs(x1) do - local ccpos = voxelmanip_area:index(cx+x1, y, cz+z1) - local claycandidate = voxelmanip_data[ccpos] - if voxelmanip_data[ccpos] == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(claycandidate), "sand") == 1 then - voxelmanip_data[ccpos] = c_clay - lvm_used = true - end - end - end - end - end - end - end - return lvm_used -end - -local function generate_end_exit_portal(pos) - local obj = minetest.add_entity(vector.add(pos, vector.new(3, 11, 3)), "mobs_mc:enderdragon") - if obj then - local dragon_entity = obj:get_luaentity() - dragon_entity._initial = true - dragon_entity._portal_pos = pos - else - minetest.log("error", "[mcl_mapgen_core] ERROR! Ender dragon doesn't want to spawn") - end - mcl_structures.call_struct(pos, "end_exit_portal") -end - --- TODO: Try to use more efficient structure generating code -local function generate_structures(minp, maxp, blockseed, biomemap) - local chunk_has_desert_well = false - local chunk_has_desert_temple = false - local chunk_has_igloo = false - local struct_min, struct_max = -3, 111 --64 - - if maxp.y >= struct_min and minp.y <= struct_max then - -- Generate structures - local pr = PcgRandom(blockseed) - perlin_structures = perlin_structures or minetest.get_perlin(329, 3, 0.6, 100) - -- Assume X and Z lengths are equal - local divlen = 5 - for x0 = minp.x, maxp.x, divlen do for z0 = minp.z, maxp.z, divlen do - -- Determine amount from perlin noise - local amount = math.floor(perlin_structures:get_2d({x=x0, y=z0}) * 9) - -- Find random positions based on this random - local p, ground_y - for i=0, amount do - p = {x = pr:next(x0, x0+divlen-1), y = 0, z = pr:next(z0, z0+divlen-1)} - -- Find ground level - ground_y = nil - local nn - for y = struct_max, struct_min, -1 do - p.y = y - local checknode = minetest.get_node(p) - if checknode then - nn = checknode.name - local def = minetest.registered_nodes[nn] - if def and def.walkable then - ground_y = y - break - end - end - end - - if ground_y then - p.y = ground_y+1 - local nn0 = minetest.get_node(p).name - -- Check if the node can be replaced - if minetest.registered_nodes[nn0] and minetest.registered_nodes[nn0].buildable_to then - -- Desert temples and desert wells - if nn == "mcl_core:sand" or (nn == "mcl_core:sandstone") then - if not chunk_has_desert_temple and not chunk_has_desert_well and ground_y > 3 then - -- Spawn desert temple - -- TODO: Check surface - if pr:next(1,12000) == 1 then - mcl_structures.call_struct(p, "desert_temple", nil, pr) - chunk_has_desert_temple = true - end - end - if not chunk_has_desert_temple and not chunk_has_desert_well and ground_y > 3 then - local desert_well_prob = minecraft_chunk_probability(1000, minp, maxp) - - -- Spawn desert well - if pr:next(1, desert_well_prob) == 1 then - -- Check surface - local surface = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, {x=p.x+5, y=p.y-1, z=p.z+5}, "mcl_core:sand") - if #surface >= 25 then - mcl_structures.call_struct(p, "desert_well", nil, pr) - chunk_has_desert_well = true - end - end - end - - -- Igloos - elseif not chunk_has_igloo and (nn == "mcl_core:snowblock" or nn == "mcl_core:snow" or (minetest.get_item_group(nn, "grass_block_snow") == 1)) then - if pr:next(1, 4400) == 1 then - -- Check surface - local floor = {x=p.x+9, y=p.y-1, z=p.z+9} - local surface = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, floor, "mcl_core:snowblock") - local surface2 = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, floor, "mcl_core:dirt_with_grass_snow") - if #surface + #surface2 >= 63 then - mcl_structures.call_struct(p, "igloo", nil, pr) - chunk_has_igloo = true - end - end - end - - -- Fossil - if nn == "mcl_core:sandstone" or nn == "mcl_core:sand" and not chunk_has_desert_temple and ground_y > 3 then - local fossil_prob = minecraft_chunk_probability(64, minp, maxp) - - if pr:next(1, fossil_prob) == 1 then - -- Spawn fossil below desert surface between layers 40 and 49 - local p1 = {x=p.x, y=pr:next(mcl_worlds.layer_to_y(40), mcl_worlds.layer_to_y(49)), z=p.z} - -- Very rough check of the environment (we expect to have enough stonelike nodes). - -- Fossils may still appear partially exposed in caves, but this is O.K. - local p2 = vector.add(p1, 4) - local nodes = minetest.find_nodes_in_area(p1, p2, {"mcl_core:sandstone", "mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:dirt", "mcl_core:gravel"}) - - if #nodes >= 100 then -- >= 80% - mcl_structures.call_struct(p1, "fossil", nil, pr) - end - end - end - - -- Witch hut - if ground_y <= 0 and nn == "mcl_core:dirt" then - local prob = minecraft_chunk_probability(48, minp, maxp) - if pr:next(1, prob) == 1 then - - local swampland = minetest.get_biome_id("Swampland") - local swampland_shore = minetest.get_biome_id("Swampland_shore") - - -- Where do witches live? - - local here_be_witches = false - if mg_name == "v6" then - -- v6: In Normal biome - if biomeinfo.get_v6_biome(p) == "Normal" then - here_be_witches = true - end - else - -- Other mapgens: In swampland biome - local bi = xz_to_biomemap_index(p.x, p.z, minp, maxp) - if biomemap[bi] == swampland or biomemap[bi] == swampland_shore then - here_be_witches = true - end - end - - if here_be_witches then - local r = tostring(pr:next(0, 3) * 90) -- "0", "90", "180" or 270" - local p1 = {x=p.x-1, y=WITCH_HUT_HEIGHT+2, z=p.z-1} - local size - if r == "0" or r == "180" then - size = {x=10, y=4, z=8} - else - size = {x=8, y=4, z=10} - end - local p2 = vector.add(p1, size) - - -- This checks free space at the “body” of the hut and a bit around. - -- ALL nodes must be free for the placement to succeed. - local free_nodes = minetest.find_nodes_in_area(p1, p2, {"air", "mcl_core:water_source", "mcl_flowers:waterlily"}) - if #free_nodes >= ((size.x+1)*(size.y+1)*(size.z+1)) then - local place = {x=p.x, y=WITCH_HUT_HEIGHT-1, z=p.z} - - -- FIXME: For some mysterious reason (black magic?) this - -- function does sometimes NOT spawn the witch hut. One can only see the - -- oak wood nodes in the water, but no hut. :-/ - mcl_structures.call_struct(place, "witch_hut", r, pr) - - -- TODO: Spawn witch in or around hut when the mob sucks less. - - local function place_tree_if_free(pos, prev_result) - local nn = minetest.get_node(pos).name - if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" then - minetest.set_node(pos, {name="mcl_core:tree", param2=0}) - return prev_result - else - return false - end - end - local offsets - if r == "0" then - offsets = { - {x=1, y=0, z=1}, - {x=1, y=0, z=5}, - {x=6, y=0, z=1}, - {x=6, y=0, z=5}, - } - elseif r == "180" then - offsets = { - {x=2, y=0, z=1}, - {x=2, y=0, z=5}, - {x=7, y=0, z=1}, - {x=7, y=0, z=5}, - } - elseif r == "270" then - offsets = { - {x=1, y=0, z=1}, - {x=5, y=0, z=1}, - {x=1, y=0, z=6}, - {x=5, y=0, z=6}, - } - elseif r == "90" then - offsets = { - {x=1, y=0, z=2}, - {x=5, y=0, z=2}, - {x=1, y=0, z=7}, - {x=5, y=0, z=7}, - } - end - for o=1, #offsets do - local ok = true - for y=place.y-1, place.y-64, -1 do - local tpos = vector.add(place, offsets[o]) - tpos.y = y - ok = place_tree_if_free(tpos, ok) - if not ok then - break - end - end - end - end - end - end - end - - -- Ice spikes in v6 - -- In other mapgens, ice spikes are generated as decorations. - if mg_name == "v6" and not chunk_has_igloo and nn == "mcl_core:snowblock" then - local spike = pr:next(1,58000) - if spike < 3 then - -- Check surface - local floor = {x=p.x+4, y=p.y-1, z=p.z+4} - local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock"}) - -- Check for collision with spruce - local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+2,z=p.z+1}, {x=p.x+4, y=p.y+6, z=p.z+4}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) - - if #surface >= 9 and #spruce_collisions == 0 then - mcl_structures.call_struct(p, "ice_spike_large", nil, pr) - end - elseif spike < 100 then - -- Check surface - local floor = {x=p.x+6, y=p.y-1, z=p.z+6} - local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock", "mcl_core:dirt_with_grass_snow"}) - - -- Check for collision with spruce - local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+1,z=p.z+1}, {x=p.x+6, y=p.y+6, z=p.z+6}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) - - if #surface >= 25 and #spruce_collisions == 0 then - mcl_structures.call_struct(p, "ice_spike_small", nil, pr) - end - end - end - end - end - - end - end end - -- End exit portal - elseif minp.y <= END_EXIT_PORTAL_POS.y and maxp.y >= END_EXIT_PORTAL_POS.y and - minp.x <= END_EXIT_PORTAL_POS.x and maxp.x >= END_EXIT_PORTAL_POS.x and - minp.z <= END_EXIT_PORTAL_POS.z and maxp.z >= END_EXIT_PORTAL_POS.z then - for y=maxp.y, minp.y, -1 do - local p = {x=END_EXIT_PORTAL_POS.x, y=y, z=END_EXIT_PORTAL_POS.z} - if minetest.get_node(p).name == "mcl_end:end_stone" then - generate_end_exit_portal(p) - return - end - end - generate_end_exit_portal(END_EXIT_PORTAL_POS) - end -end - --- Buffers for LuaVoxelManip --- local lvm_buffer = {} --- local lvm_buffer_param2 = {} - --- Generate tree decorations in the bounding box. This adds: --- * Cocoa at jungle trees --- * Jungle tree vines --- * Oak vines in swamplands -local function generate_tree_decorations(minp, maxp, seed, data, param2_data, area, biomemap, lvm_used, pr) - if maxp.y < 0 then - return lvm_used - end - - local oaktree, oakleaves, jungletree, jungleleaves = {}, {}, {}, {} - local swampland = minetest.get_biome_id("Swampland") - local swampland_shore = minetest.get_biome_id("Swampland_shore") - local jungle = minetest.get_biome_id("Jungle") - local jungle_shore = minetest.get_biome_id("Jungle_shore") - local jungle_m = minetest.get_biome_id("JungleM") - local jungle_m_shore = minetest.get_biome_id("JungleM_shore") - local jungle_edge = minetest.get_biome_id("JungleEdge") - local jungle_edge_shore = minetest.get_biome_id("JungleEdge_shore") - local jungle_edge_m = minetest.get_biome_id("JungleEdgeM") - local jungle_edge_m_shore = minetest.get_biome_id("JungleEdgeM_shore") - - -- Modifier for Jungle M biome: More vines and cocoas - local dense_vegetation = false - - if biomemap then - -- Biome map available: Check if the required biome (jungle or swampland) - -- is in this mapchunk. We are only interested in trees in the correct biome. - -- The nodes are added if the correct biome is *anywhere* in the mapchunk. - -- TODO: Strictly generate vines in the correct biomes only. - local swamp_biome_found, jungle_biome_found = false, false - for b=1, #biomemap do - local id = biomemap[b] - - if not swamp_biome_found and (id == swampland or id == swampland_shore) then - oaktree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:tree"}) - oakleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:leaves"}) - swamp_biome_found = true - end - if not jungle_biome_found and (id == jungle or id == jungle_shore or id == jungle_m or id == jungle_m_shore or id == jungle_edge or id == jungle_edge_shore or id == jungle_edge_m or id == jungle_edge_m_shore) then - jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) - jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) - jungle_biome_found = true - end - if not dense_vegetation and (id == jungle_m or id == jungle_m_shore) then - dense_vegetation = true - end - if swamp_biome_found and jungle_biome_found and dense_vegetation then - break - end - end - else - -- If there is no biome map, we just count all jungle things we can find. - -- Oak vines will not be generated. - jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) - jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) - end - - local pos, treepos, dir - - local cocoachance = 40 - if dense_vegetation then - cocoachance = 32 - end - - -- Pass 1: Generate cocoas at jungle trees - for n = 1, #jungletree do - - pos = table.copy(jungletree[n]) - treepos = table.copy(pos) - - if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then - - dir = pr:next(1, cocoachance) - - if dir == 1 then - pos.z = pos.z + 1 - elseif dir == 2 then - pos.z = pos.z - 1 - elseif dir == 3 then - pos.x = pos.x + 1 - elseif dir == 4 then - pos.x = pos.x -1 - end - - local p_pos = area:index(pos.x, pos.y, pos.z) - local l = minetest.get_node_light(pos) - - if dir < 5 - and data[p_pos] == c_air - and l and l > 12 then - local c = pr:next(1, 3) - if c == 1 then - data[p_pos] = c_cocoa_1 - elseif c == 2 then - data[p_pos] = c_cocoa_2 - else - data[p_pos] = c_cocoa_3 - end - param2_data[p_pos] = minetest.dir_to_facedir(vector.subtract(treepos, pos)) - lvm_used = true - end - - end - end - - -- Pass 2: Generate vines at jungle wood, jungle leaves in jungle and oak wood, oak leaves in swampland - perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) - perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) - perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) - perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) - perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) - - -- Extra long vines in Jungle M - local maxvinelength = 7 - if dense_vegetation then - maxvinelength = 14 - end - local treething - for i=1, 4 do - if i==1 then - treething = jungletree - elseif i == 2 then - treething = jungleleaves - elseif i == 3 then - treething = oaktree - elseif i == 4 then - treething = oakleaves - end - - for n = 1, #treething do - pos = treething[n] - - treepos = table.copy(pos) - - local dirs = { - {x=1,y=0,z=0}, - {x=-1,y=0,z=0}, - {x=0,y=0,z=1}, - {x=0,y=0,z=-1}, - } - - for d = 1, #dirs do - local pos = vector.add(pos, dirs[d]) - local p_pos = area:index(pos.x, pos.y, pos.z) - - local vine_threshold = math.max(0.33333, perlin_vines_density:get_2d(pos)) - if dense_vegetation then - vine_threshold = vine_threshold * (2/3) - end - - if perlin_vines:get_2d(pos) > -1.0 and perlin_vines_fine:get_3d(pos) > vine_threshold and data[p_pos] == c_air then - - local rdir = {} - rdir.x = -dirs[d].x - rdir.y = dirs[d].y - rdir.z = -dirs[d].z - local param2 = minetest.dir_to_wallmounted(rdir) - - -- Determine growth direction - local grow_upwards = false - -- Only possible on the wood, not on the leaves - if i == 1 then - grow_upwards = perlin_vines_upwards:get_3d(pos) > 0.8 - end - if grow_upwards then - -- Grow vines up 1-4 nodes, even through jungleleaves. - -- This may give climbing access all the way to the top of the tree :-) - -- But this will be fairly rare. - local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * 4) - for l=0, length-1 do - local t_pos = area:index(treepos.x, treepos.y, treepos.z) - - if (data[p_pos] == c_air or data[p_pos] == c_jungleleaves or data[p_pos] == c_leaves) and mcl_core.supports_vines(minetest.get_name_from_content_id(data[t_pos])) then - data[p_pos] = c_vine - param2_data[p_pos] = param2 - lvm_used = true - - else - break - end - pos.y = pos.y + 1 - p_pos = area:index(pos.x, pos.y, pos.z) - treepos.y = treepos.y + 1 - end - else - -- Grow vines down, length between 1 and maxvinelength - local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * maxvinelength) - for l=0, length-1 do - if data[p_pos] == c_air then - data[p_pos] = c_vine - param2_data[p_pos] = param2 - lvm_used = true - - else - break - end - pos.y = pos.y - 1 - p_pos = area:index(pos.x, pos.y, pos.z) - end - end - end - end - - end - end - return lvm_used -end - --- Generate mushrooms in caves manually. --- Minetest's API does not support decorations in caves yet. :-( -local function generate_underground_mushrooms(minp, maxp, seed) - local pr_shroom = PseudoRandom(seed-24359) - -- Generate rare underground mushrooms - -- TODO: Make them appear in groups, use Perlin noise - local min, max = mcl_vars.mg_lava_overworld_max + 4, 0 - if minp.y > max or maxp.y < min then - return - end - - local bpos - local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"}) - - for n = 1, #stone do - bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z } - - local l = minetest.get_node_light(bpos, 0.5) - if bpos.y >= min and bpos.y <= max and l and l <= 12 and pr_shroom:next(1,1000) < 4 then - if pr_shroom:next(1,2) == 1 then - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) - else - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) - end - end - end -end - -local nether_wart_chance -if mg_name == "v6" then - nether_wart_chance = 85 -else - nether_wart_chance = 170 -end --- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart --- Minetest's API does not support decorations in caves yet. :-( -local function generate_nether_decorations(minp, maxp, seed) - local pr_nether = PseudoRandom(seed+667) - - if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then - return - end - - minetest.log("action", "[mcl_mapgen_core] Nether decorations " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp)) - - -- TODO: Generate everything based on Perlin noise instead of PseudoRandom - - local bpos - local rack = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:netherrack"}) - local magma = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:magma"}) - local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"}) - - -- Helper function to spawn “fake” decoration - local function special_deco(nodes, spawn_func) - for n = 1, #nodes do - bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z } - - spawn_func(bpos) - end - - end - - -- Eternal fire on netherrack - special_deco(rack, function(bpos) - -- Eternal fire on netherrack - if pr_nether:next(1,100) <= 3 then - minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) - end - end) - - -- Eternal fire on magma cubes - special_deco(magma, function(bpos) - if pr_nether:next(1,150) == 1 then - minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) - end - end) - - -- Mushrooms on netherrack - -- Note: Spawned *after* the fire because of light level checks - special_deco(rack, function(bpos) - local l = minetest.get_node_light(bpos, 0.5) - if bpos.y > mcl_vars.mg_lava_nether_max + 6 and l and l <= 12 and pr_nether:next(1,1000) <= 4 then - -- TODO: Make mushrooms appear in groups, use Perlin noise - if pr_nether:next(1,2) == 1 then - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) - else - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) - end - end - end) - - -- Nether wart on soul sand - -- TODO: Spawn in Nether fortresses - special_deco(ssand, function(bpos) - if pr_nether:next(1, nether_wart_chance) == 1 then - minetest.set_node(bpos, {name = "mcl_nether:nether_wart"}) - end - end) - -end - -minetest.register_on_generated(function(minp, maxp, blockseed) - minetest.log("action", "[mcl_mapgen_core] Generating chunk " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp)) - local p1, p2 = {x=minp.x, y=minp.y, z=minp.z}, {x=maxp.x, y=maxp.y, z=maxp.z} - if lvm > 0 then - local lvm_used, shadow = false, false - local lb2 = {} -- param2 - local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - local e1, e2 = {x=emin.x, y=emin.y, z=emin.z}, {x=emax.x, y=emax.y, z=emax.z} - local data2 - local data = vm:get_data(lvm_buffer) - if param2 > 0 then - data2 = vm:get_param2_data(lb2) - end - local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2}) - - for _, rec in pairs(registered_generators) do - if rec.vf then - local lvm_used0, shadow0 = rec.vf(vm, data, data2, e1, e2, area, p1, p2, blockseed) - if lvm_used0 then - lvm_used = true - end - if shadow0 then - shadow = true - end - end - end - - if lvm_used then - -- Write stuff - vm:set_data(data) - if param2 > 0 then - vm:set_param2_data(data2) - end - vm:calc_lighting(p1, p2, shadow) - vm:write_to_map() - vm:update_liquids() - end - end - - if nodes > 0 then - for _, rec in pairs(registered_generators) do - if rec.nf then - rec.nf(p1, p2, blockseed) - end - end - end - - mcl_vars.add_chunk(minp) -end) - -function minetest.register_on_generated(node_function) - mcl_mapgen_core.register_generator("mod_"..tostring(#registered_generators+1), nil, node_function) -end - -function mcl_mapgen_core.register_generator(id, lvm_function, node_function, priority, needs_param2) - if not id then return end - - local priority = priority or 5000 - - if lvm_function then lvm = lvm + 1 end - if lvm_function then nodes = nodes + 1 end - if needs_param2 then param2 = param2 + 1 end - - local new_record = { - i = priority, - vf = lvm_function, - nf = node_function, - needs_param2 = needs_param2, - } - - registered_generators[id] = new_record - table.sort(registered_generators, function(a, b) - return (a.i < b.i) or ((a.i == b.i) and a.vf and (b.vf == nil)) - end) -end - -function mcl_mapgen_core.unregister_generator(id) - if not registered_generators[id] then return end - local rec = registered_generators[id] - registered_generators[id] = nil - if rec.vf then lvm = lvm - 1 end - if rec.nf then nodes = nodes - 1 end - if rec.needs_param2 then param2 = param2 - 1 end - --if rec.needs_level0 then level0 = level0 - 1 end -end - -- Generate basic layer-based nodes: void, bedrock, realm barrier, lava seas, etc. -- Also perform some basic node replacements. local bedrock_check -if mcl_vars.mg_bedrock_is_rough then +if mcl_mapgen.bedrock_is_rough then function bedrock_check(pos, _, pr) local y = pos.y -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer -- This code assumes a bedrock height of 5 layers. - local diff = mcl_vars.mg_bedrock_overworld_max - y -- Overworld bedrock - local ndiff1 = mcl_vars.mg_bedrock_nether_bottom_max - y -- Nether bedrock, bottom - local ndiff2 = mcl_vars.mg_bedrock_nether_top_max - y -- Nether bedrock, ceiling + local diff = mcl_mapgen.overworld.bedrock_max - y -- Overworld bedrock + local ndiff1 = mcl_mapgen.nether.bedrock_bottom_max - y -- Nether bedrock, bottom + local ndiff2 = mcl_mapgen.nether.bedrock_top_max - y -- Nether bedrock, ceiling local top if diff == 0 or ndiff1 == 0 or ndiff2 == 4 then @@ -1955,239 +1181,96 @@ end -- lvm_used: Set to true if any node in this on_generated has been set before. -- -- returns true if any node was set and lvm_used otherwise -local function set_layers(data, area, content_id, check, min, max, minp, maxp, lvm_used, pr) +local function set_layers(vm_context, pr, min, max, content_id, check) + local minp, maxp, data, area = vm_context.minp, vm_context.maxp, vm_context.data, vm_context.area if (maxp.y >= min and minp.y <= max) then for y = math.max(min, minp.y), math.min(max, maxp.y) do for x = minp.x, maxp.x do for z = minp.z, maxp.z do - local p_pos = area:index(x, y, z) + local p_pos = vm_context.area:index(x, y, z) if check then if type(check) == "function" and check({x=x,y=y,z=z}, data[p_pos], pr) then data[p_pos] = content_id - lvm_used = true + vm_context.write = true elseif check == data[p_pos] then data[p_pos] = content_id - lvm_used = true + vm_context.write = true end else - data[p_pos] = content_id - lvm_used = true + vm_context.data[p_pos] = content_id + vm_context.write = true end end end end end - return lvm_used end --- Below the bedrock, generate air/void -local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) - local biomemap --ymin, ymax - local lvm_used = false +---- Generate layers of air, void, etc +local air_layers = { + {mcl_mapgen.nether.max + 1, mcl_mapgen.nether.max + 128} -- on Nether Roof +} +if flat then + air_layers[#air_layers + 1] = {mcl_mapgen.nether.flat_floor, mcl_mapgen.nether.flat_ceiling} -- Flat Nether +end + +-- Realm barrier between the Overworld void and the End +local barrier_min = mcl_mapgen.realm_barrier_overworld_end_min +local barrier_max = mcl_mapgen.realm_barrier_overworld_end_max + +local void_layers = { + {mcl_mapgen.EDGE_MIN , mcl_mapgen.nether.min - 1 }, -- below Nether + {mcl_mapgen.nether.max + 129, mcl_mapgen.end_.min - 1 }, -- below End (above Nether) + {mcl_mapgen.end_.max + 1 , barrier_min - 1 }, -- below Realm Barrier, above End + {barrier_max + 1 , mcl_mapgen.overworld.min - 1}, -- below Overworld, above Realm Barrier +} + +local bedrock_layers = {} +if not singlenode then + bedrock_layers = { + {mcl_mapgen.overworld.bedrock_min , mcl_mapgen.overworld.bedrock_max }, + {mcl_mapgen.nether.bedrock_bottom_min, mcl_mapgen.nether.bedrock_bottom_max}, + {mcl_mapgen.nether.bedrock_top_min , mcl_mapgen.nether.bedrock_top_max }, + } +end + +mcl_mapgen.register_mapgen_block_lvm(function(vm_context) + local vm, data, area, minp, maxp, chunkseed, blockseed = vm_context.vm, vm_context.data, vm_context.area, vm_context.minp, vm_context.maxp, vm_context.chunkseed, vm_context.blockseed + vm_context.param2_data = vm_context.param2_data or vm:get_param2_data(vm_context.lvm_param2_buffer) + local param2_data = vm_context.param2_data local pr = PseudoRandom(blockseed) - - -- The Void below the Nether: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mapgen_edge_min , mcl_vars.mg_nether_min -1, minp, maxp, lvm_used, pr) - - -- [[ THE NETHER: mcl_vars.mg_nether_min mcl_vars.mg_nether_max ]] - - -- The Air on the Nether roof, https://git.minetest.land/MineClone2/MineClone2/issues/1186 - lvm_used = set_layers(data, area, c_air , nil, mcl_vars.mg_nether_max +1, mcl_vars.mg_nether_max + 128 , minp, maxp, lvm_used, pr) - -- The Void above the Nether below the End: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_nether_max + 128 +1, mcl_vars.mg_end_min -1, minp, maxp, lvm_used, pr) - - -- [[ THE END: mcl_vars.mg_end_min mcl_vars.mg_end_max ]] - - -- The Void above the End below the Realm barrier: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_end_max +1, mcl_vars.mg_realm_barrier_overworld_end_min-1, minp, maxp, lvm_used, pr) - -- Realm barrier between the Overworld void and the End - lvm_used = set_layers(data, area, c_realm_barrier, nil, mcl_vars.mg_realm_barrier_overworld_end_min , mcl_vars.mg_realm_barrier_overworld_end_max , minp, maxp, lvm_used, pr) - -- The Void above Realm barrier below the Overworld: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_realm_barrier_overworld_end_max+1, mcl_vars.mg_overworld_min -1, minp, maxp, lvm_used, pr) - - - if mg_name ~= "singlenode" then - -- Bedrock - lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_overworld_min, mcl_vars.mg_bedrock_overworld_max, minp, maxp, lvm_used, pr) - lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_bottom_min, mcl_vars.mg_bedrock_nether_bottom_max, minp, maxp, lvm_used, pr) - lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_top_min, mcl_vars.mg_bedrock_nether_top_max, minp, maxp, lvm_used, pr) - - -- Flat Nether - if mg_name == "flat" then - lvm_used = set_layers(data, area, c_air, nil, mcl_vars.mg_flat_nether_floor, mcl_vars.mg_flat_nether_ceiling, minp, maxp, lvm_used, pr) - end - + for _, layer in pairs(void_layers) do + set_layers(vm_context, pr, layer[1], layer[2], c_void) + end + for _, layer in pairs(air_layers) do + set_layers(vm_context, pr, layer[1], layer[2], c_air) + end + set_layers(vm_context, pr, barrier_min, barrier_max, c_realm_barrier) + for _, layer in pairs(bedrock_layers) do + set_layers(vm_context, pr, layer[1], layer[2], c_bedrock, bedrock_check) + end + if not singlenode then -- Big lava seas by replacing air below a certain height - if mcl_vars.mg_lava then - lvm_used = set_layers(data, area, c_lava, c_air, mcl_vars.mg_overworld_min, mcl_vars.mg_lava_overworld_max, emin, emax, lvm_used, pr) - lvm_used = set_layers(data, area, c_nether_lava, c_air, mcl_vars.mg_nether_min, mcl_vars.mg_lava_nether_max, emin, emax, lvm_used, pr) - end - - -- Clay, vines, cocoas - lvm_used = generate_clay(minp, maxp, blockseed, data, area, lvm_used) - - biomemap = minetest.get_mapgen_object("biomemap") - lvm_used = generate_tree_decorations(minp, maxp, blockseed, data, data2, area, biomemap, lvm_used, pr) - - ----- Interactive block fixing section ----- - ----- The section to perform basic block overrides of the core mapgen generated world. ----- - - -- Snow and sand fixes. This code implements snow consistency - -- and fixes floating sand and cut plants. - -- A snowy grass block must be below a top snow or snow block at all times. - if minp.y <= mcl_vars.mg_overworld_max and maxp.y >= mcl_vars.mg_overworld_min then - -- v6 mapgen: - if mg_name == "v6" then - - --[[ Remove broken double plants caused by v6 weirdness. - v6 might break the bottom part of double plants because of how it works. - There are 3 possibilities: - 1) Jungle: Top part is placed on top of a jungle tree or fern (=v6 jungle grass). - This is because the schematic might be placed even if some nodes of it - could not be placed because the destination was already occupied. - TODO: A better fix for this would be if schematics could abort placement - altogether if ANY of their nodes could not be placed. - 2) Cavegen: Removes the bottom part, the upper part floats - 3) Mudflow: Same as 2) ]] - local plants = minetest.find_nodes_in_area(minp, maxp, "group:double_plant") - for n = 1, #plants do - local node = vm:get_node_at(plants[n]) - local is_top = minetest.get_item_group(node.name, "double_plant") == 2 - if is_top then - local p_pos = area:index(plants[n].x, plants[n].y-1, plants[n].z) - if p_pos then - node = vm:get_node_at({x=plants[n].x, y=plants[n].y-1, z=plants[n].z}) - local is_bottom = minetest.get_item_group(node.name, "double_plant") == 1 - if not is_bottom then - p_pos = area:index(plants[n].x, plants[n].y, plants[n].z) - data[p_pos] = c_air - lvm_used = true - end - end - end - end - - - -- Non-v6 mapgens: - else - -- Set param2 (=color) of grass blocks. - -- Clear snowy grass blocks without snow above to ensure consistency. - local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}) - - -- Flat area at y=0 to read biome 3 times faster than 5.3.0.get_biome_data(pos).biome: 43us vs 125us per iteration: - local aream = VoxelArea:new({MinEdge={x=minp.x, y=0, z=minp.z}, MaxEdge={x=maxp.x, y=0, z=maxp.z}}) - for n=1, #nodes do - local n = nodes[n] - local p_pos = area:index(n.x, n.y, n.z) - local p_pos_above = area:index(n.x, n.y+1, n.z) - --local p_pos_below = area:index(n.x, n.y-1, n.z) - local b_pos = aream:index(n.x, 0, n.z) - local bn = minetest.get_biome_name(biomemap[b_pos]) - if bn then - local biome = minetest.registered_biomes[bn] - if biome and biome._mcl_biome_type then - data2[p_pos] = biome._mcl_palette_index - lvm_used = true - end - end - if data[p_pos] == c_dirt_with_grass_snow and p_pos_above and data[p_pos_above] ~= c_top_snow and data[p_pos_above] ~= c_snow_block then - data[p_pos] = c_dirt_with_grass - lvm_used = true - end - end - - end - - -- Nether block fixes: - -- * Replace water with Nether lava. - -- * Replace stone, sand dirt in v6 so the Nether works in v6. - elseif emin.y <= mcl_vars.mg_nether_max and emax.y >= mcl_vars.mg_nether_min then - if mg_name == "v6" then - local nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) - for n=1, #nodes do - local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) - if data[p_pos] == c_water then - data[p_pos] = c_nether_lava - lvm_used = true - elseif data[p_pos] == c_stone then - data[p_pos] = c_netherrack - lvm_used = true - elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then - data[p_pos] = c_soul_sand - lvm_used = true - end - end - else - local nodes = minetest.find_nodes_in_area(emin, emax, {"group:water"}) - for _, n in pairs(nodes) do - data[area:index(n.x, n.y, n.z)] = c_nether_lava - end - end - - -- End block fixes: - -- * Replace water with end stone or air (depending on height). - -- * Remove stone, sand, dirt in v6 so our End map generator works in v6. - -- * Generate spawn platform (End portal destination) - elseif minp.y <= mcl_vars.mg_end_max and maxp.y >= mcl_vars.mg_end_min then - local nodes - if mg_name == "v6" then - nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) - else - nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source"}) - end - if #nodes > 0 then - lvm_used = true - for _,n in pairs(nodes) do - data[area:index(n.x, n.y, n.z)] = c_air - end - end - - -- Obsidian spawn platform - if minp.y <= mcl_vars.mg_end_platform_pos.y and maxp.y >= mcl_vars.mg_end_platform_pos.y and - minp.x <= mcl_vars.mg_end_platform_pos.x and maxp.x >= mcl_vars.mg_end_platform_pos.z and - minp.z <= mcl_vars.mg_end_platform_pos.z and maxp.z >= mcl_vars.mg_end_platform_pos.z then - - --local pos1 = {x = math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), y = math.max(minp.y, mcl_vars.mg_end_platform_pos.y), z = math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2)} - --local pos2 = {x = math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2), y = math.min(maxp.y, mcl_vars.mg_end_platform_pos.y+2), z = math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2)} - - for x=math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2) do - for z=math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2), math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2) do - for y=math.max(minp.y, mcl_vars.mg_end_platform_pos.y), math.min(maxp.y, mcl_vars.mg_end_platform_pos.y+2) do - local p_pos = area:index(x, y, z) - if y == mcl_vars.mg_end_platform_pos.y then - data[p_pos] = c_obsidian - else - data[p_pos] = c_air - end - end - end - end - lvm_used = true + if mcl_mapgen.lava then + set_layers(vm_context, pr, mcl_mapgen.overworld.min, mcl_mapgen.overworld.lava_max, c_lava, c_air) + if c_nether then + set_layers(vm_context, pr, mcl_mapgen.nether.min, mcl_mapgen.nether.lava_max, c_nether.lava, c_air) end end end +end, 1) - -- Final hackery: Set sun light level in the End. - -- -26912 is at a mapchunk border. - local shadow = true - if minp.y >= -26912 and maxp.y <= mcl_vars.mg_end_max then - vm:set_lighting({day=15, night=15}) - lvm_used = true - end - if minp.y >= mcl_vars.mg_end_min and maxp.y <= -26911 then - shadow = false - lvm_used = true - end +local modpath = minetest.get_modpath(minetest.get_current_modname()) - if mg_name ~= "singlenode" then - -- Generate special decorations - generate_underground_mushrooms(minp, maxp, blockseed) - generate_nether_decorations(minp, maxp, blockseed) - generate_structures(minp, maxp, blockseed, biomemap) - end - - return lvm_used, shadow +dofile(modpath .. "/clay.lua") +dofile(modpath .. "/tree_decoration.lua") +dofile(modpath .. "/nether_wart.lua") +dofile(modpath .. "/light.lua") +if v6 then + dofile(modpath .. "/v6.lua") +elseif not singlenode then + dofile(modpath .. "/biomes.lua") +end +if not singlenode and c_nether then + dofile(modpath .. "/nether.lua") end - -mcl_mapgen_core.register_generator("main", basic, nil, 1, true) - diff --git a/mods/MAPGEN/mcl_mapgen_core/light.lua b/mods/MAPGEN/mcl_mapgen_core/light.lua new file mode 100644 index 000000000..a0b503352 --- /dev/null +++ b/mods/MAPGEN/mcl_mapgen_core/light.lua @@ -0,0 +1,41 @@ +-- Nether Light: +mcl_mapgen.register_mapgen_block_lvm(function(vm_context) + local minp = vm_context.minp + local miny = minp.y + if miny > mcl_mapgen.nether.max then return end + local maxp = vm_context.maxp + local maxy = maxp.y + if maxy < mcl_mapgen.nether.min then return end + local p1 = {x = minp.x, y = math.max(miny, mcl_mapgen.nether.min), z = minp.z} + local p2 = {x = maxp.x, y = math.min(maxy, mcl_mapgen.nether.max), z = maxp.z} + vm_context.vm:set_lighting({day = 3, night = 4}, p1, p2) + vm_context.write = true +end, 999999999) + +-- Nether Roof Light: +mcl_mapgen.register_mapgen_block_lvm(function(vm_context) + local minp = vm_context.minp + local miny = minp.y + if miny > mcl_mapgen.nether.max+127 then return end + local maxp = vm_context.maxp + local maxy = maxp.y + if maxy <= mcl_mapgen.nether.max then return end + local p1 = {x = minp.x, y = math.max(miny, mcl_mapgen.nether.max + 1), z = minp.z} + local p2 = {x = maxp.x, y = math.min(maxy, mcl_mapgen.nether.max + 127), z = maxp.z} + vm_context.vm:set_lighting({day = 15, night = 15}, p1, p2) + vm_context.write = true +end, 999999999) + +-- End Light: +mcl_mapgen.register_mapgen_block_lvm(function(vm_context) + local minp = vm_context.minp + local miny = minp.y + if miny > mcl_mapgen.end_.max then return end + local maxp = vm_context.maxp + local maxy = maxp.y + if maxy <= mcl_mapgen.end_.min then return end + local p1 = {x = minp.x, y = math.max(miny, mcl_mapgen.end_.min), z = minp.z} + local p2 = {x = maxp.x, y = math.min(maxy, mcl_mapgen.end_.max), z = maxp.z} + vm_context.vm:set_lighting({day=15, night=15}, p1, p2) + vm_context.write = true +end, 9999999999) diff --git a/mods/MAPGEN/mcl_mapgen_core/mod.conf b/mods/MAPGEN/mcl_mapgen_core/mod.conf index 9f7d9ebaa..11f51e252 100644 --- a/mods/MAPGEN/mcl_mapgen_core/mod.conf +++ b/mods/MAPGEN/mcl_mapgen_core/mod.conf @@ -1,5 +1,5 @@ name = mcl_mapgen_core author = Wuzzy description = The core of the MCL2 mapgen -depends = mcl_init, mcl_core, biomeinfo, mcl_worlds, mcl_cocoas, mcl_sponges, mcl_ocean, mcl_stairs, mcl_monster_eggs, mcl_structures -optional_depends = mclx_core +depends = mcl_mapgen, mcl_init, mcl_core, biomeinfo, mcl_worlds +optional_depends = mclx_core, mcl_cocoas, mcl_sponges, mcl_ocean, mcl_stairs, mcl_monster_eggs, mcl_structures, mcl_flowers, mcl_farming, mcl_mushrooms, mcl_nether diff --git a/mods/MAPGEN/mcl_mapgen_core/nether.lua b/mods/MAPGEN/mcl_mapgen_core/nether.lua new file mode 100644 index 000000000..ec75c80a2 --- /dev/null +++ b/mods/MAPGEN/mcl_mapgen_core/nether.lua @@ -0,0 +1,132 @@ +local v6 = mcl_mapgen.v6 + +local mcl_mushrooms = minetest.get_modpath("mcl_mushrooms") + +local c_water = minetest.get_content_id("mcl_core:water_source") +local c_stone = minetest.get_content_id("mcl_core:stone") +local c_sand = minetest.get_content_id("mcl_core:sand") +local c_dirt = minetest.get_content_id("mcl_core:dirt") + +local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") +local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") +local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") + +-- Generate mushrooms in caves manually. +-- Minetest's API does not support decorations in caves yet. :-( +local function generate_underground_mushrooms(minp, maxp, seed) + if not mcl_mushrooms then return end + + local pr_shroom = PseudoRandom(seed-24359) + -- Generate rare underground mushrooms + -- TODO: Make them appear in groups, use Perlin noise + local min, max = mcl_mapgen.overworld.lava_max + 4, 0 + if minp.y > max or maxp.y < min then + return + end + + local bpos + local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"}) + + for n = 1, #stone do + bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z } + + local l = minetest.get_node_light(bpos, 0.5) + if bpos.y >= min and bpos.y <= max and l and l <= 12 and pr_shroom:next(1,1000) < 4 then + if pr_shroom:next(1,2) == 1 then + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + else + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + end + end + end +end + +-- Generate Nether decorations manually: Eternal fire, mushrooms +-- Minetest's API does not support decorations in caves yet. :-( +local function generate_nether_decorations(minp, maxp, seed) + local pr_nether = PseudoRandom(seed+667) + + if minp.y > mcl_mapgen.nether.max or maxp.y < mcl_mapgen.nether.min then + return + end + + minetest.log("action", "[mcl_mapgen_core] Nether decorations " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp)) + + -- TODO: Generate everything based on Perlin noise instead of PseudoRandom + + local bpos + local rack = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:netherrack"}) + local magma = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:magma"}) + local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"}) + + -- Helper function to spawn “fake” decoration + local function special_deco(nodes, spawn_func) + for n = 1, #nodes do + bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z } + + spawn_func(bpos) + end + + end + + -- Eternal fire on netherrack + special_deco(rack, function(bpos) + -- Eternal fire on netherrack + if pr_nether:next(1,100) <= 3 then + minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + end + end) + + -- Eternal fire on magma cubes + special_deco(magma, function(bpos) + if pr_nether:next(1,150) == 1 then + minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + end + end) + + -- Mushrooms on netherrack + -- Note: Spawned *after* the fire because of light level checks + if mcl_mushrooms then + special_deco(rack, function(bpos) + local l = minetest.get_node_light(bpos, 0.5) + if bpos.y > mcl_mapgen.nether.lava_max + 6 and l and l <= 12 and pr_nether:next(1,1000) <= 4 then + -- TODO: Make mushrooms appear in groups, use Perlin noise + if pr_nether:next(1,2) == 1 then + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + else + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + end + end + end) + end +end + +mcl_mapgen.register_mapgen(function(minp, maxp, seed, vm_context) + local min_y, max_y = minp.y, maxp.y + + -- Nether block fixes: + -- * Replace water with Nether lava. + -- * Replace stone, sand dirt in v6 so the Nether works in v6. + if min_y > mcl_mapgen.nether.max or max_y < mcl_mapgen.nether.min then return end + if v6 then + local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + if #nodes < 1 then return end + vm_context.write = true + local data = vm_context.data + local area = vm_context.area + for n = 1, #nodes do + local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) + if data[p_pos] == c_water then + data[p_pos] = c_nether_lava + elseif data[p_pos] == c_stone then + data[p_pos] = c_netherrack + elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then + data[p_pos] = c_soul_sand + end + end + else + end + + generate_underground_mushrooms(minp, maxp, seed) + generate_nether_decorations(minp, maxp, seed) +end, 1) diff --git a/mods/MAPGEN/mcl_mapgen_core/nether_wart.lua b/mods/MAPGEN/mcl_mapgen_core/nether_wart.lua new file mode 100644 index 000000000..10554e7c4 --- /dev/null +++ b/mods/MAPGEN/mcl_mapgen_core/nether_wart.lua @@ -0,0 +1,57 @@ +local nether_wart_chance +if mcl_mapgen.v6 then + nether_wart_chance = 85 +else + nether_wart_chance = 170 +end + +local y_min = mcl_mapgen.nether.min +local y_max = mcl_mapgen.nether.max +local place_on = {"group:soil_nether_wart"} + +local block_size = mcl_mapgen.BS +local decrease_search_area = math.min(2, math.floor(block_size/2)) +local search_area_size = math.max(block_size - 2 * decrease_search_area, math.max(1, math.ceil(nether_wart_chance^(1/3)))) +nether_wart_chance = math.floor(nether_wart_chance * (search_area_size^3) / (block_size^3)) +local nether_wart_chance_threshold = nether_wart_chance +local minetest_swap_node = minetest.swap_node + +local wart_perlin +local noise_params = { + offset = 0.4, + scale = 0.4, + spread = {x = block_size, y = block_size, z = block_size}, + seed = 238742, + octaves = 1, + persist = 0.5, +} + +minetest.log("action", "Nether Wart block_size=" .. block_size .. ", search_area_size=" .. search_area_size .. ", per-area nether_wart_chance=" .. nether_wart_chance) + +local minetest_find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air +local minetest_get_perlin = minetest.get_perlin + +mcl_mapgen.register_mapgen_block(function(minp, maxp, seed) + local minp = minp + local y1 = minp.y + if y1 > y_max then return end + + local maxp = maxp + local y2 = maxp.y + if y2 < y_min then return end + + local p1 = {x = minp.x + decrease_search_area, y = y1 + decrease_search_area, z = minp.z + decrease_search_area} + local p2 = {x = maxp.x - decrease_search_area, y = y2 - decrease_search_area, z = maxp.z - decrease_search_area} + + local pos_list = minetest_find_nodes_in_area_under_air(p1, p2, place_on) + local pr = PseudoRandom(seed) + wart_perlin = wart_perlin or minetest_get_perlin(noise_params) + + for i = 1, #pos_list do + local pos = pos_list[i] + if pr:next(1, nether_wart_chance) + wart_perlin:get_3d(pos) >= nether_wart_chance_threshold then + pos.y = pos.y + 1 + minetest.swap_node(pos, {name = "mcl_nether:nether_wart"}) + end + end +end, 999999999) diff --git a/mods/MAPGEN/mcl_mapgen_core/tree_decoration.lua b/mods/MAPGEN/mcl_mapgen_core/tree_decoration.lua new file mode 100644 index 000000000..5cdcd023e --- /dev/null +++ b/mods/MAPGEN/mcl_mapgen_core/tree_decoration.lua @@ -0,0 +1,251 @@ +-- Generate tree decorations in the bounding box. This adds: +-- * Cocoa at jungle trees +-- * Jungle tree vines +-- * Oak vines in swamplands + +local minetest_find_nodes_in_area = minetest.find_nodes_in_area +local minetest_find_node_near = minetest.find_node_near +local minetest_get_node_light = minetest.get_node_light +local minetest_dir_to_facedir = minetest.dir_to_facedir +local minetest_dir_to_wallmounted = minetest.dir_to_wallmounted +local table_copy = table.copy +local vector_subtract = vector.subtract +local vector_add = vector.add +local math_max = math.max +local math_ceil = math.ceil +local math_abs = math.abs + +local c_air = minetest.CONTENT_AIR +local c_cocoas +local c_jungleleaves = minetest.get_content_id("mcl_core:jungleleaves") +local c_leaves = minetest.get_content_id("mcl_core:leaves") +local c_vine = minetest.get_content_id("mcl_core:vine") + +if minetest.get_modpath("mcl_cocoas") then + c_cocoas = { + minetest.get_content_id("mcl_cocoas:cocoa_1"), + minetest.get_content_id("mcl_cocoas:cocoa_2"), + minetest.get_content_id("mcl_cocoas:cocoa_3"), + } +end + +local swampland +local swampland_shore +local jungle +local jungle_shore +local jungle_m +local jungle_m_shore +local jungle_edge +local jungle_edge_shore +local jungle_edge_m +local jungle_edge_m_shore + +local perlin_vines, perlin_vines_fine, perlin_vines_upwards, perlin_vines_length, perlin_vines_density + +local dirs = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1}, +} + +local function generate_tree_decorations(vm_context) + local maxp = vm_context.maxp + if maxp.y < 0 then return end + local minp = vm_context.minp + + local data = vm_context.data + vm_context.param2_data = vm_context.param2_data or vm_context.vm:get_param2_data(vm_context.lvm_param2_buffer) + local param2_data = vm_context.param2_data + local area = vm_context.area + + local biomemap = vm_context.biomemap + + local pr = PseudoRandom(vm_context.chunkseed) + + local oaktree, oakleaves, jungletree, jungleleaves = {}, {}, {}, {} + + -- Modifier for Jungle M biome: More vines and cocoas + local dense_vegetation = false + + if biomemap then + swampland = swampland or minetest.get_biome_id("Swampland") + swampland_shore = swampland_shore or minetest.get_biome_id("Swampland_shore") + jungle = jungle or minetest.get_biome_id("Jungle") + jungle_shore = jungle_shore or minetest.get_biome_id("Jungle_shore") + jungle_m = jungle_m or minetest.get_biome_id("JungleM") + jungle_m_shore = jungle_m_shore or minetest.get_biome_id("JungleM_shore") + jungle_edge = jungle_edge or minetest.get_biome_id("JungleEdge") + jungle_edge_shore = jungle_edge_shore or minetest.get_biome_id("JungleEdge_shore") + jungle_edge_m = jungle_edge_m or minetest.get_biome_id("JungleEdgeM") + jungle_edge_m_shore = jungle_edge_m_shore or minetest.get_biome_id("JungleEdgeM_shore") + + -- Biome map available: Check if the required biome (jungle or swampland) + -- is in this mapchunk. We are only interested in trees in the correct biome. + -- The nodes are added if the correct biome is *anywhere* in the mapchunk. + -- TODO: Strictly generate vines in the correct biomes only. + local swamp_biome_found, jungle_biome_found = false, false + for b=1, #biomemap do + local id = biomemap[b] + + if not swamp_biome_found and (id == swampland or id == swampland_shore) then + oaktree = minetest_find_nodes_in_area(minp, maxp, {"mcl_core:tree"}) + oakleaves = minetest_find_nodes_in_area(minp, maxp, {"mcl_core:leaves"}) + swamp_biome_found = true + end + if not jungle_biome_found and (id == jungle or id == jungle_shore or id == jungle_m or id == jungle_m_shore or id == jungle_edge or id == jungle_edge_shore or id == jungle_edge_m or id == jungle_edge_m_shore) then + jungletree = minetest_find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) + jungleleaves = minetest_find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) + jungle_biome_found = true + end + if not dense_vegetation and (id == jungle_m or id == jungle_m_shore) then + dense_vegetation = true + end + if swamp_biome_found and jungle_biome_found and dense_vegetation then + break + end + end + else + -- If there is no biome map, we just count all jungle things we can find. + -- Oak vines will not be generated. + jungletree = minetest_find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) + jungleleaves = minetest_find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) + end + + local pos, treepos, dir + + if c_cocoas then + local cocoachance = 40 + if dense_vegetation then + cocoachance = 32 + end + + -- Pass 1: Generate cocoas at jungle trees + for n = 1, #jungletree do + + pos = table_copy(jungletree[n]) + treepos = table_copy(pos) + + if minetest_find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then + + dir = pr:next(1, cocoachance) + + if dir == 1 then + pos.z = pos.z + 1 + elseif dir == 2 then + pos.z = pos.z - 1 + elseif dir == 3 then + pos.x = pos.x + 1 + elseif dir == 4 then + pos.x = pos.x -1 + end + + local p_pos = area:index(pos.x, pos.y, pos.z) + local l = minetest_get_node_light(pos) + + if dir < 5 + and data[p_pos] == c_air + and l and l > 12 then + local c = pr:next(1, 3) + data[p_pos] = c_cocoas[c] + vm_context.write = true + param2_data[p_pos] = minetest_dir_to_facedir(vector_subtract(treepos, pos)) + vm_context.write_param2 = true + end + end + end + end + + -- Pass 2: Generate vines at jungle wood, jungle leaves in jungle and oak wood, oak leaves in swampland + perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) + perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) + perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) + perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) + perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) + + -- Extra long vines in Jungle M + local maxvinelength = 7 + if dense_vegetation then + maxvinelength = 14 + end + local treething + for i=1, 4 do + if i==1 then + treething = jungletree + elseif i == 2 then + treething = jungleleaves + elseif i == 3 then + treething = oaktree + elseif i == 4 then + treething = oakleaves + end + + for n = 1, #treething do + pos = treething[n] + + treepos = table_copy(pos) + + for d = 1, #dirs do + local pos = vector_add(pos, dirs[d]) + local p_pos = area:index(pos.x, pos.y, pos.z) + + local vine_threshold = math_max(0.33333, perlin_vines_density:get_2d(pos)) + if dense_vegetation then + vine_threshold = vine_threshold * (2/3) + end + + if perlin_vines:get_2d(pos) > -1.0 and perlin_vines_fine:get_3d(pos) > vine_threshold and data[p_pos] == c_air then + + local rdir = {} + rdir.x = -dirs[d].x + rdir.y = dirs[d].y + rdir.z = -dirs[d].z + local param2 = minetest_dir_to_wallmounted(rdir) + + -- Determine growth direction + local grow_upwards = false + -- Only possible on the wood, not on the leaves + if i == 1 then + grow_upwards = perlin_vines_upwards:get_3d(pos) > 0.8 + end + if grow_upwards then + -- Grow vines up 1-4 nodes, even through jungleleaves. + -- This may give climbing access all the way to the top of the tree :-) + -- But this will be fairly rare. + local length = math_ceil(math_abs(perlin_vines_length:get_3d(pos)) * 4) + for l=0, length-1 do + local t_pos = area:index(treepos.x, treepos.y, treepos.z) + + if (data[p_pos] == c_air or data[p_pos] == c_jungleleaves or data[p_pos] == c_leaves) and mcl_core.supports_vines(minetest.get_name_from_content_id(data[t_pos])) then + data[p_pos] = c_vine + param2_data[p_pos] = param2 + vm_context.write = true + else + break + end + pos.y = pos.y + 1 + p_pos = area:index(pos.x, pos.y, pos.z) + treepos.y = treepos.y + 1 + end + else + -- Grow vines down, length between 1 and maxvinelength + local length = math_ceil(math_abs(perlin_vines_length:get_3d(pos)) * maxvinelength) + for l=0, length-1 do + if data[p_pos] == c_air then + data[p_pos] = c_vine + param2_data[p_pos] = param2 + vm_context.write = true + else + break + end + pos.y = pos.y - 1 + p_pos = area:index(pos.x, pos.y, pos.z) + end + end + end + end + end + end +end + +mcl_mapgen.register_on_generated(generate_tree_decorations, 0) diff --git a/mods/MAPGEN/mcl_mapgen_core/v6.lua b/mods/MAPGEN/mcl_mapgen_core/v6.lua new file mode 100644 index 000000000..19fd44647 --- /dev/null +++ b/mods/MAPGEN/mcl_mapgen_core/v6.lua @@ -0,0 +1,49 @@ +local c_air = minetest.CONTENT_AIR + +mcl_mapgen.register_on_generated(function(vm_context) + local minp, maxp = vm_context.minp, vm_context.maxp + + if minp.y <= mcl_mapgen.end_.max and maxp.y >= mcl_mapgen.end_.min then + local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + if #nodes > 0 then + for _, n in pairs(nodes) do + data[area:index(n.x, n.y, n.z)] = c_air + end + end + vm_context.write = true + return + end + + + if minp.y > mcl_mapgen.overworld.max or maxp.y < mcl_mapgen.overworld.min then return end + local vm, data, area = vm_context.vm, vm_context.data, vm_context.area + + --[[ Remove broken double plants caused by v6 weirdness. + v6 might break the bottom part of double plants because of how it works. + There are 3 possibilities: + 1) Jungle: Top part is placed on top of a jungle tree or fern (=v6 jungle grass). + This is because the schematic might be placed even if some nodes of it + could not be placed because the destination was already occupied. + TODO: A better fix for this would be if schematics could abort placement + altogether if ANY of their nodes could not be placed. + 2) Cavegen: Removes the bottom part, the upper part floats + 3) Mudflow: Same as 2) ]] + local plants = minetest.find_nodes_in_area(minp, maxp, "group:double_plant") + for n = 1, #plants do + local node = vm:get_node_at(plants[n]) + local is_top = minetest.get_item_group(node.name, "double_plant") == 2 + if is_top then + local p_pos = area:index(plants[n].x, plants[n].y-1, plants[n].z) + if p_pos then + node = vm:get_node_at({x=plants[n].x, y=plants[n].y-1, z=plants[n].z}) + local is_bottom = minetest.get_item_group(node.name, "double_plant") == 1 + if not is_bottom then + p_pos = area:index(plants[n].x, plants[n].y, plants[n].z) + data[p_pos] = c_air + vm_context.write = true + end + end + end + end + +end, 999999999) diff --git a/mods/MAPGEN/mcl_ocean_monument/init.lua b/mods/MAPGEN/mcl_ocean_monument/init.lua new file mode 100644 index 000000000..44dcabb7c --- /dev/null +++ b/mods/MAPGEN/mcl_ocean_monument/init.lua @@ -0,0 +1,102 @@ +local chance_per_chunk = 5 +local noise_multiplier = 1 +local random_offset = 12342 +local struct_threshold = chance_per_chunk +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local mcl_mapgen_get_far_node = mcl_mapgen.get_far_node +local minetest_log = minetest.log +local minetest_place_schematic = minetest.place_schematic +local minetest_pos_to_string = minetest.pos_to_string +local minetest_swap_node = minetest.swap_node + +local path = minetest.get_modpath("mcl_ocean_monument") .. "/schematics/ocean_monument.mts" + +local water = "mcl_core:water_source" +local air = "air" +local ice = "mcl_core:ice" + +local leg_materials = { + "mcl_ocean:prismarine_brick", + "mcl_ocean:prismarine", +} +local what_we_can_replace_by_legs = { + water, + air, + "mcl_core:water_flowing", + "mcl_core:stone", +} + +local leg_search_quick_index = {} +for _, v in pairs(leg_materials) do + leg_search_quick_index[v] = true +end + +local leg_replace_quick_index = {} +for _, v in pairs(what_we_can_replace_by_legs) do + leg_replace_quick_index[v] = true +end + +local y_wanted = mcl_mapgen.OFFSET_NODES -- supposed to be -32 +local y_bottom = mcl_mapgen.overworld.min -- -62 + +mcl_mapgen.register_mapgen(function(minp, maxp, seed) + local minp = minp + local y = minp.y + if y ~= y_wanted then return end + + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if not noise or (random_number + noise) < struct_threshold then return end + + local x, z = minp.x, minp.z + + -- scan the ocean - it should be the ocean: + for i = 1, pr:next(10, 100) do + local pos = {x = pr:next(15, 64) + x, y = pr:next(0, 25) - 25, z = pr:next(15, 64) + z} + local node_name = mcl_mapgen_get_far_node(pos).name + if node_name ~= water then return end + end + + -- scan nodes above water level - there should be the air: + for i = 1, pr:next(10, 100) do + local pos = {x = pr:next(0, 79) + x, y = 2, z = pr:next(0,79) + z} + local node_name = mcl_mapgen_get_far_node(pos).name + if node_name ~= air then return end + end + + -- scan ocean surface - allow only water and ice: + for i = 1, pr:next(10,100) do + local pos = {x=pr:next(0, 79)+x, y=1, z=pr:next(0,79)+z} + local node_name = mcl_mapgen_get_far_node(pos).name + if node_name ~= water and node_name ~= ice then return end + end + + -- random rotation: + local rotation = pr:next(0, 3) + local rotation_str = tostring(rotation * 90) + minetest_place_schematic(minp, path, rotation_str, nil, true) + + -- search prismarine legs at base level and continue them up to the bottom: + for x = x, maxp.x do + for z = z, maxp.z do + local pos = {x = x, y = y, z = z} + local node_name = mcl_mapgen_get_far_node(pos).name + if leg_search_quick_index[node_name] then + local node_leg = {name = node_name} + for y = y - 1, y_bottom, -1 do + pos.y = y + local next_name = mcl_mapgen_get_far_node(pos).name + if not leg_replace_quick_index[next_name] then + break + end + minetest_swap_node(pos, node_leg) + end + end + end + end + + minetest_log("action", "[mcl_ocean_monument] Placed at " .. minetest_pos_to_string(minp) .. ", " .. rotation_str .. " deg.") + +end, mcl_mapgen.order.OCEAN_MONUMENT) diff --git a/mods/MAPGEN/mcl_ocean_monument/mod.conf b/mods/MAPGEN/mcl_ocean_monument/mod.conf new file mode 100644 index 000000000..945a81166 --- /dev/null +++ b/mods/MAPGEN/mcl_ocean_monument/mod.conf @@ -0,0 +1,4 @@ +name = mcl_ocean_monument +author = TrashPanda +description = Adds Ocean Monument, https://git.minetest.land/MineClone2/MineClone2/issues/958#issuecomment-14102 +depends = mcl_mapgen, mcl_structures diff --git a/mods/MAPGEN/mcl_ocean_monument/schematics/ocean_monument.mts b/mods/MAPGEN/mcl_ocean_monument/schematics/ocean_monument.mts new file mode 100644 index 000000000..f94b808b5 Binary files /dev/null and b/mods/MAPGEN/mcl_ocean_monument/schematics/ocean_monument.mts differ diff --git a/mods/MAPGEN/mcl_strongholds/init.lua b/mods/MAPGEN/mcl_strongholds/init.lua deleted file mode 100644 index 083172a3c..000000000 --- a/mods/MAPGEN/mcl_strongholds/init.lua +++ /dev/null @@ -1,106 +0,0 @@ --- Generate strongholds. - --- A total of 128 strongholds are generated in rings around the world origin. --- This is the list of rings, starting with the innermost ring first. -local stronghold_rings = { - -- amount: Number of strongholds in ring. - -- min, max: Minimum and maximum distance from (X=0, Z=0). - { amount = 3, min = 1408, max = 2688 }, - { amount = 6, min = 4480, max = 5760 }, - { amount = 10, min = 7552, max = 8832 }, - { amount = 15, min = 10624, max = 11904 }, - { amount = 21, min = 13696, max = 14976 }, - { amount = 28, min = 16768, max = 18048 }, - { amount = 36, min = 19840, max = 21120 }, - { amount = 9, min = 22912, max = 24192 }, -} - -local strongholds = {} -local strongholds_inited = false - -local mg_name = minetest.get_mapgen_setting("mg_name") -local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" - --- Determine the stronghold positions and store them into the strongholds table. --- The stronghold positions are based on the world seed. --- The actual position might be offset by a few blocks because it might be shifted --- to make sure the end portal room is completely within the boundaries of a mapchunk. -local function init_strongholds() - if strongholds_inited then - return - end - -- Don't generate strongholds in singlenode - if mg_name == "singlenode" then - strongholds_inited = true - return - end - local seed = tonumber(minetest.get_mapgen_setting("seed")) - local pr = PseudoRandom(seed) - for s=1, #stronghold_rings do - local ring = stronghold_rings[s] - - -- Get random angle - local angle = pr:next() - -- Scale angle to 0 .. 2*math.pi - angle = (angle / 32767) * (math.pi*2) - for a=1, ring.amount do - local dist = pr:next(ring.min, ring.max) - local y - if superflat then - y = mcl_vars.mg_bedrock_overworld_max + 3 - else - y = pr:next(mcl_vars.mg_bedrock_overworld_max+1, mcl_vars.mg_overworld_min+48) - end - local pos = { x = math.cos(angle) * dist, y = y, z = math.sin(angle) * dist } - pos = vector.round(pos) - table.insert(strongholds, { pos = pos, generated = false }) - - -- Rotate angle by (360 / amount) degrees. - -- This will cause the angles to be evenly distributed in the stronghold ring - angle = math.fmod(angle + ((math.pi*2) / ring.amount), math.pi*2) - end - end - - mcl_structures.register_structures("stronghold", table.copy(strongholds)) - - strongholds_inited = true -end - --- Stronghold generation for register_on_generated. -local function generate_strongholds(minp, maxp, blockseed) - local pr = PseudoRandom(blockseed) - for s=1, #strongholds do - if not strongholds[s].generated then - local pos = strongholds[s].pos - if minp.x <= pos.x and maxp.x >= pos.x and minp.z <= pos.z and maxp.z >= pos.z and minp.y <= pos.y and maxp.y >= pos.y then - -- Make sure the end portal room is completely within the current mapchunk - -- The original pos is changed intentionally. - if pos.x - 6 < minp.x then - pos.x = minp.x + 7 - end - if pos.x + 6 > maxp.x then - pos.x = maxp.x - 7 - end - if pos.y - 4 < minp.y then - pos.y = minp.y + 5 - end - if pos.y + 4 > maxp.y then - pos.y = maxp.y - 5 - end - if pos.z - 6 < minp.z then - pos.z = minp.z + 7 - end - if pos.z + 6 > maxp.z then - pos.z = maxp.z - 7 - end - - mcl_structures.call_struct(pos, "end_portal_shrine", nil, pr) - strongholds[s].generated = true - end - end - end -end - -init_strongholds() - -mcl_mapgen_core.register_generator("strongholds", nil, generate_strongholds, 999999) diff --git a/mods/MAPGEN/mcl_strongholds/mod.conf b/mods/MAPGEN/mcl_strongholds/mod.conf deleted file mode 100644 index 8edec9a51..000000000 --- a/mods/MAPGEN/mcl_strongholds/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_strongholds -author = Wuzzy -description = Generates strongholds with end portals in the Overworld -depends = mcl_init, mcl_structures, mcl_mapgen_core diff --git a/mods/MAPGEN/mcl_structures/desert_temple.lua b/mods/MAPGEN/mcl_structures/desert_temple.lua new file mode 100644 index 000000000..eb1950b18 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/desert_temple.lua @@ -0,0 +1,174 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 11 +local noise_multiplier = 1 +local random_offset = 999 +local scanning_ratio = 0.00003 +local struct_threshold = chance_per_chunk + +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local node_list = {"mcl_core:sand", "mcl_core:sandstone", "mcl_core:redsand", "mcl_colorblocks:hardened_clay_orange"} + +local schematic_file = modpath .. "/schematics/mcl_structures_desert_temple.mts" + +local temple_schematic_lua = minetest.serialize_schematic(schematic_file, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" +local temple_schematic = loadstring(temple_schematic_lua)() + +local red_temple_schematic_lua = minetest.serialize_schematic(schematic_file, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" +red_temple_schematic_lua = red_temple_schematic_lua:gsub("mcl_colorblocks:hardened_clay_orange", "mcl_colorblocks:hardened_clay_red") +red_temple_schematic_lua = red_temple_schematic_lua:gsub("mcl_core:sand_stone", "mcl_colorblocks:hardened_clay_orange") +red_temple_schematic_lua = red_temple_schematic_lua:gsub("mcl_core:sand", "mcl_core:redsand") +red_temple_schematic_lua = red_temple_schematic_lua:gsub("mcl_stairs:stair_sandstone", "mcl_stairs:stair_redsandstone") +red_temple_schematic_lua = red_temple_schematic_lua:gsub("mcl_stairs:slab_sandstone", "mcl_stairs:slab_redsandstone") +red_temple_schematic_lua = red_temple_schematic_lua:gsub("mcl_colorblocks:hardened_clay_yellow", "mcl_colorblocks:hardened_clay_pink") +local red_temple_schematic = loadstring(red_temple_schematic_lua)() + +local function on_placed(p1, rotation, pr, size) + local p2 = {x = p1.x + size.x - 1, y = p1.y + size.y - 1, z = p1.z + size.z - 1} + -- Delete cacti leftovers: + local cactus_nodes = minetest.find_nodes_in_area_under_air({x = p1.x, y = p1.y + 11, z = p1.z}, {x = p2.x, y = p2.y - 2, z = p2.z}, "mcl_core:cactus", false) + for _, pos in pairs(cactus_nodes) do + local node_below = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + local nn = node_below.name + if nn == "mcl_core:sandstone" then + minetest.swap_node(pos, {name="air"}) + end + end + + -- Find chests. + local chests = minetest.find_nodes_in_area(p1, {x = p2.x, y = p1.y + 5, z = p2.z}, "mcl_chests:chest") + + -- Add desert temple loot into chests + for c=1, #chests do + local lootitems = mcl_loot.get_multi_loot({ + { + stacks_min = 2, + stacks_max = 4, + items = { + { itemstring = "mcl_mobitems:bone", weight = 25, amount_min = 4, amount_max=6 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 25, amount_min = 3, amount_max=7 }, + { itemstring = "mcl_mobitems:spider_eye", weight = 25, amount_min = 1, amount_max=3 }, + { itemstring = "mcl_books:book", weight = 20, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_mobitems:saddle", weight = 20, }, + { itemstring = "mcl_core:apple_gold", weight = 20, }, + { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, + { itemstring = "mcl_core:iron_ingot", weight = 15, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:emerald", weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "", weight = 15, }, + { itemstring = "mobs_mc:iron_horse_armor", weight = 15, }, + { itemstring = "mobs_mc:gold_horse_armor", weight = 10, }, + { itemstring = "mobs_mc:diamond_horse_armor", weight = 5, }, + { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + } + }, + { + stacks_min = 4, + stacks_max = 4, + items = { + { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_core:sand", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, + } + }}, pr) + mcl_structures.init_node_construct(chests[c]) + local meta = minetest.get_meta(chests[c]) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems, pr) + end + + -- Initialize pressure plates and randomly remove up to 5 plates + local pplates = minetest.find_nodes_in_area(p1, {x = p2.x, y = p1.y + 5, z = p2.z}, "mesecons_pressureplates:pressure_plate_stone_off") + local pplates_remove = 5 + for p=1, #pplates do + if pplates_remove > 0 and pr:next(1, 100) >= 50 then + -- Remove plate + minetest.remove_node(pplates[p]) + pplates_remove = pplates_remove - 1 + else + -- Initialize plate + minetest.registered_nodes["mesecons_pressureplates:pressure_plate_stone_off"].on_construct(pplates[p]) + end + end +end + +local function place(pos, rotation, pr) + local pos_below = {x = pos.x, y = pos.y - 1, z = pos.z} + local pos_temple = {x = pos.x - 10, y = pos.y - 12, z = pos.z - 10} + local node_below = minetest.get_node(pos_below) + local nn = node_below.name + if string.find(nn, "red") then + mcl_structures.place_schematic({pos = pos_temple, schematic = red_temple_schematic, pr = pr, on_placed = on_placed}) + else + mcl_structures.place_schematic({pos = pos_temple, schematic = temple_schematic, pr = pr, on_placed = on_placed}) + end +end + +local function get_place_rank(pos) + local x, y, z = pos.x, pos.y - 1, pos.z + local p1 = {x = x - 8, y = y, z = z - 8} + local p2 = {x = x + 8, y = y, z = z + 8} + local best_pos_list_surface = minetest.find_nodes_in_area(p1, p2, node_list, false) + local other_pos_list_surface = minetest.find_nodes_in_area(p1, p2, "group:opaque", false) + p1 = {x = x - 4, y = y - 7, z = z - 4} + p2 = {x = x + 4, y = y - 3, z = z + 4} + local best_pos_list_underground = minetest.find_nodes_in_area(p1, p2, node_list, false) + local other_pos_list_underground = minetest.find_nodes_in_area(p1, p2, "group:opaque", false) + return 10 * (#best_pos_list_surface) + 2 * (#other_pos_list_surface) + 5 * (#best_pos_list_underground) + #other_pos_list_underground +end + +mcl_structures.register_structure({ + name = "desert_temple", + decoration = { + deco_type = "simple", + place_on = node_list, + flags = "all_floors", + fill_ratio = scanning_ratio, + y_min = 3, + y_max = mcl_mapgen.overworld.max, + height = 1, + biomes = not mcl_mapgen.v6 and { + "ColdTaiga_beach", + "ColdTaiga_beach_water", + "Desert", + "Desert_ocean", + "ExtremeHills_beach", + "FlowerForest_beach", + "Forest_beach", + "MesaBryce_sandlevel", + "MesaPlateauF_sandlevel", + "MesaPlateauFM_sandlevel", + "Savanna", + "Savanna_beach", + "StoneBeach", + "StoneBeach_ocean", + "Taiga_beach", + }, + }, + on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local pos = pos_list[1] + if #pos_list > 1 then + local count = get_place_rank(pos) + for i = 2, #pos_list do + local pos_i = pos_list[i] + local count_i = get_place_rank(pos_i) + if count_i > count then + count = count_i + pos = pos_i + end + end + end + place(pos, nil, pr) + end, + place_function = place, +}) diff --git a/mods/MAPGEN/mcl_structures/desert_well.lua b/mods/MAPGEN/mcl_structures/desert_well.lua new file mode 100644 index 000000000..1bd6691d2 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/desert_well.lua @@ -0,0 +1,93 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 40 +local noise_multiplier = 1 +local random_offset = 999 +local scanning_ratio = 0.00001 +local struct_threshold = chance_per_chunk + +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local node_list = {"mcl_core:sand", "mcl_core:sandstone", "mcl_core:redsand", "mcl_colorblocks:hardened_clay_orange"} + +local schematic_file = modpath .. "/schematics/mcl_structures_desert_well.mts" + +local well_schematic_lua = minetest.serialize_schematic(schematic_file, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" +local well_schematic = loadstring(well_schematic_lua)() + +local red_well_schematic_lua = minetest.serialize_schematic(schematic_file, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" +red_well_schematic_lua = red_well_schematic_lua:gsub("mcl_core:sand", "mcl_core:redsand") +red_well_schematic_lua = red_well_schematic_lua:gsub("mcl_stairs:slab_sandstone", "mcl_stairs:slab_redsandstone") +local red_well_schematic = loadstring(red_well_schematic_lua)() + +local function place(pos, rotation, pr) + local pos_below = {x = pos.x, y = pos.y - 1, z = pos.z} + local pos_well = {x = pos.x, y = pos.y - 2, z = pos.z} + local node_below = minetest.get_node(pos_below) + local nn = node_below.name + if string.find(nn, "red") then + mcl_structures.place_schematic({pos = pos_well, rotaton = rotation, schematic = red_well_schematic, pr = pr}) + else + mcl_structures.place_schematic({pos = pos_well, rotaton = rotation, schematic = well_schematic, pr = pr}) + end +end + +local function get_place_rank(pos) + local x, y, z = pos.x, pos.y - 1, pos.z + local p1 = {x = x , y = y, z = z } + local p2 = {x = x + 5, y = y, z = z + 5} + local post_pos_list_surface = #minetest.find_nodes_in_area(p1, p2, node_list, false) + local other_pos_list_surface = #minetest.find_nodes_in_area(p1, p2, "group:opaque", false) + return post_pos_list_surface * 5 + other_pos_list_surface +end + +mcl_structures.register_structure({ + name = "desert_well", + decoration = { + deco_type = "simple", + place_on = node_list, + flags = "all_floors", + fill_ratio = scanning_ratio, + y_min = -5, + y_max = mcl_mapgen.overworld.max, + height = 1, + biomes = not mcl_mapgen.v6 and { + "ColdTaiga_beach", + "ColdTaiga_beach_water", + "Desert", + "Desert_ocean", + "ExtremeHills_beach", + "FlowerForest_beach", + "Forest_beach", + "MesaBryce_sandlevel", + "MesaPlateauF_sandlevel", + "MesaPlateauFM_sandlevel", + "Savanna", + "Savanna_beach", + "StoneBeach", + "StoneBeach_ocean", + "Taiga_beach", + }, + }, + on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local pos = pos_list[1] + if #pos_list > 1 then + local count = get_place_rank(pos) + for i = 2, #pos_list do + local pos_i = pos_list[i] + local count_i = get_place_rank(pos_i) + if count_i > count then + count = count_i + pos = pos_i + end + end + end + place(pos, nil, pr) + end, + place_function = place, +}) diff --git a/mods/MAPGEN/mcl_structures/end_exit_portal.lua b/mods/MAPGEN/mcl_structures/end_exit_portal.lua new file mode 100644 index 000000000..3eeaf7819 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/end_exit_portal.lua @@ -0,0 +1,81 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local END_EXIT_PORTAL_POS_X = -3 +local END_EXIT_PORTAL_POS_Y = -27003 +local END_EXIT_PORTAL_POS_Z = -3 +local p0 = { + x = END_EXIT_PORTAL_POS_X, + y = END_EXIT_PORTAL_POS_Y, + z = END_EXIT_PORTAL_POS_Z, +} + +local schematic = modpath .. "/schematics/mcl_structures_end_exit_portal.mts" + +local dragon_spawn_pos = false +local dragon_spawned, portal_generated = false, false + +local function spawn_ender_dragon() + local obj = minetest.add_entity(dragon_spawn_pos, "mobs_mc:enderdragon") + if not obj then return false end + local dragon_entity = obj:get_luaentity() + dragon_entity._initial = true + dragon_entity._portal_pos = p0 + return obj +end + +local function try_to_spawn_ender_dragon() + if spawn_ender_dragon() then + dragon_spawned = true + return + end + minetest.after(2, try_to_spawn_ender_dragon) + minetest.log("warning", "Ender dragon doesn't want to spawn at "..minetest.pos_to_string(dragon_spawn_pos)) +end + +if portal_generated and not dragon_spawned then + minetest.after(10, try_to_spawn_ender_dragon) +end + +local function place(pos, rotation, pr) + mcl_structures.place_schematic({pos = pos, schematic = schematic, rotation = rotation, pr = pr}) +end + +mcl_mapgen.register_mapgen(function(minp, maxp, seed, vm_context) + local minp = minp + local y1 = minp.y + if y1 > END_EXIT_PORTAL_POS_Y then return end + local maxp = maxp + local y2 = maxp.y + if y2 < END_EXIT_PORTAL_POS_Y then return end + if minp.x > END_EXIT_PORTAL_POS_X then return end + if maxp.x < END_EXIT_PORTAL_POS_X then return end + if minp.z > END_EXIT_PORTAL_POS_Z then return end + if maxp.z < END_EXIT_PORTAL_POS_Z then return end + + dragon_spawn_pos = vector.add(p0, vector.new(3, 11, 3)) + portal_generated = true + try_to_spawn_ender_dragon() + + local p = table.copy(p0) + + for y = y2, y1, -1 do + p.y = y + if minetest.get_node(p).name == "mcl_end:end_stone" then + place(p, "0", PseudoRandom(vm_context.chunkseed)) + return + end + end + + for y = y2, y1, -1 do + p.y = y + if minetest.get_node(p).name ~= "air" then + place(p, "0", PseudoRandom(vm_context.chunkseed)) + return + end + end + + place(p0, "0", PseudoRandom(vm_context.chunkseed)) +end) + +mcl_structures.register_structure({name = "end_exit_portal", place_function = place}) diff --git a/mods/MAPGEN/mcl_structures/fossil.lua b/mods/MAPGEN/mcl_structures/fossil.lua new file mode 100644 index 000000000..6c6c2d24b --- /dev/null +++ b/mods/MAPGEN/mcl_structures/fossil.lua @@ -0,0 +1,53 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_block = mcl_structures.from_16x16_to_block_inverted_chance(64) +local noise_multiplier = 2 +local random_offset = 5 +local struct_threshold = chance_per_block +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level +local minetest_find_nodes_in_area = minetest.find_nodes_in_area +local min_y = mcl_worlds.layer_to_y(40) +local max_y = mcl_worlds.layer_to_y(49) +local fossils = { + "mcl_structures_fossil_skull_1.mts", -- 4×5×5 + "mcl_structures_fossil_skull_2.mts", -- 5×5×5 + "mcl_structures_fossil_skull_3.mts", -- 5×5×7 + "mcl_structures_fossil_skull_4.mts", -- 7×5×5 + "mcl_structures_fossil_spine_1.mts", -- 3×3×13 + "mcl_structures_fossil_spine_2.mts", -- 5×4×13 + "mcl_structures_fossil_spine_3.mts", -- 7×4×13 + "mcl_structures_fossil_spine_4.mts", -- 8×5×13 +} +local nodes_for_fossil = {"mcl_core:sandstone", "mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:dirt", "mcl_core:gravel"} + +function spawn_fossil(pos, rotation, pr, placer) + -- Generates one out of 8 possible fossil pieces + local def = { + pos = {x = pos.x, y = pos.y - 1, z = pos.z}, + schematic = modpath .. "/schematics/" .. fossils[pr:next(1, #fossils)], + rotation = rotation, + pr = pr, + } + mcl_structures.place_schematic(def) +end + +mcl_mapgen.register_mapgen_block(function(minp, maxp, seed) + local p1 = table.copy(minp) + local y1 = p1.y + if y1 > max_y then return end + local p2 = table.copy(maxp) + local y2 = p2.y + if y2 < min_y then return end + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_block) + p1.y = math.max(y1, min_y) + local noise = mcl_structures_get_perlin_noise_level(p1) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + p2.y = math.min(y2, max_y) + local nodes = minetest_find_nodes_in_area(p1, p2, nodes_for_fossil, false) + if #nodes < 100 then return end + spawn_fossil(p1, nil, pr) +end, 1000) + +mcl_structures.register_structure({name = 'fossil', place_function = spawn_fossil}) diff --git a/mods/MAPGEN/mcl_structures/ice_spike_large.lua b/mods/MAPGEN/mcl_structures/ice_spike_large.lua new file mode 100644 index 000000000..b46f09465 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/ice_spike_large.lua @@ -0,0 +1,66 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 5 +local random_offset = 24435 +local struct_threshold = chance_per_chunk - 1 +local noise_params = { + offset = 0, + scale = 1, + spread = { + x = 1000, + y = 1000, + z = 1000, + }, + scale = 0.01, + seed = 29313, + octaves = 2, + persistence = 0.7, +} + +local node_list = {"mcl_core:snowblock", "mcl_core:dirt_with_grass_snow"} +local schematic = modpath.."/schematics/mcl_structures_ice_spike_large.mts" + +minetest_find_nodes_in_area = minetest.find_nodes_in_area + +local function place(pos, rotation, pr) + mcl_structures.place_schematic({pos = pos, schematic = schematic, rotation = rotation, pr = pr}) +end + +local function is_place_ok(p) + -- Check surface + local floor = {x=p.x+4, y=p.y-1, z=p.z+4} + local surface = #minetest_find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, node_list, false) + if surface < 9 then return end + + -- Check for collision with spruce + local spruce_collisions = #minetest_find_nodes_in_area({x=p.x+1,y=p.y+2,z=p.z+1}, {x=p.x+4, y=p.y+6, z=p.z+4}, {"group:tree"}, false) + if spruce_collisions > 0 then return end + + return true +end + +local def = mcl_mapgen.v6 and { + decoration = { + deco_type = "simple", + place_on = node_list, + noise_params = noise_params, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, + height = 1, + }, + on_finished_chunk = mcl_mapgen.v6 and function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + if random_number < struct_threshold then return end + for i = 1, #pos_list do + local pos = pos_list[i] + if is_place_ok(pos) then + place(pos, nil, pr) + end + end + end, +} or {} +def.name = "ice_spike_large" +def.place_function = place +mcl_structures.register_structure(def) diff --git a/mods/MAPGEN/mcl_structures/ice_spike_small.lua b/mods/MAPGEN/mcl_structures/ice_spike_small.lua new file mode 100644 index 000000000..387c61bab --- /dev/null +++ b/mods/MAPGEN/mcl_structures/ice_spike_small.lua @@ -0,0 +1,65 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 3 +local random_offset = 1264 +local struct_threshold = chance_per_chunk +local noise_params = { + offset = 0, + scale = 1, + spread = { + x = mcl_mapgen.CS, + y = mcl_mapgen.CS, + z = mcl_mapgen.CS, + }, + scale = 0.3, + seed = 32931, + octaves = 2, + persistence = 0.7, +} + +local node_list = {"mcl_core:snowblock", "mcl_core:dirt_with_grass_snow"} +local schematic = modpath.."/schematics/mcl_structures_ice_spike_small.mts" + +minetest_find_nodes_in_area = minetest.find_nodes_in_area + +local function place(pos, rotation, pr) + mcl_structures.place_schematic({pos = pos, schematic = schematic, rotation = rotation, pr = pr}) +end + +local function is_place_ok(p) + local floor = {x=p.x+6, y=p.y-1, z=p.z+6} + local surface = #minetest_find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, node_list, false) + if surface < 25 then return end + + -- Check for collision with spruce + local spruce_collisions = #minetest_find_nodes_in_area({x=p.x+1,y=p.y+1,z=p.z+1}, {x=p.x+6, y=p.y+6, z=p.z+6}, {"group:tree"}, false) + if spruce_collisions > 0 then return end + + return true +end + +local def = mcl_mapgen.v6 and { + decoration = { + deco_type = "simple", + place_on = node_list, + noise_params = noise_params, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, + height = 1, + }, + on_finished_chunk = mcl_mapgen.v6 and function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + if random_number < struct_threshold then return end + for i = 1, #pos_list do + local pos = pos_list[i] + if is_place_ok(pos) then + place(pos, nil, pr) + end + end + end, +} or {} +def.name = "ice_spike_small" +def.place_function = place +mcl_structures.register_structure(def) diff --git a/mods/MAPGEN/mcl_structures/igloo.lua b/mods/MAPGEN/mcl_structures/igloo.lua new file mode 100644 index 000000000..ebb88667b --- /dev/null +++ b/mods/MAPGEN/mcl_structures/igloo.lua @@ -0,0 +1,194 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 39 +local noise_multiplier = 1.4 +local random_offset = 555 +local struct_threshold = chance_per_chunk +local scanning_ratio = 0.0003 + +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local node_list = {"mcl_core:snowblock", "mcl_core:snow", "group:grass_block_snow"} + +local schematic_top = modpath.."/schematics/mcl_structures_igloo_top.mts" +local schematic_basement = modpath.."/schematics/mcl_structures_igloo_basement.mts" + +local brick = { + -- monster egg: + [false] = { + -- cracked: + [false] = "mcl_core:stonebrick", + [true ] = "mcl_core:stonebrickcracked", + }, + [true] = { + [false] = "mcl_monster_eggs:monster_egg_stonebrick", + [true ] = "mcl_monster_eggs:monster_egg_stonebrickcracked", + }, +} +local dirs = { + ["0"] = {x=-1, y=0, z= 0}, + ["90"] = {x= 0, y=0, z=-1}, + ["180"] = {x= 1, y=0, z= 0}, + ["270"] = {x= 0, y=0, z= 1}, +} +local tdirs = { + ["0"] = {x= 1, y=0, z= 0}, + ["90"] = {x= 0, y=0, z=-1}, + ["180"] = {x=-1, y=0, z= 0}, + ["270"] = {x= 0, y=0, z= 1} +} +local tposes = { + ["0"] = {x=7, y=-1, z=3}, + ["90"] = {x=3, y=-1, z=1}, + ["180"] = {x=1, y=-1, z=3}, + ["270"] = {x=3, y=-1, z=7}, +} +local chest_offsets = { + ["0"] = {x=5, y=1, z=5}, + ["90"] = {x=5, y=1, z=3}, + ["180"] = {x=3, y=1, z=1}, + ["270"] = {x=1, y=1, z=5}, +} + +local function on_placed(pos, rotation, pr, size) + local chest_offset = chest_offsets[rotation] + if not chest_offset then return end + local lootitems = mcl_loot.get_multi_loot({ + { + stacks_min = 1, + stacks_max = 1, + items = { + { itemstring = "mcl_core:apple_gold", weight = 1 }, + } + }, + { + stacks_min = 2, + stacks_max = 8, + items = { + { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_farming:wheat_item", weight = 10, amount_min = 2, amount_max = 3 }, + { itemstring = "mcl_core:gold_nugget", weight = 10, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, + { itemstring = "mcl_tools:axe_stone", weight = 2 }, + { itemstring = "mcl_core:emerald", weight = 1 }, + } + }}, pr) + + local chest_pos = vector.add(pos, chest_offset) + mcl_structures.init_node_construct(chest_pos) + local meta = minetest.get_meta(chest_pos) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems, pr) +end + +local function on_placed_top(p1, rotation, pr, size) + local y = p1.y + 1 + local pos = {x = p1.x, y = y, z = p1.z} + local dim = mcl_mapgen[mcl_worlds.pos_to_dimension(pos)] + local bottom_of_dimension = (dim and dim.min or mcl_mapgen.EDGE_MIN) + 10 + local bottom_of_chunk = mcl_mapgen.get_chunk_beginning(y) + local buffer = y - math.max(bottom_of_chunk, bottom_of_dimension) + if buffer < 20 then return end + + local depth = pr:next(19, buffer) + local bpos = {x=pos.x, y=pos.y-depth, z=pos.z} + local dir = dirs[rotation] + if not dir then return end + local tdir = tdirs[rotation] + + -- Trapdoor position + local tpos = vector.add(pos, tposes[rotation]) + local ladder_param2 = minetest.dir_to_wallmounted(tdir) + + -- Check how deep we can actuall dig + local real_depth = 0 + for y = 1, depth - 5 do + local node = minetest.get_node({x=tpos.x,y=tpos.y-y,z=tpos.z}) + local def = minetest.registered_nodes[node.name] + if (not def) or (not def.walkable) or (def.liquidtype ~= "none") then + bpos.y = tpos.y-y+1 + break + end + real_depth = real_depth + 1 + end + if real_depth < 6 then return end + + -- Generate ladder to basement + for y=1, real_depth-1 do + minetest.set_node({x=tpos.x-1,y=tpos.y-y,z=tpos.z }, {name = brick[pr:next(1, 10) == 1][pr:next(1, 3) == 1]}) + minetest.set_node({x=tpos.x+1,y=tpos.y-y,z=tpos.z }, {name = brick[pr:next(1, 10) == 1][pr:next(1, 3) == 1]}) + minetest.set_node({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}, {name = brick[pr:next(1, 10) == 1][pr:next(1, 3) == 1]}) + minetest.set_node({x=tpos.x ,y=tpos.y-y,z=tpos.z+1}, {name = brick[pr:next(1, 10) == 1][pr:next(1, 3) == 1]}) + minetest.set_node({x=tpos.x ,y=tpos.y-y,z=tpos.z }, {name="mcl_core:ladder", param2=ladder_param2}) + end + + -- Place basement + local def = { + pos = bpos, + schematic = schematic_basement, + rotation = rotation, + pr = pr, + on_placed = on_placed, + } + mcl_structures.place_schematic(def) + + minetest.after(5, function(tpos, dir) + minetest.swap_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2 + end, tpos, dir) +end + +local function place(pos, rotation, pr) + local def = { + pos = {x = pos.x, y = pos.y - 1, z = pos.z}, + schematic = schematic_top, + rotation = rotation or tostring(pr:next(0,3)*90), + pr = pr, + on_placed = on_placed_top, + } + -- FIXME: This spawns bookshelf instead of furnace. Fix this! + -- Furnace does not work atm because apparently meta is not set. :-( + mcl_structures.place_schematic(def) +end + +local function get_place_rank(pos) + local x, y, z = pos.x, pos.y, pos.z + local p1 = {x = x , y = y, z = z } + local p2 = {x = x + 9, y = y, z = z + 9} + local best_pos_list_surface = #minetest.find_nodes_in_area(p1, p2, node_list, false) + local other_pos_list_surface = #minetest.find_nodes_in_area(p1, p2, "group:opaque", false) + return 10 * (best_pos_list_surface) + other_pos_list_surface - 640 +end + +mcl_structures.register_structure({ + name = "igloo", + decoration = { + deco_type = "simple", + place_on = node_list, + flags = "all_floors", + fill_ratio = scanning_ratio, + y_min = -33, + y_max = mcl_mapgen.overworld.max, + height = 1, + }, + on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local pos + local count = -1 + for i = 1, #pos_list do + local pos_i = vector.subtract(pos_list[i], {x = 4, y = 1, z = 4}) + local count_i = get_place_rank(pos_i) + if count_i > count then + count = count_i + pos = pos_i + end + end + if count < 0 then return end + place(pos, nil, pr) + end, + place_function = place, +}) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index be1be0f67..c99970813 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -2,46 +2,309 @@ local modname = minetest.get_current_modname() local S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) -mcl_structures = {} +local name_prefix = "mcl_structures:" +mcl_structures = {} local rotations = { "0", "90", "180", "270" } +local registered_structures = {} +local use_process_mapgen_block_lvm = false +local use_process_mapgen_chunk = false +local on_finished_block_callbacks = {} +local on_finished_chunk_callbacks = {} -local function ecb_place(blockpos, action, calls_remaining, param) - if calls_remaining >= 1 then return end - minetest.place_schematic(param.pos, param.schematic, param.rotation, param.replacements, param.force_placement, param.flags) - if param.after_placement_callback and param.p1 and param.p2 then - param.after_placement_callback(param.p1, param.p2, param.size, param.rotation, param.pr, param.callback_param) +local noise_params = { + offset = 0, + scale = 1, + spread = { + x = mcl_mapgen.CS_NODES, + y = mcl_mapgen.CS_NODES, + z = mcl_mapgen.CS_NODES, + }, + seed = 329, + octaves = 1, + persistence = 0.6, +} + +local perlin_noise +local get_perlin_noise_level = function(minp) + perlin_noise = perlin_noise or minetest.get_perlin(noise_params) + return perlin_noise:get_3d(minp) +end +mcl_structures.get_perlin_noise_level = get_perlin_noise_level + +local spawnstruct_hint = S("Use /help spawnstruct to see a list of avaiable types.") + +local function dir_to_rotation(dir) + local ax, az = math.abs(dir.x), math.abs(dir.z) + if ax > az then + if dir.x < 0 then + return "270" + end + return "90" + end + if dir.z < 0 then + return "180" + end + return "0" +end + +local function spawnstruct_function(name, param) + local player = minetest.get_player_by_name(name) + if not player then return end + if param == "" then + minetest.chat_send_player(name, S("Error: No structure type given. Please use “/spawnstruct ”.")) + minetest.chat_send_player(name, spawnstruct_hint) + return + end + local struct = registered_structures[param] + if not struct then + struct = registered_structures[name_prefix .. param] + end + if not struct then + minetest.chat_send_player(name, S("Error: Unknown structure type. Please use “/spawnstruct ”.")) + minetest.chat_send_player(name, spawnstruct_hint) + return + end + local place = struct.place_function + if not place then return end + + local pos = player:get_pos() + if not pos then return end + local pr = PseudoRandom(math.floor(pos.x * 333 + pos.y * 19 - pos.z + 4)) + pos = vector.round(pos) + local dir = minetest.yaw_to_dir(player:get_look_horizontal()) + local rot = dir_to_rotation(dir) + place(pos, rot, pr, player) + minetest.chat_send_player(name, S("Structure placed.")) +end + +local function update_spawnstruct_chatcommand() + local spawnstruct_params = "" + for _, registered_structure in pairs(registered_structures) do + if spawnstruct_params ~= "" then + spawnstruct_params = spawnstruct_params .. " | " + end + spawnstruct_params = spawnstruct_params .. registered_structure.short_name + end + local def = { + params = spawnstruct_params, + description = S("Generate a pre-defined structure near your position."), + privs = {debug = true}, + func = spawnstruct_function, + } + local registered_chatcommands = minetest.registered_chatcommands + if registered_chatcommands["spawnstruct"] then + minetest.override_chatcommand("spawnstruct", def) + else + minetest.register_chatcommand("spawnstruct", def) end end -function mcl_structures.place_schematic(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) - local s = loadstring(minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic")() - if s and s.size then - local x, z = s.size.x, s.size.z - if rotation then - if rotation == "random" and pr then - rotation = rotations[pr:next(1,#rotations)] - end - if rotation == "random" then - x = math.max(x, z) - z = x - elseif rotation == "90" or rotation == "270" then - x, z = z, x +function process_mapgen_block_lvm(vm_context) + local nodes = minetest.find_nodes_in_area(vm_context.minp, vm_context.maxp, {"group:struct"}, true) + for node_name, pos_list in pairs(nodes) do + local lvm_callback = on_finished_block_callbacks[node_name] + if lvm_callback then + lvm_callback(vm_context, pos_list) + end + end +end + +function process_mapgen_chunk(minp, maxp, seed, vm_context) + local nodes = minetest.find_nodes_in_area(minp, maxp, {"group:struct"}, true) + for node_name, pos_list in pairs(nodes) do + local chunk_callback = on_finished_chunk_callbacks[node_name] + if chunk_callback then + chunk_callback(minp, maxp, seed, vm_context, pos_list) + end + end + for node_name, pos_list in pairs(nodes) do + for _, pos in pairs(pos_list) do + local node = minetest.get_node(pos) + if string.sub(node.name, 1, 15) == 'mcl_structures:' then + minetest.swap_node(pos, {name = 'air'}) end end - local p1 = {x=pos.x , y=pos.y , z=pos.z } - local p2 = {x=pos.x+x-1, y=pos.y+s.size.y-1, z=pos.z+z-1} - minetest.log("verbose", "[mcl_structures] size=" ..minetest.pos_to_string(s.size) .. ", rotation=" .. tostring(rotation) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) - local param = {pos=vector.new(pos), schematic=s, rotation=rotation, replacements=replacements, force_placement=force_placement, flags=flags, p1=p1, p2=p2, after_placement_callback = after_placement_callback, size=vector.new(s.size), pr=pr, callback_param=callback_param} - minetest.emerge_area(p1, p2, ecb_place, param) end end +-------------------------------------------------------------------------------------- +-- mcl_structures.register_structure(struct_def) +-- struct_def: +-- name - name, like 'desert_temple' +-- decoration - decoration definition, to use as structure seed (thanks cora for the idea) +-- on_finished_block - callback, if needed, to use with decorations: funcion(vm_context, pos_list) +-- on_finished_chunk - next callback if needed: funcion(minp, maxp, seed, vm_context, pos_list) +-- place_function - callback to place schematic by /spawnstruct debug command: function(pos, rotation, pr, placer) +-- on_placed - useful when you want to process the area after placement: function(pos, rotation, pr, size) +function mcl_structures.register_structure(def) + local short_name = def.name + local name = "mcl_structures:" .. short_name + local decoration = def.decoration + local on_finished_block = def.on_finished_block + local on_finished_chunk = def.on_finished_chunk + local place_function = def.place_function + if not name then + minetest.log('warning', 'Structure name is not passed for registration - ignoring') + return + end + if registered_structures[name] then + minetest.log('warning', 'Structure '..name..' is already registered - owerwriting') + end + local decoration_id + if decoration then + minetest.register_node(':' .. name, { + drawtype = "airlike", + sunlight_propagates = true, + pointable = false, + walkable = false, + diggable = false, + buildable_to = true, + groups = { + struct = 1, + not_in_creative_inventory = 1, + }, + }) + decoration_id = minetest.register_decoration({ + deco_type = decoration.deco_type, + place_on = decoration.place_on, + sidelen = decoration.sidelen, + fill_ratio = decoration.fill_ratio, + noise_params = decoration.noise_params, + biomes = decoration.biomes, + y_min = decoration.y_min, + y_max = decoration.y_max, + spawn_by = decoration.spawn_by, + num_spawn_by = decoration.num_spawn_by, + flags = decoration.flags, + decoration = name, + height = decoration.height, + height_max = decoration.height_max, + param2 = decoration.param2, + param2_max = decoration.param2_max, + place_offset_y = decoration.place_offset_y, + schematic = decoration.schematic, + replacements = decoration.replacements, + flags = decoration.flags, + rotation = decoration.rotation, + }) + end + registered_structures[name] = { + place_function = place_function, + on_finished_block = on_finished_block, + on_finished_chunk = on_finished_chunk, + decoration_id = decoration_id, + short_name = short_name, + } + update_spawnstruct_chatcommand() + if on_finished_block then + on_finished_block_callbacks[name] = on_finished_block + if not use_process_mapgen_block_lvm then + use_process_mapgen_block_lvm = true + mcl_mapgen.register_mapgen_block_lvm(process_mapgen_block_lvm, mcl_mapgen.order.BUILDINGS) + end + end + if on_finished_chunk then + on_finished_chunk_callbacks[name] = on_finished_chunk + if not use_process_mapgen_chunk then + use_process_mapgen_chunk = true + mcl_mapgen.register_mapgen(process_mapgen_chunk, mcl_mapgen.order.BUILDINGS) + end + end +end + +-- It doesN'T remove registered node and decoration! +function mcl_structures.unregister_structure(name) + if not registered_structures[name] then + minetest.log('warning','Structure '..name..' is not registered - skipping') + return + end + registered_structures[name] = nil +end + +local function ecb_place(blockpos, action, calls_remaining, param) + if calls_remaining >= 1 then return end + local pos = param.pos + local rotation = param.rotation + minetest.place_schematic(pos, param.schematic, rotation, param.replacements, param.force_placement, param.flags) + local on_placed = param.on_placed + if not on_placed then + return + end + on_placed(pos, rotation, param.pr, param.size) +end + +function mcl_structures.place_schematic(def) + local pos = def.pos + local schematic = def.schematic + local rotation = def.rotation + local pr = def.pr + local on_placed = def.on_placed -- on_placed(pos, rotation, pr, size) + local emerge = def.emerge + if not pos then + minetest.log('warning', '[mcl_structures] No pos. specified to place schematic') + return + end + if not schematic then + minetest.log('warning', '[mcl_structures] No schematic specified to place at ' .. minetest.pos_to_string(pos)) + return + end + if not rotation or rotation == 'random' then + if pr then + rotation = rotations[pr:next(1,#rotations)] + else + rotation = rotations[math.random(1,#rotations)] + end + end + + if not emerge and not on_placed then + minetest.place_schematic(pos, schematic, rotation, def.replacements, def.force_placement, def.flags) + return + end + + local serialized_schematic = minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" + local loaded_schematic = loadstring(serialized_schematic)() + if not loaded_schematic then + minetest.log('warning', '[mcl_structures] Schematic ' .. schematic .. ' load serialized string problem at ' .. minetest.pos_to_string(pos)) + return + end + local size = loaded_schematic.size + if not size then + minetest.log('warning', '[mcl_structures] Schematic ' .. schematic .. ' has no size at ' .. minetest.pos_to_string(pos)) + return + end + local size_x, size_y, size_z = size.x, size.y, size.z + if rotation == "90" or rotation == "270" then + size_x, size_z = size_z, size_x + end + local x, y, z = pos.x, pos.y, pos.z + local p1 = {x = x, y = y, z = z} + local p2 = {x = x + size_x - 1, y = y + size_y - 1, z = size_z - 1} + local ecb_param = { + pos = vector.new(pos), + schematic = loaded_schematic, + rotation = rotation, + replacements = def.replacements, + force_placement = def.force_placement, + flags = def.flags, + size = vector.new(size), + pr = pr, + on_placed = on_placed, + } + if not emerge then + ecb_place(p1, nil, 0, ecb_param) + return + end + minetest.log("verbose", "[mcl_structures] Emerge area " .. minetest.pos_to_string(p1) .. " - " .. minetest.pos_to_string(p2) + .. " of size " ..minetest.pos_to_string(size) .. " to place " .. schematic .. ", rotation " .. tostring(rotation)) + minetest.emerge_area(p1, p2, ecb_place, ecb_param) +end + function mcl_structures.get_struct(file) local localfile = modpath.."/schematics/"..file local file, errorload = io.open(localfile, "rb") @@ -58,7 +321,7 @@ end -- Call on_construct on pos. -- Useful to init chests from formspec. -local function init_node_construct(pos) +function mcl_structures.init_node_construct(pos) local node = minetest.get_node(pos) local def = minetest.registered_nodes[node.name] if def and def.on_construct then @@ -69,200 +332,40 @@ local function init_node_construct(pos) end -- The call of Struct -function mcl_structures.call_struct(pos, struct_style, rotation, pr) +function mcl_structures.call_struct(pos, struct_style, rotation, pr, callback) minetest.log("action","[mcl_structures] call_struct " .. struct_style.." at "..minetest.pos_to_string(pos)) if not rotation then rotation = "random" end - if struct_style == "desert_temple" then - return mcl_structures.generate_desert_temple(pos, rotation, pr) - elseif struct_style == "desert_well" then - return mcl_structures.generate_desert_well(pos, rotation) - elseif struct_style == "igloo" then - return mcl_structures.generate_igloo(pos, rotation, pr) - elseif struct_style == "witch_hut" then - return mcl_structures.generate_witch_hut(pos, rotation) - elseif struct_style == "ice_spike_small" then - return mcl_structures.generate_ice_spike_small(pos, rotation) - elseif struct_style == "ice_spike_large" then - return mcl_structures.generate_ice_spike_large(pos, rotation) - elseif struct_style == "boulder" then + if struct_style == "boulder" then return mcl_structures.generate_boulder(pos, rotation, pr) - elseif struct_style == "fossil" then - return mcl_structures.generate_fossil(pos, rotation, pr) elseif struct_style == "end_exit_portal" then - return mcl_structures.generate_end_exit_portal(pos, rotation) + return mcl_structures.generate_end_exit_portal(pos, rotation, pr, callback) elseif struct_style == "end_exit_portal_open" then return mcl_structures.generate_end_exit_portal_open(pos, rotation) elseif struct_style == "end_gateway_portal" then return mcl_structures.generate_end_gateway_portal(pos, rotation) elseif struct_style == "end_portal_shrine" then return mcl_structures.generate_end_portal_shrine(pos, rotation, pr) + elseif struct_style == "end_portal" then + return mcl_structures.generate_end_portal(pos, rotation, pr) end end -function mcl_structures.generate_desert_well(pos, rot) - local newpos = {x=pos.x,y=pos.y-2,z=pos.z} - local path = modpath.."/schematics/mcl_structures_desert_well.mts" - return mcl_structures.place_schematic(newpos, path, rot or "0", nil, true) -end - -function mcl_structures.generate_igloo(pos, rotation, pr) - -- Place igloo - local success, rotation = mcl_structures.generate_igloo_top(pos, pr) - -- Place igloo basement with 50% chance - local r = pr:next(1,2) - if r == 1 then - -- Select basement depth - local dim = mcl_worlds.pos_to_dimension(pos) - --local buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) - local buffer - if dim == "nether" then - buffer = pos.y - (mcl_vars.mg_lava_nether_max + 10) - elseif dim == "end" then - buffer = pos.y - (mcl_vars.mg_end_min + 1) - elseif dim == "overworld" then - buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) - else - return success - end - if buffer <= 19 then - return success - end - local depth = pr:next(19, buffer) - local bpos = {x=pos.x, y=pos.y-depth, z=pos.z} - -- trapdoor position - local tpos - local dir, tdir - if rotation == "0" then - dir = {x=-1, y=0, z=0} - tdir = {x=1, y=0, z=0} - tpos = {x=pos.x+7, y=pos.y-1, z=pos.z+3} - elseif rotation == "90" then - dir = {x=0, y=0, z=-1} - tdir = {x=0, y=0, z=-1} - tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+1} - elseif rotation == "180" then - dir = {x=1, y=0, z=0} - tdir = {x=-1, y=0, z=0} - tpos = {x=pos.x+1, y=pos.y-1, z=pos.z+3} - elseif rotation == "270" then - dir = {x=0, y=0, z=1} - tdir = {x=0, y=0, z=1} - tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+7} - else - return success - end - local function set_brick(pos) - local c = pr:next(1, 3) -- cracked chance - local m = pr:next(1, 10) -- chance for monster egg - local brick - if m == 1 then - if c == 1 then - brick = "mcl_monster_eggs:monster_egg_stonebrickcracked" - else - brick = "mcl_monster_eggs:monster_egg_stonebrick" +function mcl_structures.generate_end_portal(pos, rotation, pr) + -- todo: proper facedir + local x0, y0, z0 = pos.x - 2, pos.y, pos.z - 2 + for x = 0, 4 do + for z = 0, 4 do + if x % 4 == 0 or z % 4 == 0 then + if x % 4 ~= 0 or z % 4 ~= 0 then + minetest.swap_node({x = x0 + x, y = y0, z = z0 + z}, {name = "mcl_portals:end_portal_frame_eye"}) end else - if c == 1 then - brick = "mcl_core:stonebrickcracked" - else - brick = "mcl_core:stonebrick" - end - end - minetest.set_node(pos, {name=brick}) - end - local ladder_param2 = minetest.dir_to_wallmounted(tdir) - local real_depth = 0 - -- Check how deep we can actuall dig - for y=1, depth-5 do - real_depth = real_depth + 1 - local node = minetest.get_node({x=tpos.x,y=tpos.y-y,z=tpos.z}) - local def = minetest.registered_nodes[node.name] - if (not def) or (not def.walkable) or (def.liquidtype ~= "none") or (not def.is_ground_content) then - bpos.y = tpos.y-y+1 - break + minetest.swap_node({x = x0 + x, y = y0, z = z0 + z}, {name = "mcl_portals:portal_end"}) end end - if real_depth <= 6 then - return success - end - -- Generate ladder to basement - for y=1, real_depth-1 do - set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) - set_brick({x=tpos.x+1,y=tpos.y-y,z=tpos.z }) - set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}) - set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z+1}) - minetest.set_node({x=tpos.x,y=tpos.y-y,z=tpos.z}, {name="mcl_core:ladder", param2=ladder_param2}) - end - -- Place basement - mcl_structures.generate_igloo_basement(bpos, rotation, pr) - -- Place hidden trapdoor - minetest.after(5, function(tpos, dir) - minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) -- TODO: more reliable param2 - end, tpos, dir) end - return success -end - -function mcl_structures.generate_igloo_top(pos, pr) - -- FIXME: This spawns bookshelf instead of furnace. Fix this! - -- Furnace does ot work atm because apparently meta is not set. :-( - local newpos = {x=pos.x,y=pos.y-1,z=pos.z} - local path = modpath.."/schematics/mcl_structures_igloo_top.mts" - local rotation = tostring(pr:next(0,3)*90) - return mcl_structures.place_schematic(newpos, path, rotation, nil, true), rotation -end - -local function igloo_placement_callback(p1, p2, size, orientation, pr) - local chest_offset - if orientation == "0" then - chest_offset = {x=5, y=1, z=5} - elseif orientation == "90" then - chest_offset = {x=5, y=1, z=3} - elseif orientation == "180" then - chest_offset = {x=3, y=1, z=1} - elseif orientation == "270" then - chest_offset = {x=1, y=1, z=5} - else - return - end - --local size = {x=9,y=5,z=7} - local lootitems = mcl_loot.get_multi_loot({ - { - stacks_min = 1, - stacks_max = 1, - items = { - { itemstring = "mcl_core:apple_gold", weight = 1 }, - } - }, - { - stacks_min = 2, - stacks_max = 8, - items = { - { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_farming:wheat_item", weight = 10, amount_min = 2, amount_max = 3 }, - { itemstring = "mcl_core:gold_nugget", weight = 10, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, - { itemstring = "mcl_tools:axe_stone", weight = 2 }, - { itemstring = "mcl_core:emerald", weight = 1 }, - } - }}, pr) - - local chest_pos = vector.add(p1, chest_offset) - init_node_construct(chest_pos) - local meta = minetest.get_meta(chest_pos) - local inv = meta:get_inventory() - mcl_loot.fill_inventory(inv, "main", lootitems, pr) -end - -function mcl_structures.generate_igloo_basement(pos, orientation, pr) - -- TODO: Add brewing stand - -- TODO: Add monster eggs - -- TODO: Spawn villager and zombie villager - local path = modpath.."/schematics/mcl_structures_igloo_basement.mts" - mcl_structures.place_schematic(pos, path, orientation, nil, true, nil, igloo_placement_callback, pr) end function mcl_structures.generate_boulder(pos, rotation, pr) @@ -280,53 +383,9 @@ function mcl_structures.generate_boulder(pos, rotation, pr) return minetest.place_schematic(newpos, path, rotation) -- don't serialize schematics for registered biome decorations, for MT 5.4.0, https://github.com/minetest/minetest/issues/10995 end -local function hut_placement_callback(p1, p2, size, orientation, pr) - if not p1 or not p2 then return end - local legs = minetest.find_nodes_in_area(p1, p2, "mcl_core:tree") - for i = 1, #legs do - while minetest.get_item_group(mcl_vars.get_node({x=legs[i].x, y=legs[i].y-1, z=legs[i].z}, true, 333333).name, "water") ~= 0 do - legs[i].y = legs[i].y - 1 - minetest.swap_node(legs[i], {name = "mcl_core:tree", param2 = 2}) - end - end -end - -function mcl_structures.generate_witch_hut(pos, rotation, pr) - local path = modpath.."/schematics/mcl_structures_witch_hut.mts" - mcl_structures.place_schematic(pos, path, rotation, nil, true, nil, hut_placement_callback, pr) -end - -function mcl_structures.generate_ice_spike_small(pos, rotation) - local path = modpath.."/schematics/mcl_structures_ice_spike_small.mts" - return minetest.place_schematic(pos, path, rotation or "random", nil, false) -- don't serialize schematics for registered biome decorations, for MT 5.4.0 -end - -function mcl_structures.generate_ice_spike_large(pos, rotation) - local path = modpath.."/schematics/mcl_structures_ice_spike_large.mts" - return minetest.place_schematic(pos, path, rotation or "random", nil, false) -- don't serialize schematics for registered biome decorations, for MT 5.4.0 -end - -function mcl_structures.generate_fossil(pos, rotation, pr) - -- Generates one out of 8 possible fossil pieces - local newpos = {x=pos.x,y=pos.y-1,z=pos.z} - local fossils = { - "mcl_structures_fossil_skull_1.mts", -- 4×5×5 - "mcl_structures_fossil_skull_2.mts", -- 5×5×5 - "mcl_structures_fossil_skull_3.mts", -- 5×5×7 - "mcl_structures_fossil_skull_4.mts", -- 7×5×5 - "mcl_structures_fossil_spine_1.mts", -- 3×3×13 - "mcl_structures_fossil_spine_2.mts", -- 5×4×13 - "mcl_structures_fossil_spine_3.mts", -- 7×4×13 - "mcl_structures_fossil_spine_4.mts", -- 8×5×13 - } - local r = pr:next(1, #fossils) - local path = modpath.."/schematics/"..fossils[r] - return mcl_structures.place_schematic(newpos, path, rotation or "random", nil, true) -end - -function mcl_structures.generate_end_exit_portal(pos, rot) +function mcl_structures.generate_end_exit_portal(pos, rot, pr, callback) local path = modpath.."/schematics/mcl_structures_end_exit_portal.mts" - return mcl_structures.place_schematic(pos, path, rot or "0", {["mcl_portals:portal_end"] = "air"}, true) + return mcl_structures.place_schematic(pos, path, rot or "0", {["mcl_portals:portal_end"] = "air"}, true, nil, callback) end function mcl_structures.generate_end_exit_portal_open(pos, rot) @@ -339,275 +398,15 @@ function mcl_structures.generate_end_gateway_portal(pos, rot) return mcl_structures.place_schematic(pos, path, rot or "0", nil, true) end -local function shrine_placement_callback(p1, p2, size, rotation, pr) - -- Find and setup spawner with silverfish - local spawners = minetest.find_nodes_in_area(p1, p2, "mcl_mobspawners:spawner") - for s=1, #spawners do - --local meta = minetest.get_meta(spawners[s]) - mcl_mobspawners.setup_spawner(spawners[s], "mobs_mc:silverfish") - end +local chunk_square = mcl_mapgen.CS_NODES * mcl_mapgen.CS_NODES +local block_square = mcl_mapgen.BS * mcl_mapgen.BS - -- Shuffle stone brick types - local bricks = minetest.find_nodes_in_area(p1, p2, "mcl_core:stonebrick") - for b=1, #bricks do - local r_bricktype = pr:next(1, 100) - local r_infested = pr:next(1, 100) - local bricktype - if r_infested <= 5 then - if r_bricktype <= 30 then -- 30% - bricktype = "mcl_monster_eggs:monster_egg_stonebrickmossy" - elseif r_bricktype <= 50 then -- 20% - bricktype = "mcl_monster_eggs:monster_egg_stonebrickcracked" - else -- 50% - bricktype = "mcl_monster_eggs:monster_egg_stonebrick" - end - else - if r_bricktype <= 30 then -- 30% - bricktype = "mcl_core:stonebrickmossy" - elseif r_bricktype <= 50 then -- 20% - bricktype = "mcl_core:stonebrickcracked" - end - -- 50% stonebrick (no change necessary) - end - if bricktype then - minetest.set_node(bricks[b], { name = bricktype }) - end - end - - -- Also replace stairs - local stairs = minetest.find_nodes_in_area(p1, p2, {"mcl_stairs:stair_stonebrick", "mcl_stairs:stair_stonebrick_outer", "mcl_stairs:stair_stonebrick_inner"}) - for s=1, #stairs do - local stair = minetest.get_node(stairs[s]) - local r_type = pr:next(1, 100) - if r_type <= 30 then -- 30% mossy - if stair.name == "mcl_stairs:stair_stonebrick" then - stair.name = "mcl_stairs:stair_stonebrickmossy" - elseif stair.name == "mcl_stairs:stair_stonebrick_outer" then - stair.name = "mcl_stairs:stair_stonebrickmossy_outer" - elseif stair.name == "mcl_stairs:stair_stonebrick_inner" then - stair.name = "mcl_stairs:stair_stonebrickmossy_inner" - end - minetest.set_node(stairs[s], stair) - elseif r_type <= 50 then -- 20% cracky - if stair.name == "mcl_stairs:stair_stonebrick" then - stair.name = "mcl_stairs:stair_stonebrickcracked" - elseif stair.name == "mcl_stairs:stair_stonebrick_outer" then - stair.name = "mcl_stairs:stair_stonebrickcracked_outer" - elseif stair.name == "mcl_stairs:stair_stonebrick_inner" then - stair.name = "mcl_stairs:stair_stonebrickcracked_inner" - end - minetest.set_node(stairs[s], stair) - end - -- 50% no change - end - - -- Randomly add ender eyes into end portal frames, but never fill the entire frame - local frames = minetest.find_nodes_in_area(p1, p2, "mcl_portals:end_portal_frame") - local eyes = 0 - for f=1, #frames do - local r_eye = pr:next(1, 10) - if r_eye == 1 then - eyes = eyes + 1 - if eyes < #frames then - local frame_node = minetest.get_node(frames[f]) - frame_node.name = "mcl_portals:end_portal_frame_eye" - minetest.set_node(frames[f], frame_node) - end - end - end +function mcl_structures.from_16x16_to_chunk_inverted_chance(x) + return math.floor(x * 256 / chunk_square + 0.5) end -function mcl_structures.generate_end_portal_shrine(pos, rotation, pr) - local offset = {x=6, y=4, z=6} - --local size = {x=13, y=8, z=13} - local newpos = { x = pos.x - offset.x, y = pos.y, z = pos.z - offset.z } - - local path = modpath.."/schematics/mcl_structures_end_portal_room_simple.mts" - mcl_structures.place_schematic(newpos, path, rotation or "0", nil, true, nil, shrine_placement_callback, pr) +function mcl_structures.from_16x16_to_block_inverted_chance(x) + return math.floor(x * 256 / block_square + 0.5) end -local function temple_placement_callback(p1, p2, size, rotation, pr) - - -- Delete cacti leftovers: - local cactus_nodes = minetest.find_nodes_in_area_under_air(p1, p2, "mcl_core:cactus") - if cactus_nodes and #cactus_nodes > 0 then - for _, pos in pairs(cactus_nodes) do - local node_below = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node_below and node_below.name == "mcl_core:sandstone" then - minetest.swap_node(pos, {name="air"}) - end - end - end - - -- Find chests. - -- FIXME: Searching this large area just for the chets is not efficient. Need a better way to find the chests; - -- probably let's just infer it from newpos because the schematic always the same. - local chests = minetest.find_nodes_in_area(p1, p2, "mcl_chests:chest") - - -- Add desert temple loot into chests - for c=1, #chests do - local lootitems = mcl_loot.get_multi_loot({ - { - stacks_min = 2, - stacks_max = 4, - items = { - { itemstring = "mcl_mobitems:bone", weight = 25, amount_min = 4, amount_max=6 }, - { itemstring = "mcl_mobitems:rotten_flesh", weight = 25, amount_min = 3, amount_max=7 }, - { itemstring = "mcl_mobitems:spider_eye", weight = 25, amount_min = 1, amount_max=3 }, - { itemstring = "mcl_books:book", weight = 20, func = function(stack, pr) - mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) - end }, - { itemstring = "mcl_mobitems:saddle", weight = 20, }, - { itemstring = "mcl_core:apple_gold", weight = 20, }, - { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, - { itemstring = "mcl_core:iron_ingot", weight = 15, amount_min = 1, amount_max = 5 }, - { itemstring = "mcl_core:emerald", weight = 15, amount_min = 1, amount_max = 3 }, - { itemstring = "", weight = 15, }, - { itemstring = "mobs_mc:iron_horse_armor", weight = 15, }, - { itemstring = "mobs_mc:gold_horse_armor", weight = 10, }, - { itemstring = "mobs_mc:diamond_horse_armor", weight = 5, }, - { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, - } - }, - { - stacks_min = 4, - stacks_max = 4, - items = { - { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_core:sand", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, - } - }}, pr) - init_node_construct(chests[c]) - local meta = minetest.get_meta(chests[c]) - local inv = meta:get_inventory() - mcl_loot.fill_inventory(inv, "main", lootitems, pr) - end - - -- Initialize pressure plates and randomly remove up to 5 plates - local pplates = minetest.find_nodes_in_area(p1, p2, "mesecons_pressureplates:pressure_plate_stone_off") - local pplates_remove = 5 - for p=1, #pplates do - if pplates_remove > 0 and pr:next(1, 100) >= 50 then - -- Remove plate - minetest.remove_node(pplates[p]) - pplates_remove = pplates_remove - 1 - else - -- Initialize plate - minetest.registered_nodes["mesecons_pressureplates:pressure_plate_stone_off"].on_construct(pplates[p]) - end - end -end - -function mcl_structures.generate_desert_temple(pos, rotation, pr) - -- No Generating for the temple ... Why using it ? No Change - local path = modpath.."/schematics/mcl_structures_desert_temple.mts" - local newpos = {x=pos.x,y=pos.y-12,z=pos.z} - --local size = {x=22, y=24, z=22} - if newpos == nil then - return - end - mcl_structures.place_schematic(newpos, path, rotation or "random", nil, true, nil, temple_placement_callback, pr) -end - -local registered_structures = {} - ---[[ Returns a table of structure of the specified type. -Currently the only valid parameter is "stronghold". -Format of return value: -{ - { pos = , generated= }, -- first structure - { pos = , generated= }, -- second structure - -- and so on -} - -TODO: Implement this function for all other structure types as well. -]] -function mcl_structures.get_registered_structures(structure_type) - if registered_structures[structure_type] then - return table.copy(registered_structures[structure_type]) - else - return {} - end -end - --- Register a structures table for the given type. The table format is the same as for --- mcl_structures.get_registered_structures. -function mcl_structures.register_structures(structure_type, structures) - registered_structures[structure_type] = structures -end - -local function dir_to_rotation(dir) - local ax, az = math.abs(dir.x), math.abs(dir.z) - if ax > az then - if dir.x < 0 then - return "270" - end - return "90" - end - if dir.z < 0 then - return "180" - end - return "0" -end - --- Debug command -minetest.register_chatcommand("spawnstruct", { - params = "desert_temple | desert_well | igloo | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_exit_portal_open | end_gateway_portal | end_portal_shrine | nether_portal | dungeon", - description = S("Generate a pre-defined structure near your position."), - privs = {debug = true}, - func = function(name, param) - local player = minetest.get_player_by_name(name) - if not player then return end - local pos = player:get_pos() - if not pos then return end - pos = vector.round(pos) - local dir = minetest.yaw_to_dir(player:get_look_horizontal()) - local rot = dir_to_rotation(dir) - local pr = PseudoRandom(pos.x+pos.y+pos.z) - local errord = false - local message = S("Structure placed.") - if param == "desert_temple" then - mcl_structures.generate_desert_temple(pos, rot, pr) - elseif param == "desert_well" then - mcl_structures.generate_desert_well(pos, rot) - elseif param == "igloo" then - mcl_structures.generate_igloo(pos, rot, pr) - elseif param == "witch_hut" then - mcl_structures.generate_witch_hut(pos, rot, pr) - elseif param == "boulder" then - mcl_structures.generate_boulder(pos, rot, pr) - elseif param == "fossil" then - mcl_structures.generate_fossil(pos, rot, pr) - elseif param == "ice_spike_small" then - mcl_structures.generate_ice_spike_small(pos, rot, pr) - elseif param == "ice_spike_large" then - mcl_structures.generate_ice_spike_large(pos, rot, pr) - elseif param == "end_exit_portal" then - mcl_structures.generate_end_exit_portal(pos, rot, pr) - elseif param == "end_exit_portal_open" then - mcl_structures.generate_end_exit_portal_open(pos, rot, pr) - elseif param == "end_gateway_portal" then - mcl_structures.generate_end_gateway_portal(pos, rot, pr) - elseif param == "end_portal_shrine" then - mcl_structures.generate_end_portal_shrine(pos, rot, pr) - elseif param == "dungeon" and mcl_dungeons and mcl_dungeons.spawn_dungeon then - mcl_dungeons.spawn_dungeon(pos, rot, pr) - elseif param == "nether_portal" and mcl_portals and mcl_portals.spawn_nether_portal then - mcl_portals.spawn_nether_portal(pos, rot, pr, name) - elseif param == "" then - message = S("Error: No structure type given. Please use “/spawnstruct ”.") - errord = true - else - message = S("Error: Unknown structure type. Please use “/spawnstruct ”.") - errord = true - end - minetest.chat_send_player(name, message) - if errord then - minetest.chat_send_player(name, S("Use /help spawnstruct to see a list of avaiable types.")) - end - end -}) +dofile(modpath .. "/structures.lua") diff --git a/mods/MAPGEN/mcl_structures/jungle_temple.lua b/mods/MAPGEN/mcl_structures/jungle_temple.lua new file mode 100644 index 000000000..9abaf4626 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/jungle_temple.lua @@ -0,0 +1,203 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 30 +local noise_multiplier = 1.3 +local random_offset = 132 +local struct_threshold = chance_per_chunk +local scanning_ratio = 0.0003 + +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local node_list = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:stone", "mcl_core:granite", "mcl_core:gravel", "mcl_core:diorite"} + +local schematic_file = modpath .. "/schematics/mcl_structures_jungle_temple.mts" + +local temple_schematic_lua = minetest.serialize_schematic(schematic_file, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" +local temple_schematic = loadstring(temple_schematic_lua)() +local size = temple_schematic.size +local sx = size.x +local sy = size.y +local sz = size.z +local offset = vector.round(vector.divide(size, 2)) +offset.y = 5 + +local ox = offset.x +local oy = offset.y +local oz = offset.z +local corner_x = sx - 3 +local corner_z = sz - 3 +local air_offset_x = ox - 6 +local air_offset_z = oz - 6 + +local function is_air(pos) + local node = minetest.get_node(pos) + return node.name == "air" +end + +local stair_support_node = { + {name = "mcl_core:cobble"}, + {name = "mcl_core:mossycobble"}, + {name = "mcl_core:stonebrick"}, + {name = "mcl_core:stonebrickmossy"}, + {name = "mcl_core:stonebrickcracked"}, +} + +local function on_placed(p1, rotation, pr, size) + local p2 + if rotation == "90" or rotation == "270" then + p2 = {x = p1.x + sz - 1, y = p1.y + sy - 1, z = p1.z + sx - 1} + else + p2 = {x = p1.x + sx - 1, y = p1.y + sy - 1, z = p1.z + sz - 1} + end + + -- Support stairs + local y = p1.y + 5 + local bottom = mcl_mapgen.get_chunk_beginning(y) + local stair_list = minetest.find_nodes_in_area({x = p1.x, y = y, z = p1.z}, {x = p2.x, y = y, z = p2.z}, {"mcl_stairs:stair_cobble"}, false) + for i = 1, #stair_list do + local pos = stair_list[i] + pos.y = y - 1 + while is_air(pos) and pos.y > bottom do + minetest.swap_node(pos, stair_support_node[pr:next(1, #stair_support_node)]) + pos.y = pos.y - 1 + end + end + + -- Initialize some nodes + local chest_node = "mcl_chests:trapped_chest_small" + local lever_node = "mesecons_walllever:wall_lever_off" + local nodes = minetest.find_nodes_in_area(p1, {x = p2.x, y = p1.y + 5, z = p2.z}, {chest_node, lever_node}, true) + + local levers = nodes[lever_node] + for _, pos in pairs(levers) do + mcl_structures.init_node_construct(pos) + end + + -- Add loot into chests TODO: fix items + local chests = nodes[chest_node] + for c=1, #chests do + local lootitems = mcl_loot.get_multi_loot({ + { + stacks_min = 2, + stacks_max = 4, + items = { + { itemstring = "mcl_mobitems:bone", weight = 25, amount_min = 4, amount_max=6 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 25, amount_min = 3, amount_max=7 }, + { itemstring = "mcl_mobitems:spider_eye", weight = 25, amount_min = 1, amount_max=3 }, + { itemstring = "mcl_books:book", weight = 20, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_mobitems:saddle", weight = 20, }, + { itemstring = "mcl_core:apple_gold", weight = 20, }, + { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, + { itemstring = "mcl_core:iron_ingot", weight = 15, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:emerald", weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "", weight = 15, }, + { itemstring = "mobs_mc:iron_horse_armor", weight = 15, }, + { itemstring = "mobs_mc:gold_horse_armor", weight = 10, }, + { itemstring = "mobs_mc:diamond_horse_armor", weight = 5, }, + { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + } + }, + { + stacks_min = 4, + stacks_max = 4, + items = { + { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_core:sand", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, + } + }}, pr) + mcl_structures.init_node_construct(chests[c]) + local meta = minetest.get_meta(chests[c]) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems, pr) + end +end + +local function place(pos, rotation, pr) + mcl_structures.place_schematic({pos = pos, schematic = temple_schematic, pr = pr, on_placed = on_placed}) +end + +local mcl_mapgen_clamp_to_chunk = mcl_mapgen.clamp_to_chunk +local function process_pos(pos) + return { + x = mcl_mapgen_clamp_to_chunk(pos.x - ox, sx), + y = mcl_mapgen_clamp_to_chunk(pos.y - oy, sy), + z = mcl_mapgen_clamp_to_chunk(pos.z - oz, sz), + } +end + +local function get_place_rank(pos) + local x1 = pos.x + 1 + local x2 = x1 + corner_x + local z1 = pos.z + 1 + local z2 = z1 + corner_z + local y2 = pos.y + 1 + local y1 = y2 - 2 + if is_air({x = x1, y = y1, z = z1}) then return -1 end + if is_air({x = x2, y = y1, z = z1}) then return -1 end + if is_air({x = x1, y = y1, z = z2}) then return -1 end + if is_air({x = x2, y = y1, z = z2}) then return -1 end + + local p1 = {x = x1 + air_offset_x, y = y2, z = z1 + air_offset_z} + local p2 = {x = x2 - air_offset_x, y = y2, z = z2 + air_offset_z} + local pos_counter_air = #minetest.find_nodes_in_area(p1, p2, {"air", "group:buildable_to", "group:deco_block"}, false) + local pos_counter_air = pos_counter_air - 2 * (#minetest.find_nodes_in_area(p1, p2, {"group:tree"}, false)) + + local p1 = {x = x1 + 1, y = y1, z = z1 + 1} + local p2 = {x = x2 - 1, y = y1, z = z2 - 1} + local pos_counter_ground = #minetest.find_nodes_in_area(p1, p2, node_list, false) + return pos_counter_ground + pos_counter_air +end + +mcl_structures.register_structure({ + name = "jungle_temple", + decoration = { + deco_type = "simple", + place_on = node_list, + flags = "all_floors", + fill_ratio = scanning_ratio, + y_min = -13, + y_max = mcl_mapgen.overworld.max, + height = 1, + biomes = + mcl_mapgen.v6 and { + "Jungle" + } or { + "Jungle", + "JungleEdge", + "JungleEdgeM", + "JungleEdgeM_ocean", + "JungleEdge_ocean", + "JungleM", + "JungleM_ocean", + "JungleM_shore", + "Jungle_ocean", + "Jungle_shore", + }, + }, + on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local pos + local count = -1 + for i = 1, #pos_list do + local pos_i = process_pos(pos_list[i]) + local count_i = get_place_rank(pos_i) + if count_i > count then + count = count_i + pos = pos_i + end + end + if count < 0 then return end + place(pos, nil, pr) + end, + place_function = place, +}) diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr index 248de695c..b9d2f48c0 100644 --- a/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr @@ -1,7 +1,7 @@ # textdomain: mcl_structures -Generate a pre-defined structure near your position.=Генерирует поблизости заранее определённое строение. -Structure placed.=Строение размещено. +Generate a pre-defined structure near your position.=Генерирует поблизости заранее определённую структуру. +Structure placed.=Структура размещена. Village built. WARNING: Villages are experimental and might have bugs.=Деревня построена. ВНИМАНИЕ: Деревни экспериментальны и могут содержать ошибки. -Error: No structure type given. Please use “/spawnstruct ”.=Ошибка: Не задан тип строения. Пожалуйста, используйте “/spawnstruct <тип>”. -Error: Unknown structure type. Please use “/spawnstruct ”.=Ошибка: Неизвестный тип строения. Пожалуйста, используйте “/spawnstruct <тип>”. +Error: No structure type given. Please use “/spawnstruct ”.=Ошибка: Не задан тип структуры. Пожалуйста, используйте “/spawnstruct <тип>”. +Error: Unknown structure type. Please use “/spawnstruct ”.=Ошибка: Неизвестный тип структуры. Пожалуйста, используйте “/spawnstruct <тип>”. Use /help spawnstruct to see a list of avaiable types.=Используйте /help spawnstruct, чтобы увидеть список доступных типов. diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.zh_CN.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.zh_CN.tr new file mode 100644 index 000000000..fcb41621c --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.zh_CN.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=在你的位置附近生成一个预定的结构. +Structure placed.=结构被放置. +Village built. WARNING: Villages are experimental and might have bugs.=村庄建成了.警告:村庄是实验性的,可能有bug. +Error: No structure type given. Please use “/spawnstruct ”.=错误:没有给出结构类型。请使用 “/spawnstruct ”. +Error: Unknown structure type. Please use “/spawnstruct ”.=错误:未知结构类型。请使用 “/spawnstruct ”. +Use /help spawnstruct to see a list of avaiable types.= 使用 "/help spawnstruct "查看可用类型的列表. diff --git a/mods/MAPGEN/mcl_structures/mod.conf b/mods/MAPGEN/mcl_structures/mod.conf index 3150c7cec..1e34960a8 100644 --- a/mods/MAPGEN/mcl_structures/mod.conf +++ b/mods/MAPGEN/mcl_structures/mod.conf @@ -1,4 +1,4 @@ name = mcl_structures -author = Wuzzy -description = Structures for MCL2 -depends = mcl_loot +author = Wuzzy, kay27, cora +description = Structures for MineClone 2/5 +depends = mcl_loot, mcl_mapgen, mcl_worlds diff --git a/mods/MAPGEN/mcl_structures/nice_jungle_temple.lua b/mods/MAPGEN/mcl_structures/nice_jungle_temple.lua new file mode 100644 index 000000000..75a137b03 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/nice_jungle_temple.lua @@ -0,0 +1,209 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 40 +local noise_multiplier = 1 +local random_offset = 133 +local struct_threshold = chance_per_chunk +local scanning_ratio = 0.00021 +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local node_list = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:stone", "mcl_core:granite", "mcl_core:gravel", "mcl_core:diorite"} + +local schematic_file = modpath .. "/schematics/mcl_structures_nice_jungle_temple.mts" + +local temple_schematic_lua = minetest.serialize_schematic(schematic_file, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" +local temple_schematic = loadstring(temple_schematic_lua)() +local size = temple_schematic.size +local sx = size.x +local sy = size.y +local sz = size.z +local offset = vector.round(vector.divide(size, 2)) +offset.y = 5 + +local ox = offset.x +local oy = offset.y +local oz = offset.z +local corner_x = sx - 3 +local corner_z = sz - 3 +local air_offset_x = ox - 6 +local air_offset_z = oz - 6 + +local function is_air(pos) + local node = minetest.get_node(pos) + return node.name == "air" +end + +local stair_support_node = { + {name = "mcl_core:cobble"}, + {name = "mcl_core:mossycobble"}, + {name = "mcl_core:stonebrick"}, + {name = "mcl_core:stonebrickmossy"}, + {name = "mcl_core:stonebrickcracked"}, +} + +local nodes_to_be_supported = { + "mcl_stairs:stair_cobble", + "mcl_stairs:stair_stonebrickmossy", + "mcl_stairs:stair_stonebrickcracked", +} + +local function on_placed(p1, rotation, pr, size) + local p2 + if rotation == "90" or rotation == "270" then + p2 = {x = p1.x + sz - 1, y = p1.y + sy - 1, z = p1.z + sx - 1} + else + p2 = {x = p1.x + sx - 1, y = p1.y + sy - 1, z = p1.z + sz - 1} + end + + -- Support stairs + local y = p1.y + 5 + local bottom = mcl_mapgen.get_chunk_beginning(y) + local stair_list = minetest.find_nodes_in_area({x = p1.x, y = y, z = p1.z}, {x = p2.x, y = y, z = p2.z}, nodes_to_be_supported, false) + for i = 1, #stair_list do + local pos = stair_list[i] + pos.y = y - 1 + while is_air(pos) and pos.y > bottom do + minetest.swap_node(pos, stair_support_node[pr:next(1, #stair_support_node)]) + pos.y = pos.y - 1 + end + end + + -- Initialize some nodes + local chest_node = "mcl_chests:trapped_chest_small" + local lever_node = "mesecons_walllever:wall_lever_off" + local nodes = minetest.find_nodes_in_area(p1, {x = p2.x, y = p1.y + 5, z = p2.z}, {chest_node, lever_node}, true) + + local levers = nodes[lever_node] + for _, pos in pairs(levers) do + mcl_structures.init_node_construct(pos) + end + + -- Add loot into chests TODO: fix items + local chests = nodes[chest_node] + for c=1, #chests do + local lootitems = mcl_loot.get_multi_loot({ + { + stacks_min = 2, + stacks_max = 4, + items = { + { itemstring = "mcl_mobitems:bone", weight = 25, amount_min = 4, amount_max=6 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 25, amount_min = 3, amount_max=7 }, + { itemstring = "mcl_mobitems:spider_eye", weight = 25, amount_min = 1, amount_max=3 }, + { itemstring = "mcl_books:book", weight = 20, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mcl_mobitems:saddle", weight = 20, }, + { itemstring = "mcl_core:apple_gold", weight = 20, }, + { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, + { itemstring = "mcl_core:iron_ingot", weight = 15, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:emerald", weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "", weight = 15, }, + { itemstring = "mobs_mc:iron_horse_armor", weight = 15, }, + { itemstring = "mobs_mc:gold_horse_armor", weight = 10, }, + { itemstring = "mobs_mc:diamond_horse_armor", weight = 5, }, + { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + } + }, + { + stacks_min = 4, + stacks_max = 4, + items = { + { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_core:sand", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, + } + }}, pr) + mcl_structures.init_node_construct(chests[c]) + local meta = minetest.get_meta(chests[c]) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems, pr) + end + +end + +local function place(pos, rotation, pr) + mcl_structures.place_schematic({pos = pos, schematic = temple_schematic, pr = pr, on_placed = on_placed}) +end + +local mcl_mapgen_clamp_to_chunk = mcl_mapgen.clamp_to_chunk +local function process_pos(pos) + return { + x = mcl_mapgen_clamp_to_chunk(pos.x - ox, sx), + y = mcl_mapgen_clamp_to_chunk(pos.y - oy, sy), + z = mcl_mapgen_clamp_to_chunk(pos.z - oz, sz), + } +end + +local function get_place_rank(pos) + local x1 = pos.x + 1 + local x2 = x1 + corner_x + local z1 = pos.z + 1 + local z2 = z1 + corner_z + local y2 = pos.y + 1 + local y1 = y2 - 2 + if is_air({x = x1, y = y1, z = z1}) then return -1 end + if is_air({x = x2, y = y1, z = z1}) then return -1 end + if is_air({x = x1, y = y1, z = z2}) then return -1 end + if is_air({x = x2, y = y1, z = z2}) then return -1 end + + local p1 = {x = x1 + air_offset_x, y = y2, z = z1 + air_offset_z} + local p2 = {x = x2 - air_offset_x, y = y2, z = z2 + air_offset_z} + local pos_counter_air = #minetest.find_nodes_in_area(p1, p2, {"air", "group:buildable_to", "group:deco_block"}, false) + local pos_counter_air = pos_counter_air - 2 * (#minetest.find_nodes_in_area(p1, p2, {"group:tree"}, false)) + + local p1 = {x = x1 + 1, y = y1, z = z1 + 1} + local p2 = {x = x2 - 1, y = y1, z = z2 - 1} + local pos_counter_ground = #minetest.find_nodes_in_area(p1, p2, node_list, false) + return pos_counter_ground + pos_counter_air +end + +mcl_structures.register_structure({ + name = "nice_jungle_temple", + decoration = { + deco_type = "simple", + place_on = node_list, + flags = "all_floors", + fill_ratio = scanning_ratio, + y_min = -20, + y_max = mcl_mapgen.overworld.max, + height = 1, + biomes = + mcl_mapgen.v6 and { + "Jungle" + } or { + "Jungle", + "JungleEdge", + "JungleEdgeM", + "JungleEdgeM_ocean", + "JungleEdge_ocean", + "JungleM", + "JungleM_ocean", + "JungleM_shore", + "Jungle_ocean", + "Jungle_shore", + }, + }, + on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local pos + local count = -1 + for i = 1, #pos_list do + local pos_i = process_pos(pos_list[i]) + local count_i = get_place_rank(pos_i) + if count_i > count then + count = count_i + pos = pos_i + end + end + if count < 0 then return end + place(pos, nil, pr) + end, + place_function = place, +}) diff --git a/mods/MAPGEN/mcl_structures/noise_indicator.lua b/mods/MAPGEN/mcl_structures/noise_indicator.lua new file mode 100644 index 000000000..3845e5784 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/noise_indicator.lua @@ -0,0 +1,69 @@ +local step = 1 + +local levels = { + [-9] = "black", + [-8] = "brown", + [-7] = "brown", + [-6] = "gray", + [-5] = "gray", + [-4] = "red", + [-3] = "orange", + [-2] = "purple", + [-1] = "magenta", + [0] = "pink", + [1] = "yellow", + [2] = "green", + [3] = "lime", + [4] = "blue", + [5] = "cyan", + [6] = "light_blue", + [7] = "silver", + [8] = "silver", + [9] = "white", +} + +local math_min, math_max = math.min, math.max +local math_floor, math_ceil = math.floor, math.ceil + +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local noise_offset_x_and_z = math_floor(mcl_mapgen.CS_NODES/2) + +mcl_mapgen.register_mapgen(function(minp, maxp, seed, vm_context) + if minetest.settings:get_bool("mcl_debug_struct_noise", false) then + local y0 = minp.y + for x0 = minp.x, maxp.x, step do + for z0 = minp.z, maxp.z, step do + local current_noise_level = mcl_structures_get_perlin_noise_level({x = x0 - noise_offset_x_and_z, y = y0, z = z0 - noise_offset_x_and_z}) + local amount + if current_noise_level < 0 then + amount = math_max(math_ceil(current_noise_level * 9), -9) + else + amount = math_min(math_floor(current_noise_level * 9), 9) + end + local y0 = maxp.y - 9 + amount + minetest.set_node({x=x0, y=y0, z=z0}, {name = "mcl_core:glass_"..levels[amount]}) + end + end + end + + if minetest.settings:get_bool("mcl_debug_chunk_borders", false) then + for x0 = minp.x, maxp.x, step do + for y0 = minp.y, maxp.y, step do + minetest.set_node({x=x0, y=y0, z=maxp.z}, {name = "mcl_core:glass"}) + end + end + for z0 = minp.z, maxp.z, step do + for y0 = minp.y, maxp.y, step do + minetest.set_node({x=maxp.x, y=y0, z=z0}, {name = "mcl_core:glass"}) + end + end + for z0 = minp.z, maxp.z, step do + for x0 = minp.x, maxp.x, step do + minetest.set_node({x=x0, y=maxp.y, z=z0}, {name = "mcl_core:glass"}) + end + end + if not minetest.settings:get_bool("mcl_debug_struct_noise", false) then + end + end +end, 999999999999) diff --git a/mods/MAPGEN/mcl_structures/ruined_portal.lua b/mods/MAPGEN/mcl_structures/ruined_portal.lua new file mode 100644 index 000000000..40484f9c9 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/ruined_portal.lua @@ -0,0 +1,632 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 400 +local noise_multiplier = 2.5 +local random_offset = 9159 +local scanning_ratio = 0.001 +local struct_threshold = 396 + +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level +local minetest_find_nodes_in_area = minetest.find_nodes_in_area +local minetest_swap_node = minetest.swap_node +local math_round = math.round +local math_abs = math.abs + + +local rotation_to_orientation = { + ["0"] = 1, + ["90"] = 0, + ["180"] = 1, + ["270"] = 0, +} + +local rotation_to_param2 = { + ["0"] = 3, + ["90"] = 0, + ["180"] = 1, + ["270"] = 2, +} + +local node_top = { + "mcl_core:goldblock", + "mcl_core:stone_with_gold", + "mcl_core:goldblock", +} + +local node_garbage = { + "mcl_nether:netherrack", + "mcl_core:lava_source", + "mcl_nether:netherrack", + "mcl_nether:netherrack", + "mcl_nether:magma", + "mcl_nether:netherrack", +} + +local stone1 = {name = "mcl_core:stonebrickcracked"} +local stone2 = {name = "mcl_core:stonebrickmossy"} +local stone3 = {name = "mcl_nether:magma"} +local stone4 = {name = "mcl_core:stonebrick"} + +local slab1 = {name = "mcl_stairs:slab_stonebrickcracked_top"} +local slab2 = {name = "mcl_stairs:slab_stonebrickmossy_top"} +local slab3 = {name = "mcl_stairs:slab_stone_top"} +local slab4 = {name = "mcl_stairs:slab_stonebrick_top"} + +local stair1 = "mcl_stairs:stair_stonebrickcracked" +local stair2 = "mcl_stairs:stair_stonebrickmossy" +local stair3 = "mcl_stairs:stair_stone_rough" +local stair4 = "mcl_stairs:stair_stonebrick" + + +local function draw_frame(frame_pos, frame_width, frame_height, orientation, pr, is_chain, rotation) + local param2 = rotation_to_param2[rotation] + + local function set_ruined_node(pos, node) + if pr:next(1, 5) == 4 then return end + minetest_swap_node(pos, node) + end + + local function get_random_stone_material() + local rnd = pr:next(1, 15) + if rnd < 4 then return stone1 end + if rnd == 4 then return stone2 end + if rnd == 5 then return stone3 end + return stone4 + end + + local function get_random_slab() + local rnd = pr:next(1, 15) + if rnd < 4 then return slab1 end + if rnd == 4 then return slab2 end + if rnd == 5 then return slab3 end + return slab4 + end + + local function get_random_stair(param2_offset) + local param2 = (param2 + (param2_offset or 0)) % 4 + local rnd = pr:next(1, 15) + if rnd < 4 then return {name = stair1, param2 = param2} end + if rnd == 4 then return {name = stair2, param2 = param2} end + if rnd == 5 then return {name = stair3, param2 = param2} end + return {name = stair4, param2 = param2} + end + + local function set_frame_stone_material(pos) + minetest_swap_node(pos, get_random_stone_material()) + end + + local function set_ruined_frame_stone_material(pos) + set_ruined_node(pos, get_random_stone_material()) + end + + local is_chain = is_chain + local orientation = orientation + local x1 = frame_pos.x + local y1 = frame_pos.y + local z1 = frame_pos.z + local slide_x = (1 - orientation) + local slide_z = orientation + local last_x = x1 + (frame_width - 1) * slide_x + local last_z = z1 + (frame_width - 1) * slide_z + local last_y = y1 + frame_height - 1 + + -- it's about the portal frame itself, what it will consist of + local frame_nodes = 2 * (frame_height + frame_width) - 4 + local obsidian_nodes = pr:next(math_round(frame_nodes * 0.5), math_round(frame_nodes * 0.73)) + local crying_obsidian_nodes = pr:next(math_round(obsidian_nodes * 0.09), math_round(obsidian_nodes * 0.5)) + local air_nodes = frame_nodes - obsidian_nodes + + local function set_frame_node(pos) + -- local node_choice = pr:next(1, air_nodes + obsidian_nodes) + local node_choice = math_round(mcl_structures_get_perlin_noise_level(pos) * (air_nodes + obsidian_nodes)) + if node_choice > obsidian_nodes and air_nodes > 0 then + air_nodes = air_nodes - 1 + return + end + obsidian_nodes = obsidian_nodes - 1 + if node_choice >= crying_obsidian_nodes then + minetest_swap_node(pos, {name = "mcl_core:obsidian"}) + return 1 + end + minetest_swap_node(pos, {name = "mcl_core:crying_obsidian"}) + crying_obsidian_nodes = crying_obsidian_nodes - 1 + return 1 + end + + local function set_outer_frame_node(def) + local is_top = def.is_top + if is_chain then + local pos2 = def.pos_outer2 + local is_top_hole = is_top and frame_width > 5 and ((pos2.x == x1 + slide_x * 2 and pos2.z == z1 + slide_z * 2) or (pos2.x == last_x - slide_x * 2 and pos2.z == last_z - slide_z * 2)) + if is_top_hole then + if pr:next(1, 7) > 1 then + minetest_swap_node(pos2, {name = "xpanes:bar_flat", param2 = orientation}) + end + else + set_frame_stone_material(pos2) + end + end + local is_obsidian = def.is_obsidian + if not is_obsidian and pr:next(1, 2) == 1 then return end + local pos = def.pos_outer1 + local is_decor_here = not is_top and pos.y % 3 == 2 + if is_decor_here then + minetest_swap_node(pos, {name = "mcl_core:stonebrickcarved"}) + elseif is_chain then + if not is_top and not is_obsidian then + minetest_swap_node(pos, {name = "xpanes:bar"}) + else + minetest_swap_node(pos, {name = "xpanes:bar_flat", param2 = orientation}) + end + else + if pr:next(1, 5) == 3 then + minetest_swap_node(pos, {name = "mcl_core:stonebrickcracked"}) + else + minetest_swap_node(pos, {name = "mcl_core:stonebrick"}) + end + end + end + + local function draw_roof(pos, length) + local x = pos.x + local y = pos.y + local z = pos.z + local number_of_roof_nodes = length + if number_of_roof_nodes > 1 then + set_ruined_node({x = x, y = y, z = z}, get_random_stair((param2 == 1 or param2 == 2) and -1 or 1)) + set_ruined_node({x = x + (length - 1) * slide_x, y = y, z = z + (length - 1) * slide_z}, get_random_stair((param2 == 1 or param2 == 2) and 1 or -1)) + number_of_roof_nodes = number_of_roof_nodes - 2 + x = x + slide_x + z = z + slide_z + end + while number_of_roof_nodes > 0 do + set_ruined_node({x = x, y = y, z = z}, get_random_stair((param2 == 1 or param2 == 2) and 2 or 0)) + x = x + slide_x + z = z + slide_z + number_of_roof_nodes = number_of_roof_nodes - 1 + end + end + + -- bottom corners + set_frame_node({x = x1, y = y1, z = z1}) + set_frame_node({x = last_x, y = y1, z = last_z}) + + -- top corners + local is_obsidian_top_left = set_frame_node({x = x1, y = last_y, z = z1}) + local is_obsidian_top_right = set_frame_node({x = last_x, y = last_y, z = last_z}) + + if is_chain then + if is_obsidian_top_left and pr:next(1, 4) ~= 2 then + set_frame_stone_material({x = x1 - slide_x * 2, y = last_y + 2, z = z1 - slide_z * 2}) + end + if is_obsidian_top_left and pr:next(1, 4) ~= 2 then + set_frame_stone_material({x = x1 - slide_x * 2, y = last_y + 1, z = z1 - slide_z * 2}) + end + if is_obsidian_top_left and pr:next(1, 4) ~= 2 then + set_frame_stone_material({x = last_x + slide_x * 2, y = last_y + 2, z = last_z + slide_z * 2}) + end + if is_obsidian_top_left and pr:next(1, 4) ~= 2 then + set_frame_stone_material({x = last_x + slide_x * 2, y = last_y + 1, z = last_z + slide_z * 2}) + end + end + + for y = y1, last_y do + local begin_or_end = y == y1 or y == last_y + local is_obsidian_left = begin_or_end and is_obsidian_top_left or set_frame_node({x = x1 , y = y, z = z1 }) + local is_obsidian_right = begin_or_end and is_obsidian_top_right or set_frame_node({x = last_x, y = y, z = last_z}) + set_outer_frame_node({ + pos_outer1 = {x = x1 - slide_x , y = y, z = z1 - slide_z }, + pos_outer2 = {x = x1 - slide_x * 2, y = y, z = z1 - slide_z * 2}, + is_obsidian = is_obsidian_left, + }) + set_outer_frame_node({ + pos_outer1 = {x = last_x + slide_x , y = y, z = last_z + slide_z }, + pos_outer2 = {x = last_x + slide_x * 2, y = y, z = last_z + slide_z * 2}, + is_obsidian = is_obsidian_right, + }) + end + + for i = 0, 1 do + set_outer_frame_node({ + pos_outer1 = {x = x1 - slide_x * i, y = last_y + 1, z = z1 - slide_z * i}, + pos_outer2 = {x = x1 - slide_x * i, y = last_y + 2, z = z1 - slide_z * i}, + is_obsidian = is_obsidian_top_left, + is_top = true, + }) + set_outer_frame_node({ + pos_outer1 = {x = last_x + slide_x * i, y = last_y + 1, z = last_z + slide_z * i}, + pos_outer2 = {x = last_x + slide_x * i, y = last_y + 2, z = last_z + slide_z * i}, + is_obsidian = is_obsidian_top_right, + is_top = true, + }) + end + + for x = x1 + slide_x, last_x - slide_x do for z = z1 + slide_z, last_z - slide_z do + set_frame_node({x = x, y = y1, z = z}) + local is_obsidian_top = set_frame_node({x = x, y = last_y, z = z}) + set_outer_frame_node({ + pos_outer1 = {x = x, y = last_y + 1, z = z}, + pos_outer2 = {x = x, y = last_y + 2, z = z}, + is_obsidian = is_obsidian_top, + is_top = true + }) + end end + + local node_top = {name = node_top[pr:next(1, #node_top)]} + if is_chain then + set_ruined_frame_stone_material({x = x1 + slide_x * 2, y = last_y + 3, z = z1 + slide_z * 2}) + set_ruined_frame_stone_material({x = x1 + slide_x , y = last_y + 3, z = z1 + slide_z }) + set_ruined_frame_stone_material({x = last_x - slide_x , y = last_y + 3, z = last_z - slide_z }) + set_ruined_frame_stone_material({x = last_x - slide_x * 2, y = last_y + 3, z = last_z - slide_z * 2}) + for x = x1 + slide_x * 3, last_x - slide_x * 3 do for z = z1 + slide_z * 3, last_z - slide_z * 3 do + set_ruined_node({x = x, y = last_y + 3, z = z}, node_top) + set_ruined_node({x = x - slide_z, y = last_y + 3, z = z - slide_x}, get_random_slab()) + set_ruined_node({x = x + slide_z, y = last_y + 3, z = z + slide_x}, get_random_slab()) + end end + draw_roof({x = x1 + slide_x * 3, y = last_y + 4, z = z1 + slide_z * 3}, frame_width - 6) + else + set_ruined_frame_stone_material({x = x1 + slide_x * 3, y = last_y + 2, z = z1 + slide_z * 3}) + set_ruined_frame_stone_material({x = x1 + slide_x * 2, y = last_y + 2, z = z1 + slide_z * 2}) + set_ruined_frame_stone_material({x = last_x - slide_x * 2, y = last_y + 2, z = last_z - slide_z * 2}) + set_ruined_frame_stone_material({x = last_x - slide_x * 3, y = last_y + 2, z = last_z - slide_z * 3}) + for x = x1 + slide_x * 4, last_x - slide_x * 4 do for z = z1 + slide_z * 4, last_z - slide_z * 4 do + set_ruined_node({x = x, y = last_y + 2, z = z}, node_top) + set_ruined_node({x = x - slide_z, y = last_y + 2, z = z - slide_x}, get_random_slab()) + set_ruined_node({x = x + slide_z, y = last_y + 2, z = z + slide_x}, get_random_slab()) + end end + draw_roof({x = x1 + slide_x * 3, y = last_y + 3, z = z1 + slide_z * 3}, frame_width - 6) + end +end + +local possible_rotations = {"0", "90", "180", "270"} + +local function draw_trash(pos, width, height, lift, orientation, pr) + local slide_x = (1 - orientation) + local slide_z = orientation + local x1 = pos.x - lift - 1 + local x2 = pos.x + (width - 1) * slide_x + lift + 1 + local z1 = pos.z - lift - 1 + local z2 = pos.z + (width - 1) * slide_z + lift + 1 + local y1 = pos.y - pr:next(1, height) - 1 + local y2 = pos.y + local opacity_layers = math.floor((y2 - y1) / 2) + local opacity_layer = -opacity_layers + for y = y1, y2 do + local inverted_opacity_0_5 = math_round(math_abs(opacity_layer) / opacity_layers * 5) + for x = x1 + pr:next(0, 2), x2 - pr:next(0, 2) do + for z = z1 + pr:next(0, 2), z2 - pr:next(0, 2) do + if inverted_opacity_0_5 == 0 or (x % inverted_opacity_0_5 ~= pr:next(0, 1) and z % inverted_opacity_0_5 ~= pr:next(0, 1)) then + minetest_swap_node({x = x, y = y, z = z}, {name = node_garbage[pr:next(1, #node_garbage)]}) + end + end + end + opacity_layer = opacity_layer + 1 + end +end + +local stair_replacement_list = { + "air", + "group:water", + "group:lava", + "group:buildable_to", + "group:deco_block", +} + +local stair_names = { + "mcl_stairs:stair_stonebrickcracked", + "mcl_stairs:stair_stonebrickmossy", + "mcl_stairs:stair_stone_rough", + "mcl_stairs:stair_stone_rough", + "mcl_stairs:stair_stone_rough", + "mcl_stairs:stair_stone_rough", + "mcl_stairs:stair_stone_rough", + "mcl_stairs:stair_stone_rough", + "mcl_stairs:stair_stone_rough", + "mcl_stairs:stair_stonebrick", + "mcl_stairs:stair_stonebrick", + "mcl_stairs:stair_stonebrick", +} +local stair_outer_names = { + "mcl_stairs:stair_stonebrickcracked_outer", + "mcl_stairs:stair_stonebrickmossy_outer", + "mcl_stairs:stair_stone_rough_outer", + "mcl_stairs:stair_stonebrick_outer", +} + +local stair_content = { + {name = "mcl_core:lava_source"}, + {name = "mcl_core:stone"}, + {name = "mcl_core:stone"}, + {name = "mcl_core:stone"}, + {name = "mcl_core:stone"}, + {name = "mcl_core:stone"}, + {name = "mcl_core:stonebrick"}, + {name = "mcl_nether:magma"}, + {name = "mcl_nether:netherrack"}, + {name = "mcl_nether:netherrack"}, +} + +local stair_content_bottom = { + {name = "mcl_nether:magma"}, + {name = "mcl_nether:magma"}, + {name = "mcl_nether:netherrack"}, + {name = "mcl_nether:netherrack"}, + {name = "mcl_nether:netherrack"}, + {name = "mcl_nether:netherrack"}, +} + +local slabs = { + {name = "mcl_stairs:slab_stone"}, + {name = "mcl_stairs:slab_stone"}, + {name = "mcl_stairs:slab_stone"}, + {name = "mcl_stairs:slab_stone"}, + {name = "mcl_stairs:slab_stone"}, + {name = "mcl_stairs:slab_stonebrick"}, + {name = "mcl_stairs:slab_stonebrick"}, + {name = "mcl_stairs:slab_stonebrickcracked"}, + {name = "mcl_stairs:slab_stonebrickmossy"}, +} + +local stones = { + {name = "mcl_core:stone"}, + {name = "mcl_core:stone"}, + {name = "mcl_core:stone"}, + {name = "mcl_core:cobble"}, + {name = "mcl_core:mossycobble"}, +} + +local stair_selector = { + [-1] = { + [-1] = { + names = stair_outer_names, + param2 = 1, + }, + [0] = { + names = stair_names, + param2 = 1, + }, + [1] = { + names = stair_outer_names, + param2 = 2, + }, + }, + [0] = { + [-1] = { + names = stair_names, + param2 = 0, + }, + [0] = { + names = stair_content, + }, + [1] = { + names = stair_names, + param2 = 2, + }, + }, + [1] = { + [-1] = { + names = stair_outer_names, + param2 = 0, + }, + [0] = { + names = stair_names, + param2 = 3, + }, + [1] = { + names = stair_outer_names, + param2 = 3, + }, + }, +} + +local stair_offset_from_bottom = 2 + +local function draw_stairs(pos, width, height, lift, orientation, pr, is_chain, param2) + + local current_stair_content = stair_content + local current_stones = stones + + local function set_ruined_node(pos, node) + if pr:next(1, 7) < 3 then return end + minetest_swap_node(pos, node) + return true + end + + local param2 = param2 + local mirror = param2 == 1 or param2 == 2 + if mirror then + param2 = (param2 + 2) % 4 + end + + local chain_offset = is_chain and 1 or 0 + + local lift = lift + stair_offset_from_bottom + local slide_x = (1 - orientation) + local slide_z = orientation + local width = width + 2 + local x1 = pos.x - (chain_offset + 1 ) * slide_x - 1 + local x2 = pos.x + (chain_offset + width) * slide_x + 1 + local z1 = pos.z - (chain_offset + 1 ) * slide_z - 1 + local z2 = pos.z + (chain_offset + width) * slide_z + 1 + local y1 = pos.y - stair_offset_from_bottom + local y2 = pos.y + lift - stair_offset_from_bottom + local stair_layer = true + local y = y2 + local place_slabs = true + local x_key, z_key + local need_to_place_chest = true + local chest_pos + local bad_nodes_ratio = 0 + while (y >= y1) or (bad_nodes_ratio > 0.07) do + local good_nodes_counter = 0 + for x = x1, x2 do + x_key = (x == x1) and -1 or (x == x2) and 1 or 0 + for z = z1, z2 do + local pos = {x = x, y = y, z = z} + if #minetest_find_nodes_in_area(pos, pos, stair_replacement_list, false) > 0 then + z_key = (z == z1) and -1 or (z == z2) and 1 or 0 + local stair_coverage = (x_key ~= 0) or (z_key ~= 0) + if stair_coverage then + if stair_layer then + local stair = stair_selector[x_key][z_key] + local names = stair.names + set_ruined_node(pos, {name = names[pr:next(1, #names)], param2 = stair.param2}) + elseif place_slabs then + set_ruined_node(pos, slabs[pr:next(1, #slabs)]) + else + local placed = set_ruined_node(pos, current_stones[pr:next(1, #current_stones)]) + if need_to_place_chest and placed then + chest_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + minetest_swap_node(chest_pos, {name = "mcl_chests:chest_small"}) + need_to_place_chest = false + end + end + elseif not stair_layer then + set_ruined_node(pos, current_stair_content[pr:next(1, #current_stair_content)]) + end + else + good_nodes_counter = good_nodes_counter + 1 + end + end + end + bad_nodes_ratio = 1 - good_nodes_counter / ((x2 - x1 + 1) * (z2 - z1 + 1)) + if y >= y1 then + x1 = x1 - 1 + x2 = x2 + 1 + z1 = z1 - 1 + z2 = z2 + 1 + if (stair_layer or place_slabs) then + y = y - 1 + if y <= y1 then + current_stair_content = stair_content_bottom + current_stones = stair_content_bottom + end + end + place_slabs = not place_slabs + stair_layer = false + else + place_slabs = false + y = y - 1 + local dx1 = pr:next(0, 10) + if dx1 < 3 then x1 = x1 + dx1 end + local dx2 = pr:next(0, 10) + if dx2 < 3 then x2 = x2 - dx1 end + if x1 >= x2 then return chest_pos end + local dz1 = pr:next(0, 10) + if dz1 < 3 then z1 = z1 + dz1 end + local dz2 = pr:next(0, 10) + if dz2 < 3 then z2 = z2 - dz1 end + if z1 >= z2 then return chest_pos end + end + end + return chest_pos +end + +local function enchant(stack, pr) + -- 75%-100% damage + mcl_enchanting.enchant_randomly(stack, 30, true, false, false, pr) +end + +local function enchant_armor(stack, pr) + -- itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) + mcl_enchanting.enchant_randomly(stack, 30, false, false, false, pr) +end + +local function place(pos, rotation, pr) + local width = pr:next(2, 10) + local height = pr:next(((width < 3) and 3 or 2), 10) + local lift = pr:next(0, 4) + local rotation = rotation or possible_rotations[pr:next(1, #possible_rotations)] + local orientation = rotation_to_orientation[rotation] + assert(orientation) + local param2 = rotation_to_param2[rotation] + assert(param2) + local is_chain = pr:next(1, 3) > 1 + draw_trash(pos, width, height, lift, orientation, pr) + local chest_pos = draw_stairs(pos, width, height, lift, orientation, pr, is_chain, param2) + draw_frame({x = pos.x, y = pos.y + lift, z = pos.z}, width + 2, height + 2, orientation, pr, is_chain, rotation) + if not chest_pos then return end + + local lootitems = mcl_loot.get_loot( + { + stacks_min = 4, + stacks_max = 8, + items = { + {itemstring = "mcl_core:iron_nugget", weight = 40, amount_min = 9, amount_max = 18}, + {itemstring = "mcl_core:flint", weight = 40, amount_min = 9, amount_max = 18}, + {itemstring = "mcl_core:obsidian", weight = 40, amount_min = 1, amount_max = 2}, + {itemstring = "mcl_fire:fire_charge", weight = 40, amount_min = 1, amount_max = 1}, + {itemstring = "mcl_fire:flint_and_steel", weight = 40, amount_min = 1, amount_max = 1}, + {itemstring = "mcl_core:gold_nugget", weight = 15, amount_min = 4, amount_max = 24}, + {itemstring = "mcl_core:apple_gold", weight = 15}, + {itemstring = "mcl_tools:axe_gold", weight = 15, func = enchant}, + {itemstring = "mcl_farming:hoe_gold", weight = 15, func = enchant}, + {itemstring = "mcl_tools:pick_gold", weight = 15, func = enchant}, + {itemstring = "mcl_tools:shovel_gold", weight = 15, func = enchant}, + {itemstring = "mcl_tools:sword_gold", weight = 15, func = enchant}, + {itemstring = "mcl_armor:helmet_gold", weight = 15, func = enchant_armor}, + {itemstring = "mcl_armor:chestplate_gold", weight = 15, func = enchant_armor}, + {itemstring = "mcl_armor:leggings_gold", weight = 15, func = enchant_armor}, + {itemstring = "mcl_armor:boots_gold", weight = 15, func = enchant_armor}, + {itemstring = "mcl_potions:speckled_melon", weight = 5, amount_min = 4, amount_max = 12}, + {itemstring = "mcl_farming:carrot_item_gold", weight = 5, amount_min = 4, amount_max = 12}, + {itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 2, amount_max = 8}, + {itemstring = "mcl_clock:clock", weight = 5}, + {itemstring = "mesecons_pressureplates:pressure_plate_gold_off", weight = 5}, + {itemstring = "mobs_mc:gold_horse_armor", weight = 5}, + {itemstring = "mcl_core:goldblock", weight = 1, amount_min = 1, amount_max = 2}, + {itemstring = "mcl_bells:bell", weight = 1}, + {itemstring = "mcl_core:apple_gold_enchanted", weight = 1}, + } + }, + pr + ) + mcl_structures.init_node_construct(chest_pos) + local meta = minetest.get_meta(chest_pos) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems, pr) +end + +local function get_place_rank(pos) + local x, y, z = pos.x, pos.y, pos.z + local p1 = {x = x , y = y, z = z } + local p2 = {x = x + 7, y = y, z = z + 7} + local air_pos_list_surface = #minetest_find_nodes_in_area(p1, p2, "air", false) + p1.y = p1.y - 1 + p2.y = p2.y - 1 + local opaque_pos_list_surface = #minetest_find_nodes_in_area(p1, p2, "group:opaque", false) + return air_pos_list_surface + 3 * opaque_pos_list_surface +end + +mcl_structures.register_structure({ + name = "ruined_portal", + decoration = { + deco_type = "simple", + flags = "all_floors", + fill_ratio = scanning_ratio, + height = 1, + place_on = {"mcl_core:sand", "mcl_core:dirt_with_grass", "mcl_core:water_source", "mcl_core:dirt_with_grass_snow"}, + }, + on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) + if maxp.y < mcl_mapgen.overworld.min then return end + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local pos = pos_list[1] + if #pos_list > 1 then + local count = get_place_rank(pos) + for i = 2, #pos_list do + local pos_i = pos_list[i] + local count_i = get_place_rank(pos_i) + if count_i > count then + count = count_i + pos = pos_i + end + end + end + place(pos, nil, pr) + end, + place_function = place, +}) diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_jungle_temple.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_jungle_temple.mts new file mode 100644 index 000000000..ec98a83ea Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_jungle_temple.mts differ diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_nice_jungle_temple.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_nice_jungle_temple.mts new file mode 100644 index 000000000..8a9babb9b Binary files /dev/null and b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_nice_jungle_temple.mts differ diff --git a/mods/MAPGEN/mcl_structures/stronghold.lua b/mods/MAPGEN/mcl_structures/stronghold.lua new file mode 100644 index 000000000..3493173d5 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/stronghold.lua @@ -0,0 +1,184 @@ +-- Generate strongholds. + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +-- A total of 128 strongholds are generated in rings around the world origin. +-- This is the list of rings, starting with the innermost ring first. +local stronghold_rings = { + -- amount: Number of strongholds in ring. + -- min, max: Minimum and maximum distance from (X=0, Z=0). + { amount = 3, min = 1408, max = 2688 }, + { amount = 6, min = 4480, max = 5760 }, + { amount = 10, min = 7552, max = 8832 }, + { amount = 15, min = 10624, max = 11904 }, + { amount = 21, min = 13696, max = 14976 }, + { amount = 28, min = 16768, max = 18048 }, + { amount = 36, min = 19840, max = 21120 }, + { amount = 9, min = 22912, max = 24192 }, +} + +local strongholds = {} +local strongholds_inited = false + +local superflat = mcl_mapgen.superflat + +local size = {x = 13, y = 8, z = 13} +local offset = vector.round(vector.divide(size, 2)) + +local function place(pos, rotation, pr) + local p1 = { x = pos.x - offset.x, y = pos.y - offset.y, z = pos.z - offset.z } + local p2 = vector.add(p1, vector.subtract(size, 1)) + + local path = modpath.."/schematics/mcl_structures_end_portal_room_simple.mts" + + mcl_structures.place_schematic({ + pos = p1, + schematic = path, + rotation = rotation or "0", + pr = pr, + }) + -- Find and setup spawner with silverfish + local spawners = minetest.find_nodes_in_area(p1, p2, "mcl_mobspawners:spawner") + for s=1, #spawners do + mcl_mobspawners.setup_spawner(spawners[s], "mobs_mc:silverfish") + end + + -- Shuffle stone brick types + local bricks = minetest.find_nodes_in_area(p1, p2, "mcl_core:stonebrick") + for b=1, #bricks do + local r_bricktype = pr:next(1, 100) + local r_infested = pr:next(1, 100) + local bricktype + if r_infested <= 5 then + if r_bricktype <= 30 then -- 30% + bricktype = "mcl_monster_eggs:monster_egg_stonebrickmossy" + elseif r_bricktype <= 50 then -- 20% + bricktype = "mcl_monster_eggs:monster_egg_stonebrickcracked" + else -- 50% + bricktype = "mcl_monster_eggs:monster_egg_stonebrick" + end + else + if r_bricktype <= 30 then -- 30% + bricktype = "mcl_core:stonebrickmossy" + elseif r_bricktype <= 50 then -- 20% + bricktype = "mcl_core:stonebrickcracked" + end + -- 50% stonebrick (no change necessary) + end + if bricktype then + minetest.set_node(bricks[b], { name = bricktype }) + end + end + + -- Also replace stairs + local stairs = minetest.find_nodes_in_area(p1, p2, {"mcl_stairs:stair_stonebrick", "mcl_stairs:stair_stonebrick_outer", "mcl_stairs:stair_stonebrick_inner"}) + for s=1, #stairs do + local stair = minetest.get_node(stairs[s]) + local r_type = pr:next(1, 100) + if r_type <= 30 then -- 30% mossy + if stair.name == "mcl_stairs:stair_stonebrick" then + stair.name = "mcl_stairs:stair_stonebrickmossy" + elseif stair.name == "mcl_stairs:stair_stonebrick_outer" then + stair.name = "mcl_stairs:stair_stonebrickmossy_outer" + elseif stair.name == "mcl_stairs:stair_stonebrick_inner" then + stair.name = "mcl_stairs:stair_stonebrickmossy_inner" + end + minetest.set_node(stairs[s], stair) + elseif r_type <= 50 then -- 20% cracky + if stair.name == "mcl_stairs:stair_stonebrick" then + stair.name = "mcl_stairs:stair_stonebrickcracked" + elseif stair.name == "mcl_stairs:stair_stonebrick_outer" then + stair.name = "mcl_stairs:stair_stonebrickcracked_outer" + elseif stair.name == "mcl_stairs:stair_stonebrick_inner" then + stair.name = "mcl_stairs:stair_stonebrickcracked_inner" + end + minetest.set_node(stairs[s], stair) + end + -- 50% no change + end + + -- Randomly add ender eyes into end portal frames, but never fill the entire frame + local frames = minetest.find_nodes_in_area(p1, p2, "mcl_portals:end_portal_frame") + local eyes = 0 + for f=1, #frames do + local r_eye = pr:next(1, 10) + if r_eye == 1 then + eyes = eyes + 1 + if eyes < #frames then + local frame_node = minetest.get_node(frames[f]) + frame_node.name = "mcl_portals:end_portal_frame_eye" + minetest.set_node(frames[f], frame_node) + end + end + end +end + + +-- Determine the stronghold positions and store them into the strongholds table. +-- The stronghold positions are based on the world seed. +-- The actual position might be offset by a few blocks because it might be shifted +-- to make sure the end portal room is completely within the boundaries of a mapchunk. +local function init_strongholds() + if strongholds_inited then + return + end + -- Don't generate strongholds in singlenode + if mcl_mapgen.singlenode then + strongholds_inited = true + return + end + local pr = PseudoRandom(mcl_mapgen.seed) + for s=1, #stronghold_rings do + local ring = stronghold_rings[s] + + -- Get random angle + local angle = pr:next() + -- Scale angle to 0 .. 2*math.pi + angle = (angle / 32767) * (math.pi*2) + for a=1, ring.amount do + local dist = pr:next(ring.min, ring.max) + local y + if superflat then + y = mcl_mapgen.overworld.bedrock_max + offset.y + else + y = pr:next(mcl_mapgen.overworld.bedrock_max+1+offset.y, mcl_mapgen.overworld.bedrock_min+48+offset.y) + end + local pos = { + x = mcl_mapgen.clamp_to_chunk(math.floor(math.cos(angle) * dist) - offset.x, size.x) + offset.x, + y = mcl_mapgen.clamp_to_chunk(y - offset.y, size.y) + offset.y, + z = mcl_mapgen.clamp_to_chunk(math.floor(math.sin(angle) * dist) - offset.z, size.z) + offset.z, + } + table.insert(strongholds, { pos = pos, generated = false }) + + -- Rotate angle by (360 / amount) degrees. + -- This will cause the angles to be evenly distributed in the stronghold ring + angle = math.fmod(angle + ((math.pi*2) / ring.amount), math.pi*2) + end + end + + mcl_structures.strongholds = strongholds + + mcl_structures.register_structure({ + name = "stronghold", + place_function = place, + }) + + strongholds_inited = true +end + +init_strongholds() + +-- Stronghold generation for register_on_generated. +mcl_mapgen.register_mapgen(function(minp, maxp, blockseed) + local pr = PseudoRandom(blockseed) + for s=1, #strongholds do + if not strongholds[s].generated then + local pos = strongholds[s].pos + if minp.x <= pos.x and maxp.x >= pos.x and minp.z <= pos.z and maxp.z >= pos.z and minp.y <= pos.y and maxp.y >= pos.y then + place(pos, nil, pr) + strongholds[s].generated = true + end + end + end +end, mcl_mapgen.order.STRONGHOLDS) diff --git a/mods/MAPGEN/mcl_structures/structures.lua b/mods/MAPGEN/mcl_structures/structures.lua new file mode 100644 index 000000000..32a399ae3 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/structures.lua @@ -0,0 +1,18 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +if not mcl_mapgen.singlenode then + dofile(modpath .. "/desert_temple.lua") + dofile(modpath .. "/desert_well.lua") + dofile(modpath .. "/end_exit_portal.lua") + dofile(modpath .. "/fossil.lua") + dofile(modpath .. "/igloo.lua") + dofile(modpath .. "/ice_spike_small.lua") + dofile(modpath .. "/ice_spike_large.lua") + dofile(modpath .. "/jungle_temple.lua") + dofile(modpath .. "/nice_jungle_temple.lua") + dofile(modpath .. "/noise_indicator.lua") + dofile(modpath .. "/ruined_portal.lua") + dofile(modpath .. "/stronghold.lua") + dofile(modpath .. "/witch_hut.lua") +end diff --git a/mods/MAPGEN/mcl_structures/witch_hut.lua b/mods/MAPGEN/mcl_structures/witch_hut.lua new file mode 100644 index 000000000..49843bb59 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/witch_hut.lua @@ -0,0 +1,136 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local chance_per_chunk = 17 +local noise_multiplier = -0.9 +local random_offset = 8 +local scanning_ratio = 0.01 +local struct_threshold = chance_per_chunk + +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local schematic_file = modpath .. "/schematics/mcl_structures_witch_hut.mts" + +local witch_hut_schematic_lua = minetest.serialize_schematic(schematic_file, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic" +local witch_hut_schematic = loadstring(witch_hut_schematic_lua)() + +local node_list = {"mcl_core:dirt_with_grass", "mcl_core:dirt"} + +local WITCH_HUT_HEIGHT = 2 -- Exact Y level to spawn witch huts at. This height refers to the height of the floor + +local witch_hut_offsets = { + ["0"] = { + {x=1, y=0, z=1}, {x=1, y=0, z=5}, {x=6, y=0, z=1}, {x=6, y=0, z=5}, + }, + ["180"] = { + {x=2, y=0, z=1}, {x=2, y=0, z=5}, {x=7, y=0, z=1}, {x=7, y=0, z=5}, + }, + ["270"] = { + {x=1, y=0, z=1}, {x=5, y=0, z=1}, {x=1, y=0, z=6}, {x=5, y=0, z=6}, + }, + ["90"] = { + {x=1, y=0, z=2}, {x=5, y=0, z=2}, {x=1, y=0, z=7}, {x=5, y=0, z=7}, + }, +} + +local function on_placed(place, rotation, pr, size) + local offsets = witch_hut_offsets[rotation] + if not offsets then return end + for _, offset in pairs(offsets) do + local tpos = vector.add(place, offset) + for y = place.y - 1, mcl_mapgen.get_chunk_beginning(place.y - 1), -1 do + tpos.y = y + local nn = minetest.get_node(tpos).name + if not nn then break end + local node = minetest.registered_nodes[nn] + local groups = node.groups + if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" or groups.deco_block then + minetest.swap_node(tpos, {name="mcl_core:tree"}) + else + break + end + end + end +end + + +local function place(pos, rotation, pr) + mcl_structures.place_schematic({pos = pos, rotaton = rotation, schematic = witch_hut_schematic, pr = pr, on_placed = on_placed}) +end + +local function get_place_rank(pos) + local x, y, z = pos.x, pos.y, pos.z + local p1 = {x = x + 1, y = y + 1, z = z + 1} + local p2 = {x = x + 4, y = y + 4, z = z + 4} + local counter = #minetest.find_nodes_in_area(p1, p2, {"air", "group:buildable_to", "group:deco_block"}, false) + return counter +end + +local function tune_pos(pos) + local pos = table.copy(pos) + local y = pos.y - 1 + if y >= WITCH_HUT_HEIGHT - 5 and y <= WITCH_HUT_HEIGHT + 5 then + pos.y = WITCH_HUT_HEIGHT + return pos + end + local x = pos.x + local z = pos.z + local p1 = {x = x - 3, y = y , z = z - 3} + local p2 = {x = x + 3, y = y + 2, z = z + 3} + local water_list = minetest.find_nodes_in_area(p1, p2, {"group:water"}, false) + if not water_list or #water_list < 1 then + pos.y = y + return pos + end + local top = -1 + for _, pos in pairs(water_list) do + if pos.y > top then + top = pos.y + end + end + pos.y = top + return pos +end + +mcl_structures.register_structure({ + name = "witch_hut", + decoration = { + deco_type = "simple", + place_on = node_list, + spawn_by = {"mcl_core:water_source", "group:frosted_ice"}, + num_spawn_by = 1, + -- flags = "all_floors", + fill_ratio = scanning_ratio, + y_min = mcl_mapgen.overworld.min, + y_max = mcl_mapgen.overworld.max, + height = 1, + biomes = mcl_mapgen.v6 and { + "Normal", + } or { + "Swampland", + "Swampland_shore", + "Swampland_ocean", + "Swampland_deep_ocean", + }, + }, + on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) + local pr = PseudoRandom(seed + random_offset) + local random_number = pr:next(1, chance_per_chunk) + local noise = mcl_structures_get_perlin_noise_level(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local pos = tune_pos(pos_list[1]) + if #pos_list > 1 then + local count = get_place_rank(pos) + for i = 2, #pos_list do + local pos_i = pos_list[i] + local count_i = get_place_rank(pos_i) + if count_i > count then + count = count_i + pos = pos_i + end + end + end + place(pos, nil, pr) + end, + place_function = place, +}) diff --git a/mods/MAPGEN/mcl_villages/README.md b/mods/MAPGEN/mcl_villages/README.md new file mode 100644 index 000000000..3d1531fb3 --- /dev/null +++ b/mods/MAPGEN/mcl_villages/README.md @@ -0,0 +1,22 @@ +# MCL_Villages version 1.0 +-------------------------- +Originally a fork of Rochambeau's "Settlements", fully rewritten for MineClone 5. + +## Using the mod +---------------- +This mod adds villages on world generation. + +## Credits +---------- + * This mod is originally based on "ruins" by BlockMen + + * Completely new schematics for MineClone2: + * MysticTempest - CC-BY-SA 4.0 + + * Basic conversion of Settlements mod for compatibility with MineClone2: MysticTempest + + * Reimplemention: kay27 + +## License +---------- + * License of source code: WTFPL diff --git a/mods/MAPGEN/mcl_villages/README.txt b/mods/MAPGEN/mcl_villages/README.txt deleted file mode 100644 index 7573084d8..000000000 --- a/mods/MAPGEN/mcl_villages/README.txt +++ /dev/null @@ -1,45 +0,0 @@ -MCL_Villages: -============================ -A fork of Rochambeau's "Settlements" mod converted for use in MineClone5. - --------------- -Using the mod: --------------- -This mod adds settlements on world generation. - -And, in Creative Mode; also comes with a debug tool for spawning in villages. - - -------------- -MCL2 Credits: -------------- -Code forked from: https://github.com/MysticTempest/settlements/tree/mcl_villages - Commit: e24b4be -================================================================================ -Basic conversion of Settlements mod for compatibility with MineClone2, plus new schematics: MysticTempest - -Seed-based Village Generation, multi-threading, bugfixes: kay27 - - - -========================= -version: 0.1 alpha - -License of source code: WTFPL ------------------------------ -(c) Copyright Rochambeau (2018) - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. - - -Credits: --------------- -This mod is based on "ruins" by BlockMen - -Completely new schematics for MineClone2: -MysticTempest - CC-BY-SA 4.0 - diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua deleted file mode 100644 index a69029063..000000000 --- a/mods/MAPGEN/mcl_villages/buildings.lua +++ /dev/null @@ -1,282 +0,0 @@ ---[[ -------------------------------------------------------------------------------- --- build schematic, replace material, rotation -------------------------------------------------------------------------------- -function settlements.build_schematic(vm, data, va, pos, building, replace_wall, name) - -- get building node material for better integration to surrounding - local platform_material = mcl_vars.get_node(pos) - if not platform_material or (platform_material.name == "air" or platform_material.name == "ignore") then - return - end - platform_material = platform_material.name - -- pick random material - local material = wallmaterial[math.random(1,#wallmaterial)] - -- schematic conversion to lua - local schem_lua = minetest.serialize_schematic(building, - "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" - -- replace material - if replace_wall == "y" then - schem_lua = schem_lua:gsub("mcl_core:cobble", material) - end - schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", - platform_material) - --- Disable special junglewood for now. - -- special material for spawning npcs - -- schem_lua = schem_lua:gsub("mcl_core:junglewood", - -- "settlements:junglewood") --- - - -- format schematic string - local schematic = loadstring(schem_lua)() - -- build foundation for the building an make room above - local width = schematic["size"]["x"] - local depth = schematic["size"]["z"] - local height = schematic["size"]["y"] - local possible_rotations = {"0", "90", "180", "270"} - local rotation = possible_rotations[ math.random( #possible_rotations ) ] - settlements.foundation( - pos, - width, - depth, - height, - rotation) - vm:set_data(data) - -- place schematic - - minetest.place_schematic_on_vmanip( - vm, - pos, - schematic, - rotation, - nil, - true) - vm:write_to_map(true) -end]] -------------------------------------------------------------------------------- --- initialize settlement_info -------------------------------------------------------------------------------- -function settlements.initialize_settlement_info(pr) - local count_buildings = {} - - -- count_buildings table reset - for k,v in pairs(settlements.schematic_table) do - count_buildings[v["name"]] = 0 - end - - -- randomize number of buildings - local number_of_buildings = pr:next(10, 25) - local number_built = 1 - settlements.debug("Village ".. number_of_buildings) - - return count_buildings, number_of_buildings, number_built -end -------------------------------------------------------------------------------- --- fill settlement_info --------------------------------------------------------------------------------- -function settlements.create_site_plan(maxp, minp, pr) - local settlement_info = {} - local building_all_info - local possible_rotations = {"0", "90", "180", "270"} - -- find center of chunk - local center = { - x=math.floor((minp.x+maxp.x)/2), - y=maxp.y, - z=math.floor((minp.z+maxp.z)/2) - } - -- find center_surface of chunk - local center_surface , surface_material = settlements.find_surface(center, true) - local chunks = {} - chunks[mcl_vars.get_chunk_number(center)] = true - - -- go build settlement around center - if not center_surface then return false end - - -- add settlement to list - table.insert(settlements_in_world, center_surface) - -- save list to file - settlements.save() - -- initialize all settlement_info table - local count_buildings, number_of_buildings, number_built = settlements.initialize_settlement_info(pr) - -- first building is townhall in the center - building_all_info = settlements.schematic_table[1] - local rotation = possible_rotations[ pr:next(1, #possible_rotations ) ] - -- add to settlement info table - local index = 1 - settlement_info[index] = { - pos = center_surface, - name = building_all_info["name"], - hsize = building_all_info["hsize"], - rotat = rotation, - surface_mat = surface_material - } - --increase index for following buildings - index = index + 1 - -- now some buildings around in a circle, radius = size of town center - local x, z, r = center_surface.x, center_surface.z, building_all_info["hsize"] - -- draw j circles around center and increase radius by math.random(2,5) - for j = 1,20 do - -- set position on imaginary circle - for j = 0, 360, 15 do - local angle = j * math.pi / 180 - local ptx, ptz = x + r * math.cos( angle ), z + r * math.sin( angle ) - ptx = settlements.round(ptx, 0) - ptz = settlements.round(ptz, 0) - local pos1 = { x=ptx, y=center_surface.y+50, z=ptz} - local chunk_number = mcl_vars.get_chunk_number(pos1) - local pos_surface, surface_material - if chunks[chunk_number] then - pos_surface, surface_material = settlements.find_surface(pos1) - else - chunks[chunk_number] = true - pos_surface, surface_material = settlements.find_surface(pos1, true) - end - if not pos_surface then break end - - local randomized_schematic_table = shuffle(settlements.schematic_table, pr) - -- pick schematic - local size = #randomized_schematic_table - for i = size, 1, -1 do - -- already enough buildings of that type? - if count_buildings[randomized_schematic_table[i]["name"]] < randomized_schematic_table[i]["max_num"]*number_of_buildings then - building_all_info = randomized_schematic_table[i] - -- check distance to other buildings - local distance_to_other_buildings_ok = settlements.check_distance(settlement_info, pos_surface, building_all_info["hsize"]) - if distance_to_other_buildings_ok then - -- count built houses - count_buildings[building_all_info["name"]] = count_buildings[building_all_info["name"]] +1 - rotation = possible_rotations[ pr:next(1, #possible_rotations ) ] - number_built = number_built + 1 - settlement_info[index] = { - pos = pos_surface, - name = building_all_info["name"], - hsize = building_all_info["hsize"], - rotat = rotation, - surface_mat = surface_material - } - index = index + 1 - break - end - end - end - if number_of_buildings == number_built then - break - end - end - if number_built >= number_of_buildings then - break - end - r = r + pr:next(2,5) - end - settlements.debug("really ".. number_built) - return settlement_info -end -------------------------------------------------------------------------------- --- evaluate settlement_info and place schematics -------------------------------------------------------------------------------- --- Initialize node -local function construct_node(p1, p2, name) - local r = minetest.registered_nodes[name] - if r then - if r.on_construct then - local nodes = minetest.find_nodes_in_area(p1, p2, name) - for p=1, #nodes do - local pos = nodes[p] - r.on_construct(pos) - end - return nodes - end - minetest.log("warning", "[mcl_villages] No on_construct defined for node name " .. name) - return - end - minetest.log("warning", "[mcl_villages] Attempt to 'construct' inexistant nodes: " .. name) -end -local function init_nodes(p1, p2, size, rotation, pr) - construct_node(p1, p2, "mcl_itemframes:item_frame") - construct_node(p1, p2, "mcl_furnaces:furnace") - construct_node(p1, p2, "mcl_anvils:anvil") - - local nodes = construct_node(p1, p2, "mcl_chests:chest") - if nodes and #nodes > 0 then - for p=1, #nodes do - local pos = nodes[p] - settlements.fill_chest(pos, pr) - end - end -end -function settlements.place_schematics(settlement_info, pr) - local building_all_info - for i, built_house in ipairs(settlement_info) do - for j, schem in ipairs(settlements.schematic_table) do - if settlement_info[i]["name"] == schem["name"] then - building_all_info = schem - break - end - end - - local pos = settlement_info[i]["pos"] - local rotation = settlement_info[i]["rotat"] - -- get building node material for better integration to surrounding - local platform_material = settlement_info[i]["surface_mat"] - --platform_material_name = minetest.get_name_from_content_id(platform_material) - -- pick random material - --local material = wallmaterial[pr:next(1,#wallmaterial)] - -- - local building = building_all_info["mts"] - local replace_wall = building_all_info["rplc"] - -- schematic conversion to lua - local schem_lua = minetest.serialize_schematic(building, - "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" - schem_lua = schem_lua:gsub("mcl_core:stonebrickcarved", "mcl_villages:stonebrickcarved") - -- replace material - if replace_wall then - --Note, block substitution isn't matching node names exactly; so nodes that are to be substituted that have the same prefixes cause bugs. - -- Example: Attempting to swap out 'mcl_core:stonebrick'; which has multiple, additional sub-variants: (carved, cracked, mossy). Will currently cause issues, so leaving disabled. - if platform_material == "mcl_core:snow" or platform_material == "mcl_core:dirt_with_grass_snow" or platform_material == "mcl_core:podzol" then - schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sprucetree") - schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sprucewood") - --schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:spruce_fence") - --schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_sprucewood_top") - --schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_sprucewood") - --schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_sprucewood_off") - elseif platform_material == "mcl_core:sand" or platform_material == "mcl_core:redsand" then - schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sandstonecarved") - schem_lua = schem_lua:gsub("mcl_core:cobble", "mcl_core:sandstone") - schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sandstonesmooth") - --schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:birch_fence") - --schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_birchwood_top") - --schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_birchwood") - --schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_birchwood_off") - --schem_lua = schem_lua:gsub("mcl_stairs:stair_stonebrick", "mcl_stairs:stair_redsandstone") - --schem_lua = schem_lua:gsub("mcl_core:stonebrick", "mcl_core:redsandstonesmooth") - schem_lua = schem_lua:gsub("mcl_core:brick_block", "mcl_core:redsandstone") - end - end - schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material) - - --[[ Disable special junglewood for now. - -- special material for spawning npcs - schem_lua = schem_lua:gsub("mcl_core:junglewood", "settlements:junglewood") - --]] - - schem_lua = schem_lua:gsub("mcl_stairs:stair_wood_outer", "mcl_stairs:slab_wood") - schem_lua = schem_lua:gsub("mcl_stairs:stair_stone_rough_outer", "air") - - -- format schematic string - local schematic = loadstring(schem_lua)() - -- build foundation for the building an make room above - -- place schematic - mcl_structures.place_schematic( - pos, - schematic, - rotation, - nil, - true, - nil, - init_nodes, - pr - ) - end -end diff --git a/mods/MAPGEN/mcl_villages/const.lua b/mods/MAPGEN/mcl_villages/const.lua deleted file mode 100644 index eb7806209..000000000 --- a/mods/MAPGEN/mcl_villages/const.lua +++ /dev/null @@ -1,81 +0,0 @@ --- switch for debugging -function settlements.debug(message) - -- minetest.chat_send_all(message) - -- minetest.log("warning", "[mcl_villages] "..message) - minetest.log("verbose", "[mcl_villages] "..message) -end - ---[[ Manually set in 'buildings.lua' --- material to replace cobblestone with -local wallmaterial = { - "mcl_core:junglewood", - "mcl_core:sprucewood", - "mcl_core:wood", - "mcl_core:birchwood", - "mcl_core:acaciawood", - "mcl_core:stonebrick", - "mcl_core:cobble", - "mcl_core:sandstonecarved", - "mcl_core:sandstone", - "mcl_core:sandstonesmooth2" -} ---]] -settlements.surface_mat = {} -------------------------------------------------------------------------------- --- Set array to list --- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list -------------------------------------------------------------------------------- -function settlements.grundstellungen() - settlements.surface_mat = settlements.Set { - "mcl_core:dirt_with_grass", - --"mcl_core:dry_dirt_with_grass", - "mcl_core:dirt_with_grass_snow", - --"mcl_core:dirt_with_dry_grass", - "mcl_core:podzol", - "mcl_core:sand", - "mcl_core:redsand", - --"mcl_core:silver_sand", - "mcl_core:snow" - } -end --- --- possible surfaces where buildings can be built --- - --- --- path to schematics --- -schem_path = settlements.modpath.."/schematics/" --- --- list of schematics --- -local basic_pseudobiome_villages = minetest.settings:get_bool("basic_pseudobiome_villages", true) - -settlements.schematic_table = { - {name = "large_house", mts = schem_path.."large_house.mts", hwidth = 11, hdepth = 12, hheight = 9, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages }, - {name = "blacksmith", mts = schem_path.."blacksmith.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.055, rplc = basic_pseudobiome_villages }, - {name = "butcher", mts = schem_path.."butcher.mts", hwidth = 11, hdepth = 8, hheight = 10, hsize = 14, max_num = 0.03 , rplc = basic_pseudobiome_villages }, - {name = "church", mts = schem_path.."church.mts", hwidth = 13, hdepth = 13, hheight = 14, hsize = 15, max_num = 0.04 , rplc = basic_pseudobiome_villages }, - {name = "farm", mts = schem_path.."farm.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.1 , rplc = basic_pseudobiome_villages }, - {name = "lamp", mts = schem_path.."lamp.mts", hwidth = 3, hdepth = 3, hheight = 13, hsize = 10, max_num = 0.1 , rplc = false }, - {name = "library", mts = schem_path.."library.mts", hwidth = 12, hdepth = 12, hheight = 8, hsize = 13, max_num = 0.04 , rplc = basic_pseudobiome_villages }, - {name = "medium_house", mts = schem_path.."medium_house.mts", hwidth = 8, hdepth = 12, hheight = 8, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages }, - {name = "small_house", mts = schem_path.."small_house.mts", hwidth = 9, hdepth = 7, hheight = 8, hsize = 13, max_num = 0.7 , rplc = basic_pseudobiome_villages }, - {name = "tavern", mts = schem_path.."tavern.mts", hwidth = 11, hdepth = 10, hheight = 10, hsize = 13, max_num = 0.050, rplc = basic_pseudobiome_villages }, - {name = "well", mts = schem_path.."well.mts", hwidth = 6, hdepth = 8, hheight = 6, hsize = 10, max_num = 0.045, rplc = basic_pseudobiome_villages }, -} - --- --- list of settlements, load on server start up --- -settlements_in_world = {} --- --- --- maximum allowed difference in height for building a sttlement --- -max_height_difference = 56 --- --- --- -half_map_chunk_size = 40 ---quarter_map_chunk_size = 20 diff --git a/mods/MAPGEN/mcl_villages/foundation.lua b/mods/MAPGEN/mcl_villages/foundation.lua deleted file mode 100644 index 71c5cfdda..000000000 --- a/mods/MAPGEN/mcl_villages/foundation.lua +++ /dev/null @@ -1,65 +0,0 @@ -------------------------------------------------------------------------------- --- function to fill empty space below baseplate when building on a hill -------------------------------------------------------------------------------- -function settlements.ground(pos, pr) -- role model: Wendelsteinkircherl, Brannenburg - local p2 = vector.new(pos) - local cnt = 0 - local mat = "mcl_core:dirt" - p2.y = p2.y-1 - while true do - cnt = cnt+1 - if cnt > 20 then break end - if cnt>pr:next(2,4) then - mat = "mcl_core:stone" - end - minetest.swap_node(p2, {name=mat}) - p2.y = p2.y-1 - end -end -------------------------------------------------------------------------------- --- function clear space above baseplate -------------------------------------------------------------------------------- -function settlements.terraform(settlement_info, pr) - local fheight, fwidth, fdepth, schematic_data - - for i, built_house in ipairs(settlement_info) do - -- pick right schematic_info to current built_house - for j, schem in ipairs(settlements.schematic_table) do - if settlement_info[i]["name"] == schem["name"] then - schematic_data = schem - break - end - end - local pos = settlement_info[i]["pos"] - if settlement_info[i]["rotat"] == "0" or settlement_info[i]["rotat"] == "180" then - fwidth = schematic_data["hwidth"] - fdepth = schematic_data["hdepth"] - else - fwidth = schematic_data["hdepth"] - fdepth = schematic_data["hwidth"] - end - --fheight = schematic_data["hheight"] * 3 -- remove trees and leaves above - fheight = schematic_data["hheight"] -- remove trees and leaves above - -- - -- now that every info is available -> create platform and clear space above - -- - for xi = 0,fwidth-1 do - for zi = 0,fdepth-1 do - for yi = 0,fheight *3 do - if yi == 0 then - local p = {x=pos.x+xi, y=pos.y, z=pos.z+zi} - settlements.ground(p, pr) - else - -- write ground --- local p = {x=pos.x+xi, y=pos.y+yi, z=pos.z+zi} --- local node = mcl_vars.get_node(p) --- if node and node.name ~= "air" then --- minetest.swap_node(p,{name="air"}) --- end - minetest.swap_node({x=pos.x+xi, y=pos.y+yi, z=pos.z+zi},{name="air"}) - end - end - end - end - end -end diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index 7e460990e..37052a9b6 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -1,24 +1,379 @@ -settlements = {} -settlements.modpath = minetest.get_modpath(minetest.get_current_modname()) +mcl_villages = {} +local chance_per_chunk = 100 +local chunk_offset_top = 16 +local chunk_offset_bottom = 3 +local max_height_difference = 12 +local minp_min = -64 +local noise_multiplier = 1 +local random_offset = 1 +local random_multiply = 19 +local struct_threshold = chance_per_chunk +local noise_params = { + offset = 0, + scale = 2, + spread = { + x = mcl_mapgen.CS_NODES * chance_per_chunk, + y = mcl_mapgen.CS_NODES * chance_per_chunk, + z = mcl_mapgen.CS_NODES * chance_per_chunk, + }, + seed = 842458, + octaves = 2, + persistence = 0.5, +} +local perlin_noise +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local S = minetest.get_translator(modname) +local basic_pseudobiome_villages = minetest.settings:get_bool("basic_pseudobiome_villages", true) +local schem_path = modpath .. "/schematics/" +local schematic_table = { + {name = "large_house", mts = schem_path.."large_house.mts", max_num = 0.08 , rplc = basic_pseudobiome_villages }, + {name = "blacksmith", mts = schem_path.."blacksmith.mts", max_num = 0.055, rplc = basic_pseudobiome_villages }, + {name = "butcher", mts = schem_path.."butcher.mts", max_num = 0.03 , rplc = basic_pseudobiome_villages }, + {name = "church", mts = schem_path.."church.mts", max_num = 0.04 , rplc = basic_pseudobiome_villages }, + {name = "farm", mts = schem_path.."farm.mts", max_num = 0.1 , rplc = basic_pseudobiome_villages }, + {name = "lamp", mts = schem_path.."lamp.mts", max_num = 0.1 , rplc = false }, + {name = "library", mts = schem_path.."library.mts", max_num = 0.04 , rplc = basic_pseudobiome_villages }, + {name = "medium_house", mts = schem_path.."medium_house.mts", max_num = 0.08 , rplc = basic_pseudobiome_villages }, + {name = "small_house", mts = schem_path.."small_house.mts", max_num = 0.7 , rplc = basic_pseudobiome_villages }, + {name = "tavern", mts = schem_path.."tavern.mts", max_num = 0.050, rplc = basic_pseudobiome_villages }, + {name = "well", mts = schem_path.."well.mts", max_num = 0.045, rplc = basic_pseudobiome_villages }, +} +local surface_mat = { + ["mcl_core:dirt_with_dry_grass"] = { top = "mcl_core:dirt", bottom = "mcl_core:stone" }, + ["mcl_core:dirt_with_grass"] = { top = "mcl_core:dirt", bottom = "mcl_core:stone" }, + ["mcl_core:dirt_with_grass_snow"] = { top = "mcl_core:dirt", bottom = "mcl_core:stone" }, + ["mcl_core:podzol"] = { top = "mcl_core:podzol", bottom = "mcl_core:stone" }, + ["mcl_core:redsand"] = { top = "mcl_core:redsand", bottom = "mcl_core:redsandstone" }, + ["mcl_core:sand"] = { top = "mcl_core:sand", bottom = "mcl_core:sandstone" }, + ["mcl_core:snow"] = { top = "mcl_core:dirt", bottom = "mcl_core:stone" }, +} +local storage = minetest.get_mod_storage() +local villages = minetest.deserialize(storage:get_string("villages") or "return {}") or {} +local minetest_get_spawn_level = minetest.get_spawn_level +local minetest_get_node = minetest.get_node +local minetest_find_nodes_in_area = minetest.find_nodes_in_area +local minetest_get_perlin = minetest.get_perlin +local math_pi = math.pi +local math_cos = math.cos +local math_sin = math.sin +local math_min = math.min +local math_max = math.max +local math_floor = math.floor +local math_ceil = math.ceil +local string_find = string.find +local minetest_swap_node = minetest.swap_node +local minetest_registered_nodes = minetest.registered_nodes +local minetest_bulk_set_node = minetest.bulk_set_node +local air_offset = chunk_offset_top - 1 +local ground_offset = chunk_offset_bottom + 1 +local surface_search_list = {} +for k, _ in pairs(surface_mat) do + table.insert(surface_search_list, k) +end -dofile(settlements.modpath.."/const.lua") -dofile(settlements.modpath.."/utils.lua") -dofile(settlements.modpath.."/foundation.lua") -dofile(settlements.modpath.."/buildings.lua") -dofile(settlements.modpath.."/paths.lua") ---dofile(settlements.modpath.."/convert_lua_mts.lua") --- --- load settlements on server --- -settlements_in_world = settlements.load() -settlements.grundstellungen() +local function math_round(x) + return (x < 0) and math_ceil(x - 0.5) or math_floor(x + 0.5) +end +local function find_surface(pos, minp, maxp) + local x, z = pos.x, pos.z + local y_top = maxp.y + local y_max = y_top - air_offset + if #minetest_find_nodes_in_area({x=x, y=y_max, z=z}, {x=x, y=y_top, z=z}, "air") < chunk_offset_top then return end + y_max = y_max - 1 + local y_bottom = minp.y + local y_min = y_bottom + chunk_offset_bottom + local nodes = minetest_find_nodes_in_area({x=x, y=y_min, z=z}, {x=x, y=y_max, z=z}, surface_search_list) + for _, surface_pos in pairs(nodes) do + local node_name_from_above = minetest_get_node({x=surface_pos.x, y=surface_pos.y+1, z=surface_pos.z}).name + if string_find(node_name_from_above, "air" ) + or string_find(node_name_from_above, "snow" ) + or string_find(node_name_from_above, "fern" ) + or string_find(node_name_from_above, "flower") + or string_find(node_name_from_above, "bush" ) + or string_find(node_name_from_above, "tree" ) + or string_find(node_name_from_above, "grass" ) + then + return surface_pos, minetest_get_node(surface_pos).name + end + end +end + +local function get_treasures(pr) + local loottable = {{ + stacks_min = 3, + stacks_max = 8, + items = { + { itemstring = "mcl_core:diamond" , weight = 3, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_core:iron_ingot" , weight = 10, amount_min = 1, amount_max = 5 }, + { itemstring = "mcl_core:gold_ingot" , weight = 5, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_farming:bread" , weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_core:apple" , weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_tools:pick_iron" , weight = 5, }, + { itemstring = "mcl_tools:sword_iron" , weight = 5, }, + { itemstring = "mcl_armor:chestplate_iron" , weight = 5, }, + { itemstring = "mcl_armor:helmet_iron" , weight = 5, }, + { itemstring = "mcl_armor:leggings_iron" , weight = 5, }, + { itemstring = "mcl_armor:boots_iron" , weight = 5, }, + { itemstring = "mcl_core:obsidian" , weight = 5, amount_min = 3, amount_max = 7 }, + { itemstring = "mcl_core:sapling" , weight = 5, amount_min = 3, amount_max = 7 }, + { itemstring = "mcl_mobitems:saddle" , weight = 3, }, + { itemstring = "mobs_mc:iron_horse_armor" , weight = 1, }, + { itemstring = "mobs_mc:gold_horse_armor" , weight = 1, }, + { itemstring = "mobs_mc:diamond_horse_armor", weight = 1, }, + } + }} + local items = mcl_loot.get_multi_loot(loottable, pr) + return items +end + +local function fill_chest(pos, pr) + local meta = minetest.get_meta(pos) + minetest.registered_nodes["mcl_chests:chest_small"].on_construct(pos) + local inv = minetest.get_inventory( {type="node", pos=pos} ) + local items = get_treasures(pr) + mcl_loot.fill_inventory(inv, "main", items, pr) +end + +local possible_rotations = {"0", "90", "180", "270"} + +local function get_random_rotation(pr) + return possible_rotations[pr:next(1, #possible_rotations)] +end + +local function create_site_plan(minp, maxp, pr) + local plan = {} + local building_all_info + local center = vector.add(minp, mcl_mapgen.HALF_CS_NODES) + local center_surface, surface_material = find_surface(center, minp, maxp) + if not center_surface then return end + + local number_of_buildings = pr:next(10, 25) + local shuffle = {} + local count_buildings = {} + for i = 1, #schematic_table do + shuffle[i] = i + count_buildings[i] = 0 + end + for i = #shuffle, 2, -1 do + local j = pr:next(1, i) + shuffle[i], shuffle[j] = shuffle[j], shuffle[i] + end + local number_built = 1 + local shuffle_index = pr:next(1, #schematic_table) + + -- first building is townhall in the center + plan[#plan + 1] = { + pos = center_surface, + building = schematic_table[shuffle_index], + rotation = get_random_rotation(pr), + surface_mat = surface_material, + } + count_buildings[1] = count_buildings[1] + 1 + -- now some buildings around in a circle, radius = size of town center + local x, z, r = center_surface.x, center_surface.z, schematic_table[1].hsize + -- draw j circles around center and increase radius by random(2, 5) + for k = 1, 20 do + -- set position on imaginary circle + for j = 0, 360, 15 do + local angle = j * math_pi / 180 + local pos_surface, surface_material = find_surface( + { + x = math_round(x + r * math_cos(angle)), + z = math_round(z + r * math_sin(angle)) + }, + minp, + maxp + ) + if pos_surface then + shuffle_index = (shuffle_index % (#schematic_table)) + 1 + local schematic_index = shuffle[shuffle_index] + local schematic = schematic_table[schematic_index] + if count_buildings[schematic_index] < schematic.max_num * number_of_buildings then + local hsize2 = schematic.hsize^2 + local is_distance_ok = true + for _, built_house in pairs(plan) do + local pos = built_house.pos + local building = built_house.building + local distance2 = (pos_surface.x - pos.x)^2 + (pos_surface.z - pos.z)^2 + if distance2 < building.hsize^2 or distance2 < hsize2 then + is_distance_ok = false + break + end + end + if is_distance_ok then + plan[#plan + 1] = { + pos = pos_surface, + building = schematic, + rotation = get_random_rotation(pr), + surface_mat = surface_material, + } + count_buildings[schematic_index] = count_buildings[schematic_index] + 1 + number_built = number_built + 1 + break + end + end + end + if number_built >= number_of_buildings then + break + end + end + if number_built >= number_of_buildings then + break + end + r = r + pr:next(2, 5) + end + return plan +end + +local function ground(pos1, pos2, minp, maxp, pr, mat) + local pos1, pos2 = pos1, pos2 + local x1, x2, z1, z2, y = pos1.x, pos2.x, pos1.z, pos2.z, pos1.y - 1 + local pos_list_dirt = {} + local pos_list_stone = {} + for x0 = x1, x2 do + for z0 = z1, z2 do + local finish = false + local y1 = y - pr:next(2, 4) + for y0 = y, y1, -1 do + local p0 = {x = x0, y = y0, z = z0} + local node = minetest_get_node(p0) + local node_name = node.name + if node_name ~= "air" and not string_find(node_name, "water") and not string_find(node_name, "flower") then + finish = true + break + end + pos_list_dirt[#pos_list_dirt + 1] = p0 + end + if not finish then + for y0 = y1 - 1, math_max(minp.y, y - pr:next(17, 27)), -1 do + local p0 = {x = x0, y = y0, z = z0} + local node = minetest_get_node(p0) + local node_name = node.name + if node_name ~= "air" and not string_find(node_name, "water") and not string_find(node_name, "flower") then + break + end + pos_list_stone[#pos_list_stone + 1] = p0 + end + end + end + end + minetest_bulk_set_node(pos_list_dirt, {name = surface_mat[mat].top}) + minetest_bulk_set_node(pos_list_stone, {name = surface_mat[mat].bottom}) +end + +local function terraform(plan, minp, maxp, pr) + local fheight, fwidth, fdepth, schematic_data, pos, rotation, swap_wd, build_material + for _, built_house in pairs(plan) do + schematic_data = built_house.building + pos = built_house.pos + rotation = built_house.rotation + build_material = built_house.surface_mat + swap_wd = rotation == "90" or rotation == "270" + fwidth = swap_wd and schematic_data.hdepth or schematic_data.hwidth + fdepth = swap_wd and schematic_data.hwidth or schematic_data.hdepth + fheight = schematic_data.hheight + local pos2 = { + x = pos.x + fwidth - 1, + y = math_min(pos.y + fheight + 4, maxp.y), + z = pos.z + fdepth - 1 + } + ground(pos, {x = pos2.x, y = pos.y + 1, z = pos2.z}, minp, maxp, pr, build_material) + local node_list = {} + for xi = pos.x, pos2.x do + for zi = pos.z, pos2.z do + for yi = pos.y + 1, pos2.y do + node_list[#node_list + 1] = {x = xi, y = yi, z = zi} + end + end + end + minetest_bulk_set_node(node_list, {name = "air"}) + end +end + +local function paths(plan, minp, maxp) + local starting_point = find_surface({x = plan[1].pos.x + 2, z = plan[1].pos.z + 2}, minp, maxp) + if not starting_point then return end + starting_point.y = starting_point.y + 1 + for i = 2, #plan do + local p = plan[i] + local end_point = p.pos + end_point.y = end_point.y + 1 + local path = minetest.find_path(starting_point, end_point, mcl_mapgen.CS_NODES, 2, 2, "A*_noprefetch") + if path then + for _, pos in pairs(path) do + pos.y = pos.y - 1 + local surface_mat = minetest.get_node(pos).name + if surface_mat == "mcl_core:sand" or surface_mat == "mcl_core:redsand" then + minetest.swap_node(pos, {name = "mcl_core:sandstonesmooth2"}) + else + minetest.swap_node(pos, {name = "mcl_core:grass_path"}) + end + end + end + end +end + +local function init_nodes(p1, rotation, pr, size) + local p2 = vector.subtract(vector.add(p1, size), 1) + local nodes = minetest.find_nodes_in_area(p1, p2, {"mcl_itemframes:item_frame", "mcl_furnaces:furnace", "mcl_anvils:anvil", "mcl_chests:chest", "mcl_villages:stonebrickcarved"}) + for _, pos in pairs(nodes) do + local name = minetest_get_node(pos).name + local def = minetest_registered_nodes[minetest_get_node(pos).name] + def.on_construct(pos) + if name == "mcl_chests:chest" then + minetest_swap_node(pos, {name = "mcl_chests:chest_small"}) + fill_chest(pos, pr) + end + end +end + +local function place_schematics(plan, pr) + for _, built_house in pairs(plan) do + local pos = built_house.pos + local rotation = built_house.rotation + local platform_material = built_house.surface_mat + local replace_wall = built_house.building.rplc + local schem_lua = built_house.building.preloaded_schematic + if replace_wall then + --Note, block substitution isn't matching node names exactly; so nodes that are to be substituted that have the same prefixes cause bugs. + -- Example: Attempting to swap out 'mcl_core:stonebrick'; which has multiple, additional sub-variants: (carved, cracked, mossy). Will currently cause issues, so leaving disabled. + if platform_material == "mcl_core:snow" or platform_material == "mcl_core:dirt_with_grass_snow" or platform_material == "mcl_core:podzol" then + schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sprucetree") + schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sprucewood") + elseif platform_material == "mcl_core:sand" or platform_material == "mcl_core:redsand" then + schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sandstonecarved") + schem_lua = schem_lua:gsub("mcl_core:cobble", "mcl_core:sandstone") + schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sandstonesmooth") + schem_lua = schem_lua:gsub("mcl_core:brick_block", "mcl_core:redsandstone") + end + end + schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material) + schem_lua = schem_lua:gsub("mcl_stairs:stair_wood_outer", "mcl_stairs:slab_wood") + schem_lua = schem_lua:gsub("mcl_stairs:stair_stone_rough_outer", "air") + + local schematic = loadstring(schem_lua)() + -- build foundation for the building an make room above + -- place schematic + mcl_structures.place_schematic({ + pos = pos, + schematic = schematic, + rotation = rotation, + on_placed = init_nodes, + pr = pr, + }) + end +end -- -- register block for npc spawn -- +local function spawn_villager(pos) + minetest.add_entity({x = pos.x, y = pos.y + 1, z = pos.z}, "mobs_mc:villager") +end minetest.register_node("mcl_villages:stonebrickcarved", { - description = ("Chiseled Stone Village Bricks"), + description = S("Chiseled Stone Village Bricks"), _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, @@ -28,83 +383,141 @@ minetest.register_node("mcl_villages:stonebrickcarved", { is_ground_content = false, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, + on_construct = spawn_villager, +}) + +minetest.register_abm({ + label = "Spawn villagers", + nodenames = {"mcl_villages:stonebrickcarved"}, + interval = 60, + chance = 3, + action = function(pos, node) + -- check the space above + local p = table.copy(pos) + p.y = p.y + 1 + if minetest_get_node(p).name ~= "air" then return end + p.y = p.y + 1 + if minetest_get_node(p).name ~= "air" then return end + p.y = p.y - 1 + local villagers_counter = 0 + for _, obj in pairs(minetest.get_objects_inside_radius(p, 40)) do + local lua_entity = obj:get_luaentity() + if luaentity and luaentity.name == "mobs_mc:villager" then + villagers_counter = villagers_counter + 1 + if villagers_counter > 7 then return end + end + end + spawn_villager(pos) + end }) - ---[[ Enable for testing, but use MineClone2's own spawn code if/when merging. --- --- register inhabitants --- -if minetest.get_modpath("mobs_mc") then - mobs:register_spawn("mobs_mc:villager", --name - {"mcl_core:stonebrickcarved"}, --nodes - 15, --max_light - 0, --min_light - 20, --chance - 7, --active_object_count - 31000, --max_height - nil) --day_toggle -end ---]] - -- -- on map generation, try to build a settlement -- -local function build_a_settlement(minp, maxp, blockseed) - local pr = PseudoRandom(blockseed) - - -- fill settlement_info with buildings and their data - local settlement_info = settlements.create_site_plan(maxp, minp, pr) - if not settlement_info then return end - - -- evaluate settlement_info and prepair terrain - settlements.terraform(settlement_info, pr) - - -- evaluate settlement_info and build paths between buildings - settlements.paths(settlement_info) - - -- evaluate settlement_info and place schematics - settlements.place_schematics(settlement_info, pr) -end - -local function ecb_village(blockpos, action, calls_remaining, param) - if calls_remaining >= 1 then return end - local minp, maxp, blockseed = param.minp, param.maxp, param.blockseed - build_a_settlement(minp, maxp, blockseed) +local function build_a_village(minp, maxp, pr, placer) + minetest.log("action","[mcl_villages] Building village at mapchunk " .. minetest.pos_to_string(minp) .. "..." .. minetest.pos_to_string(maxp)) + local pr = pr or PseudoRandom(mcl_mapgen.get_block_seed3(minp)) + local plan = create_site_plan(minp, maxp, pr) + if not plan then + if placer then + if placer:is_player() then + minetest.chat_send_player(placer:get_player_name(), S("Map chunk @1 to @2 is not suitable for placing villages.", minetest.pos_to_string(minp), minetest.pos_to_string(maxp))) + end + end + return + end + paths(plan, minp, maxp) + terraform(plan, minp, maxp, pr) + place_schematics(plan, pr) + villages[#villages + 1] = minp + storage:set_string("villages", minetest.serialize(villages)) end -- Disable natural generation in singlenode. -local mg_name = minetest.get_mapgen_setting("mg_name") -if mg_name ~= "singlenode" then - mcl_mapgen_core.register_generator("villages", nil, function(minp, maxp, blockseed) - -- don't build settlement underground - if maxp.y < 0 then return end - -- randomly try to build settlements - if blockseed % 77 ~= 17 then return end - -- needed for manual and automated settlement building - -- don't build settlements on (too) uneven terrain - --local heightmap = minetest.get_mapgen_object("heightmap") - local height_difference = settlements.evaluate_heightmap() +if not mcl_mapgen.singlenode then + local scan_last_node = mcl_mapgen.LAST_BLOCK * mcl_mapgen.BS - 1 + local scan_offset = mcl_mapgen.BS + mcl_mapgen.register_mapgen(function(minp, maxp, chunkseed) + if minp.y < minp_min then return end + local pr = PseudoRandom(chunkseed * random_multiply + random_offset) + local random_number = pr:next(1, chance_per_chunk) + perlin_noise = perlin_noise or minetest_get_perlin(noise_params) + local noise = perlin_noise:get_3d(minp) * noise_multiplier + if (random_number + noise) < struct_threshold then return end + local min, max = 9999999, -9999999 + for i = 1, pr:next(5,10) do + local surface_point = find_surface( + vector.add( + vector.new( + pr:next(scan_offset, scan_last_node), + 0, + pr:next(scan_offset, scan_last_node) + ), + minp + ), + minp, + maxp + ) + if not surface_point then return end + local y = surface_point.y + min = math_min(y, min) + max = math_max(y, max) + end + local height_difference = max - min if height_difference > max_height_difference then return end - - local param={minp=vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed} - minetest.emerge_area(minp, maxp, ecb_village, param) - end) + build_a_village(minp, maxp, chunkkseed) + end, mcl_mapgen.order.VILLAGES) end --- manually place villages -if minetest.is_creative_enabled("") then - minetest.register_craftitem("mcl_villages:tool", { - description = "mcl_villages build tool", - inventory_image = "default_tool_woodshovel.png", - -- build ssettlement - on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.under then return end - local minp = vector.subtract( pointed_thing.under, half_map_chunk_size) - local maxp = vector.add( pointed_thing.under, half_map_chunk_size) - build_a_settlement(minp, maxp, math.random(0,32767)) + +for k, v in pairs(schematic_table) do + local schem_lua = minetest.serialize_schematic( + v.mts, + "lua", + { + lua_use_comments = false, + lua_num_indent_spaces = 0, + } + ):gsub("mcl_core:stonebrickcarved", "mcl_villages:stonebrickcarved") .. " return schematic" + v.preloaded_schematic = schem_lua + local loaded_schematic = loadstring(schem_lua)() + local size = loaded_schematic.size + v.hwidth = size.x + v.hheight = size.y + v.hdepth = size.z + v.hsize = math.ceil(math.sqrt((size.x/2)^2 + (size.y/2)^2) * 2 + 1) + mcl_structures.register_structure({ + name = v.name, + place_function = function(pos, rotation, pr, placer) + local minp = mcl_mapgen.get_chunk_beginning(pos) + local maxp = mcl_mapgen.get_chunk_ending(pos) + local surface_pos, surface_material = find_surface(pos, minp, maxp) + local plan = { + [1] = { + pos = pos, + building = schematic_table[k], + rotation = rotation, + surface_mat = surface_material or "mcl_core:snow", + } + } + if surface_material then + terraform(plan, minp, maxp, pr) + end + place_schematics(plan, pr) end }) - mcl_wip.register_experimental_item("mcl_villages:tool") +end + +mcl_structures.register_structure({ + name = "village", + place_function = function(pos, rotation, pr, placer) + local minp = mcl_mapgen.get_chunk_beginning(pos) + local maxp = mcl_mapgen.get_chunk_ending(pos) + build_a_village(minp, maxp, pr, placer) + end +}) + +function mcl_villages.get_villages() + return villages end diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr new file mode 100644 index 000000000..325d3b191 --- /dev/null +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_villages +Chiseled Stone Village Bricks=Точёный каменный блок из деревни +Map chunk @1 to @2 is not suitable for placing villages.=Чанк с @1 по @2 непригоден для размещения деревень. \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/template.txt b/mods/MAPGEN/mcl_villages/locale/template.txt new file mode 100644 index 000000000..7d9fcb43b --- /dev/null +++ b/mods/MAPGEN/mcl_villages/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_villages +Chiseled Stone Village Bricks= +Map chunk @1 to @2 is not suitable for placing villages.= diff --git a/mods/MAPGEN/mcl_villages/mod.conf b/mods/MAPGEN/mcl_villages/mod.conf index d8e2aa7d4..eb4a5d080 100644 --- a/mods/MAPGEN/mcl_villages/mod.conf +++ b/mods/MAPGEN/mcl_villages/mod.conf @@ -1,5 +1,5 @@ name = mcl_villages -author = Rochambeau -description = This mod adds settlements on world generation. -depends = mcl_util, mcl_mapgen_core, mcl_structures, mcl_core, mcl_loot +author = Rochambeau, MysticTempest, kay27 +description = This mod adds villages on world generation. +depends = mcl_util, mcl_structures, mcl_core, mcl_loot, mcl_mapgen optional_depends = mcl_farming, mobs_mc diff --git a/mods/MAPGEN/mcl_villages/paths.lua b/mods/MAPGEN/mcl_villages/paths.lua deleted file mode 100644 index 63f2ba146..000000000 --- a/mods/MAPGEN/mcl_villages/paths.lua +++ /dev/null @@ -1,91 +0,0 @@ -------------------------------------------------------------------------------- --- generate paths between buildings -------------------------------------------------------------------------------- -function settlements.paths(settlement_info) - local starting_point - local end_point - local distance - --for k,v in pairs(settlement_info) do - starting_point = settlement_info[1]["pos"] - for o,p in pairs(settlement_info) do - - end_point = settlement_info[o]["pos"] - if starting_point ~= end_point - then - -- loop until end_point is reched (distance == 0) - while true do - - -- define surrounding pos to starting_point - local north_p = {x=starting_point.x+1, y=starting_point.y, z=starting_point.z} - local south_p = {x=starting_point.x-1, y=starting_point.y, z=starting_point.z} - local west_p = {x=starting_point.x, y=starting_point.y, z=starting_point.z+1} - local east_p = {x=starting_point.x, y=starting_point.y, z=starting_point.z-1} - -- measure distance to end_point - local dist_north_p_to_end = math.sqrt( - ((north_p.x - end_point.x)*(north_p.x - end_point.x))+ - ((north_p.z - end_point.z)*(north_p.z - end_point.z)) - ) - local dist_south_p_to_end = math.sqrt( - ((south_p.x - end_point.x)*(south_p.x - end_point.x))+ - ((south_p.z - end_point.z)*(south_p.z - end_point.z)) - ) - local dist_west_p_to_end = math.sqrt( - ((west_p.x - end_point.x)*(west_p.x - end_point.x))+ - ((west_p.z - end_point.z)*(west_p.z - end_point.z)) - ) - local dist_east_p_to_end = math.sqrt( - ((east_p.x - end_point.x)*(east_p.x - end_point.x))+ - ((east_p.z - end_point.z)*(east_p.z - end_point.z)) - ) - -- evaluate which pos is closer to the end_point - if dist_north_p_to_end <= dist_south_p_to_end and - dist_north_p_to_end <= dist_west_p_to_end and - dist_north_p_to_end <= dist_east_p_to_end - then - starting_point = north_p - distance = dist_north_p_to_end - - elseif dist_south_p_to_end <= dist_north_p_to_end and - dist_south_p_to_end <= dist_west_p_to_end and - dist_south_p_to_end <= dist_east_p_to_end - then - starting_point = south_p - distance = dist_south_p_to_end - - elseif dist_west_p_to_end <= dist_north_p_to_end and - dist_west_p_to_end <= dist_south_p_to_end and - dist_west_p_to_end <= dist_east_p_to_end - then - starting_point = west_p - distance = dist_west_p_to_end - - elseif dist_east_p_to_end <= dist_north_p_to_end and - dist_east_p_to_end <= dist_south_p_to_end and - dist_east_p_to_end <= dist_west_p_to_end - then - starting_point = east_p - distance = dist_east_p_to_end - end - -- find surface of new starting point - local surface_point, surface_mat = settlements.find_surface(starting_point) - -- replace surface node with mcl_core:grass_path - if surface_point - then - if surface_mat == "mcl_core:sand" or surface_mat == "mcl_core:redsand" then - minetest.swap_node(surface_point,{name="mcl_core:sandstonesmooth2"}) - else - minetest.swap_node(surface_point,{name="mcl_core:grass_path"}) - end - -- don't set y coordinate, surface might be too low or high - starting_point.x = surface_point.x - starting_point.z = surface_point.z - end - if distance <= 1 or - starting_point == end_point - then - break - end - end - end - end -end diff --git a/mods/MAPGEN/mcl_villages/schematics/blacksmith.mts b/mods/MAPGEN/mcl_villages/schematics/blacksmith.mts index d7fb66593..09665654a 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/blacksmith.mts and b/mods/MAPGEN/mcl_villages/schematics/blacksmith.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/butcher.mts b/mods/MAPGEN/mcl_villages/schematics/butcher.mts index 251033b1e..03353de10 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/butcher.mts and b/mods/MAPGEN/mcl_villages/schematics/butcher.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/church.mts b/mods/MAPGEN/mcl_villages/schematics/church.mts index dbf022cb4..a4fab8952 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/church.mts and b/mods/MAPGEN/mcl_villages/schematics/church.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/farm.mts b/mods/MAPGEN/mcl_villages/schematics/farm.mts index 9094c8681..e47f6e22f 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/farm.mts and b/mods/MAPGEN/mcl_villages/schematics/farm.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/lamp.mts b/mods/MAPGEN/mcl_villages/schematics/lamp.mts index c8d907eba..4d2d1a350 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/lamp.mts and b/mods/MAPGEN/mcl_villages/schematics/lamp.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/large_house.mts b/mods/MAPGEN/mcl_villages/schematics/large_house.mts index 36be603f4..1a55c32d9 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/large_house.mts and b/mods/MAPGEN/mcl_villages/schematics/large_house.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/library.mts b/mods/MAPGEN/mcl_villages/schematics/library.mts index b47e0b413..2986a7162 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/library.mts and b/mods/MAPGEN/mcl_villages/schematics/library.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/medium_house.mts b/mods/MAPGEN/mcl_villages/schematics/medium_house.mts index 43ce2391b..85ef0f903 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/medium_house.mts and b/mods/MAPGEN/mcl_villages/schematics/medium_house.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/small_house.mts b/mods/MAPGEN/mcl_villages/schematics/small_house.mts index d7b62529c..d09fbfe00 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/small_house.mts and b/mods/MAPGEN/mcl_villages/schematics/small_house.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/tavern.mts b/mods/MAPGEN/mcl_villages/schematics/tavern.mts index 5eae8ae23..f6f3a5979 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/tavern.mts and b/mods/MAPGEN/mcl_villages/schematics/tavern.mts differ diff --git a/mods/MAPGEN/mcl_villages/schematics/well.mts b/mods/MAPGEN/mcl_villages/schematics/well.mts index 6ea47fea4..8b543dbf4 100644 Binary files a/mods/MAPGEN/mcl_villages/schematics/well.mts and b/mods/MAPGEN/mcl_villages/schematics/well.mts differ diff --git a/mods/MAPGEN/mcl_villages/utils.lua b/mods/MAPGEN/mcl_villages/utils.lua deleted file mode 100644 index 993de11c4..000000000 --- a/mods/MAPGEN/mcl_villages/utils.lua +++ /dev/null @@ -1,255 +0,0 @@ -local get_node = mcl_vars.get_node - -------------------------------------------------------------------------------- --- function to copy tables -------------------------------------------------------------------------------- -function settlements.shallowCopy(original) - local copy = {} - for key, value in pairs(original) do - copy[key] = value - end - return copy -end --- --- --- -function settlements.round(num, numDecimalPlaces) - local mult = 10^(numDecimalPlaces or 0) - return math.floor(num * mult + 0.5) / mult -end - -------------------------------------------------------------------------------- --- function to find surface block y coordinate --- returns surface postion -------------------------------------------------------------------------------- -function settlements.find_surface(pos, wait) - local p6 = vector.new(pos) - local cnt = 0 - local itter = 1 -- count up or down - local cnt_max = 200 - -- check, in which direction to look for surface - local surface_node - if wait then - surface_node = get_node(p6, true, 10000000) - else - surface_node = get_node(p6) - end - if surface_node.name=="air" or surface_node.name=="ignore" then - itter = -1 - end - -- go through nodes an find surface - while cnt < cnt_max do - -- Check Surface_node and Node above - -- - if settlements.surface_mat[surface_node.name] then - local surface_node_plus_1 = get_node({ x=p6.x, y=p6.y+1, z=p6.z}) - if surface_node_plus_1 and surface_node and - (string.find(surface_node_plus_1.name,"air") or - string.find(surface_node_plus_1.name,"snow") or - string.find(surface_node_plus_1.name,"fern") or - string.find(surface_node_plus_1.name,"flower") or - string.find(surface_node_plus_1.name,"bush") or - string.find(surface_node_plus_1.name,"tree") or - string.find(surface_node_plus_1.name,"grass")) - then - settlements.debug("find_surface7: " ..surface_node.name.. " " .. surface_node_plus_1.name) - return p6, surface_node.name - else - settlements.debug("find_surface2: wrong surface+1") - end - else - settlements.debug("find_surface3: wrong surface "..surface_node.name.." at pos "..minetest.pos_to_string(p6)) - end - - p6.y = p6.y + itter - if p6.y < 0 then - settlements.debug("find_surface4: y<0") - return nil - end - cnt = cnt+1 - surface_node = get_node(p6) - end - settlements.debug("find_surface5: cnt_max overflow") - return nil -end -------------------------------------------------------------------------------- --- check distance for new building -------------------------------------------------------------------------------- -function settlements.check_distance(settlement_info, building_pos, building_size) - local distance - for i, built_house in ipairs(settlement_info) do - distance = math.sqrt( - ((building_pos.x - built_house["pos"].x)*(building_pos.x - built_house["pos"].x))+ - ((building_pos.z - built_house["pos"].z)*(building_pos.z - built_house["pos"].z))) - if distance < building_size or distance < built_house["hsize"] then - return false - end - end - return true -end -------------------------------------------------------------------------------- --- save list of generated settlements -------------------------------------------------------------------------------- -function settlements.save() - local file = io.open(minetest.get_worldpath().."/settlements.txt", "w") - if file then - file:write(minetest.serialize(settlements_in_world)) - file:close() - end -end -------------------------------------------------------------------------------- --- load list of generated settlements -------------------------------------------------------------------------------- -function settlements.load() - local file = io.open(minetest.get_worldpath().."/settlements.txt", "r") - if file then - local table = minetest.deserialize(file:read("*all")) - if type(table) == "table" then - return table - end - end - return {} -end -------------------------------------------------------------------------------- --- fill chests -------------------------------------------------------------------------------- -function settlements.fill_chest(pos, pr) - -- initialize chest (mts chests don't have meta) - local meta = minetest.get_meta(pos) - if meta:get_string("infotext") ~= "Chest" then - -- For MineClone2 0.70 or before - -- minetest.registered_nodes["mcl_chests:chest"].on_construct(pos) - -- - -- For MineClone2 after commit 09ab1482b5 (the new entity chests) - minetest.registered_nodes["mcl_chests:chest_small"].on_construct(pos) - end - -- fill chest - local inv = minetest.get_inventory( {type="node", pos=pos} ) - - local function get_treasures(prand) - local loottable = {{ - stacks_min = 3, - stacks_max = 8, - items = { - { itemstring = "mcl_core:diamond", weight = 3, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 5 }, - { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_farming:bread", weight = 15, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_tools:pick_iron", weight = 5 }, - { itemstring = "mcl_tools:sword_iron", weight = 5 }, - { itemstring = "mcl_armor:chestplate_iron", weight = 5 }, - { itemstring = "mcl_armor:helmet_iron", weight = 5 }, - { itemstring = "mcl_armor:leggings_iron", weight = 5 }, - { itemstring = "mcl_armor:boots_iron", weight = 5 }, - { itemstring = "mcl_core:obsidian", weight = 5, amount_min = 3, amount_max = 7 }, - { itemstring = "mcl_core:sapling", weight = 5, amount_min = 3, amount_max = 7 }, - { itemstring = "mcl_mobitems:saddle", weight = 3 }, - { itemstring = "mobs_mc:iron_horse_armor", weight = 1 }, - { itemstring = "mobs_mc:gold_horse_armor", weight = 1 }, - { itemstring = "mobs_mc:diamond_horse_armor", weight = 1 }, - } - }} - local items = mcl_loot.get_multi_loot(loottable, prand) - return items - end - - local items = get_treasures(pr) - mcl_loot.fill_inventory(inv, "main", items, pr) -end - -------------------------------------------------------------------------------- --- initialize furnace -------------------------------------------------------------------------------- -function settlements.initialize_furnace(pos) - -- find chests within radius - local furnacepos = minetest.find_node_near(pos, - 7, --radius - {"mcl_furnaces:furnace"}) - -- initialize furnacepos (mts furnacepos don't have meta) - if furnacepos - then - local meta = minetest.get_meta(furnacepos) - if meta:get_string("infotext") ~= "furnace" - then - minetest.registered_nodes["mcl_furnaces:furnace"].on_construct(furnacepos) - end - end -end -------------------------------------------------------------------------------- --- initialize anvil -------------------------------------------------------------------------------- -function settlements.initialize_anvil(pos) - -- find chests within radius - local anvilpos = minetest.find_node_near(pos, - 7, --radius - {"mcl_anvils:anvil"}) - -- initialize anvilpos (mts anvilpos don't have meta) - if anvilpos - then - local meta = minetest.get_meta(anvilpos) - if meta:get_string("infotext") ~= "anvil" - then - minetest.registered_nodes["mcl_anvils:anvil"].on_construct(anvilpos) - end - end -end -------------------------------------------------------------------------------- --- randomize table -------------------------------------------------------------------------------- -function shuffle(tbl, pr) - local table = settlements.shallowCopy(tbl) - local size = #table - for i = size, 1, -1 do - local rand = pr:next(1, size) - table[i], table[rand] = table[rand], table[i] - end - return table -end -------------------------------------------------------------------------------- --- evaluate heightmap -------------------------------------------------------------------------------- -function settlements.evaluate_heightmap() - local heightmap = minetest.get_mapgen_object("heightmap") - -- max height and min height, initialize with impossible values for easier first time setting - local max_y = -50000 - local min_y = 50000 - -- only evaluate the center square of heightmap 40 x 40 - local square_start = 1621 - local square_end = 1661 - for j = 1 , 40, 1 do - for i = square_start, square_end, 1 do - -- skip buggy heightmaps, return high value - if heightmap[i] == -31000 or heightmap[i] == 31000 then - return max_height_difference + 1 - end - if heightmap[i] < min_y then - min_y = heightmap[i] - end - if heightmap[i] > max_y then - max_y = heightmap[i] - end - end - -- set next line - square_start = square_start + 80 - square_end = square_end + 80 - end - -- return the difference between highest and lowest pos in chunk - local height_diff = max_y - min_y - -- filter buggy heightmaps - if height_diff <= 1 then - return max_height_difference + 1 - end - -- debug info - settlements.debug("heightdiff ".. height_diff) - return height_diff -end -------------------------------------------------------------------------------- --- Set array to list --- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list -------------------------------------------------------------------------------- -function settlements.Set (list) - local set = {} - for _, l in ipairs(list) do set[l] = true end - return set -end diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 65a7d6a69..654a05672 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -19,8 +19,7 @@ end local probability_railcaves_in_mapchunk = P(0.33333) setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_railcaves_in_mapchunk")) -- Extra check to prevent mod griefing in singlenode, mcimported worlds. -local mg_name = minetest.get_mapgen_setting("mg_name") -if mg_name == "singlenode" then +if mcl_mapgen.singlenode then probability_railcaves_in_mapchunk = P(0) elseif setting then probability_railcaves_in_mapchunk = P(setting) @@ -96,10 +95,10 @@ end -- Max. and min. heights between rail corridors are generated local height_min -if mcl_vars.mg_lava then - height_min = mcl_vars.mg_lava_overworld_max + 2 +if mcl_mapgen.lava then + height_min = mcl_mapgen.overworld.lava_max + 2 else - height_min = mcl_vars.mg_bedrock_overworld_max + 2 + height_min = mcl_mapgen.overworld.bedrock_max + 2 end local height_max = mcl_worlds.layer_to_y(60) @@ -1093,7 +1092,7 @@ local function create_corridor_system(main_cave_coords) end -- The rail corridor algorithm starts here -mcl_mapgen_core.register_generator("railcorridors", nil, function(minp, maxp, blockseed, _pr) +mcl_mapgen.register_mapgen(function(minp, maxp, blockseed) -- We re-init the randomizer for every mapchunk as we start generating in the middle of each mapchunk. -- We can't use the mapgen seed as this would make the algorithm depending on the order the mapchunk generate. InitRandomizer(blockseed) diff --git a/mods/MISC/findbiome/locale/findbiome.fr.tr b/mods/MISC/findbiome/locale/findbiome.fr.tr index 0fc6aa578..89e6019de 100644 --- a/mods/MISC/findbiome/locale/findbiome.fr.tr +++ b/mods/MISC/findbiome/locale/findbiome.fr.tr @@ -6,5 +6,5 @@ Biome does not exist!=Le biome n'existe pas! Biome found at @1.=Biome trouvé à @1. No biome found!=Aucun biome trouvé! List all biomes=Lister tous les biomes -No biomes.=Aucun biomes. +No biomes.=Aucun biome. Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Non supporté. Le mod «biomeinfo» est requis pour le support de mapgen v6! diff --git a/mods/MISC/findbiome/locale/findbiome.ru.tr b/mods/MISC/findbiome/locale/findbiome.ru.tr index c37371820..51cb0e486 100644 --- a/mods/MISC/findbiome/locale/findbiome.ru.tr +++ b/mods/MISC/findbiome/locale/findbiome.ru.tr @@ -2,9 +2,9 @@ Find and teleport to biome=Найти и телепортироваться к биому =<биом> No player.=Нет игрока. -Biome does not exist!=Биом не существует! +Biome does not exist!=Такого биома не существует! Biome found at @1.=Биом найден в @1. No biome found!=Биом не найден! List all biomes=Список всех биомов No biomes.=Нет биомов. -Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Не поддерживается. Для поддержки мэпгена v6 требуется мод “biomeinfo”! +Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Не поддерживается. Для поддержки мапгена v6 требуется мод “biomeinfo”! diff --git a/mods/MISC/findbiome/locale/findbiome.zh_CN.tr b/mods/MISC/findbiome/locale/findbiome.zh_CN.tr new file mode 100644 index 000000000..993ceed7d --- /dev/null +++ b/mods/MISC/findbiome/locale/findbiome.zh_CN.tr @@ -0,0 +1,10 @@ +# textdomain: findbiome +Find and teleport to biome=寻找以及传送至生物群系 +=<生物群系> +No player.=没有玩家. +Biome does not exist!=生物群系不存在. +Biome found at @1.=生物群系在 @1 被找到 +No biome found!=找不到生物群系. +List all biomes=生物群系列表信息 +No biomes.=没有生物群系. +Not supported. The “biomeinfo” mod is required for v6 mapgen support!=不支持. 生物群系信息模组需要v6 地图生成构造器支持! diff --git a/mods/MISC/mcl_commands/gamemode.lua b/mods/MISC/mcl_commands/gamemode.lua new file mode 100644 index 000000000..8d720e21d --- /dev/null +++ b/mods/MISC/mcl_commands/gamemode.lua @@ -0,0 +1,127 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local gamemode_ids = { + survival = 1, + creative = 2, +} + +local id_to_gamemode = {} +for gamemode, id in pairs(gamemode_ids) do + id_to_gamemode[id] = gamemode +end + +local creative_mode = 'creative' + +local storage = minetest.get_mod_storage() + +local player_to_gamemode_id = minetest.deserialize(storage:get_string("player_to_gamemode_id") or "return {}") or {} +minetest.register_on_shutdown(function() + storage:set_string("player_to_gamemode_id", minetest.serialize(player_to_gamemode_id)) +end) + +local core_is_creative_enabled = minetest.is_creative_enabled + +minetest.is_creative_enabled = function(name) + local id = player_to_gamemode_id[name] + if id then + local gamemode = id_to_gamemode[id] + if gamemode then + return gamemode == creative_mode + end + end + return core_is_creative_enabled(name) +end + +local registered_functions_on_gamemode_change = {} + +local function handle_gamemode_command(player_name, new_gamemode) + local old_gamemode_id = player_to_gamemode_id[player_name] + local old_gamemode = old_gamemode_id and id_to_gamemode[old_gamemode_id] + player_to_gamemode_id[player_name] = gamemode_ids[new_gamemode] + if old_gamemode ~= new_gamemode then + for _, function_ref in pairs(registered_functions_on_gamemode_change) do + function_ref(player_name, old_gamemode, new_gamemode) + end + end + return true +end + +if minetest.registered_chatcommands["gamemode"] then + minetest.unregister_chatcommand("gamemode") +end + +local function get_gamemode_param() + local param + local i = 0 + for gamemode, _ in pairs(gamemode_ids) do + if i == 0 then + param = "(" + else + param = param .. " | " + end + i = i + 1 + param = param .. gamemode + end + if i > 0 then + param = param .. ") " + end + return param +end + +minetest.register_chatcommand("gamemode", { + params = S("@1[]", get_gamemode_param()), + description = S("Set game mode for player or yourself"), + privs = {server=true}, + func = function(name, param) + if (param == "") then + return false, S("Error: No game mode specified.") + end + if (gamemode_ids[param]) then + handle_gamemode_command(name, param) + else + local new_gamemode, player_name = string.match(param, "^([%a]+) ([%a%d_-]+)$") + if not new_gamemode or not gamemode_ids[new_gamemode] or not player_name then + return false, S("Invalid usage, see /help @1", "gamemode") + end + handle_gamemode_command(player_name, new_gamemode) + end + end +}) + +local action_id_to_index = {} + +function mcl_commands.register_on_gamemode_change(action_id, function_ref) + if action_id_to_index[action_id] then + minetest.log("warning", "[mcl_command] [gamemode] Duplicate register_on_gamemode_change action_id") + return + end + local new_index = #registered_functions_on_gamemode_change + 1 + registered_functions_on_gamemode_change[new_index] = function_ref + action_id_to_index[action_id] = new_index +end + +function mcl_commands.unregister_on_gamemode_change(action_id) + local old_index = action_id_to_index[action_id] + if not old_index then + minetest.log("warning", "[mcl_command] [gamemode] Can't unregister not registered action_id in unregister_on_gamemode_change") + return + end + table.remove(registered_functions_on_gamemode_change, old_index) + action_to_id[action_id] = nil +end + +mcl_commands.register_on_gamemode_change("check_fly_and_noclip", function(player_name, old_gamemode, new_gamemode) + if new_gamemode == "creative" then + local privs = minetest.get_player_privs(player_name) + if not privs then return end + privs.fly = true + privs.noclip = true + minetest.set_player_privs(player_name, privs) + elseif new_gamemode == "survival" then + local privs = minetest.get_player_privs(player_name) + if not privs then return end + privs.fly = nil + privs.noclip = nil + minetest.set_player_privs(player_name, privs) + end +end) diff --git a/mods/MISC/mcl_commands/init.lua b/mods/MISC/mcl_commands/init.lua index a287c2926..1fd5ecc3c 100644 --- a/mods/MISC/mcl_commands/init.lua +++ b/mods/MISC/mcl_commands/init.lua @@ -1,5 +1,8 @@ +mcl_commands = {} + local modpath = minetest.get_modpath(minetest.get_current_modname()) +dofile(modpath.."/gamemode.lua") dofile(modpath.."/kill.lua") dofile(modpath.."/setblock.lua") dofile(modpath.."/seed.lua") diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.de.tr b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr index 68d267517..7f21c8537 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.de.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.de.tr @@ -10,7 +10,7 @@ Kill player or yourself=Spieler oder sich selbst töten Can use /say=Kann „/say“ benutzen = Send a message to every player=Nachricht an alle Spieler senden -Invalid usage, see /help say.=Falsche Benutzung, siehe „/help say“. +Invalid usage, see /help @1.=Falsche Benutzung, siehe „/help @1“. ,, =,, Set node at given position=Node (Block) an der gegebenen Position platzieren Invalid node=Unültiger Node @@ -21,3 +21,6 @@ Ban list: @1=Bannliste: @1 Show who is logged on=Anzeigen, wer eingeloggt ist Displays the world seed=Den Seed der Welt anzeigen Only peaceful mobs allowed!=Nur friedliche Mobs erlaubt! +@1[]= +Set game mode for player or yourself= +Error: No game mode specified.= diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.es.tr b/mods/MISC/mcl_commands/locale/mcl_commands.es.tr index 91b21eb91..a04d4aaf1 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.es.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.es.tr @@ -21,3 +21,6 @@ Ban list: @1=Lista de baneados: @1 Show who is logged on=Mostrar quién ha iniciado sesión Displays the world seed=Muestra la semilla del mundo Only peaceful mobs allowed!=¡Solo se permiten animales pacíficos! +@1[]= +Set game mode for player or yourself= +Error: No game mode specified.= diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.fr.tr b/mods/MISC/mcl_commands/locale/mcl_commands.fr.tr index a655368bf..1223c24ec 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.fr.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.fr.tr @@ -10,7 +10,7 @@ Kill player or yourself=Tuez un joueur ou vous-même Can use /say=Peut utiliser /say = Send a message to every player=Envoyez un message à chaque joueur -Invalid usage, see /help say.=Utilisation non valide, voir /help say. +Invalid usage, see /help @1.=Utilisation non valide, voir /help @1. ,, =,, Set node at given position=Placer le noeud à une position donnée Invalid node=Noeud non valide @@ -20,4 +20,7 @@ List bans=Liste des interdictions Ban list: @1=Liste d'interdiction: @1 Show who is logged on=Afficher qui est connecté Displays the world seed=Affiche la graine du monde -Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées! +Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisés! +@1[]=@1[] +Set game mode for player or yourself=Choisir le mode de jeu pour vous ou pour les joueurs +Error: No game mode specified.=Erreur : mode de jeu non spécifié. diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.pl.tr b/mods/MISC/mcl_commands/locale/mcl_commands.pl.tr index 4a3ad181c..bacdae3a9 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.pl.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.pl.tr @@ -10,7 +10,7 @@ Kill player or yourself=Zabij gracza lub siebie Can use /say=Może używać /say = Send a message to every player=Wyślij wiadomość do każdego gracza -Invalid usage, see /help say.=Niepoprawne użyciu, zobacz /help say. +Invalid usage, see /help @1.=Niepoprawne użyciu, zobacz /help @1. ,, =,, Set node at given position=Ustaw node w danej pozycji Invalid node=Niepoprawny node @@ -21,3 +21,6 @@ Ban list: @1=Lista zbanowanych: @1 Show who is logged on=Pokaż zalogowanych Displays the world seed=Wyświetl ziarno świata Only peaceful mobs allowed!=Tylko pokojowe moby dozwolone! +@1[]= +Set game mode for player or yourself= +Error: No game mode specified.= diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr b/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr index 686c8067c..3c18f554c 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr @@ -1,23 +1,30 @@ # textdomain: mcl_commands -Players can't be killed right now, damage has been disabled.=Игроки не могут быть убиты прямо сейчас, урон отключён. -Player @1 does not exist.=Игрок @1 не существует. +Players can't be killed right now, damage has been disabled.=Игроки не могут быть убиты - урон отключён. +Player @1 does not exist.=Игрока @1 не существует. You are already dead=Вы уже мертвы @1 is already dead=@1 уже мертв(а) -@1 committed suicide.=@1 совершил(а) роскомнадзор. -@1 was killed by @2.=@1 был(а) убит(а) @2. +@1 committed suicide.=@1 совершил(а) Роскомнадзор. +@1 was killed by @2.=@1 был убит(а) @2. []=[<имя>] Kill player or yourself=Убить игрока или себя Can use /say=Можно использовать /say =<сообщение> -Send a message to every player=Отправляет сообщение всем игрокам -Invalid usage, see /help say.=Недопустимое использование, см. /help say. -,, =,, <СтрокаУзла> -Set node at given position=Устанавливает узел в заданной позиции -Invalid node=Неправильный узел -@1 spawned.=@1 возродился(ась). +Send a message to every player=Отправить сообщение всем игрокам +Invalid usage, see /help @1.=Недопустимое использование, см. /help @1. +,, =,, <НаименованиеБлока> +Set node at given position=Устанавливает блок в заданной позиции +Invalid node=Неправильный блок +@1 spawned.=@1 возродился. Invalid parameters (see /help setblock)=Недопустимые параметры (см. /help setblock) List bans=Список банов Ban list: @1=Бан-лист: @1 -Show who is logged on=Показывает, кто подключён +Show who is logged on=Показывает игроков в сети Displays the world seed=Показывает значение зерна мира (seed) Only peaceful mobs allowed!=Включены только мирные мобы! +@1[]=@1[<имя>] +Set game mode for player or yourself=Задаёт режим игры для игрока или для вас +Error: No game mode specified.=Ошибка: Режим игры не указан. + =<звук> <цель> +Play a sound. Arguments: : name of the sound. : Target.=Проигрывает звук. Аргументы: <звук> - название звука, <цель> - целевой игрок. +Sound name is invalid!=Неправильное название звука! +Target is invalid!!=Неправильная цель!! \ No newline at end of file diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.zh_CN.tr b/mods/MISC/mcl_commands/locale/mcl_commands.zh_CN.tr new file mode 100644 index 000000000..e9dbb1593 --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.zh_CN.tr @@ -0,0 +1,26 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.=现在不能杀死玩家,由于互相伤害被禁止. +Player @1 does not exist.=玩家 @1 不存在 +You are already dead=你已经死了 +@1 is already dead=@1 已经死了 +@1 committed suicide.=@1 尝试自杀 +@1 was killed by @2.=@1 被 @2 杀了. +[]=[<名字>] +Kill player or yourself=杀死其他玩家或者自己 +Can use /say=可以使用 /say +=<信息> +Send a message to every player=给每位玩家发消息 +Invalid usage, see /help @1.=无效的使用,请查看 /help @1. +,, =,, <节点字符串> +Set node at given position=设置节点在所给的位置 +Invalid node=无效的节点 +@1 spawned.=@1 生成. +Invalid parameters (see /help setblock)=无效参数 (请查看 /help setblock) +List bans=被禁止的列表 +Ban list: @1=禁止的列表: @1 +Show who is logged on=显示谁已登录 +Displays the world seed=显示世界生成种子 +Only peaceful mobs allowed!=只允许和平的生物! +@1[]=@1[<名字>] +Set game mode for player or yourself=为玩家或你自己设置游戏模式 +Error: No game mode specified.=错误: 没有指定游戏模式. \ No newline at end of file diff --git a/mods/MISC/mcl_commands/locale/template.txt b/mods/MISC/mcl_commands/locale/template.txt index 5b4370b8f..0a7cc9cf5 100644 --- a/mods/MISC/mcl_commands/locale/template.txt +++ b/mods/MISC/mcl_commands/locale/template.txt @@ -10,7 +10,7 @@ Kill player or yourself= Can use /say= = Send a message to every player= -Invalid usage, see /help say.= +Invalid usage, see /help @1.= ,, = Set node at given position= Invalid node= @@ -21,3 +21,10 @@ Ban list: @1= Show who is logged on= Displays the world seed= Only peaceful mobs allowed!= +@1[]= +Set game mode for player or yourself= +Error: No game mode specified.= + = +Play a sound. Arguments: : name of the sound. : Target.= +Sound name is invalid!= +Target is invalid!!= diff --git a/mods/MISC/mcl_commands/say.lua b/mods/MISC/mcl_commands/say.lua index 9fd53c174..5f5bc5b00 100644 --- a/mods/MISC/mcl_commands/say.lua +++ b/mods/MISC/mcl_commands/say.lua @@ -10,7 +10,7 @@ minetest.register_chatcommand("say", { privs = {announce=true}, func = function(name, param) if not param then - return false, S("Invalid usage, see /help say.") + return false, S("Invalid usage, see /help @1.", "say") end minetest.chat_send_all(("["..name.."] "..param)) return true diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index f06ff3582..bbf75f37b 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -20,10 +20,26 @@ end) for _, action in pairs({"grant", "revoke"}) do minetest["register_on_priv_" .. action](function(name, _, priv) - if priv == "fly" then - local player = minetest.get_player_by_name(name) + local player = minetest.get_player_by_name(name) + if player then local meta = player:get_meta() - meta:set_int("fly_changed", 1) + + if priv == "fly" then + meta:set_int("fly_changed", 1) + end + + --[[ + so e.g. hackers who have been revoked of the interact privilege + will not automatically get the interact privilege through the mcl shields code back + ]] + + if priv == "interact" then + if action == "revoke" then + meta:set_int("ineract_revoked", 1) + else + meta:set_int("ineract_revoked", 0) + end + end end end) -end \ No newline at end of file +end diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr b/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr index a3f37c365..9970e26bc 100644 --- a/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr +++ b/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr @@ -1,2 +1,2 @@ # textdomain: mcl_privs -Can place and use advanced blocks like mob spawners, command blocks and barriers.=Позволяет размещать и использовать продвинутые блоки, такие как спаунеры мобов, блоки команд и барьеры. \ No newline at end of file +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Позволяет размещать и использовать продвинутые блоки, такие как спавнеры мобов, командные блоки и барьеры. \ No newline at end of file diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.zh_CN.tr b/mods/MISC/mcl_privs/locale/mcl_privs.zh_CN.tr new file mode 100644 index 000000000..c6880732e --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.zh_CN.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=可以放置和使用高级块, 如怪物生成器、命令块和屏障. diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.ru.tr b/mods/MISC/mcl_wip/locale/mcl_wip.ru.tr index 6fb33179d..91a0454a5 100644 --- a/mods/MISC/mcl_wip/locale/mcl_wip.ru.tr +++ b/mods/MISC/mcl_wip/locale/mcl_wip.ru.tr @@ -1,4 +1,4 @@ # textdomain: mcl_wip -# WIP означает “Work in Progress” - работа продолжается -(WIP)=(в процессе) -(Temporary)=(Временное) +# WIP означает “Work in Progress” - в процессе разработки +(WIP)=(в разработке) +(Temporary)=(Временно) diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.zh_CN.tr b/mods/MISC/mcl_wip/locale/mcl_wip.zh_CN.tr new file mode 100644 index 000000000..5a4a9f860 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_wip +# WIP means “Work in Progress” +(WIP)=(半成品) +(Temporary)=(短暂的) diff --git a/mods/PLAYER/mcl_anticheat/init.lua b/mods/PLAYER/mcl_anticheat/init.lua index a37c9b5b8..2e3f427a6 100644 --- a/mods/PLAYER/mcl_anticheat/init.lua +++ b/mods/PLAYER/mcl_anticheat/init.lua @@ -1,24 +1,38 @@ -local flights_kick_threshold = 10 -local suffocations_kick_threshold = 1 +local enable_anticheat = true +local kick_cheaters = false +local kick_threshold = 10 local after = minetest.after local get_connected_players = minetest.get_connected_players local get_node = minetest.get_node local get_objects_inside_radius = minetest.get_objects_inside_radius local get_player_by_name = minetest.get_player_by_name -local is_creative_enabled = minetest.is_creative_enabled local kick_player = minetest.kick_player local set_node = minetest.set_node +local find_nodes_in_area = minetest.find_nodes_in_area local ceil = math.ceil local floor = math.floor +local vector_length = vector.length local distance = vector.distance -local window_size = 10 -local detection_interval = 1.7 +local window_size = 8 +local detection_interval = 1.6 local step_seconds = detection_interval / window_size local joined_players = {} +local ip_to_players = {} +local player_name_to_ip = {} +local player_doesnt_move = {} +local ban_next_time = {} + +local function update_settings() + enable_anticheat = minetest.settings:get_bool("enable_anticheat", true) + kick_cheaters = minetest.settings:get_bool("kick_cheaters", false) + kick_threshold = tonumber(minetest.settings:get("kick_threshold") or 10) + minetest.after(10, update_settings) +end +update_settings() local function update_player(player_object) if not player_object then return end @@ -26,28 +40,40 @@ local function update_player(player_object) if not name then return end local pos = player_object:get_pos() - local x, y, z = floor(pos.x), floor(pos.y-0.1), floor(pos.z) + local x, z = floor(pos.x), floor(pos.z) + local feet_y, head_y = floor(pos.y-0.1), floor(pos.y + 1.49) if mcl_playerplus.elytra then - local elytra = mcl_playerplus.elytra[player_object] + local elytra = mcl_playerplus.elytra[name] if elytra and elytra.active then return end end - local air = get_node({x = x , y = y , z = z }).name == "air" - and get_node({x = x , y = y , z = z + 1}).name == "air" - and get_node({x = x , y = y + 1, z = z }).name == "air" - and get_node({x = x , y = y + 1, z = z + 1}).name == "air" - and get_node({x = x + 1, y = y , z = z }).name == "air" - and get_node({x = x + 1, y = y , z = z + 1}).name == "air" - and get_node({x = x + 1, y = y + 1, z = z }).name == "air" - and get_node({x = x + 1, y = y + 1, z = z + 1}).name == "air" + local air = #find_nodes_in_area({x = x, y = feet_y, z = z}, {x = x + 1, y = feet_y + 1, z = z + 1}, "air") == 8 + if air then + local objects = get_objects_inside_radius({x = pos.x, y = pos.y - 0.6, z = pos.z}, 1.3) + for _, obj in pairs(objects) do + if not obj:is_player() and obj:get_luaentity() and obj:get_luaentity()._cmi_is_mob then + air = false + break + end + end + end + local noclip = #find_nodes_in_area({x = x, y = head_y, z = z}, {x = x + 1, y = head_y + 1, z = z + 1}, "group:opaque") == 8 + + local velocity = player_object:get_velocity() + if vector_length(velocity) < 0.00000001 then + player_doesnt_move[name] = (player_doesnt_move[name] or 0) + 1 + else + player_doesnt_move[name] = 0 + end local player_data = { pos = pos, - velocity = player_object:get_velocity(), - air = air + velocity = velocity, + air = air, + noclip = noclip, } if joined_players[name] then @@ -63,12 +89,13 @@ local function update_player(player_object) end local function check_player(name) - if is_creative_enabled(name) then return end + if minetest.is_creative_enabled(name) then return end local data = joined_players[name] if not data then return end if not data[0] then return end local always_air = true + local always_noclip = true local falling = data[0].velocity.y < 0 for i = 0, window_size - 1 do local derivative = data[i] @@ -77,6 +104,7 @@ local function check_player(name) return end always_air = always_air and derivative.air + always_noclip = always_noclip and derivative.noclip falling = falling or derivative.velocity.y < 0 end if always_air and not falling then @@ -85,26 +113,39 @@ local function check_player(name) data.flights = 1 else data.flights = data.flights + 1 - if data.flights >= flights_kick_threshold then - kick_player(name, "flights") - end + end + if kick_cheaters and kick_threshold and kick_threshold > 0 and data.flights >= kick_threshold then + kick_player(name, "flights") + return end local obj_player = minetest.get_player_by_name(name) if not obj_player then - kick_player(name, "flights") + return end local velocity = obj_player:get_velocity() local pos = obj_player:get_pos() local x, y, z = floor(pos.x), floor(pos.y), floor(pos.z) - while ( get_node({x = x , y = y, z = z }).name == "air" - and get_node({x = x , y = y, z = z + 1}).name == "air" - and get_node({x = x + 1, y = y, z = z }).name == "air" - and get_node({x = x + 1, y = y, z = z + 1}).name == "air" - ) do + while #find_nodes_in_area({x = x, y = y, z = z}, {x = x + 1, y = y, z = z + 1}, "air") == 4 do y = y - 1 end - obj_player:set_velocity({x = velocity.x, y = -10, z = velocity.z}) obj_player:set_pos({x = x, y = y + 0.5, z = z}) + obj_player:set_velocity({x = 0, y = 0, z = 0}) + obj_player:set_acceleration({x = 0, y = 0, z = 0}) + end + if always_noclip then + -- noclip detected + local obj_player = minetest.get_player_by_name(name) + if not obj_player then + return + end + local pos = obj_player:get_pos() + local x, y, z = floor(pos.x), floor(pos.y+1.49), floor(pos.z) + while #find_nodes_in_area({x = x, y = y, z = z}, {x = x + 1, y = y + 1, z = z + 1}, "group:opaque") >= 7 do + y = y + 1 + end + obj_player:set_pos({x = x, y = y + 0.5, z = z}) + obj_player:set_velocity({x = 0, y = 0, z = 0}) + obj_player:set_acceleration({x = 0, y = 0, z = 0}) end end @@ -112,15 +153,77 @@ local function remove_player(player_object) if not player_object then return end local name = player_object:get_player_name() if not name then return end + local ip = player_name_to_ip[name] + player_name_to_ip[name] = nil + if ip then + local players = ip_to_players[ip] + if players then + for k, v in pairs(players) do + if v == name then + if k < #players then + players[k] = players[#players] + end + players[#players] = nil + break + end + end + end + end minetest.after(step_seconds, function() + player_doesnt_move[name] = nil joined_players[name] = nil end) end local function step() - for _, player in pairs(get_connected_players()) do - update_player(player) - check_player(player:get_player_name()) + if enable_anticheat then + for _, player in pairs(get_connected_players()) do + update_player(player) + check_player(player:get_player_name()) + end + end + for ip, players in pairs(ip_to_players) do + if #players > 2 then + local first = players[1] + local should_be_banned = ban_next_time[ip] + if #players < 6 then + for _, player_name in pairs(players) do + if (player_doesnt_move[player_name] or 0) > 1800/step_seconds then + minetest.kick_player(player_name, "Didn't move during 30 minutes, more than 2 connections from IP " .. ip) + end + end + elseif #players < 10 then + for _, player_name in pairs(players) do + if (player_doesnt_move[player_name] or 0) > 600/step_seconds then + minetest.kick_player(player_name, "Didn't move during 10 minutes, more than 5 connections from IP " .. ip) + end + end + elseif #players < 26 then + for _, player_name in pairs(players) do + if should_be_banned then + minetest.ban_player(player_name) + else + if (player_doesnt_move[player_name] or 0) > 90/step_seconds then + minetest.kick_player(player_name, "Didn't move during 1.5 minutes being connected multiple times") + ban_next_time[ip] = 1 + end + end + end + elseif #players <= 100 then + for _, player_name in pairs(players) do + if should_be_banned then + minetest.ban_player(player_name) + else + minetest.kick_player(player_name, "More than 25 connections from IP address " .. ip) + ban_next_time[ip] = 1 + end + end + else + for _, player_name in pairs(players) do + minetest.ban_player(player_name) + end + end + end end after(step_seconds, step) end @@ -162,7 +265,7 @@ minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack data.suffocations = data.suffocations + 1 end end - if data.suffocations >= suffocations_kick_threshold then + if data.suffocations >= kick_threshold then kick_player(name, "choker") end end) @@ -171,4 +274,15 @@ minetest.register_on_joinplayer(update_player) minetest.register_on_leaveplayer(remove_player) +minetest.register_on_authplayer(function(name, ip, is_success) + if not is_success then return end + local players = ip_to_players[ip] + if not players then + ip_to_players[ip] = {name} + else + players[#players + 1] = name + end + player_name_to_ip[name] = ip +end) + after(step_seconds, step) diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr index 811868b3a..b69a4ea9f 100644 --- a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.fr.tr @@ -3,6 +3,6 @@ Food=Nourriture Saturation=Saturation %s: %.1f/%d=%s: %.1f/%d -Exhaust.=Échappement. +Exhaust.=Épuisement. %s: %d/%d=%s: %d/%d @1 starved to death.=@1 est mort de faim. diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr index a91a4db75..bc0b33a67 100644 --- a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr @@ -1,8 +1,8 @@ # textdomain: mcl_hunger @1 succumbed to the poison.=@1 умер(ла) от яда. -Food=Продукт +Food=Еда Saturation=Насыщение %s: %.1f/%d=%s: %.1f/%d -Exhaust.=Истощ. +Exhaust.=Истощение %s: %d/%d=%s: %d/%d @1 starved to death.=@1 умер(ла) от голода. diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.zh_CN.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.zh_CN.tr new file mode 100644 index 000000000..09d6b88f6 --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.zh_CN.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.=@1 死于中毒. +Food=食物 +Saturation=饱食度 +%s: %.1f/%d=%s: %.1f/%d +Exhaust.=饥饿. +%s: %d/%d=%s: %d/%d +@1 starved to death.=@1 饿死了. diff --git a/mods/PLAYER/mcl_music/init.lua b/mods/PLAYER/mcl_music/init.lua new file mode 100644 index 000000000..05215059c --- /dev/null +++ b/mods/PLAYER/mcl_music/init.lua @@ -0,0 +1,113 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local pianowtune = "diminixed-pianowtune01" +local end_tune = "diminixed-ambientwip" +local nether_tune = "horizonchris96-traitor" + +local dimension_to_base_track = { + ["overworld"] = pianowtune, + ["nether"] = nether_tune, + ["end"] = end_tune, +} + +local listeners = {} + +local weather_state + +local function stop_music_for_listener_name(listener_name) + if not listener_name then return end + local listener = listeners[listener_name] + if not listener then return end + local handle = listener.handle + if not handle then return end + minetest.sound_stop(handle) + listeners[listener_name].handle = nil +end + +local function stop() + for _, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + stop_music_for_listener_name(player_name) + end +end + +local function play() + local new_weather_state = mcl_weather.get_weather() + local was_good_weather = weather_state == "none" or weather_state == "clear" + weather_state = new_weather_state + local is_good_weather = weather_state == "none" or weather_state == "clear" + local is_weather_changed = weather_state ~= new_weather_state + local time = minetest.get_timeofday() + if time < 0.25 or time >= 0.75 then + stop() + minetest.after(10, play) + return + end + local day_count = minetest.get_day_count() + for _, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + local hp = player:get_hp() + local pos = player:get_pos() + local dimension = mcl_worlds.pos_to_dimension(pos) + + local listener = listeners[player_name] + local old_hp = listener and listener.hp + local old_dimension = listener and listener.dimension + + local is_dimension_changed = old_dimension and (old_dimension ~= dimension) or false + local is_hp_changed = old_hp and (math.abs(old_hp - hp) > 0.00001) or false + local handle = listener and listener.handle + + local track = dimension_to_base_track[dimension] + + if is_hp_changed + or is_dimension_changed + or (dimension == "overworld" and (is_weather_changed or not is_good_weather)) + or not track + then + stop_music_for_listener_name(player_name) + if not listeners[player_name] then + listeners[player_name] = {} + end + listeners[player_name].hp = hp + listeners[player_name].dimension = dimension + elseif not handle and (not listener or (listener.day_count ~= day_count)) then + local spec = { + name = track, + gain = 0.3, + pitch = 1.0, + } + local parameters = { + to_player = player_name, + gain = 1.0, + fade = 0.0, + pitch = 1.0, + } + handle = minetest.sound_play(spec, parameters, false) + listeners[player_name] = { + spec = spec, + parameters = parameters, + handle = handle, + hp = hp, + dimension = dimension, + day_count = day_count, + } + end + end + + minetest.after(7, play) +end + +minetest.after(15, play) + +minetest.register_on_joinplayer(function(player, last_login) + local player_name = player:get_player_name() + stop_music_for_listener_name(player_name) +end) + +minetest.register_on_respawnplayer(function(player) + local player_name = player:get_player_name() + stop_music_for_listener_name(player_name) +end) + diff --git a/mods/PLAYER/mcl_music/mod.conf b/mods/PLAYER/mcl_music/mod.conf new file mode 100644 index 000000000..74493b42d --- /dev/null +++ b/mods/PLAYER/mcl_music/mod.conf @@ -0,0 +1,4 @@ +name = mcl_music +author = diminixed, horizonchris96, kay27 +description = Mod check some conditions and plays music +depends = mcl_player, mcl_weather, mcl_worlds diff --git a/mods/PLAYER/mcl_music/sounds/diminixed-ambientwip.ogg b/mods/PLAYER/mcl_music/sounds/diminixed-ambientwip.ogg new file mode 100644 index 000000000..c02e8540a Binary files /dev/null and b/mods/PLAYER/mcl_music/sounds/diminixed-ambientwip.ogg differ diff --git a/mods/PLAYER/mcl_music/sounds/diminixed-pianowtune01.ogg b/mods/PLAYER/mcl_music/sounds/diminixed-pianowtune01.ogg new file mode 100644 index 000000000..38df66cb6 Binary files /dev/null and b/mods/PLAYER/mcl_music/sounds/diminixed-pianowtune01.ogg differ diff --git a/mods/PLAYER/mcl_music/sounds/horizonchris96-traitor.ogg b/mods/PLAYER/mcl_music/sounds/horizonchris96-traitor.ogg new file mode 100644 index 000000000..d21386712 Binary files /dev/null and b/mods/PLAYER/mcl_music/sounds/horizonchris96-traitor.ogg differ diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 2a4c25c34..9d910a89a 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -9,7 +9,8 @@ local animation_blend = 0 local function get_mouse_button(player) local controls = player:get_player_control() local get_wielded_item_name = player:get_wielded_item():get_name() - if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") and not string.find(get_wielded_item_name, "mcl_bows:crossbow") or controls.LMB then + if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") and not string.find(get_wielded_item_name, "mcl_bows:crossbow") and + not mcl_shields.wielding_shield(player, 1) and not mcl_shields.wielding_shield(player, 2) or controls.LMB then return true else return false @@ -89,7 +90,7 @@ function mcl_player.player_set_model(player, model_name) end local function set_texture(player, index, texture) - local textures = player_textures[player:get_player_name()] + local textures = player_textures[player:get_player_name()] or {} textures[index] = texture player:set_properties({textures = textures}) end @@ -126,6 +127,8 @@ function mcl_player.player_get_preview(player) end function mcl_player.get_player_formspec_model(player, x, y, w, h, fsname) + if not mcl_util then return end + if not mcl_util.is_player(player) then return end local name = player:get_player_name() local model = player_model[name] local anim = models[model].animations[player_anim[name]] @@ -188,6 +191,9 @@ minetest.register_globalstep(function(dtime) animation_speed_mod = animation_speed_mod / 2 end + if mcl_shields.is_blocking(player) then + animation_speed_mod = animation_speed_mod / 2 + end -- ask if player is swiming @@ -204,6 +210,8 @@ minetest.register_globalstep(function(dtime) or walking and velocity.x < -0.35 or walking and velocity.z > 0.35 or walking and velocity.z < -0.35 then + local wielded_itemname = player:get_wielded_item():get_name() + local no_arm_moving = string.find(wielded_itemname, "mcl_bows:bow") or mcl_shields.wielding_shield(player, 1) or mcl_shields.wielding_shield(player, 2) if player_sneak[name] ~= controls.sneak then player_anim[name] = nil player_sneak[name] = controls.sneak @@ -212,9 +220,9 @@ minetest.register_globalstep(function(dtime) player_set_animation(player, "swim_walk_mine", animation_speed_mod) elseif not controls.sneak and head_in_water and is_sprinting == true then player_set_animation(player, "swim_walk", animation_speed_mod) - elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB and controls.sneak or string.find(player:get_wielded_item():get_name(), "mcl_bows:crossbow_") and controls.sneak then + elseif no_arm_moving and controls.RMB and controls.sneak or string.find(wielded_itemname, "mcl_bows:crossbow_") and controls.sneak then player_set_animation(player, "bow_sneak", animation_speed_mod) - elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB or string.find(player:get_wielded_item():get_name(), "mcl_bows:crossbow_") then + elseif no_arm_moving and controls.RMB or string.find(wielded_itemname, "mcl_bows:crossbow_") then player_set_animation(player, "bow_walk", animation_speed_mod) elseif is_sprinting == true and get_mouse_button(player) == true and not controls.sneak and not head_in_water then player_set_animation(player, "run_walk_mine", animation_speed_mod) diff --git a/mods/PLAYER/mcl_playerinfo/init.lua b/mods/PLAYER/mcl_playerinfo/init.lua index 9c5d1433f..6c714c78b 100644 --- a/mods/PLAYER/mcl_playerinfo/init.lua +++ b/mods/PLAYER/mcl_playerinfo/init.lua @@ -73,9 +73,8 @@ minetest.register_globalstep(function(dtime) end) -- set to blank on join (for 3rd party mods) -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - +minetest.register_on_authplayer(function(name, ip, is_success) + if not is_success then return end mcl_playerinfo[name] = { node_head = "", node_feet = "", diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 380f29bd4..85755e0de 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -2,7 +2,6 @@ mcl_playerplus = { elytra = {}, } -local player_velocity_old = {x=0, y=0, z=0} local get_connected_players = minetest.get_connected_players local dir_to_yaw = minetest.dir_to_yaw local get_item_group = minetest.get_item_group @@ -19,12 +18,15 @@ local playerphysics = playerphysics local vector = vector local math = math +local math_min = math.min -- Internal player state local mcl_playerplus_internal = {} local time = 0 local look_pitch = 0 +local player_pos_for_bubble_columns = {} + local function player_collision(player) local pos = player:get_pos() @@ -34,9 +36,9 @@ local function player_collision(player) local width = .75 for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do - - if object and (object:is_player() - or (object:get_luaentity()._cmi_is_mob == true and object ~= player)) then + local luaentity = object:get_luaentity() + if object and ((mcl_util and mcl_util.is_player(object)) + or (luaentity and luaentity._cmi_is_mob == true and object ~= player)) then local pos2 = object:get_pos() local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} @@ -120,6 +122,114 @@ end local node_stand, node_stand_below, node_head, node_feet + +local function roundN(n, d) + if type(n) ~= "number" then return n end + local m = 10^d + return math.floor(n * m + 0.5) / m +end + +local function close_enough(a,b) + local rt=true + if type(a) == "table" and type(b) == "table" then + for k,v in pairs(a) do + if roundN(v,2) ~= roundN(b[k],2) then + rt=false + break + end + end + else + rt = roundN(a,2) == roundN(b,2) + end + return rt +end + + + +local function props_changed(props,oldprops) + local changed=false + local p={} + for k,v in pairs(props) do + if not close_enough(v,oldprops[k]) then + p[k]=v + changed=true + end + end + return changed,p +end + +--test if assert works +assert(true) +assert(not false) + +--test data for == and ~= +local test_equal1=42 +local test_equal2=42.0 +local test_equal3=42.1 + +assert(test_equal1==test_equal1) +assert(test_equal1==test_equal2) +assert(test_equal1~=test_equal3) + +--testdata for roundN +local test_round1=15 +local test_round2=15.00199999999 +local test_round3=15.00111111 +local test_round4=15.00999999 + +assert(roundN(test_round1,2)==roundN(test_round1,2)) --test again if basic equality works because wth not +assert(roundN(test_round1,2)==roundN(test_round2,2)) +assert(roundN(test_round1,2)==roundN(test_round3,2)) +assert(roundN(test_round1,2)~=roundN(test_round4,2)) + + +-- tests for close_enough +local test_cb = {-0.35,0,-0.35,0.35,0.8,0.35} --collisionboxes +local test_cb_close = {-0.351213,0,-0.35,0.35,0.8,0.351212} +local test_cb_diff = {-0.35,0,-1.35,0.35,0.8,0.35} + +local test_eh = 1.65 --eye height +local test_eh_close = 1.65123123 +local test_eh_diff = 1.35 + +local test_nt = { r = 225, b = 225, a = 225, g = 225 } --nametag +local test_nt_diff = { r = 225, b = 225, a = 0, g = 225 } + +assert(close_enough(test_cb,test_cb_close)) +assert(not close_enough(test_cb,test_cb_diff)) + +assert(close_enough(test_eh,test_eh_close)) +assert(not close_enough(test_eh,test_eh_diff)) + +assert(not close_enough(test_nt,test_nt_diff)) --no floats involved here + +--tests for props_changed +local test_properties_set1={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.65, nametag_color = { r = 225, b = 225, a = 225, g = 225 }} +local test_properties_set2={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 225, g = 225 }} + +local test_p1,p=props_changed(test_properties_set1,test_properties_set1) +local test_p2,p=props_changed(test_properties_set1,test_properties_set2) + +assert(not test_p1) +assert(test_p2) + +-- we still don't really know if lua is lying to us! but at least everything *seems* to be ok + +local function set_properties_conditional(player,props) + local changed,p=props_changed(props,player:get_properties()) + if changed then + player:set_properties(p) + end +end + +local function set_bone_position_conditional(player,b,p,r) --bone,position,rotation + local oldp,oldr=player:get_bone_position(b) + if vector.equals(vector.round(oldp),vector.round(p)) and vector.equals(vector.round(oldr),vector.round(r)) then + return + end + player:set_bone_position(b,p,r) +end + minetest.register_globalstep(function(dtime) time = time + dtime @@ -167,7 +277,7 @@ minetest.register_globalstep(function(dtime) local fly_pos = player:get_pos() local fly_node = minetest.get_node({x = fly_pos.x, y = fly_pos.y - 0.5, z = fly_pos.z}).name - local elytra = mcl_playerplus.elytra[player] + local elytra = mcl_playerplus.elytra[name] elytra.active = player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" and not player:get_attach() @@ -175,12 +285,6 @@ minetest.register_globalstep(function(dtime) and (fly_node == "air" or fly_node == "ignore") if elytra.active then - if player_velocity.x < (player_velocity_old.x - 10) or player_velocity.x > (player_velocity_old.x + 10) and fly_node ~= "ignore" then - mcl_util.deal_damage(player, math.abs(player_velocity_old.x) * 0.2, {type = "fly_into_wall"}) - end - if player_velocity.z < (player_velocity_old.z - 10) or player_velocity.z > (player_velocity_old.z + 10) and fly_node ~= "ignore" then - mcl_util.deal_damage(player, math.abs(player_velocity_old.z) * 0.2, {type = "fly_into_wall"}) - end mcl_player.player_set_animation(player, "fly") if player_velocity.y < -1.5 then player:add_velocity({x=0, y=0.17, z=0}) @@ -220,78 +324,79 @@ minetest.register_globalstep(function(dtime) end if wielded_def and wielded_def._mcl_toollike_wield then - player:set_bone_position("Wield_Item", vector.new(0,3.9,1.3), vector.new(90,0,0)) + set_bone_position_conditional(player,"Wield_Item", vector.new(0,3.9,1.3), vector.new(90,0,0)) elseif string.find(wielded:get_name(), "mcl_bows:bow") then - player:set_bone_position("Wield_Item", vector.new(.5,4.5,-1.6), vector.new(90,0,20)) + set_bone_position_conditional(player,"Wield_Item", vector.new(.5,4.5,-1.6), vector.new(90,0,20)) elseif string.find(wielded:get_name(), "mcl_bows:crossbow_loaded") then - player:set_bone_position("Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(64,90,0)) + set_bone_position_conditional(player,"Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(64,90,0)) elseif string.find(wielded:get_name(), "mcl_bows:crossbow") then - player:set_bone_position("Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(90,90,0)) + set_bone_position_conditional(player,"Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(90,90,0)) else - player:set_bone_position("Wield_Item", vector.new(-1.5,4.9,1.8), vector.new(135,0,90)) + set_bone_position_conditional(player,"Wield_Item", vector.new(-1.5,4.9,1.8), vector.new(135,0,90)) end - player_velocity_old = player:get_velocity() or player:get_player_velocity() - - - -- controls right and left arms pitch when shooting a bow - if string.find(wielded:get_name(), "mcl_bows:bow") and control.RMB then - player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) - player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) + -- controls right and left arms pitch when shooting a bow or blocking + if mcl_shields.is_blocking(player) == 2 then + set_bone_position_conditional(player, "Arm_Right_Pitch_Control", vector.new(-3, 5.785, 0), vector.new(20, -20, 0)) + elseif mcl_shields.is_blocking(player) == 1 then + set_bone_position_conditional(player, "Arm_Left_Pitch_Control", vector.new(3, 5.785, 0), vector.new(20, 20, 0)) + elseif string.find(wielded:get_name(), "mcl_bows:bow") and control.RMB then + set_bone_position_conditional(player,"Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) + set_bone_position_conditional(player,"Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) -- controls right and left arms pitch when holing a loaded crossbow elseif string.find(wielded:get_name(), "mcl_bows:crossbow_loaded") then - player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) - player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) + set_bone_position_conditional(player,"Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) + set_bone_position_conditional(player,"Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) -- controls right and left arms pitch when loading a crossbow - elseif string.find(wielded:get_name(), "mcl_bows:crossbow_") then - player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(45,-20,25)) - player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(55,20,-45)) + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_") then + set_bone_position_conditional(player,"Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(45,-20,25)) + set_bone_position_conditional(player,"Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(55,20,-45)) -- when punching elseif control.LMB and not parent then - player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch,0,0)) - player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) + set_bone_position_conditional(player,"Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch,0,0)) + set_bone_position_conditional(player,"Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) -- when holding an item. elseif wielded:get_name() ~= "" then - player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(20,0,0)) - player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) + set_bone_position_conditional(player,"Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(20,0,0)) + set_bone_position_conditional(player,"Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) -- resets arms pitch else - player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) - player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(0,0,0)) + set_bone_position_conditional(player,"Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) + set_bone_position_conditional(player,"Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(0,0,0)) end if elytra.active then -- set head pitch and yaw when flying - player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) + set_bone_position_conditional(player,"Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly - player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) + set_properties_conditional(player,{collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when flying - player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0)) + set_bone_position_conditional(player,"Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0)) elseif parent then local parent_yaw = degrees(parent:get_yaw()) - player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) - player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0)) - player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0)) + set_properties_conditional(player,{collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) + set_bone_position_conditional(player,"Head_Control", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0)) + set_bone_position_conditional(player,"Body_Control", vector.new(0,6.3,0), vector.new(0,0,0)) elseif control.sneak then -- controls head pitch when sneaking - player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, player_vel_yaw - yaw)) + set_bone_position_conditional(player,"Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, player_vel_yaw - yaw)) -- sets eye height, and nametag color accordingly - player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) + set_properties_conditional(player,{collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) -- sneaking body conrols - player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) + set_bone_position_conditional(player,"Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) elseif get_item_group(mcl_playerinfo[name].node_head, "water") ~= 0 and is_sprinting(name) == true then -- set head pitch and yaw when swimming - player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) + set_bone_position_conditional(player,"Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly - player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,0.8,0.312}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) + set_properties_conditional(player,{collisionbox = {-0.312,0,-0.312,0.312,0.8,0.312}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when swimming - player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0)) + set_bone_position_conditional(player,"Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0)) else -- sets eye height, and nametag color accordingly - player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) + set_properties_conditional(player,{collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) - player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0)) - player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) + set_bone_position_conditional(player,"Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0)) + set_bone_position_conditional(player,"Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) end -- Update jump status immediately since we need this info in real time. @@ -301,14 +406,15 @@ minetest.register_globalstep(function(dtime) mcl_playerplus_internal[name].jump_cooldown = mcl_playerplus_internal[name].jump_cooldown - dtime end + node_head = mcl_playerinfo[name].node_head + node_feet = mcl_playerinfo[name].node_feet + if control.jump and mcl_playerplus_internal[name].jump_cooldown <= 0 then --pos = player:get_pos() node_stand = mcl_playerinfo[name].node_stand node_stand_below = mcl_playerinfo[name].node_stand_below - node_head = mcl_playerinfo[name].node_head - node_feet = mcl_playerinfo[name].node_feet if not node_stand or not node_stand_below or not node_head or not node_feet then return end @@ -347,6 +453,114 @@ minetest.register_globalstep(function(dtime) mcl_playerplus_internal[name].jump_cooldown = 0.45 end end + + local bubble_column_feet = node_feet == "mcl_core:bubble_column_source" + if bubble_column_feet then + local bubble_column_head = node_head == "mcl_core:bubble_column_source" + if bubble_column_head then + if not player_pos_for_bubble_columns[name] then + player_pos_for_bubble_columns[name] = fly_pos + else + local head_alt_1 = fly_pos.y + 1.5 + local head_alt_2 = head_alt_1 + time + while head_alt_1 < head_alt_2 do + local next_alt = math.min(head_alt_1 + 1, head_alt_2) + local next_node_head = minetest.get_node({x = fly_pos.x, y = next_alt, z = fly_pos.z}).name + if next_node_head == "mcl_core:bubble_column_source" then + head_alt_1 = next_alt + else + local ndef = minetest.registered_nodes[next_node_head] + if (ndef.walkable == nil or ndef.walkable == true) + and (ndef.collision_box == nil or ndef.collision_box.type == "regular") + and (ndef.node_box == nil or ndef.node_box.type == "regular") + and (ndef.groups.disable_suffocation ~= 1) + and (ndef.groups.opaque == 1) + then + break + else + -- pull head slightly above water level: + head_alt_1 = head_alt_1 + (next_alt - head_alt_1) * 0.5 + break + end + end + end + local new_alt = head_alt_1 - 1.5 + local delta_y = new_alt - fly_pos.y + if delta_y > 0 then + fly_pos.y = new_alt + player:set_pos(fly_pos) + local velocity_y = player_velocity.y + local add_velocity_y + if velocity_y > 1 then + add_velocity_y = -velocity_y/5 + elseif velocity_y >= -1 then + add_velocity_y = -velocity_y/2.5 + else + add_velocity_y = -velocity_y/2 + end + player:add_velocity({x = 0, y = add_velocity_y, z = 0}) + player_pos_for_bubble_columns[name] = fly_pos + else + player_pos_for_bubble_columns[name] = nil + end + end + else + player_pos_for_bubble_columns[name] = nil + end + else + local whirlpool_feet = node_feet == "mcl_core:whirlpool_source" + if whirlpool_feet then + if not player_pos_for_bubble_columns[name] then + player_pos_for_bubble_columns[name] = fly_pos + else + local whirlpool_head = node_head == "mcl_core:whirlpool_source" + local stands_on = minetest.get_node({x = fly_pos.x, y = fly_pos.y - 0.0001, z = fly_pos.z}).name + if stands_on == "mcl_nether:magma" then + fly_pos.y = math.floor(fly_pos.y) + (control.sneak and 0.51 or 0.5) + player:set_pos(fly_pos) + local add_velocity_y + local velocity_y = player_velocity.y + if velocity_y < -1 then + add_velocity_y = -velocity_y/5 + elseif velocity_y <= 1 then + add_velocity_y = -velocity_y/2.5 + else + add_velocity_y = -velocity_y/2 + end + player:add_velocity({x = 0, y = add_velocity_y, z = 0}) + player_pos_for_bubble_columns[name] = fly_pos + elseif stands_on == "mcl_core:whirlpool_source" then + local estimated_pos_y = player_pos_for_bubble_columns[name].y - (whirlpool_head and time/2 or time/5) + local next_pos_y = fly_pos.y + while next_pos_y > estimated_pos_y do + next_pos_y = next_pos_y - math.min(1, next_pos_y - estimated_pos_y) + local will_stand_on = minetest.get_node({x = fly_pos.x, y = next_pos_y - 0.0001, z = fly_pos.z}).name + if will_stand_on ~= "mcl_core:whirlpool_source" then + next_pos_y = math.floor(next_pos_y - 0.0001) + (control.sneak and 0.51 or 0.5) + break + end + end + fly_pos.y = next_pos_y + player:set_pos(fly_pos) + local add_velocity_y + local velocity_y = player_velocity.y + if velocity_y < -1 then + add_velocity_y = -velocity_y/5 + elseif velocity_y <= 1 then + add_velocity_y = -velocity_y/2.5 + else + add_velocity_y = -velocity_y/2 + end + player:add_velocity({x = 0, y = add_velocity_y, z = 0}) + player_pos_for_bubble_columns[name] = fly_pos + else + player_pos_for_bubble_columns[name] = nil + end + end + elseif player_pos_for_bubble_columns[name] then + player_pos_for_bubble_columns[name] = nil + end + end end -- Run the rest of the code every 0.5 seconds @@ -519,15 +733,14 @@ minetest.register_globalstep(function(dtime) end) -- set to blank on join (for 3rd party mods) -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - +minetest.register_on_authplayer(function(name, ip, is_success) + if not is_success then return end mcl_playerplus_internal[name] = { lastPos = nil, swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly } - mcl_playerplus.elytra[player] = {active = false, rocketing = 0} + mcl_playerplus.elytra[name] = {active = false, rocketing = 0} end) -- clear when player leaves @@ -535,10 +748,10 @@ minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() mcl_playerplus_internal[name] = nil - mcl_playerplus.elytra[player] = nil + mcl_playerplus.elytra[name] = nil end) --- Don't change HP if the player falls in the water or through End Portal: +-- Don't change HP if the player falls in the liquid or through End Portal: mcl_damage.register_modifier(function(obj, damage, reason) if reason.type == "fall" then local pos = obj:get_pos() @@ -552,10 +765,11 @@ mcl_damage.register_modifier(function(obj, damage, reason) node = minetest.get_node(pos) end if node then - if minetest.registered_nodes[node.name].walkable then + local def = minetest.registered_nodes[node.name] + if not def or def.walkable then return end - if minetest.get_item_group(node.name, "water") ~= 0 then + if minetest.get_item_group(node.name, "liquid") ~= 0 then return 0 end if node.name == "mcl_portals:portal_end" then diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr new file mode 100644 index 000000000..a50f97ec8 --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 est mort(e) etouffé(e). +@1 was prickled to death by a cactus.=@1 a été piqué(e) à mort par un cactus. \ No newline at end of file diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr new file mode 100644 index 000000000..06318c3b1 --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 задохнулся(ась). +@1 was prickled to death by a cactus.=@1 был(а) исколот(а) до смерти кактусом. diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.zh_CN.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.zh_CN.tr new file mode 100644 index 000000000..2cdd41eb0 --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.=@1 窒息而死. +@1 was prickled to death by a cactus.=@1 被仙人掌刺死. \ No newline at end of file diff --git a/mods/PLAYER/mcl_playerplus/locale/template.txt b/mods/PLAYER/mcl_playerplus/locale/template.txt new file mode 100644 index 000000000..52222c4fa --- /dev/null +++ b/mods/PLAYER/mcl_playerplus/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_playerplus +@1 suffocated to death.= +@1 was prickled to death by a cactus.= \ No newline at end of file diff --git a/mods/PLAYER/mcl_playerplus/mod.conf b/mods/PLAYER/mcl_playerplus/mod.conf index b77c9e2e5..374178625 100644 --- a/mods/PLAYER/mcl_playerplus/mod.conf +++ b/mods/PLAYER/mcl_playerplus/mod.conf @@ -1,5 +1,5 @@ name = mcl_playerplus author = TenPlus1 description = Adds some simple player-related gameplay effects: Hurt by touching a cactus, suffocation and more. -depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting, mcl_damage, mcl_sprint +depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting, mcl_damage, mcl_sprint, mcl_shields diff --git a/mods/PLAYER/mcl_refresh_status/README.md b/mods/PLAYER/mcl_refresh_status/README.md new file mode 100644 index 000000000..b214ffb75 --- /dev/null +++ b/mods/PLAYER/mcl_refresh_status/README.md @@ -0,0 +1,28 @@ +# Status Effect Refresh for Mineclone 5 + +This allows the use of status effect function from mcl_potions and prevents them +from continuing their effect after player respawn + +## Licensing +MIT License + +Copyright (c) 2022 Mental-Inferno + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/mods/PLAYER/mcl_refresh_status/init.lua b/mods/PLAYER/mcl_refresh_status/init.lua new file mode 100644 index 000000000..7b9bc4bd9 --- /dev/null +++ b/mods/PLAYER/mcl_refresh_status/init.lua @@ -0,0 +1,3 @@ +minetest.register_on_respawnplayer(function(player) + mcl_potions._reset_player_effects(player, true) +end) \ No newline at end of file diff --git a/mods/PLAYER/mcl_refresh_status/mod.conf b/mods/PLAYER/mcl_refresh_status/mod.conf new file mode 100644 index 000000000..f72f49ff2 --- /dev/null +++ b/mods/PLAYER/mcl_refresh_status/mod.conf @@ -0,0 +1,4 @@ +name = mcl_refresh_status +author = Mental-Inferno +description = Resets status-effects inflicted on player when player respawns +depends = mcl_potions diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr index 146c6be5f..d38f907ff 100644 --- a/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.fr.tr @@ -2,13 +2,13 @@ [] []=[] [] Select player skin of yourself or another player=Sélectionner une apparence pour vous même ou un autre joueur Insufficient or wrong parameters=Paramètres insuffisants ou incorrects -Player @1 not online!=Le joueur @1 n'est pas en ligne! -You need the “server” privilege to change the skin of other players!=Vous avez besoin du privilège “server” pour changer l'apparence des autres joueurs! +Player @1 not online!=Le joueur @1 n'est pas en ligne ! +You need the “server” privilege to change the skin of other players!=Vous avez besoin du privilège “server” pour changer l'apparence des autres joueurs ! Invalid skin number! Valid numbers: 0 to @1=Numéro d'apparence incorrect! Numéros valides : 0 à @1 -Your skin has been set to: @1=Votre apparence a été définie à: @1 -Your skin has been set to: @1 (@2)=Votre apparence a été définie à: @1 (@2) -Skin of @1 set to: @2 (@3)=Apparence of @1 set to: @2 (@3)= +Your skin has been set to: @1=Votre apparence a été définie en : @1 +Your skin has been set to: @1 (@2)=Votre apparence a été définie en : @1 (@2) +Skin of @1 set to: @2 (@3)=Apparence de @1 definie en : @2 (@3) Select player skin:=Sélectionner l'apparence du joueur : @1 (@2)=@1 (@2) -Name: @1=Nom : @ +Name: @1=Nom : @1 diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr index 64eab0e3f..3b8fac442 100644 --- a/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr @@ -3,9 +3,9 @@ Select player skin of yourself or another player=Выберите скин для себя или для другого игрока Insufficient or wrong parameters=Недопустимые или неправильные параметры Player @1 not online!=Игрок @1 не в сети! -You need the “server” privilege to change the skin of other players!=Для смены скинов другим игрокам у вас должна быть привилегия “server”! -Invalid skin number! Valid numbers: 0 to @1=Недопустимый номер скина! Правильные номера: от 0 до @1 -Your skin has been set to: @1=Ваш скин выбран: @1 +You need the “server” privilege to change the skin of other players!=Для смены скинов другим игрокам у Вас должна быть привилегия “server”! +Invalid skin number! Valid numbers: 0 to @1=Недопустимый номер скина! Допустимые номера: от 0 до @1 +Your skin has been set to: @1=Ваш скин установлен: @1 Your skin has been set to: @1 (@2)=Ваш скин установлен: @1 (@2) Skin of @1 set to: @2 (@3)=Скин игрока @1 установлен: @2 (@3) Select player skin:=Выбор скина игрока: diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.zh_CN.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.zh_CN.tr new file mode 100644 index 000000000..4b903b619 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.zh_CN.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_skins +[] []=[<玩家>] [<皮肤编号>] +Select player skin of yourself or another player=选择你自己的玩家皮肤或者其他玩家皮肤 +Insufficient or wrong parameters=参数不足或错误 +Player @1 not online!=玩家 @1 不在线 +You need the “server” privilege to change the skin of other players!=你需要“服务器”特权来改变其他玩家的皮肤! +Invalid skin number! Valid numbers: 0 to @1=无效的皮肤编号!有效数字: 0到 @1 +Your skin has been set to: @1=您的皮肤已设置为: @1 +Your skin has been set to: @1 (@2)=您的皮肤已设置为: @1 (@2) +Skin of @1 set to: @2 (@3)=@1 的皮肤 已经设置为: @2 (@3) +Select player skin:=选择你的玩家皮肤 +@1 (@2)=@1 (@2) +Name: @1=名字: @1 diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 801e7ffd0..de4db5094 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -81,7 +81,7 @@ local dir_step = storage:get_int("mcl_spawn_dir_step") or 0 local dir_ind = storage:get_int("mcl_spawn_dir_ind") or 1 local emerge_pos1, emerge_pos2 -local spawn_limit = mcl_vars.mapgen_edge_max +local spawn_limit = mcl_mapgen.EDGE_MAX --Functions diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr index eec1bcd65..a6333cb12 100644 --- a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr @@ -1,4 +1,4 @@ # textdomain: mcl_spawn New respawn position set!=Задана новая точка возрождения! Respawn position cleared!=Точка возрождения удалена! -Your spawn bed was missing or blocked.=Точка вашего возрождения не задана либо заблокирована. +Your spawn bed was missing or blocked.=Ваша кровать пропала или заблокирована. diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.zh_CN.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.zh_CN.tr new file mode 100644 index 000000000..596335087 --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_spawn +New respawn position set!=设置了新的重生点 +Respawn position cleared!=清除了重生点! +Your spawn bed was missing or blocked.=你的床已经丢失或者被阻挡。 \ No newline at end of file diff --git a/mods/PLAYER/mcl_spawn/mod.conf b/mods/PLAYER/mcl_spawn/mod.conf index 954f831db..2c7953fe7 100644 --- a/mods/PLAYER/mcl_spawn/mod.conf +++ b/mods/PLAYER/mcl_spawn/mod.conf @@ -1,4 +1,4 @@ name = mcl_spawn author = Wuzzy description = Set and get the player's respawn position -depends = mcl_init +depends = mcl_mapgen diff --git a/mods/PLAYER/mcl_wieldview/init.lua b/mods/PLAYER/mcl_wieldview/init.lua index 7200f6186..92175a17e 100644 --- a/mods/PLAYER/mcl_wieldview/init.lua +++ b/mods/PLAYER/mcl_wieldview/init.lua @@ -6,7 +6,7 @@ mcl_wieldview = { } function mcl_wieldview.get_item_texture(itemname) - if itemname == "" then + if itemname == "" or minetest.get_item_group(itemname, "no_wieldview") ~= 0 then return end @@ -41,14 +41,19 @@ function mcl_wieldview.update_wielded_item(player) local def = mcl_wieldview.players[player] - if def.item == itemname then + if def and (def.item == itemname) then return end - def.item = itemname - def.texture = mcl_wieldview.get_item_texture(itemname) or "blank.png" + local texture = mcl_wieldview.get_item_texture(itemname) or "blank.png" - mcl_player.player_set_wielditem(player, def.texture) + local new_def = { + item = itemname, + texture = texture, + } + mcl_wieldview.players[player] = new_def + + mcl_player.player_set_wielditem(player, texture) end minetest.register_on_joinplayer(function(player) @@ -113,6 +118,10 @@ minetest.register_entity("mcl_wieldview:wieldnode", { self.object:set_properties({textures = {""}}) end + if minetest.get_item_group(itemstring, "no_wieldview") ~= 0 then + self.object:set_properties({textures = {""}}) + end + self.itemstring = itemstring end else diff --git a/settingtypes.txt b/settingtypes.txt index 344afa50a..dca03b7e1 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -157,6 +157,16 @@ fix_doubleplants (Mcimport double plant fixes) bool true # Allow players to create Minecraft-like maps. enable_real_maps (Enable Real Maps) bool true +[Anticheat] +# Enable anticheats +enable_anticheat (Enable Anticheat) bool true +# Kick cheaters +kick_cheaters (Kick Cheaters) bool false +# Cheat kicking threshold +kick_threshold (Cheat Kicking Threshold) int 10 + [Debugging] # If enabled, this will show the itemstring of an item in the description. -mcl_item_id_debug (Item ID Debug) bool false \ No newline at end of file +mcl_item_id_debug (Item ID Debug) bool false +mcl_debug_struct_noise (Show Structures Perlin Noise) bool false +mcl_debug_chunk_borders (Show Chunk Borders) bool false diff --git a/tools/convert_all_tga_to_png.bash b/tools/convert_all_tga_to_png.bash new file mode 100755 index 000000000..8d3032c12 --- /dev/null +++ b/tools/convert_all_tga_to_png.bash @@ -0,0 +1,10 @@ +#!/bin/bash + +for name in ./*.tga +do + convert "$name" "${name%.*}".png + +# Slow and useless: +# optipng -o7 -zm1-9 "${name%.*}".png + +done