diff --git a/data/games/garage/LICENSE.txt b/data/games/garage/LICENSE.txt index a76b0a1..48f0b8d 100644 --- a/data/games/garage/LICENSE.txt +++ b/data/games/garage/LICENSE.txt @@ -1,4 +1,519 @@ -License information for Development Test ----------------------------------------- +License of media (textures and sounds) +-------------------------------------- +Copyright (C) 2010-2012 celeron55, Perttu Ahola +See README.txt in each mod directory for information about other authors. -The same license as for Luanti applies. +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +License of menu/header.png +Copyright (C) 2015 paramat CC BY-SA 3.0 + + +License of source code +---------------------- +Copyright (C) 2010-2012 celeron55, Perttu Ahola +See README.txt in each mod directory for information about other authors. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/data/games/garage/README.md b/data/games/garage/README.md deleted file mode 100644 index 4b5fb73..0000000 --- a/data/games/garage/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Development Test (devtest) - -This is a basic testing environment that contains a bunch of things to test the engine, but it could also be used as a minimal testbed for testing out mods. - -## Features - -* Basic nodes for mapgen -* Basic, minimal map generator -* Lots of example nodes for testing drawtypes, param2, light level, and many other node properties -* Example entities -* Other example items -* Formspec test (via `/test_formspec` command) -* Automated unit tests (disabled by default) -* Tools for manipulating nodes and entities, like the "Param2 Tool" - -## Getting started - -Basically, just create a world and start. A few important things to note: - -* Items are gotten from the “Chest of Everything” (`chest_of_everything:chest`) -* When you lost your initial items, type in `/stuff` command to get them back -* By default, Creative Mode activates infinite node placement. This behavior can be changed with the `devtest_infplace` setting -* Use the `/infplace` command to toggle infinite node placement in-game -* Use the Param2 Tool to change the param2 of nodes; it's useful to experiment with the various drawtype test nodes -* Check out the game settings and server commands for additional tests and features - -Confused by a certain node or item? Check out for inline code comments. The usages of most tools are explained in their tooltips. - -### Example tests - -* You can use this to test what happens if a player is simultaneously in 2 nodes with `damage_per_second` but with a different value. -* Or use the Falling Node Tool on various test nodes to see how they behave when falling. -* You could also use this as a testbed for dependency-free mods, e.g. to test out how your formspecs behave without theming. - -## Random notes - -* Textures of drawtype test nodes have a red dot at the top left corner. This is to see whether the textures are oriented properly - -## Design philosophy - -This should loosely follow the following principles: - -* Engine testing: The main focus of this is to aid testing of *engine* features, such as mapgen or node drawtypes -* Mod testing: The secondary focus is to help modders as well, either as a minimal testbed for mods or even as a code example -* Minimal interference: Under default settings, it shall not interfere with APIs except on explicit user wish. Non-trivial tests and features need to be enabled by a setting first -* Convenience: Have various tools to make usage easier and more convenient -* Reproducing engine bugs: When an engine bug was found, consider creating a test case -* Clarity: Textures and names need to be designed to keep different things clearly visually apart at a glance -* Low loading time: It must load blazing-fast so stuff can be tested quickly - diff --git a/data/games/garage/game.conf b/data/games/garage/game.conf index e79cc94..e9c3f85 100644 --- a/data/games/garage/game.conf +++ b/data/games/garage/game.conf @@ -1,4 +1,3 @@ -title = Development Test -description = Testing environment to help with testing the engine features of Luanti. It can also be helpful in mod development. -first_mod = first_mod -last_mod = last_mod +title = Minetest Game +description = A basic exploration, mining, crafting, and building, sandbox game with no NPCs, monsters, or animals. Minetest Game is usually used with mods added, and many mods are available for this game. Reliably maintained by Luanti core developers. +min_minetest_version = 5.8 diff --git a/data/games/garage/game_api.txt b/data/games/garage/game_api.txt new file mode 100644 index 0000000..9c57694 --- /dev/null +++ b/data/games/garage/game_api.txt @@ -0,0 +1,1233 @@ +Minetest Game API +================= +GitHub Repo: https://github.com/minetest/minetest_game + + +Introduction +------------ + +The Minetest Game game offers multiple new possibilities in addition to the Luanti engine's built-in API, +allowing you to add new plants to farming mod, buckets for new liquids, new stairs and custom panes. +For information on the Luanti API, visit https://github.com/minetest/minetest/blob/master/doc/lua_api.txt +Please note: + + * [XYZ] refers to a section the Luanti API + * [#ABC] refers to a section in this document + * [pos] refers to a position table `{x = -5, y = 0, z = 200}` + + +Bucket API +---------- + +The bucket API allows registering new types of buckets for non-default liquids. + + bucket.register_liquid( + "default:lava_source", -- name of the source node + "default:lava_flowing", -- name of the flowing node + "bucket:bucket_lava", -- name of the new bucket item (or nil if liquid is not takeable) + "bucket_lava.png", -- texture of the new bucket item (ignored if itemname == nil) + "Lava Bucket", -- text description of the bucket item + {lava_bucket = 1}, -- groups of the bucket item, OPTIONAL + false -- force-renew, OPTIONAL. Force the liquid source to renew if it has + -- a source neighbour, even if defined as 'liquid_renewable = false'. + -- Needed to avoid creating holes in sloping rivers. + ) + +The filled bucket item is returned to the player that uses an empty bucket pointing to the given liquid source. +When punching with an empty bucket pointing to an entity or a non-liquid node, the on_punch of the entity or node will be triggered. + + +Beds API +-------- + + beds.register_bed( + "beds:bed", -- Bed name + def -- See [#Bed definition] + ) + + * `beds.can_dig(bed_pos)` Returns a boolean whether the bed at `bed_pos` may be dug + * `beds.read_spawns() ` Returns a table containing players respawn positions + * `beds.kick_players()` Forces all players to leave bed + * `beds.skip_night()` Sets world time to morning and saves respawn position of all players currently sleeping + * `beds.day_interval` Is a table with keys "start" and "finish". Allows you + to set the period of the day (timeofday format). Default: `{ start = 0.2, finish = 0.805 }`. + +### Bed definition + + { + description = "Simple Bed", + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = {'Tile definition'}, -- the tiles of the bottom part of the bed. + top = {Tile definition} -- the tiles of the bottom part of the bed. + }, + nodebox = { + bottom = 'regular nodebox', -- bottom part of bed (see [Node boxes]) + top = 'regular nodebox', -- top part of bed (see [Node boxes]) + }, + selectionbox = 'regular nodebox', -- for both nodeboxes (see [Node boxes]) + recipe = { -- Craft recipe + {"group:wool", "group:wool", "group:wool"}, + {"group:wood", "group:wood", "group:wood"} + } + } + + +Bones API +--------- + +An ordered list of listnames (default: "main", "craft") of the player inventory, +that will be placed into bones or dropped on player death can be looked up or changed +in `bones.player_inventory_lists`. + +e.g. `table.insert(bones.player_inventory_lists, "backpack")` + + +Creative API +------------ + +Use `creative.register_tab(name, title, items)` to add a tab with filtered items. +For example, + + creative.register_tab("tools", "Tools", minetest.registered_tools) + +is used to show all tools. Name is used in the sfinv page name, title is the +human readable title. + +Creative provides `creative.is_enabled_for(name)`, which is identical in +functionality to the engine's `minetest.creative_is_enabled(name)`. +Its use is deprecated and it should also not be overriden. + +The contents of `creative.formspec_add` is appended to every creative inventory +page. Mods can use it to add additional formspec elements onto the default +creative inventory formspec to be drawn after each update. + +Group overrides can be used for any registered item, node or tool. Use one of +the groups stated below to pick which category it will appear in. + + node = 1 -- Appears in the Nodes category + tool = 1 -- Appears in the Tools category + craftitem = 1 -- Appears in the Items category + + +Chests API +---------- + +The chests API allows the creation of chests, which have their own inventories for holding items. + +`default.chest.get_chest_formspec(pos)` + + * Returns a formspec for a specific chest. + * `pos` Location of the chest node, e.g `{x = 1, y = 1, z = 1}` + +`default.chest.chest_lid_obstructed(pos)` + + * Returns a boolean depending on whether or not a chest has its top obstructed by a solid node. + * `pos` Location of the chest node, e.g `{x = 1, y = 1, z = 1}` + +`default.chest.chest_lid_close(pn)` + + * Closes the chest that a player is currently looking in. + * `pn` The name of the player whose chest is going to be closed + +`default.chest.open_chests` + + * A table indexed by player name to keep track of who opened what chest. + * Key: The name of the player. + * Value: A table containing information about the chest the player is looking at. + e.g `{ pos = {1, 1, 1}, sound = null, swap = "default:chest" }` + +`default.chest.register_chest(name, def)` + + * Registers new chest + * `name` Name for chest e.g. "default:chest" + * `def` See [#Chest Definition] + +### Chest Definition + + description = "Chest", + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, -- Textures which are applied to the chest model. + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = false, -- If true, only placer can modify chest. + + +Doors API +--------- + +The doors mod allows modders to register custom doors and trapdoors. + +`doors.registered_doors[name] = Door definition` + * Table of registered doors, indexed by door name + +`doors.registered_trapdoors[name] = Trapdoor definition` + * Table of registered trap doors, indexed by trap door name + +`doors.register_door(name, def)` + + * Registers new door + * `name` Name for door + * `def` See [#Door definition] + +`doors.register_trapdoor(name, def)` + + * Registers new trapdoor + * `name` Name for trapdoor + * `def` See [#Trapdoor definition] + +`doors.register_fencegate(name, def)` + + * Registers new fence gate + * `name` Name for fence gate + * `def` See [#Fence gate definition] + +`doors.get(pos)` + + * `pos` A position as a table, e.g `{x = 1, y = 1, z = 1}` + * Returns an ObjectRef to a door, or nil if the position does not contain a door + + ### Methods + + :open(player) -- Open the door object, returns if door was opened + :close(player) -- Close the door object, returns if door was closed + :toggle(player) -- Toggle the door state, returns if state was toggled + :state() -- returns the door state, true = open, false = closed + + the "player" parameter can be omitted in all methods. If passed then + the usual permission checks will be performed to make sure the player + has the permissions needed to open this door. If omitted then no + permission checks are performed. + +`doors.door_toggle(pos, node, clicker)` + + * Toggle door open or shut + * `pos` Position of the door + * `node` Node definition + * `clicker` Player definition for the player that clicked on the door + +### Door definition + + description = "Door description", + inventory_image = "mod_door_inv.png", + groups = {choppy = 2}, + model = "mod_door", -- (optional) + -- Model name without a suffix ("big_door" not "big_door_a.obj", "big_door_b.obj") + tiles = {"mod_door.png"}, -- UV map. + -- The front and back of the door must be identical in appearence as they swap on + -- open/close. + recipe = craftrecipe, + sounds = default.node_sound_wood_defaults(), -- optional + sound_open = sound play for open door, -- optional + sound_close = sound play for close door, -- optional + gain_open = 0.3, -- optional, defaults to 0.3 + gain_close = 0.3, -- optional, defaults to 0.3 + protected = false, -- If true, only placer can open the door (locked for others) + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing), + -- optional function containing the on_rightclick callback, defaults to a doors.door_toggle-wrapper + use_texture_alpha = "clip", + +### Trapdoor definition + + description = "Trapdoor description", + inventory_image = "mod_trapdoor_inv.png", + nodebox_closed = {} -- Nodebox for closed model + nodebox_opened = {} -- Nodebox for opened model + -- (optional) both nodeboxes must be used, not one only + groups = {choppy = 2}, + tile_front = "doors_trapdoor.png", -- the texture for the front and back of the trapdoor + tile_side = "doors_trapdoor_side.png", + -- The texture for the four sides of the trapdoor. + -- The texture should have the trapdoor side drawn twice, in the lowest and highest + -- 1/8ths of the texture, both upright. The area between is not used. + -- The lower 1/8th will be used for the closed trapdoor, the higher 1/8th will be used + -- for the open trapdoor. + sounds = default.node_sound_wood_defaults(), -- optional + sound_open = sound play for open door, -- optional + sound_close = sound play for close door, -- optional + gain_open = 0.3, -- optional, defaults to 0.3 + gain_close = 0.3, -- optional, defaults to 0.3 + protected = false, -- If true, only placer can open the door (locked for others) + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) , + -- function containing the on_rightclick callback + use_texture_alpha = "clip", + +### Fence gate definition + + description = "Wooden Fence Gate", + texture = "default_wood.png", -- `backface_culling` will automatically be + -- set to `true` if not specified. + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), -- optional + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + -- function containing the on_rightclick callback + + +Dungeon Loot API +---------------- + +The mod that places chests with loot in dungeons provides an API to register additional loot. + +`dungeon_loot.register(def)` + + * Registers one or more loot items + * `def` Can be a single [#Loot definition] or a list of them + +`dungeon_loot.registered_loot` + + * Table of all registered loot, not to be modified manually + +### Loot definition + + name = "item:name", + chance = 0.5, + -- ^ chance value from 0.0 to 1.0 that the item will appear in the chest when chosen + -- Due to an extra step in the selection process, 0.5 does not(!) mean that + -- on average every second chest will have this item + count = {1, 4}, + -- ^ table with minimum and maximum amounts of this item + -- optional, defaults to always single item + y = {-32768, -512}, + -- ^ table with minimum and maximum heights this item can be found at + -- optional, defaults to no height restrictions + types = {"desert"}, + -- ^ table with types of dungeons this item can be found in + -- supported types: "normal" (the cobble/mossycobble one), "sandstone" + -- "desert" and "ice" + -- optional, defaults to no type restrictions + + +Fence API +--------- + +Allows creation of new fences with "fencelike" drawtype. + +`default.register_fence(name, item definition)` + + Registers a new fence. Custom fields texture and material are required, as + are name and description. The rest is optional. You can pass most normal + nodedef fields here except drawtype. The fence group will always be added + for this node. + +### fence definition + + name = "default:fence_wood", + description = "Wooden Fence", + texture = "default_wood.png", + material = "default:wood", -- `nil` if you don't want the recipe + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + +Walls API +--------- + +The walls API allows easy addition of stone auto-connecting wall nodes. + +walls.register(name, desc, texture, mat, sounds) +^ name = "walls:stone_wall". Node name. +^ desc = "A Stone wall" +^ texture = "default_stone.png" +^ mat = "default:stone". Used to auto-generate crafting recipe. +^ sounds = sounds: see [#Default sounds] + +All walls will be connected to any nodes with one of the following groups: + * `wall` + * `stone` + * `fence` + * `wall_connected` + + +Farming API +----------- + +The farming API allows you to easily register plants and hoes. + +`farming.register_hoe(name, hoe definition)` + * Register a new hoe, see [#hoe definition] + +`farming.register_plant(name, Plant definition)` + * Register a new growing plant, see [#Plant definition] + +`farming.registered_plants[name] = definition` + * Table of registered plants, indexed by plant name + +### Hoe Definition + + + { + description = "", -- Description for tooltip + inventory_image = "unknown_item.png", -- Image to be used as wield- and inventory image + max_uses = 30, -- Uses until destroyed + material = "", -- Material for recipes + recipe = { -- Craft recipe, if material isn't used + {"air", "air", "air"}, + {"", "group:stick"}, + {"", "group:stick"}, + } + } + +### Plant definition + + { + description = "", -- Description of seed item + harvest_description = "", -- Description of harvest item + -- (optional, derived automatically if not provided) + inventory_image = "unknown_item.png", -- Image to be used as seed's wield- and inventory image + steps = 8, -- How many steps the plant has to grow, until it can be harvested + -- ^ Always provide a plant texture for each step, format: modname_plantname_i.png (i = stepnumber) + minlight = 13, -- Minimum light to grow + maxlight = default.LIGHT_MAX -- Maximum light to grow + can_grow = function(pos) -- Сalled every growth tick to check if the plant can grow, returns bool + -- (optional, checks for wet soil by default) + } + + +Fire API +-------- + +Add group flammable when registering a node to make fire seek for it. +Add it to an item to make it burn up when dropped in lava or fire. +New node def property: + +`on_burn(pos)` + + * Called when fire attempts to remove a burning node. + * `pos` Position of the burning node. + + `on_ignite(pos, igniter)` + + * Called when Flint and steel (or a mod defined ignitor) is used on a node. + Defining it may prevent the default action (spawning flames) from triggering. + * `pos` Position of the ignited node. + * `igniter` Player that used the tool, when available. + + +Give Initial Stuff API +---------------------- + +`give_initial_stuff.give(player)` + +^ Give initial stuff to "player" + +`give_initial_stuff.add(stack)` + +^ Add item to the initial stuff +^ Stack can be an ItemStack or a item name eg: "default:dirt 99" +^ Can be called after the game has loaded + +`give_initial_stuff.clear()` + +^ Removes all items from the initial stuff +^ Can be called after the game has loaded + +`give_initial_stuff.get_list()` + +^ returns list of item stacks + +`give_initial_stuff.set_list(list)` + +^ List of initial items with numeric indices. + +`give_initial_stuff.add_from_csv(str)` + +^ str is a comma separated list of initial stuff +^ Adds items to the list of items to be given + + +Player API +---------- + +The player API can register player models and update the player's appearance. + +* `player_api.globalstep(dtime, ...)` + * The function called by the globalstep that controls player animations. + You can override this to replace the globalstep with your own implementation. + * Receives all args that minetest.register_globalstep() passes + +* `player_api.register_model(name, def)` + * Register a new model to be used by players + * `name`: model filename such as "character.x", "foo.b3d", etc. + * `def`: see [#Model definition] + * Saved to player_api.registered_models + +* `player_api.registered_models[name]` + * Get a model's definition + * `name`: model filename + * See [#Model definition] + +* `player_api.set_model(player, model_name)` + * Change a player's model + * `player`: PlayerRef + * `model_name`: model registered with `player_api.register_model` + +* `player_api.set_animation(player, anim_name, speed)` + * Applies an animation to a player if speed or anim_name differ from the currently playing animation + * `player`: PlayerRef + * `anim_name`: name of the animation + * `speed`: keyframes per second. If nil, the default from the model def is used + +* `player_api.set_textures(player, textures)` + * Sets player textures + * `player`: PlayerRef + * `textures`: array of textures. If nil, the default from the model def is used + +* `player_api.set_textures(player, index, texture)` + * Sets one of the player textures + * `player`: PlayerRef + * `index`: Index into array of all textures + * `texture`: the texture string + +* `player_api.get_animation(player)` + * Returns a table containing fields `model`, `textures` and `animation` + * Any of the fields of the returned table may be nil + * `player`: PlayerRef + +* `player_api.player_attached` + * A table that maps a player name to a boolean + * If the value for a given player is set to true, the default player animations + (walking, digging, ...) will no longer be updated, and knockback from damage is + prevented for that player + * Example of usage: A mod sets a player's value to true when attached to a vehicle + +### Model Definition + + { + animation_speed = 30, -- Default animation speed, in keyframes per second + textures = {"character.png"}, -- Default array of textures + animations = { + -- [anim_name] = { + -- x = , + -- y = , + -- collisionbox = , -- (optional) + -- eye_height = , -- (optional) + -- -- suspend client side animations while this one is active (optional) + -- override_local = + -- }, + stand = ..., lay = ..., walk = ..., mine = ..., walk_mine = ..., -- required animations + sit = ... -- used by boats and other MTG mods + }, + -- Default object properties, see lua_api.txt + visual_size = {x = 1, y = 1}, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, + stepheight = 0.6, + eye_height = 1.47 + } + + +TNT API +------- + +`tnt.register_tnt(definition)` + +^ Register a new type of tnt. + + * `name` The name of the node. If no prefix is given `tnt` is used. + * `description` A description for your TNT. + * `radius` The radius within which the TNT can destroy nodes. The default is 3. + * `damage_radius` The radius within which the TNT can damage players and mobs. By default it is twice the `radius`. + * `sound` The sound played when explosion occurs. By default it is `tnt_explode`. + * `disable_drops` Disable drops. By default it is set to false. + * `ignore_protection` Don't check `minetest.is_protected` before removing a node. + * `ignore_on_blast` Don't call `on_blast` even if a node has one. + * `tiles` Textures for node + * `side` Side tiles. By default the name of the tnt with a suffix of `_side.png`. + * `top` Top tile. By default the name of the tnt with a suffix of `_top.png`. + * `bottom` Bottom tile. By default the name of the tnt with a suffix of `_bottom.png`. + * `burning` Top tile when lit. By default the name of the tnt with a suffix of `_top_burning_animated.png". + +`tnt.boom(position[, definition])` + +^ Create an explosion. + +* `position` The center of explosion. +* `definition` The TNT definion as passed to `tnt.register` with the following addition: + * `explode_center` false by default which removes TNT node on blast, when true will explode center node. + +`tnt.burn(position, [nodename])` + +^ Ignite node at position, triggering its `on_ignite` callback (see fire mod). +If no such callback exists, fallback to turn tnt group nodes to their +"_burning" variant. + nodename isn't required unless already known. + +To make dropping items from node inventories easier, you can use the +following helper function from 'default': + +default.get_inventory_drops(pos, inventory, drops) + +^ Return drops from node inventory "inventory" in drops. + +* `pos` - the node position +* `inventory` - the name of the inventory (string) +* `drops` - an initialized list + +The function returns no values. The drops are returned in the `drops` +parameter, and drops is not reinitialized so you can call it several +times in a row to add more inventory items to it. + + +`on_blast` callbacks: + +Both nodedefs and entitydefs can provide an `on_blast()` callback + +`nodedef.on_blast(pos, intensity)` +^ Allow drop and node removal overriding +* `pos` - node position +* `intensity` - TNT explosion measure. larger or equal to 1.0 +^ Should return a list of drops (e.g. {"default:stone"}) +^ Should perform node removal itself. If callback exists in the nodedef +^ then the TNT code will not destroy this node. + +`entitydef.on_blast(luaobj, damage)` +^ Allow TNT effects on entities to be overridden +* `luaobj` - LuaEntityRef of the entity +* `damage` - suggested HP damage value +^ Should return a list of (bool do_damage, bool do_knockback, table drops) +* `do_damage` - if true then TNT mod wil damage the entity +* `do_knockback` - if true then TNT mod will knock the entity away +* `drops` - a list of drops, e.g. {"wool:red"} + + +Screwdriver API +--------------- + +The screwdriver API allows you to control a node's behaviour when a screwdriver is used on it. +To use it, add the `on_screwdriver` function to the node definition. + +`on_rotate(pos, node, user, mode, new_param2)` + + * `pos` Position of the node that the screwdriver is being used on + * `node` that node + * `user` The player who used the screwdriver + * `mode` screwdriver.ROTATE_FACE or screwdriver.ROTATE_AXIS + * `new_param2` the new value of param2 that would have been set if on_rotate wasn't there + * return value: false to disallow rotation, nil to keep default behaviour, true to allow + it but to indicate that changed have already been made (so the screwdriver will wear out) + * use `on_rotate = false` to always disallow rotation + * use `on_rotate = screwdriver.rotate_simple` to allow only face rotation + + +Sethome API +----------- + +The sethome API adds three global functions to allow mods to read a players home position, +set a players home position and teleport a player to home position. + +`sethome.get(name)` + + * `name` Player who's home position you wish to get + * return value: false if no player home coords exist, position table if true + +`sethome.set(name, pos)` + + * `name` Player who's home position you wish to set + * `pos` Position table containing coords of home position + * return value: false if unable to set and save new home position, otherwise true + +`sethome.go(name)` + + * `name` Player you wish to teleport to their home position + * return value: false if player cannot be sent home, otherwise true + +Spawn API +--------- + +The spawn mod takes care of deciding the position of new and respawning players +in the world and has an API to modify its behavior. + +`spawn.get_default_pos()` +* Gets the default spawn position as decided by a biome-dependent algorithm. +* This is not influenced by settings like "static_spawnpoint" or "engine_spawn". +* return value: a vector or `nil` on failure + +`spawn.add_suitable_biome(biome)`: +* Adds a biome to the list of allowed biomes for the above algorithm. +* `biome`: Name of a registered biome + +`spawn.register_on_spawn(func)`: +* Registers a callback to be called when a player (re-)spawns. This can be used + to intercept the normal logic to e.g. respawn a player at his bed. +* `func`: `function(player, is_new)` with arguments + - `player`: ObjectRef + - `is_new`: true if the player is joining the server for the first time + - return value: true to skip all other spawn logic, false or nil otherwise + +When a player (re-)spawns the following order is executed: +1. All spawn callbacks in order of registration. +2. If no result, teleport player to `spawn.get_default_pos()`. +3. If that fails, spawning is left up to engine. + + +Sfinv API +--------- + +It is recommended that you read this link for a good introduction to the +sfinv API by its author: https://rubenwardy.com/minetest_modding_book/en/chapters/sfinv.html + +### sfinv Methods + +**Pages** + +* sfinv.set_page(player, pagename) - changes the page +* sfinv.get_page(player) - get the current page name. Will never return nil +* sfinv.get_homepage_name(player) - get the page name of the first page to show to a player +* sfinv.register_page(name, def) - register a page, see section below +* sfinv.override_page(name, def) - overrides fields of an page registered with register_page. + * Note: Page must already be defined, (opt)depend on the mod defining it. +* sfinv.set_player_inventory_formspec(player) - (re)builds page formspec + and calls set_inventory_formspec(). +* sfinv.get_formspec(player, context) - builds current page's formspec + +**Contexts** + +* sfinv.get_or_create_context(player) - gets the player's context +* sfinv.set_context(player, context) + +**Theming** + +* sfinv.make_formspec(player, context, content, show_inv, size) - adds a theme to a formspec + * show_inv, defaults to false. Whether to show the player's main inventory + * size, defaults to `size[8,8.6]` if not specified +* sfinv.get_nav_fs(player, context, nav, current_idx) - creates tabheader or "" + +### sfinv Members + +* pages - table of pages[pagename] = def +* pages_unordered - array table of pages in order of addition (used to build navigation tabs). +* contexts - contexts[playername] = player_context +* enabled - set to false to disable. Good for inventory rehaul mods like unified inventory + +### Context + +A table with these keys: + +* page - current page name +* nav - a list of page names +* nav_titles - a list of page titles +* nav_idx - current nav index (in nav and nav_titles) +* any thing you want to store + * sfinv will clear the stored data on log out / log in + +### sfinv.register_page + +sfinv.register_page(name, def) + +def is a table containing: + +* `title` - human readable page name (required) +* `get(self, player, context)` - returns a formspec string. See formspec variables. (required) +* `is_in_nav(self, player, context)` - return true to show in the navigation (the tab header, by default) +* `on_player_receive_fields(self, player, context, fields)` - on formspec submit. +* `on_enter(self, player, context)` - called when the player changes pages, usually using the tabs. +* `on_leave(self, player, context)` - when leaving this page to go to another, called before other's on_enter + +### get formspec + +Use sfinv.make_formspec to apply a layout: + + return sfinv.make_formspec(player, context, [[ + list[current_player;craft;1.75,0.5;3,3;] + list[current_player;craftpreview;5.75,1.5;1,1;] + image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270] + listring[current_player;main] + listring[current_player;craft] + image[0,4.25;1,1;gui_hb_bg.png] + image[1,4.25;1,1;gui_hb_bg.png] + image[2,4.25;1,1;gui_hb_bg.png] + image[3,4.25;1,1;gui_hb_bg.png] + image[4,4.25;1,1;gui_hb_bg.png] + image[5,4.25;1,1;gui_hb_bg.png] + image[6,4.25;1,1;gui_hb_bg.png] + image[7,4.25;1,1;gui_hb_bg.png] + ]], true) + +See above (methods section) for more options. + +### Customising themes + +Simply override this function to change the navigation: + + function sfinv.get_nav_fs(player, context, nav, current_idx) + return "navformspec" + end + +And override this function to change the layout: + + function sfinv.make_formspec(player, context, content, show_inv, size) + local tmp = { + size or "size[8,8.6]", + theme_main, + sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx), + content + } + if show_inv then + tmp[4] = theme_inv + end + return table.concat(tmp, "") + end + + +Stairs API +---------- + +The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those +delivered with Minetest Game, to keep them compatible with other mods. + +The following node attributes are sourced from the recipeitem: + * use_texture_alpha + * sunlight_propagates + * light_source + * If the recipeitem is a fuel, the stair/slab is also registered as a fuel of proportionate burntime. + +`stairs.register_stair(subname, recipeitem, groups, images, description, sounds, worldaligntex)` + + * Registers a stair + * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the stair's definition + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] + +`stairs.register_slab(subname, recipeitem, groups, images, description, sounds, worldaligntex)` + + * Registers a slab + * `subname`: Basically the material name (e.g. cobble) used for the slab name. Nodename pattern: "stairs:slab_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble" + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the slab's definition + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] + +`stairs.register_stair_inner(subname, recipeitem, groups, images, description, sounds, worldaligntex, full_description)` + + * Registers an inner corner stair + * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_inner_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the stair's definition with "Inner" prepended + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] + * `full_description`: Overrides the description, bypassing string concatenation. This is useful for translation. (optional) + +`stairs.register_stair_outer(subname, recipeitem, groups, images, description, sounds, worldaligntex, full_description)` + + * Registers an outer corner stair + * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_outer_subname" + * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil` + * `groups`: See [Known damage and digging time defining groups] + * `images`: See [Tile definition] + * `description`: Used for the description field in the stair's definition with "Outer" prepended + * `sounds`: See [#Default sounds] + * `worldaligntex`: A bool to set all textures world-aligned. Default false. See [Tile definition] + * `full_description`: Overrides the description, bypassing string concatenation. This is useful for translation. (optional) + +``` +stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, + sounds, worldaligntex, desc_stair_inner, desc_stair_outer) +``` + + * A wrapper for stairs.register_stair, stairs.register_slab, stairs.register_stair_inner, stairs.register_stair_outer + * Uses almost the same arguments as stairs.register_stair + * `desc_stair`: Description for stair nodes. For corner stairs 'Inner' or 'Outer' will be prefixed unless + `desc_stair_inner` or `desc_stair_outer` are specified, which are used instead. + * `desc_slab`: Description for slab node + * `desc_stair_inner`: Description for inner stair node + * `desc_stair_outer`: Description for outer stair node + + +Xpanes API +---------- + +Creates panes that automatically connect to each other + +`xpanes.register_pane(subname, def)` + + * `subname`: used for nodename. Result: "xpanes:subname" and "xpanes:subname_{2..15}" + * `def`: See [#Pane definition] + +### Pane definition + + { + textures = { + "texture for front and back", + (unused), + "texture for the 4 edges" + }, -- More tiles aren't supported + groups = {group = rating}, -- Uses the known node groups, see [Known damage and digging time defining groups] + sounds = SoundSpec, -- See [#Default sounds] + recipe = {{"","","","","","","","",""}}, -- Recipe field only + use_texture_alpha = true, -- Optional boolean (default: `false`) for colored glass panes + } + + +Raillike definitions +-------------------- + +The following nodes use the group `connect_to_raillike` and will only connect to +raillike nodes within this group and the same group value. +Use `minetest.raillike_group()` to get the group value. + +| Node type | Raillike group name +|-----------------------|--------------------- +| default:rail | "rail" +| tnt:gunpowder | "gunpowder" +| tnt:gunpowder_burning | "gunpowder" + +Example: +If you want to add a new rail type and want it to connect with default:rail, +add `connect_to_raillike=minetest.raillike_group("rail")` into the `groups` table +of your node. + + +Default sounds +-------------- + +Sounds inside the default table can be used within the sounds field of node definitions. + + * `default.node_sound_defaults()` + * `default.node_sound_stone_defaults()` + * `default.node_sound_dirt_defaults()` + * `default.node_sound_sand_defaults()` + * `default.node_sound_wood_defaults()` + * `default.node_sound_leaves_defaults()` + * `default.node_sound_glass_defaults()` + * `default.node_sound_metal_defaults()` + + +Default constants +----------------- + +`default.LIGHT_MAX` The maximum light level (see [Node definition] light_source) + + +GUI and formspecs +----------------- + +`default.get_hotbar_bg(x, y)` + + * Get the hotbar background as string, containing the formspec elements + * x: Horizontal position in the formspec + * y: Vertical position in the formspec + +`default.gui_bg` + + * Deprecated, remove from mods. + +`default.gui_bg_img` + + * Deprecated, remove from mods. + +`default.gui_slots` + + * Deprecated, remove from mods. + +`default.gui_survival_form` + + * Entire formspec for the survival inventory + +`default.get_furnace_active_formspec(fuel_percent, item_percent)` + + * Get the active furnace formspec using the defined GUI elements + * fuel_percent: Percent of how much the fuel is used + * item_percent: Percent of how much the item is cooked + +`default.get_furnace_inactive_formspec()` + + * Get the inactive furnace formspec using the defined GUI elements + + +Leafdecay +--------- + +To enable leaf decay for leaves when a tree is cut down by a player, +register the tree with the default.register_leafdecay(leafdecaydef) +function. + +If `param2` of any registered node is ~= 0, the node will always be +preserved. Thus, if the player places a node of that kind, you will +want to set `param2 = 1` or so. + +The function `default.after_place_leaves` can be set as +`after_place_node of a node` to set param2 to 1 if the player places +the node (should not be used for nodes that use param2 otherwise +(e.g. facedir)). + +If the node is in the `leafdecay_drop` group then it will always be +dropped as an item. + +`default.register_leafdecay(leafdecaydef)` + +`leafdecaydef` is a table, with following members: + { + trunks = {"default:tree"}, -- nodes considered trunks + leaves = {"default:leaves", "default:apple"}, + -- nodes considered for removal + radius = 3, -- radius to consider for searching + } + +Note: all the listed nodes in `trunks` have their `on_after_destruct` +callback overridden. All the nodes listed in `leaves` have their +`on_timer` callback overridden. + + +Dyes +---- + +Minetest Game dyes are registered with: + + groups = {dye = 1, color_ = 1}, + +To make recipes that will work with dyes from many mods, define them using the +dye group and the color groups. + +Dye color groups: + + * `color_white` + * `color_grey` + * `color_dark_grey` + * `color_black` + * `color_red` + * `color_pink` + * `color_orange` + * `color_brown` + * `color_yellow` + * `color_green` + * `color_dark_green` + * `color_blue` + * `color_cyan` + * `color_violet` + * `color_magenta` + +Example of one shapeless recipe using the dye group and a color group: + + minetest.register_craft({ + type = "shapeless", + output = ":item_yellow", + recipe = {":item_no_color", "group:dye,color_yellow"}, + }) + + +Trees +----- + + * `default.grow_tree(pos, is_apple_tree)` + * Grows a mgv6 tree or apple tree at pos + + * `default.grow_jungle_tree(pos)` + * Grows a mgv6 jungletree at pos + + * `default.grow_pine_tree(pos)` + * Grows a mgv6 pinetree at pos + + * `default.grow_new_apple_tree(pos)` + * Grows a new design apple tree at pos + + * `default.grow_new_jungle_tree(pos)` + * Grows a new design jungle tree at pos + + * `default.grow_new_pine_tree(pos)` + * Grows a new design pine tree at pos + + * `default.grow_new_snowy_pine_tree(pos)` + * Grows a new design snowy pine tree at pos + + * `default.grow_new_acacia_tree(pos)` + * Grows a new design acacia tree at pos + + * `default.grow_new_aspen_tree(pos)` + * Grows a new design aspen tree at pos + + * `default.grow_bush(pos)` + * Grows a bush at pos + + * `default.grow_acacia_bush(pos)` + * Grows an acaia bush at pos + + * `default.grow_pine_bush(pos)` + * Grows a pine bush at pos + + * `default.grow_blueberry_bush(pos)` + * Grows a blueberry bush at pos + + * `default.on_grow_failed(pos)` + * Reset the node timer to 300 seconds, used as default callback when the growth of a sapling fails + + * `default.sapling_growth_defs` + * Table that contains all the definitions for the growable saplings, see `default.register_sapling_growth` + + * `default.register_sapling_growth(name, def)` + * Register a new sapling growth configuration. Useful to add custom sapling and trees to the game in a compact way. + default.register_sapling_growth( + "default:sapling", -- Name of the sapling + { + can_grow = default.can_grow, -- Function called to determine whether the sapling can grow, should return a boolean + on_grow_failed = default.on_grow_failed, -- Function called when the growth fails + grow = function(pos) -- Function called when the growth has success. This should replace the sapling with a tree. + } + ) + + * `default.grow_sapling(pos)` + * Attempt to grow a sapling at the given position. Useful as on_timer callback. + + + +Carts +----- + + carts.register_rail( + "mycarts:myrail", -- Rail name + nodedef, -- standard nodedef + railparams -- rail parameter struct (optional) + ) + + railparams = { + on_step(obj, dtime), -- Event handler called when + -- cart is on rail + acceleration, -- integer acceleration factor (negative + -- values to brake) + } + + The event handler is called after all default calculations + are made, so the custom on_step handler can override things + like speed, acceleration, player attachment. The handler will + likely be called many times per second, so the function needs + to make sure that the event is handled properly. + + +Key API +------- + +The key API allows mods to add key functionality to nodes that have +ownership or specific permissions. Using the API will make it so +that a node owner can use skeleton keys on their nodes to create keys +for that node in that location, and give that key to other players, +allowing them some sort of access that they otherwise would not have +due to node protection. + +To make your new nodes work with the key API, you need to register +two callback functions in each nodedef: + + +`on_key_use(pos, player)` + * Is called when a player right-clicks (uses) a normal key on your + * node. + * `pos` - position of the node + * `player` - PlayerRef + * return value: none, ignored + +The `on_key_use` callback should validate that the player is wielding +a key item with the right key meta secret. If needed the code should +deny access to the node functionality. + +If formspecs are used, the formspec callbacks should duplicate these +checks in the metadata callback functions. + + +`on_skeleton_key_use(pos, player, newsecret)` + + * Is called when a player right-clicks (uses) a skeleton key on your + * node. + * `pos` - position of the node + * `player` - PlayerRef + * `newsecret` - a secret value(string) + * return values: + * `secret` - `nil` or the secret value that unlocks the door + * `name` - a string description of the node ("a locked chest") + * `owner` - name of the node owner + +The `on_skeleton_key_use` function should validate that the player has +the right permissions to make a new key for the item. The newsecret +value is useful if the node has no secret value. The function should +store this secret value somewhere so that in the future it may compare +key secrets and match them to allow access. If a node already has a +secret value, the function should return that secret value instead +of the newsecret value. The secret value stored for the node should +not be overwritten, as this would invalidate existing keys. + +Aside from the secret value, the function should retun a descriptive +name for the node and the owner name. The return values are all +encoded in the key that will be given to the player in replacement +for the wielded skeleton key. + +if `nil` is returned, it is assumed that the wielder did not have +permissions to create a key for this node, and no key is created. + +`default.register_craft_metadata_copy(ingredient, result)` +---------------------------------------------------------- + +This function registers a shapeless recipe that takes `ingredient` +and `result` as input and outputs `result`. + +The metadata of the input `result` is copied to the output `result`. + + +Log API +------- + +Logs action of the player with a node at a certain position. +By default only actions of real players are logged. +Actions of non-players (usually machines) are logged only when +setting `log_non_player_actions` is enabled. +A player is considered non-player if `player:is_player()` returns +`false` or `player.is_fake_player` is truthy. The use of +`is_fake_player` is an unofficial standard between mods. +These non-players are marked by the content of `is_fake_player` +(if it is a string) or a "*" in brackets after the player name in +the log. + +`default.log_player_action(player, ...)` + + * `player` The player who performed the action + * `message_parts` Any mumber of message parts describing the action + in 3rd person singular present tense. It can also + contain a `pos` which is logged as "(X,Y,Z)" + +`default.set_inventory_action_loggers(def, name)` + + * hooks the callbacks `on_metadata_inventory_move`, + `on_metadata_inventory_put` and `on_metadata_inventory_take` + that log corresponding actions + * after logging the action, the original callback (if any) is called + * `def` See [Node definition] + * `name` Description of the node in the log message + + +Weather API +----------- + +The weather mod will constantly adjust weather effects seen by the player +(that is: cloud parameters, shadow intensity, bloom and volumetric lighting). +These can be influenced using this API. + +#### `weather.get = function(player)` + +* Returns the current weather effects seen by the player. + It returns a table with two keys: + * `clouds`: A table (or `nil`) with cloud data following the same format as used for `player:set_clouds()`. + * `lighting`: A table (or `nil`) with lighting data following the same format as used for `player:set_lighting()`. +* `player`: ObjectRef of the relevant player +* You can override this function to change the weather effects by simply returning different values. + Setting `clouds` or `lighting` in the result table to `nil` will *prevent* those from changing. + +Utilities +--------- + +`default.dig_up(pos, node, digger, max_height)` + + * Find all nodes above `pos` that is the same, then dig them all + * `max_height` Maximum number of nodes to iterate. Default: 100 diff --git a/data/games/garage/menu/background.png b/data/games/garage/menu/background.png deleted file mode 100644 index e69c4d0..0000000 Binary files a/data/games/garage/menu/background.png and /dev/null differ diff --git a/data/games/garage/menu/header.png b/data/games/garage/menu/header.png index b47e004..b24122f 100644 Binary files a/data/games/garage/menu/header.png and b/data/games/garage/menu/header.png differ diff --git a/data/games/garage/menu/icon.png b/data/games/garage/menu/icon.png index f854b9c..bf90c82 100644 Binary files a/data/games/garage/menu/icon.png and b/data/games/garage/menu/icon.png differ diff --git a/data/games/garage/mods/gltf/invalid/empty.gltf b/data/games/garage/minetest.conf similarity index 100% rename from data/games/garage/mods/gltf/invalid/empty.gltf rename to data/games/garage/minetest.conf diff --git a/data/games/garage/minetest.conf.example b/data/games/garage/minetest.conf.example new file mode 100644 index 0000000..6b392e8 --- /dev/null +++ b/data/games/garage/minetest.conf.example @@ -0,0 +1,81 @@ +# This file contains settings of Minetest Game that can be changed in +# minetest.conf. +# By default, all the settings are commented and not functional. +# Uncomment settings by removing the preceding #. + +# Whether creative mode (fast digging of all blocks, unlimited resources) should +# be enabled. +#creative_mode = false + +# Sets the behaviour of the inventory items when a player dies. +# bones: Store items in a bone node but drop items if inside protected area. +# drop: Drop items on the ground. +# keep: Player keeps items. +#bones_mode = bones + +# The time in seconds after which the bones of a dead player can be looted by +# everyone. +# 0 to disable. +#share_bones_time = 1200 + +# How much earlier the bones of a dead player can be looted by +# everyone if the player dies in a protected area they don't own. +# 0 to disable. By default it is "share_bones_time" divide by four. +#share_bones_time_early = 300 + +# Inform player of condition and location of new bones. +#bones_position_message = false + +# Whether fire should be enabled. If disabled, 'basic_flame' nodes will +# disappear. +# 'permanent_flame' nodes will remain with either setting. +#enable_fire = true + +# Enable flame sound. +#flame_sound = true + +# Whether lavacooling should be enabled. +#enable_lavacooling = true + +# Whether the stuff in initial_stuff should be given to new players. +#give_initial_stuff = false +#initial_stuff = default:pick_steel,default:axe_steel,default:shovel_steel, +default:torch 99,default:cobble 99 + +# Whether the TNT mod should be enabled. +#enable_tnt = + +# The radius of a TNT explosion. +#tnt_radius = 3 + +# Enable the stairs mod ABM that replaces the old 'upside down' +# stair and slab nodes in old maps with the new param2 versions. +#enable_stairs_replace_abm = false + +# Whether to allow respawning in beds. +# Default value is true. +#enable_bed_respawn = true + +# Whether players can skip night by sleeping. +# Default value is true. +#enable_bed_night_skip = true + +# If enabled, fences and walls cannot be jumped over. +#enable_fence_tall = false + +# Whether the engine's spawn search, which does not check for a suitable +# starting biome, is used. +# Default value is false. +#engine_spawn = false + +# Whether river water source nodes create flowing sounds. +# Helps rivers create more sound, especially on level sections. +#river_source_sounds = false + +# If enabled, the 'weather' mod will control cloud parameters, shadow intensity, +# bloom and volumetric lighting. +# Non-functional in V6 or Singlenode mapgens. +#enable_weather = true + +# If enabled, non-player actions are logged +#log_non_player_actions = false diff --git a/data/games/garage/mods/basenodes/init.lua b/data/games/garage/mods/basenodes/init.lua deleted file mode 100644 index a6cc680..0000000 --- a/data/games/garage/mods/basenodes/init.lua +++ /dev/null @@ -1,361 +0,0 @@ -local WATER_ALPHA = "^[opacity:" .. 160 -local WATER_VISC = 1 -local LAVA_VISC = 7 - --- --- Node definitions --- - --- Register nodes - -core.register_node("basenodes:stone", { - description = "Stone", - tiles = {"default_stone.png"}, - groups = {cracky=3}, -}) - -core.register_node("basenodes:desert_stone", { - description = "Desert Stone", - tiles = {"default_desert_stone.png"}, - groups = {cracky=3}, -}) - -core.register_node("basenodes:dirt_with_grass", { - description = "Dirt with Grass", - tiles ={"default_grass.png", - -- a little dot on the bottom to distinguish it from dirt - "default_dirt.png^basenodes_dirt_with_grass_bottom.png", - {name = "default_dirt.png^default_grass_side.png", - tileable_vertical = false}}, - groups = {crumbly=3, soil=1}, -}) - -core.register_node("basenodes:dirt_with_snow", { - description = "Dirt with Snow", - tiles ={"basenodes_dirt_with_snow.png", - -- a little dot on the bottom to distinguish it from dirt - "default_dirt.png^basenodes_dirt_with_snow_bottom.png", - {name = "default_dirt.png^default_snow_side.png", - tileable_vertical = false}}, - groups = {crumbly=3, soil=1}, -}) - -core.register_node("basenodes:dirt", { - description = "Dirt", - tiles ={"default_dirt.png"}, - groups = {crumbly=3, soil=1}, -}) - -core.register_node("basenodes:sand", { - description = "Sand", - tiles ={"default_sand.png"}, - groups = {crumbly=3}, -}) - -core.register_node("basenodes:desert_sand", { - description = "Desert Sand", - tiles ={"default_desert_sand.png"}, - groups = {crumbly=3}, -}) - -core.register_node("basenodes:gravel", { - description = "Gravel", - tiles ={"default_gravel.png"}, - groups = {crumbly=2}, -}) - -core.register_node("basenodes:junglegrass", { - description = "Jungle Grass", - drawtype = "plantlike", - tiles ={"default_junglegrass.png"}, - inventory_image = "default_junglegrass.png", - wield_image = "default_junglegrass.png", - paramtype = "light", - walkable = false, - groups = {snappy=3}, -}) - -core.register_node("basenodes:tree", { - description = "Normal Tree Trunk", - tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, - is_ground_content = false, - groups = {choppy=2,oddly_breakable_by_hand=1}, -}) - -core.register_node("basenodes:leaves", { - description = "Normal Leaves", - drawtype = "allfaces_optional", - tiles = {"default_leaves.png"}, - paramtype = "light", - is_ground_content = false, - groups = {snappy=3}, -}) - -core.register_node("basenodes:jungletree", { - description = "Jungle Tree Trunk", - tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, - is_ground_content = false, - groups = {choppy=2,oddly_breakable_by_hand=1}, -}) - -core.register_node("basenodes:jungleleaves", { - description = "Jungle Leaves", - drawtype = "allfaces_optional", - tiles = {"default_jungleleaves.png"}, - paramtype = "light", - is_ground_content = false, - groups = {snappy=3}, -}) - -core.register_node("basenodes:pine_tree", { - description = "Pine Tree Trunk", - tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", "default_pine_tree.png"}, - is_ground_content = false, - groups = {choppy=2,oddly_breakable_by_hand=1}, -}) - -core.register_node("basenodes:pine_needles", { - description = "Pine Needles", - drawtype = "allfaces_optional", - tiles = {"default_pine_needles.png"}, - paramtype = "light", - is_ground_content = false, - groups = {snappy=3}, -}) - -core.register_node("basenodes:water_source", { - description = "Water Source".."\n".. - "Swimmable, spreading, renewable liquid".."\n".. - "Drowning damage: 1", - drawtype = "liquid", - waving = 3, - tiles = {"default_water.png"..WATER_ALPHA}, - special_tiles = { - {name = "default_water.png"..WATER_ALPHA, backface_culling = false}, - {name = "default_water.png"..WATER_ALPHA, backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - liquidtype = "source", - liquid_alternative_flowing = "basenodes:water_flowing", - liquid_alternative_source = "basenodes:water_source", - liquid_viscosity = WATER_VISC, - post_effect_color = {a = 64, r = 100, g = 100, b = 200}, - post_effect_color_shaded = true, - groups = {water = 3, liquid = 3}, -}) - -core.register_node("basenodes:water_flowing", { - description = "Flowing Water".."\n".. - "Swimmable, spreading, renewable liquid".."\n".. - "Drowning damage: 1", - drawtype = "flowingliquid", - waving = 3, - tiles = {"default_water_flowing.png"}, - special_tiles = { - {name = "default_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - {name = "default_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - liquidtype = "flowing", - liquid_alternative_flowing = "basenodes:water_flowing", - liquid_alternative_source = "basenodes:water_source", - liquid_viscosity = WATER_VISC, - post_effect_color = {a = 64, r = 100, g = 100, b = 200}, - post_effect_color_shaded = true, - groups = {water = 3, liquid = 3}, -}) - -core.register_node("basenodes:river_water_source", { - description = "River Water Source".."\n".. - "Swimmable, spreading, non-renewable liquid".."\n".. - "Drowning damage: 1", - drawtype = "liquid", - waving = 3, - tiles = { "default_river_water.png"..WATER_ALPHA }, - special_tiles = { - {name = "default_river_water.png"..WATER_ALPHA, backface_culling = false}, - {name = "default_river_water.png"..WATER_ALPHA, backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - liquidtype = "source", - liquid_alternative_flowing = "basenodes:river_water_flowing", - liquid_alternative_source = "basenodes:river_water_source", - liquid_viscosity = 1, - liquid_renewable = false, - liquid_range = 2, - post_effect_color = {a = 103, r = 30, g = 76, b = 90}, - post_effect_color_shaded = true, - groups = {water = 3, liquid = 3, }, -}) - -core.register_node("basenodes:river_water_flowing", { - description = "Flowing River Water".."\n".. - "Swimmable, spreading, non-renewable liquid".."\n".. - "Drowning damage: 1", - drawtype = "flowingliquid", - waving = 3, - tiles = {"default_river_water_flowing.png"..WATER_ALPHA}, - special_tiles = { - {name = "default_river_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - {name = "default_river_water_flowing.png"..WATER_ALPHA, - backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - liquidtype = "flowing", - liquid_alternative_flowing = "basenodes:river_water_flowing", - liquid_alternative_source = "basenodes:river_water_source", - liquid_viscosity = 1, - liquid_renewable = false, - liquid_range = 2, - post_effect_color = {a = 103, r = 30, g = 76, b = 90}, - post_effect_color_shaded = true, - groups = {water = 3, liquid = 3, }, -}) - -core.register_node("basenodes:lava_flowing", { - description = "Flowing Lava".."\n".. - "Swimmable, spreading, renewable liquid".."\n".. - "4 damage per second".."\n".. - "Drowning damage: 1", - drawtype = "flowingliquid", - tiles = {"default_lava_flowing.png"}, - special_tiles = { - {name="default_lava_flowing.png", backface_culling = false}, - {name="default_lava_flowing.png", backface_culling = false}, - }, - paramtype = "light", - light_source = core.LIGHT_MAX, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - damage_per_second = 4, - liquidtype = "flowing", - liquid_alternative_flowing = "basenodes:lava_flowing", - liquid_alternative_source = "basenodes:lava_source", - liquid_viscosity = LAVA_VISC, - post_effect_color = {a=192, r=255, g=64, b=0}, - groups = {lava=3, liquid=1}, -}) - -core.register_node("basenodes:lava_source", { - description = "Lava Source".."\n".. - "Swimmable, spreading, renewable liquid".."\n".. - "4 damage per second".."\n".. - "Drowning damage: 1", - drawtype = "liquid", - tiles = { "default_lava.png" }, - special_tiles = { - {name = "default_lava.png", backface_culling = false}, - {name = "default_lava.png", backface_culling = true}, - }, - paramtype = "light", - light_source = core.LIGHT_MAX, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drowning = 1, - damage_per_second = 4, - liquidtype = "source", - liquid_alternative_flowing = "basenodes:lava_flowing", - liquid_alternative_source = "basenodes:lava_source", - liquid_viscosity = LAVA_VISC, - post_effect_color = {a=192, r=255, g=64, b=0}, - groups = {lava=3, liquid=1}, -}) - -core.register_node("basenodes:cobble", { - description = "Cobblestone", - tiles ={"default_cobble.png"}, - is_ground_content = false, - groups = {cracky=3}, -}) - -core.register_node("basenodes:mossycobble", { - description = "Mossy Cobblestone", - tiles ={"default_mossycobble.png"}, - is_ground_content = false, - groups = {cracky=3}, -}) - -core.register_node("basenodes:apple", { - description = "Apple".."\n".. - "Punch: Eat (+2)", - drawtype = "plantlike", - tiles ={"default_apple.png"}, - inventory_image = "default_apple.png", - paramtype = "light", - is_ground_content = false, - sunlight_propagates = true, - walkable = false, - groups = {dig_immediate=3}, - - -- Make eatable because why not? - on_use = core.item_eat(2), -}) - -core.register_node("basenodes:ice", { - description = "Ice", - tiles ={"default_ice.png"}, - groups = {cracky=3}, -}) - --- The snow nodes intentionally have different tints to make them more --- distinguishable -core.register_node("basenodes:snow", { - description = "Snow Sheet", - tiles = {"basenodes_snow_sheet.png"}, - groups = {crumbly=3}, - walkable = false, - paramtype = "light", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, - }, -}) - -core.register_node("basenodes:snowblock", { - description = "Snow Block", - tiles ={"default_snow.png"}, - groups = {crumbly=3}, -}) - - diff --git a/data/games/garage/mods/basenodes/mod.conf b/data/games/garage/mods/basenodes/mod.conf deleted file mode 100644 index 25024dc..0000000 --- a/data/games/garage/mods/basenodes/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = basenodes -description = Contains basic nodes for mapgen diff --git a/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png b/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png deleted file mode 100644 index 5e8fc41..0000000 Binary files a/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_grass_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_snow.png b/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_snow.png deleted file mode 100644 index 7ea2d8d..0000000 Binary files a/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_snow.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png b/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png deleted file mode 100644 index 447c94e..0000000 Binary files a/data/games/garage/mods/basenodes/textures/basenodes_dirt_with_snow_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/basenodes_snow_sheet.png b/data/games/garage/mods/basenodes/textures/basenodes_snow_sheet.png deleted file mode 100644 index 4553320..0000000 Binary files a/data/games/garage/mods/basenodes/textures/basenodes_snow_sheet.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_apple.png b/data/games/garage/mods/basenodes/textures/default_apple.png deleted file mode 100644 index 9c115da..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_apple.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_cobble.png b/data/games/garage/mods/basenodes/textures/default_cobble.png deleted file mode 100644 index 5b859e9..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_cobble.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_desert_sand.png b/data/games/garage/mods/basenodes/textures/default_desert_sand.png deleted file mode 100644 index 19ec87d..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_desert_sand.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_desert_stone.png b/data/games/garage/mods/basenodes/textures/default_desert_stone.png deleted file mode 100644 index 5126fb6..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_desert_stone.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_dirt.png b/data/games/garage/mods/basenodes/textures/default_dirt.png deleted file mode 100644 index 6ca9588..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_dirt.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_grass.png b/data/games/garage/mods/basenodes/textures/default_grass.png deleted file mode 100644 index 3d63971..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_grass.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_gravel.png b/data/games/garage/mods/basenodes/textures/default_gravel.png deleted file mode 100644 index 7e5ff61..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_gravel.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_ice.png b/data/games/garage/mods/basenodes/textures/default_ice.png deleted file mode 100644 index c4bddd2..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_ice.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_junglegrass.png b/data/games/garage/mods/basenodes/textures/default_junglegrass.png deleted file mode 100644 index d64e33a..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_junglegrass.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_jungleleaves.png b/data/games/garage/mods/basenodes/textures/default_jungleleaves.png deleted file mode 100644 index 1fa67e8..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_jungleleaves.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_jungletree.png b/data/games/garage/mods/basenodes/textures/default_jungletree.png deleted file mode 100644 index 053850f..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_jungletree.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_jungletree_top.png b/data/games/garage/mods/basenodes/textures/default_jungletree_top.png deleted file mode 100644 index e80de8a..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_jungletree_top.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_lava.png b/data/games/garage/mods/basenodes/textures/default_lava.png deleted file mode 100644 index a4cf649..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_lava.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_lava_flowing.png b/data/games/garage/mods/basenodes/textures/default_lava_flowing.png deleted file mode 100644 index 07066a6..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_lava_flowing.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_leaves.png b/data/games/garage/mods/basenodes/textures/default_leaves.png deleted file mode 100644 index c0475d4..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_leaves.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_mossycobble.png b/data/games/garage/mods/basenodes/textures/default_mossycobble.png deleted file mode 100644 index 69585e3..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_mossycobble.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_pine_needles.png b/data/games/garage/mods/basenodes/textures/default_pine_needles.png deleted file mode 100644 index 137caa2..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_pine_needles.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_pine_tree.png b/data/games/garage/mods/basenodes/textures/default_pine_tree.png deleted file mode 100644 index 5743183..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_pine_tree.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_pine_tree_top.png b/data/games/garage/mods/basenodes/textures/default_pine_tree_top.png deleted file mode 100644 index cc18f34..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_pine_tree_top.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_river_water.png b/data/games/garage/mods/basenodes/textures/default_river_water.png deleted file mode 100644 index e1074d2..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_river_water.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_river_water_flowing.png b/data/games/garage/mods/basenodes/textures/default_river_water_flowing.png deleted file mode 100644 index 4a756b2..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_river_water_flowing.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_sand.png b/data/games/garage/mods/basenodes/textures/default_sand.png deleted file mode 100644 index 0ed0e4c..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_sand.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_snow.png b/data/games/garage/mods/basenodes/textures/default_snow.png deleted file mode 100644 index c42e0ee..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_snow.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_snow_side.png b/data/games/garage/mods/basenodes/textures/default_snow_side.png deleted file mode 100644 index f34d109..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_snow_side.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_stone.png b/data/games/garage/mods/basenodes/textures/default_stone.png deleted file mode 100644 index 763b439..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_stone.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_tree.png b/data/games/garage/mods/basenodes/textures/default_tree.png deleted file mode 100644 index 189ec15..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_tree.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_tree_top.png b/data/games/garage/mods/basenodes/textures/default_tree_top.png deleted file mode 100644 index d1a4fa7..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_tree_top.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_water.png b/data/games/garage/mods/basenodes/textures/default_water.png deleted file mode 100644 index 3e385ae..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_water.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/default_water_flowing.png b/data/games/garage/mods/basenodes/textures/default_water_flowing.png deleted file mode 100644 index 7cdafd5..0000000 Binary files a/data/games/garage/mods/basenodes/textures/default_water_flowing.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/dirt_with_grass/default_grass.png b/data/games/garage/mods/basenodes/textures/dirt_with_grass/default_grass.png deleted file mode 100644 index 47e50e8..0000000 Binary files a/data/games/garage/mods/basenodes/textures/dirt_with_grass/default_grass.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/dirt_with_grass/default_grass_side.png b/data/games/garage/mods/basenodes/textures/dirt_with_grass/default_grass_side.png deleted file mode 100644 index 04770b6..0000000 Binary files a/data/games/garage/mods/basenodes/textures/dirt_with_grass/default_grass_side.png and /dev/null differ diff --git a/data/games/garage/mods/basenodes/textures/info.txt b/data/games/garage/mods/basenodes/textures/info.txt deleted file mode 100644 index 2d4ef7e..0000000 --- a/data/games/garage/mods/basenodes/textures/info.txt +++ /dev/null @@ -1,7 +0,0 @@ - -The dirt_with_grass folder is for testing loading textures from subfolders. -If it works correctly, the default_grass_side.png file in the folder is used but -default_grass.png is not overwritten by the file in the folder. - -default_dirt.png should be overwritten by the default_dirt.png in the unittests -mod which depends on basenodes. diff --git a/data/games/garage/mods/basetools/init.lua b/data/games/garage/mods/basetools/init.lua deleted file mode 100644 index 92b5888..0000000 --- a/data/games/garage/mods/basetools/init.lua +++ /dev/null @@ -1,582 +0,0 @@ --- --- Tool definitions --- - ---[[ TOOLS SUMMARY: - -Tool types: - -* Hand: basic tool/weapon (special capabilities in creative mode) -* Pickaxe: dig cracky -* Axe: dig choppy -* Shovel: dig crumbly -* Shears: dig snappy -* Sword: deal damage -* Dagger: deal damage, but faster - -Tool materials: - -* Wood: dig nodes of rating 3 -* Stone: dig nodes of rating 3 or 2 -* Steel: dig nodes of rating 3, 2 or 1 -* Mese: dig "everything" instantly -* n-Uses: can be used n times before breaking -]] - --- The hand -if core.settings:get_bool("creative_mode") then - local digtime = 42 - local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} - - core.register_item(":", { - type = "none", - wield_image = "wieldhand.png", - wield_scale = {x = 1, y = 1, z = 2.5}, - range = 10, - tool_capabilities = { - full_punch_interval = 0.5, - max_drop_level = 3, - groupcaps = { - crumbly = caps, - cracky = caps, - snappy = caps, - choppy = caps, - oddly_breakable_by_hand = caps, - -- dig_immediate group doesn't use value 1. Value 3 is instant dig - dig_immediate = - {times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256}, - }, - damage_groups = {fleshy = 10}, - } - }) -else - core.register_item(":", { - type = "none", - wield_image = "wieldhand.png", - wield_scale = {x = 1, y = 1, z = 2.5}, - tool_capabilities = { - full_punch_interval = 0.9, - max_drop_level = 0, - groupcaps = { - crumbly = {times = {[2] = 3.00, [3] = 0.70}, uses = 0, maxlevel = 1}, - snappy = {times = {[3] = 0.40}, uses = 0, maxlevel = 1}, - oddly_breakable_by_hand = - {times = {[1] = 3.50, [2] = 2.00, [3] = 0.70}, uses = 0} - }, - damage_groups = {fleshy = 1}, - } - }) -end - --- Mese Pickaxe: special tool that digs "everything" instantly -core.register_tool("basetools:pick_mese", { - description = "Mese Pickaxe".."\n".. - "Digs diggable nodes instantly.", - inventory_image = "basetools_mesepick.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=3, - groupcaps={ - cracky={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, - crumbly={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, - snappy={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, - choppy={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, - dig_immediate={times={[1]=0.0, [2]=0.0, [3]=0.0}, maxlevel=255}, - }, - damage_groups = {fleshy=100}, - }, -}) - - --- A variant of the mese pickaxe that is not affected by the 0.15s digging delay -core.register_tool("basetools:pick_mese_no_delay", { - description = "Mese Pickaxe (no delay)".."\n".. - "Digs diggable nodes instantly.".."\n".. - "There is no delay between digging each node,\n".. - 'but the "repeat_dig_time" setting is still respected.', - inventory_image = "basetools_mesepick_no_delay.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=3, - groupcaps={ - cracky={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255}, - crumbly={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255}, - snappy={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255}, - choppy={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255}, - dig_immediate={times={[1]=0.001, [2]=0.001, [3]=0.001}, maxlevel=255}, - }, - damage_groups = {fleshy=100}, - }, -}) - - --- --- Pickaxes: Dig cracky --- - -core.register_tool("basetools:pick_wood", { - description = "Wooden Pickaxe".."\n".. - "Digs cracky=3", - inventory_image = "basetools_woodpick.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - cracky={times={[3]=2.00}, uses=30, maxlevel=0} - }, - }, -}) -core.register_tool("basetools:pick_stone", { - description = "Stone Pickaxe".."\n".. - "Digs cracky=2..3", - inventory_image = "basetools_stonepick.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - cracky={times={[2]=1.20, [3]=0.80}, uses=60, maxlevel=0} - }, - }, -}) -core.register_tool("basetools:pick_steel", { - description = "Steel Pickaxe".."\n".. - "Digs cracky=1..3", - inventory_image = "basetools_steelpick.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=0} - }, - }, -}) -core.register_tool("basetools:pick_steel_l1", { - description = "Steel Pickaxe Level 1".."\n".. - "Digs cracky=1..3".."\n".. - "maxlevel=1", - inventory_image = "basetools_steelpick_l1.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=1} - }, - }, -}) -core.register_tool("basetools:pick_steel_l2", { - description = "Steel Pickaxe Level 2".."\n".. - "Digs cracky=1..3".."\n".. - "maxlevel=2", - inventory_image = "basetools_steelpick_l2.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=90, maxlevel=2} - }, - }, -}) - --- --- Shovels (dig crumbly) --- - -core.register_tool("basetools:shovel_wood", { - description = "Wooden Shovel".."\n".. - "Digs crumbly=3", - inventory_image = "basetools_woodshovel.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - crumbly={times={[3]=0.50}, uses=30, maxlevel=0} - }, - }, -}) -core.register_tool("basetools:shovel_stone", { - description = "Stone Shovel".."\n".. - "Digs crumbly=2..3", - inventory_image = "basetools_stoneshovel.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - crumbly={times={[2]=0.50, [3]=0.30}, uses=60, maxlevel=0} - }, - }, -}) -core.register_tool("basetools:shovel_steel", { - description = "Steel Shovel".."\n".. - "Digs crumbly=1..3", - inventory_image = "basetools_steelshovel.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - crumbly={times={[1]=1.00, [2]=0.70, [3]=0.60}, uses=90, maxlevel=0} - }, - }, -}) - --- --- Axes (dig choppy) --- - -core.register_tool("basetools:axe_wood", { - description = "Wooden Axe".."\n".. - "Digs choppy=3", - inventory_image = "basetools_woodaxe.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - choppy={times={[3]=0.80}, uses=30, maxlevel=0}, - }, - }, -}) -core.register_tool("basetools:axe_stone", { - description = "Stone Axe".."\n".. - "Digs choppy=2..3", - inventory_image = "basetools_stoneaxe.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - choppy={times={[2]=1.00, [3]=0.60}, uses=60, maxlevel=0}, - }, - }, -}) -core.register_tool("basetools:axe_steel", { - description = "Steel Axe".."\n".. - "Digs choppy=1..3", - inventory_image = "basetools_steelaxe.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=90, maxlevel=0}, - }, - }, -}) - --- --- Shears (dig snappy) --- - -core.register_tool("basetools:shears_wood", { - description = "Wooden Shears".."\n".. - "Digs snappy=3", - inventory_image = "basetools_woodshears.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - snappy={times={[3]=1.00}, uses=30, maxlevel=0}, - }, - }, -}) -core.register_tool("basetools:shears_stone", { - description = "Stone Shears".."\n".. - "Digs snappy=2..3", - inventory_image = "basetools_stoneshears.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - snappy={times={[2]=1.00, [3]=0.50}, uses=60, maxlevel=0}, - }, - }, -}) -core.register_tool("basetools:shears_steel", { - description = "Steel Shears".."\n".. - "Digs snappy=1..3", - inventory_image = "basetools_steelshears.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - snappy={times={[1]=1.00, [2]=0.50, [3]=0.25}, uses=90, maxlevel=0}, - }, - }, -}) - --- --- Swords (deal damage) --- - -core.register_tool("basetools:sword_wood", { - description = "Wooden Sword".."\n".. - "Damage: fleshy=2", - inventory_image = "basetools_woodsword.png", - tool_capabilities = { - full_punch_interval = 1.0, - damage_groups = {fleshy=2}, - } -}) -core.register_tool("basetools:sword_stone", { - description = "Stone Sword".."\n".. - "Damage: fleshy=5", - inventory_image = "basetools_stonesword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=0, - damage_groups = {fleshy=5}, - } -}) -core.register_tool("basetools:sword_steel", { - description = "Steel Sword".."\n".. - "Damage: fleshy=10", - inventory_image = "basetools_steelsword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - damage_groups = {fleshy=10}, - } -}) -core.register_tool("basetools:sword_titanium", { - description = "Titanium Sword".."\n".. - "Damage: fleshy=100", - inventory_image = "basetools_titaniumsword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - damage_groups = {fleshy=100}, - } -}) -core.register_tool("basetools:sword_blood", { - description = "Blood Sword".."\n".. - "Damage: fleshy=1000", - inventory_image = "basetools_bloodsword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - damage_groups = {fleshy=1000}, - } -}) - --- Max. damage sword -core.register_tool("basetools:sword_mese", { - description = "Mese Sword".."\n".. - "Damage: fleshy=32767, fiery=32767, icy=32767".."\n".. - "Full Punch Interval: 0.0s", - inventory_image = "basetools_mesesword.png", - tool_capabilities = { - full_punch_interval = 0.0, - max_drop_level=1, - damage_groups = {fleshy=32767, fiery=32767, icy=32767}, - } -}) - --- Fire/Ice sword: Deal damage to non-fleshy damage groups -core.register_tool("basetools:sword_fire", { - description = "Fire Sword".."\n".. - "Damage: icy=10", - inventory_image = "basetools_firesword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=0, - damage_groups = {icy=10}, - } -}) -core.register_tool("basetools:sword_ice", { - description = "Ice Sword".."\n".. - "Damage: fiery=10", - inventory_image = "basetools_icesword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=0, - damage_groups = {fiery=10}, - } -}) -core.register_tool("basetools:sword_elemental", { - description = "Elemental Sword".."\n".. - "Damage: fiery=10, icy=10", - inventory_image = "basetools_elementalsword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=0, - damage_groups = {fiery=10, icy=10}, - } -}) - --- Healing weapons: heal HP -core.register_tool("basetools:dagger_heal", { - description = "Healing Dagger".."\n".. - "Heal: fleshy=1".."\n".. - "Full Punch Interval: 0.5s", - inventory_image = "basetools_healdagger.png", - tool_capabilities = { - full_punch_interval = 0.5, - damage_groups = {fleshy=-1}, - } -}) -core.register_tool("basetools:sword_heal", { - description = "Healing Sword".."\n".. - "Heal: fleshy=10", - inventory_image = "basetools_healsword.png", - tool_capabilities = { - full_punch_interval = 1.0, - damage_groups = {fleshy=-10}, - } -}) -core.register_tool("basetools:sword_heal_super", { - description = "Super Healing Sword".."\n".. - "Heal: fleshy=32768, fiery=32768, icy=32768", - inventory_image = "basetools_superhealsword.png", - tool_capabilities = { - full_punch_interval = 1.0, - damage_groups = {fleshy=-32768, fiery=-32768, icy=-32768}, - } -}) - - --- --- Dagger: Low damage, fast punch interval --- -core.register_tool("basetools:dagger_wood", { - description = "Wooden Dagger".."\n".. - "Damage: fleshy=1".."\n".. - "Full Punch Interval: 0.5s", - inventory_image = "basetools_wooddagger.png", - tool_capabilities = { - full_punch_interval = 0.5, - max_drop_level=0, - damage_groups = {fleshy=1}, - } -}) -core.register_tool("basetools:dagger_steel", { - description = "Steel Dagger".."\n".. - "Damage: fleshy=2".."\n".. - "Full Punch Interval: 0.5s", - inventory_image = "basetools_steeldagger.png", - tool_capabilities = { - full_punch_interval = 0.5, - max_drop_level=0, - damage_groups = {fleshy=2}, - } -}) - --- Test tool uses, punch_attack_uses, and wear bar coloring -local tool_params = { - {uses = 1}, - {uses = 2}, - {uses = 3}, - { - uses = 5, - wear_color = "#5865f2", - wear_description = "Solid color: #5865f2", - }, - { - uses = 10, - wear_color = "slateblue", - wear_description = "Solid color: slateblue", - }, - { - uses = 50, - wear_color = { - color_stops = { - [0] = "red", - [0.5] = "yellow", - [1.0] = "blue" - }, - blend = "linear" - }, - wear_description = "Ranges from blue to yellow to red", - }, - { - uses = 100, - wear_color = { - color_stops = { - [0] = "#ffff00", - [0.2] = "#ff00ff", - [0.3] = "#ffff00", - [0.45] = "#c0ffee", - [0.6] = {r=255, g=255, b=0, a=100}, -- continues until the end - }, - blend = "constant" - }, - wear_description = "Misc. colors, constant interpolation", - }, - {uses = 1e3}, - {uses = 1e4}, - {uses = 65535}, -} - -for i, params in ipairs(tool_params) do - local uses = params.uses - local ustring = uses.."-Use"..(uses == 1 and "" or "s") - local color = string.format("#FF00%02X", math.floor(((i-1)/#tool_params) * 255)) - core.register_tool("basetools:pick_uses_"..string.format("%05d", uses), { - description = ustring.." Pickaxe".."\n".. - "Digs cracky=3".. - (params.wear_description and "\n".."Wear bar: " .. params.wear_description or ""), - inventory_image = "basetools_usespick.png^[colorize:"..color..":127", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - cracky={times={[3]=0.1, [2]=0.2, [1]=0.3}, uses=uses, maxlevel=0} - }, - }, - wear_color = params.wear_color - }) - - core.register_tool("basetools:sword_uses_"..string.format("%05d", uses), { - description = ustring.." Sword".."\n".. - "Damage: fleshy=1", - inventory_image = "basetools_usessword.png^[colorize:"..color..":127", - tool_capabilities = { - damage_groups = {fleshy=1}, - punch_attack_uses = uses, - }, - }) -end - -core.register_chatcommand("wear_color", { - params = "[idx]", - description = "Set wear bar color override", - func = function(player_name, param) - local player = core.get_player_by_name(player_name) - if not player then return end - - local wear_color = nil - local wear_desc = "Reset override" - - if param ~= "" then - local params = tool_params[tonumber(param)] - if not params then - return false, "idx out of bounds" - end - wear_color = params.wear_color - wear_desc = "Set override: "..(params.wear_description or "Default behavior") - end - local tool = player:get_wielded_item() - if tool:get_count() == 0 then - return false, "Tool not found" - end - tool:get_meta():set_wear_bar_params(wear_color) - player:set_wielded_item(tool) - return true, wear_desc - end -}) - --- Punch handler to set random color & wear -local wear_on_use = function(itemstack, user, pointed_thing) - local meta = itemstack:get_meta() - local color = math.random(0, 0xFFFFFF) - local colorstr = string.format("#%06x", color) - meta:set_wear_bar_params(colorstr) - core.log("action", "[basetool] Wear bar color of "..itemstack:get_name().." changed to "..colorstr) - itemstack:set_wear(math.random(0, 65535)) - return itemstack -end - --- Place handler to clear item metadata color -local wear_on_place = function(itemstack, user, pointed_thing) - local meta = itemstack:get_meta() - meta:set_wear_bar_params(nil) - return itemstack -end - -core.register_tool("basetools:random_wear_bar", { - description = "Wear Bar Color Test\n" .. - "Punch: Set random color & wear\n" .. - "Place: Clear color", - -- Base texture: A grayscale square (can be colorized) - inventory_image = "basetools_usespick.png^[colorize:#FFFFFF:127", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - cracky={times={[3]=0.1, [2]=0.2, [1]=0.3}, uses=1000, maxlevel=0} - }, - }, - - on_use = wear_on_use, - on_place = wear_on_place, - on_secondary_use = wear_on_place, -}) diff --git a/data/games/garage/mods/basetools/mod.conf b/data/games/garage/mods/basetools/mod.conf deleted file mode 100644 index f0d9f65..0000000 --- a/data/games/garage/mods/basetools/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = basetools -description = Contains basic digging tools diff --git a/data/games/garage/mods/basetools/textures/basetools_bloodsword.png b/data/games/garage/mods/basetools/textures/basetools_bloodsword.png deleted file mode 100644 index a521ba4..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_bloodsword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_elementalsword.png b/data/games/garage/mods/basetools/textures/basetools_elementalsword.png deleted file mode 100644 index d007217..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_elementalsword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_firesword.png b/data/games/garage/mods/basetools/textures/basetools_firesword.png deleted file mode 100644 index eca999b..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_firesword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_healdagger.png b/data/games/garage/mods/basetools/textures/basetools_healdagger.png deleted file mode 100644 index 3e6eb9c..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_healdagger.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_healsword.png b/data/games/garage/mods/basetools/textures/basetools_healsword.png deleted file mode 100644 index f93fddf..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_healsword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_icesword.png b/data/games/garage/mods/basetools/textures/basetools_icesword.png deleted file mode 100644 index 55a8d60..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_icesword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_mesepick.png b/data/games/garage/mods/basetools/textures/basetools_mesepick.png deleted file mode 100644 index 2993b47..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_mesepick.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_mesepick_no_delay.png b/data/games/garage/mods/basetools/textures/basetools_mesepick_no_delay.png deleted file mode 100644 index 5a7db7e..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_mesepick_no_delay.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_mesesword.png b/data/games/garage/mods/basetools/textures/basetools_mesesword.png deleted file mode 100644 index bc82769..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_mesesword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steelaxe.png b/data/games/garage/mods/basetools/textures/basetools_steelaxe.png deleted file mode 100644 index aac594d..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steelaxe.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steeldagger.png b/data/games/garage/mods/basetools/textures/basetools_steeldagger.png deleted file mode 100644 index 4c91730..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steeldagger.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steelpick.png b/data/games/garage/mods/basetools/textures/basetools_steelpick.png deleted file mode 100644 index bc02aac..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steelpick.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steelpick_l1.png b/data/games/garage/mods/basetools/textures/basetools_steelpick_l1.png deleted file mode 100644 index dc03f3f..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steelpick_l1.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steelpick_l2.png b/data/games/garage/mods/basetools/textures/basetools_steelpick_l2.png deleted file mode 100644 index 011df45..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steelpick_l2.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steelshears.png b/data/games/garage/mods/basetools/textures/basetools_steelshears.png deleted file mode 100644 index 04c86c3..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steelshears.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steelshovel.png b/data/games/garage/mods/basetools/textures/basetools_steelshovel.png deleted file mode 100644 index 8cab607..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steelshovel.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_steelsword.png b/data/games/garage/mods/basetools/textures/basetools_steelsword.png deleted file mode 100644 index 9909365..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_steelsword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_stoneaxe.png b/data/games/garage/mods/basetools/textures/basetools_stoneaxe.png deleted file mode 100644 index a374c54..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_stoneaxe.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_stonepick.png b/data/games/garage/mods/basetools/textures/basetools_stonepick.png deleted file mode 100644 index d9156ee..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_stonepick.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_stoneshears.png b/data/games/garage/mods/basetools/textures/basetools_stoneshears.png deleted file mode 100644 index 0b4bd3b..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_stoneshears.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_stoneshovel.png b/data/games/garage/mods/basetools/textures/basetools_stoneshovel.png deleted file mode 100644 index 3c1bb48..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_stoneshovel.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_stonesword.png b/data/games/garage/mods/basetools/textures/basetools_stonesword.png deleted file mode 100644 index 6f3e94c..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_stonesword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_superhealsword.png b/data/games/garage/mods/basetools/textures/basetools_superhealsword.png deleted file mode 100644 index 4175a09..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_superhealsword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_titaniumsword.png b/data/games/garage/mods/basetools/textures/basetools_titaniumsword.png deleted file mode 100644 index 55e22c7..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_titaniumsword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_usespick.png b/data/games/garage/mods/basetools/textures/basetools_usespick.png deleted file mode 100644 index 27850f9..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_usespick.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_usessword.png b/data/games/garage/mods/basetools/textures/basetools_usessword.png deleted file mode 100644 index 0eaf4cf..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_usessword.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_woodaxe.png b/data/games/garage/mods/basetools/textures/basetools_woodaxe.png deleted file mode 100644 index 4015e91..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_woodaxe.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_wooddagger.png b/data/games/garage/mods/basetools/textures/basetools_wooddagger.png deleted file mode 100644 index 6e5ab0f..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_wooddagger.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_woodpick.png b/data/games/garage/mods/basetools/textures/basetools_woodpick.png deleted file mode 100644 index 15c61f4..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_woodpick.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_woodshears.png b/data/games/garage/mods/basetools/textures/basetools_woodshears.png deleted file mode 100644 index 4ff92fd..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_woodshears.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_woodshovel.png b/data/games/garage/mods/basetools/textures/basetools_woodshovel.png deleted file mode 100644 index 6cc52f8..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_woodshovel.png and /dev/null differ diff --git a/data/games/garage/mods/basetools/textures/basetools_woodsword.png b/data/games/garage/mods/basetools/textures/basetools_woodsword.png deleted file mode 100644 index 364016e..0000000 Binary files a/data/games/garage/mods/basetools/textures/basetools_woodsword.png and /dev/null differ diff --git a/data/games/garage/mods/beds/README.txt b/data/games/garage/mods/beds/README.txt new file mode 100644 index 0000000..5c452da --- /dev/null +++ b/data/games/garage/mods/beds/README.txt @@ -0,0 +1,30 @@ +Minetest Game mod: beds +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by BlockMen (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +BlockMen (CC BY-SA 3.0) + All textures unless otherwise noted + +TumeniNodes (CC BY-SA 3.0) + beds_bed_under.png + +This mod adds a bed which allows players to skip the night. +To sleep, right click on the bed. If playing in singleplayer mode the night gets skipped +immediately. If playing multiplayer you get shown how many other players are in bed too, +if all players are sleeping the night gets skipped. The night skip can be forced if more +than half of the players are lying in bed and use this option. + +Another feature is a controlled respawning. If you have slept in bed (not just lying in +it) your respawn point is set to the beds location and you will respawn there after +death. +You can disable the respawn at beds by setting "enable_bed_respawn = false" in +minetest.conf. +You can disable the night skip feature by setting "enable_bed_night_skip = false" in +minetest.conf or by using the /set command in-game. diff --git a/data/games/garage/mods/beds/api.lua b/data/games/garage/mods/beds/api.lua new file mode 100644 index 0000000..2214465 --- /dev/null +++ b/data/games/garage/mods/beds/api.lua @@ -0,0 +1,204 @@ +-- Removes a node without calling on on_destruct() +-- We use this to mess with bed nodes without causing unwanted recursion. +local function remove_no_destruct(pos) + minetest.swap_node(pos, {name = "air"}) + minetest.remove_node(pos) -- Now clear the meta + minetest.check_for_falling(pos) +end + +--- returns the position of the other bed half (or nil on failure) +local function get_other_bed_pos(pos, n) + local node = core.get_node(pos) + local dir = core.facedir_to_dir(node.param2) + if not dir then + return -- There are 255 possible param2 values. Ignore bad ones. + end + local other + if n == 2 then + other = vector.subtract(pos, dir) + elseif n == 1 then + other = vector.add(pos, dir) + else + return nil + end + + local onode = core.get_node(other) + if onode.param2 == node.param2 and core.get_item_group(onode.name, "bed") ~= 0 then + return other + end + return nil +end + +local function destruct_bed(pos, n) + local other = get_other_bed_pos(pos, n) + if other then + remove_no_destruct(other) + beds.remove_spawns_at(other) + end + beds.remove_spawns_at(pos) +end + +function beds.register_bed(name, def) + minetest.register_node(name .. "_bottom", { + description = def.description, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + drawtype = "nodebox", + tiles = def.tiles.bottom, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + stack_max = 1, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = def.nodebox.bottom, + }, + selection_box = { + type = "fixed", + fixed = def.selectionbox, + }, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local pos + if udef and udef.buildable_to then + pos = under + else + pos = pointed_thing.above + end + + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + + local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + if not node_def or not node_def.buildable_to then + return itemstack + end + + local dir = placer and placer:get_look_dir() and + minetest.dir_to_facedir(placer:get_look_dir()) or 0 + local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) + + if minetest.is_protected(botpos, player_name) and + not minetest.check_player_privs(player_name, "protection_bypass") then + minetest.record_protection_violation(botpos, player_name) + return itemstack + end + + local botdef = minetest.registered_nodes[minetest.get_node(botpos).name] + if not botdef or not botdef.buildable_to then + return itemstack + end + + minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) + minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) + + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack + end, + + on_destruct = function(pos) + destruct_bed(pos, 1) + end, + + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + beds.on_rightclick(pos, clicker) + return itemstack + end, + + on_rotate = function(pos, node, user, _, new_param2) + local dir = minetest.facedir_to_dir(node.param2) + if not dir then + return false + end + -- old position of the top node + local p = vector.add(pos, dir) + local node2 = minetest.get_node_or_nil(p) + if not node2 or minetest.get_item_group(node2.name, "bed") ~= 2 or + node.param2 ~= node2.param2 then + return false + end + if minetest.is_protected(p, user:get_player_name()) then + minetest.record_protection_violation(p, user:get_player_name()) + return false + end + if new_param2 % 32 > 3 then + return false + end + -- new position of the top node + local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) + local node3 = minetest.get_node_or_nil(newp) + local node_def = node3 and minetest.registered_nodes[node3.name] + if not node_def or not node_def.buildable_to then + return false + end + if minetest.is_protected(newp, user:get_player_name()) then + minetest.record_protection_violation(newp, user:get_player_name()) + return false + end + node.param2 = new_param2 + remove_no_destruct(p) + minetest.set_node(pos, node) + minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) + return true + end, + can_dig = function(pos, player) + return beds.can_dig(pos) + end, + }) + + minetest.register_node(name .. "_top", { + drawtype = "nodebox", + tiles = def.tiles.top, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2, + not_in_creative_inventory = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), + drop = "", + node_box = { + type = "fixed", + fixed = def.nodebox.top, + }, + selection_box = { + type = "fixed", + -- Small selection box to allow digging stray top nodes + fixed = {-0.3, -0.3, -0.3, 0.3, -0.1, 0.3}, + }, + on_destruct = function(pos) + destruct_bed(pos, 2) + end, + can_dig = function(pos, player) + local other = get_other_bed_pos(pos, 2) + return (not other) or beds.can_dig(other) + end, + }) + + minetest.register_alias(name, name .. "_bottom") + + minetest.register_craft({ + output = name, + recipe = def.recipe + }) +end diff --git a/data/games/garage/mods/beds/beds.lua b/data/games/garage/mods/beds/beds.lua new file mode 100644 index 0000000..e905107 --- /dev/null +++ b/data/games/garage/mods/beds/beds.lua @@ -0,0 +1,109 @@ +-- beds/beds.lua + +-- support for MT game translation. +local S = beds.get_translator + +-- Fancy shaped bed + +beds.register_bed("beds:fancy_bed", { + description = S("Fancy Bed"), + inventory_image = "beds_bed_fancy.png", + wield_image = "beds_bed_fancy.png", + tiles = { + bottom = { + "beds_bed_top1.png", + "beds_bed_under.png", + "beds_bed_side1.png", + "beds_bed_side1.png^[transformFX", + "beds_bed_foot.png", + "beds_bed_foot.png", + }, + top = { + "beds_bed_top2.png", + "beds_bed_under.png", + "beds_bed_side2.png", + "beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "beds_bed_head.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +-- Simple shaped bed + +beds.register_bed("beds:bed", { + description = S("Simple Bed"), + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = { + "beds_bed_top_bottom.png^[transformR90", + "beds_bed_under.png", + "beds_bed_side_bottom_r.png", + "beds_bed_side_bottom_r.png^[transformFX", + "blank.png", + "beds_bed_side_bottom.png" + }, + top = { + "beds_bed_top_top.png^[transformR90", + "beds_bed_under.png", + "beds_bed_side_top_r.png", + "beds_bed_side_top_r.png^[transformFX", + "beds_bed_side_top.png", + "blank.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5}, + recipe = { + {"wool:white", "wool:white", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + }, +}) + +-- Aliases for PilzAdam's beds mod + +minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") +minetest.register_alias("beds:bed_top_red", "beds:bed_top") + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "beds:fancy_bed_bottom", + burntime = 13, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "beds:bed_bottom", + burntime = 12, +}) diff --git a/data/games/garage/mods/beds/functions.lua b/data/games/garage/mods/beds/functions.lua new file mode 100644 index 0000000..6ce90f2 --- /dev/null +++ b/data/games/garage/mods/beds/functions.lua @@ -0,0 +1,304 @@ +local pi = math.pi +local is_sp = minetest.is_singleplayer() +local enable_respawn = minetest.settings:get_bool("enable_bed_respawn") +if enable_respawn == nil then + enable_respawn = true +end + +-- support for MT game translation. +local S = beds.get_translator + +-- Helper functions + +local function get_look_yaw(pos) + local rotation = minetest.get_node(pos).param2 + if rotation > 3 then + rotation = rotation % 4 -- Mask colorfacedir values + end + if rotation == 1 then + return pi / 2, rotation + elseif rotation == 3 then + return -pi / 2, rotation + elseif rotation == 0 then + return pi, rotation + else + return 0, rotation + end +end + +local function is_night_skip_enabled() + local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") + if enable_night_skip == nil then + enable_night_skip = true + end + return enable_night_skip +end + +local function check_in_beds(players) + local in_bed = beds.player + if not players then + players = minetest.get_connected_players() + end + + for n, player in ipairs(players) do + local name = player:get_player_name() + if not in_bed[name] then + return false + end + end + + return #players > 0 +end + +local function lay_down(player, pos, bed_pos, state, skip) + local name = player:get_player_name() + local hud_flags = player:hud_get_flags() + + if not player or not name then + return + end + + -- stand up + if state ~= nil and not state then + if not beds.player[name] then + -- player not in bed, do nothing + return false + end + beds.bed_position[name] = nil + -- skip here to prevent sending player specific changes (used for leaving players) + if skip then + return + end + player:set_pos(beds.pos[name]) + + -- physics, eye_offset, etc + local physics_override = beds.player[name].physics_override + beds.player[name] = nil + player:set_physics_override({ + speed = physics_override.speed, + jump = physics_override.jump, + gravity = physics_override.gravity + }) + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_look_horizontal(math.random(1, 180) / 100) + player_api.player_attached[name] = false + hud_flags.wielditem = true + player_api.set_animation(player, "stand" , 30) + + -- lay down + else + + -- Check if bed is occupied + for _, other_pos in pairs(beds.bed_position) do + if vector.distance(bed_pos, other_pos) < 0.1 then + minetest.chat_send_player(name, S("This bed is already occupied!")) + return false + end + end + + -- Check if player is moving + if vector.length(player:get_velocity()) > 0.05 then + minetest.chat_send_player(name, S("You have to stop moving before going to bed!")) + return false + end + + -- Check if player is attached to an object + if player:get_attach() then + return false + end + + if beds.player[name] then + -- player already in bed, do nothing + return false + end + + beds.pos[name] = pos + beds.bed_position[name] = bed_pos + beds.player[name] = {physics_override = player:get_physics_override()} + + local yaw, param2 = get_look_yaw(bed_pos) + player:set_look_horizontal(yaw) + local dir = minetest.facedir_to_dir(param2) + -- p.y is just above the nodebox height of the 'Simple Bed' (the highest bed), + -- to avoid sinking down through the bed. + local p = { + x = bed_pos.x + dir.x / 2, + y = bed_pos.y + 0.07, + z = bed_pos.z + dir.z / 2 + } + player:set_physics_override({speed = 0, jump = 0, gravity = 0}) + player:set_pos(p) + player_api.player_attached[name] = true + hud_flags.wielditem = false + player_api.set_animation(player, "lay" , 0) + end + + player:hud_set_flags(hud_flags) +end + +local function get_player_in_bed_count() + local c = 0 + for _, _ in pairs(beds.player) do + c = c + 1 + end + return c +end + +local function update_formspecs(finished) + local ges = #minetest.get_connected_players() + local player_in_bed = get_player_in_bed_count() + local is_majority = (ges / 2) < player_in_bed + + local form_n + local esc = minetest.formspec_escape + if finished then + form_n = beds.formspec .. "label[2.7,9;" .. esc(S("Good morning.")) .. "]" + else + form_n = beds.formspec .. "label[2.2,9;" .. + esc(S("@1 of @2 players are in bed", player_in_bed, ges)) .. "]" + if is_majority and is_night_skip_enabled() then + form_n = form_n .. "button_exit[2,6;4,0.75;force;" .. + esc(S("Force night skip")) .. "]" + end + end + + for name,_ in pairs(beds.player) do + minetest.show_formspec(name, "beds_form", form_n) + end +end + + +-- Public functions + +function beds.kick_players() + for name, _ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + lay_down(player, nil, nil, false) + end +end + +function beds.skip_night() + minetest.set_timeofday(0.23) +end + +local update_scheduled = false +local function schedule_update() + if update_scheduled then + -- there already is an update scheduled; don't schedule more to prevent races + return + end + update_scheduled = true + minetest.after(2, function() + update_scheduled = false + if not is_sp then + update_formspecs(is_night_skip_enabled()) + end + if is_night_skip_enabled() then + -- skip the night and let all players stand up + beds.skip_night() + beds.kick_players() + end + end) +end + +function beds.on_rightclick(pos, player) + local name = player:get_player_name() + local ppos = player:get_pos() + local tod = minetest.get_timeofday() + + if tod > beds.day_interval.start and tod < beds.day_interval.finish then + if beds.player[name] then + lay_down(player, nil, nil, false) + end + minetest.chat_send_player(name, S("You can only sleep at night.")) + return + end + + -- move to bed + if not beds.player[name] then + lay_down(player, ppos, pos) + beds.set_spawns() -- save respawn positions when entering bed + else + lay_down(player, nil, nil, false) + end + + if not is_sp then + update_formspecs(false) + end + + if check_in_beds() then + schedule_update() + end +end + +function beds.can_dig(bed_pos) + -- Check all players in bed which one is at the expected position + for _, player_bed_pos in pairs(beds.bed_position) do + if vector.equals(bed_pos, player_bed_pos) then + return false + end + end + return true +end + +-- Callbacks +-- Only register respawn callback if respawn enabled +if enable_respawn then + -- Respawn player at bed if valid position is found + spawn.register_on_spawn(function(player, is_new) + local pos = beds.spawn[player:get_player_name()] + if pos then + player:set_pos(pos) + return true + end + end) +end + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + lay_down(player, nil, nil, false, true) + beds.player[name] = nil + if check_in_beds() then + schedule_update() + end +end) + +minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + local in_bed = beds.player + local pos = player:get_pos() + local yaw = get_look_yaw(pos) + + if in_bed[name] then + lay_down(player, nil, pos, false) + player:set_look_horizontal(yaw) + player:set_pos(pos) + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "beds_form" then + return + end + + -- Because "Force night skip" button is a button_exit, it will set fields.quit + -- and lay_down call will change value of player_in_bed, so it must be taken + -- earlier. + local last_player_in_bed = get_player_in_bed_count() + + if fields.quit or fields.leave then + lay_down(player, nil, nil, false) + update_formspecs(false) + end + + if fields.force then + local is_majority = (#minetest.get_connected_players() / 2) < last_player_in_bed + if is_majority and is_night_skip_enabled() then + update_formspecs(true) + beds.skip_night() + beds.kick_players() + else + update_formspecs(false) + end + end +end) diff --git a/data/games/garage/mods/beds/init.lua b/data/games/garage/mods/beds/init.lua new file mode 100644 index 0000000..14ced8b --- /dev/null +++ b/data/games/garage/mods/beds/init.lua @@ -0,0 +1,31 @@ +-- beds/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("beds") +local esc = minetest.formspec_escape + +beds = {} +beds.player = {} +beds.bed_position = {} +beds.pos = {} +beds.spawn = {} +beds.get_translator = S + +beds.formspec = "size[8,11;true]" .. + "no_prepend[]" .. + "bgcolor[#080808BB;true]" .. + "button_exit[2,10;4,0.75;leave;" .. esc(S("Leave Bed")) .. "]" + +beds.day_interval = { + start = 0.2, + finish = 0.805, +} + +local modpath = minetest.get_modpath("beds") + +-- Load files + +dofile(modpath .. "/functions.lua") +dofile(modpath .. "/api.lua") +dofile(modpath .. "/beds.lua") +dofile(modpath .. "/spawns.lua") diff --git a/data/games/garage/mods/beds/license.txt b/data/games/garage/mods/beds/license.txt new file mode 100644 index 0000000..383047d --- /dev/null +++ b/data/games/garage/mods/beds/license.txt @@ -0,0 +1,61 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2018 TumeniNodes + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/beds/locale/beds.de.tr b/data/games/garage/mods/beds/locale/beds.de.tr new file mode 100644 index 0000000..3f2c959 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.de.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Schickes Bett +Simple Bed=Schlichtes Bett +This bed is already occupied!=Dieses Bett ist bereits belegt! +You have to stop moving before going to bed!=Sie müssen stehen bleiben, bevor Sie zu Bett gehen können! +Good morning.=Guten Morgen. +@1 of @2 players are in bed=@1 von @2 Spielern sind im Bett +Force night skip=Überspringen der Nacht erzwingen +You can only sleep at night.=Sie können nur nachts schlafen. +Leave Bed=Bett verlassen diff --git a/data/games/garage/mods/beds/locale/beds.eo.tr b/data/games/garage/mods/beds/locale/beds.eo.tr new file mode 100644 index 0000000..3a4ad2f --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.eo.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Luksa lito +Simple Bed=Simpla lito +This bed is already occupied!=Tiu lito jam estas okupata! +You have to stop moving before going to bed!=Vi ĉesu moviĝi por enlitiĝi! +Good morning.=Bonan matenon. +@1 of @2 players are in bed=@1 el @2 ludantoj estas en lito +Force night skip=Devigi noktan salton +You can only sleep at night.=Vi povas dormi nur nokte. +Leave Bed=Ellitiĝi diff --git a/data/games/garage/mods/beds/locale/beds.es.tr b/data/games/garage/mods/beds/locale/beds.es.tr new file mode 100644 index 0000000..8ef0db7 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.es.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Cama de lujo +Simple Bed=Cama sencilla +This bed is already occupied!=Esta cama esta ocupada +You have to stop moving before going to bed!=Deja de moverte o no podras acostarte +Good morning.=Buenos días. +@1 of @2 players are in bed=@1 de @2 jugadores están durmiendo +Force night skip=Forzar hacer de dia +You can only sleep at night.=Sólo puedes dormir por la noche. +Leave Bed=Levantarse diff --git a/data/games/garage/mods/beds/locale/beds.fr.tr b/data/games/garage/mods/beds/locale/beds.fr.tr new file mode 100644 index 0000000..43c06e3 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.fr.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Lit chic +Simple Bed=Lit simple +This bed is already occupied!=Ce lit est déjà occupé ! +You have to stop moving before going to bed!=Vous devez arrêter de bouger avant de vous coucher ! +Good morning.=Bonjour. +@1 of @2 players are in bed=@1 joueur(s) sur @2 sont au lit +Force night skip=Forcer le passage de la nuit +You can only sleep at night.=Vous ne pouvez dormir que la nuit. +Leave Bed=Se lever du lit diff --git a/data/games/garage/mods/beds/locale/beds.id.tr b/data/games/garage/mods/beds/locale/beds.id.tr new file mode 100644 index 0000000..d87c933 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.id.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Ranjang Mewah +Simple Bed=Ranjang Sederhana +This bed is already occupied!=Ranjang telah terisi! +You have to stop moving before going to bed!=Anda harus diam untuk tidur! +Good morning.=Selamat pagi. +@1 of @2 players are in bed=@1 dari @2 pemain sedang tidur +Force night skip=Paksa lewati malam +You can only sleep at night.=Anda hanya bisa tidur pada waktu malam. +Leave Bed=Tinggalkan Ranjang diff --git a/data/games/garage/mods/beds/locale/beds.it.tr b/data/games/garage/mods/beds/locale/beds.it.tr new file mode 100644 index 0000000..8f4e14e --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.it.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Letto decorato +Simple Bed=Letto semplice +This bed is already occupied!= +You have to stop moving before going to bed!= +Good morning.= +@1 of @2 players are in bed= +Force night skip= +You can only sleep at night.= +Leave Bed=Alzati dal letto diff --git a/data/games/garage/mods/beds/locale/beds.ja.tr b/data/games/garage/mods/beds/locale/beds.ja.tr new file mode 100644 index 0000000..5034456 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.ja.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=ファンシーなベッド +Simple Bed=シンプルなベッド +This bed is already occupied!=ベッドはすでに使われています! +You have to stop moving before going to bed!=寝るときは動かないでください! +Good morning.=おはようございます。 +@1 of @2 players are in bed=ベッドに@1 / @2人います +Force night skip=強制的に夜をスキップします +You can only sleep at night.=夜しか寝れません。 +Leave Bed=ベッドから出ます diff --git a/data/games/garage/mods/beds/locale/beds.jbo.tr b/data/games/garage/mods/beds/locale/beds.jbo.tr new file mode 100644 index 0000000..a72f686 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.jbo.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=lo selja'i ckana +Simple Bed=lo sampu ckana +This bed is already occupied!=.i lo ti ckana cu canlu +You have to stop moving before going to bed!=lo nu do cando cu sarcu lo nu do sipna +Good morning.=.i .uise'inai cerni +@1 of @2 players are in bed=.i @1 cmima be lu'i @2 le pilno cu vreta lo ckana +Force night skip=bapli le nu co'u nicte +You can only sleep at night.=.i steci le ka nicte kei fa le ka do kakne le ka sipna ca pa ckaji be ce'u +Leave Bed=cliva lo ckana diff --git a/data/games/garage/mods/beds/locale/beds.lv.tr b/data/games/garage/mods/beds/locale/beds.lv.tr new file mode 100644 index 0000000..cea63ff --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.lv.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Skaista gulta +Simple Bed=Gulta +This bed is already occupied!=Šī gulta jau ir aizņemta! +You have to stop moving before going to bed!=Jums jāapstājas lai gulētu! +Good morning.=Labrīt. +@1 of @2 players are in bed=@1 no @2 spēlētājiem guļ gultās +Force night skip=Izlaist nakti +You can only sleep at night.=Jūs variet gulēt tikai naktī. +Leave Bed=Celties no gultas diff --git a/data/games/garage/mods/beds/locale/beds.ms.tr b/data/games/garage/mods/beds/locale/beds.ms.tr new file mode 100644 index 0000000..b197b63 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.ms.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Katil Beragam +Simple Bed=Katil Biasa +This bed is already occupied!=Katil ini sudah diduduki! +You have to stop moving before going to bed!=Anda perlu berhenti bergerak sebelum tidur! +Good morning.=Selamat pagi. +@1 of @2 players are in bed=@1 daripada @2 pemain sedang tidur +Force night skip=Paksa langkau malam +You can only sleep at night.=Anda hanya boleh tidur pada waktu malam. +Leave Bed=Tinggalkan Katil diff --git a/data/games/garage/mods/beds/locale/beds.pl.tr b/data/games/garage/mods/beds/locale/beds.pl.tr new file mode 100644 index 0000000..2bc03c6 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.pl.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Fantazyjne łóżko +Simple Bed=Proste łóżko +This bed is already occupied!=To łóżko jest już zajęte! +You have to stop moving before going to bed!=Musisz się zatrzymać aby wejść do łóżka +Good morning.=Dzień dobry. +@1 of @2 players are in bed=@1 z @2 graczy śpią +Force night skip=Wymuś pominięcie nocy +You can only sleep at night.=Możesz spać tylko w nocy. +Leave Bed=Opuść łóżko diff --git a/data/games/garage/mods/beds/locale/beds.pt_BR.tr b/data/games/garage/mods/beds/locale/beds.pt_BR.tr new file mode 100644 index 0000000..47fb1b9 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Cama Bonita +Simple Bed=Cama Simples +This bed is already occupied!=Esta cama já está ocupada! +You have to stop moving before going to bed!=Você precisa parar de se mover antes de ir para cama! +Good morning.=Bom dia. +@1 of @2 players are in bed=@1 de @2 jogadores estão na cama +Force night skip=Forçar o amanhecer +You can only sleep at night.=Você só pode dormir à noite +Leave Bed=Sair da Cama diff --git a/data/games/garage/mods/beds/locale/beds.ru.tr b/data/games/garage/mods/beds/locale/beds.ru.tr new file mode 100644 index 0000000..7c1b536 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.ru.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Красивая кровать +Simple Bed=Простая кровать +This bed is already occupied!=Эта кровать уже занята! +You have to stop moving before going to bed!=Вам нужно перестать двигаться чтобы лечь! +Good morning.=Доброе утро. +@1 of @2 players are in bed=@1 из @2 игроков в кровати +Force night skip=Пропустить ночь +You can only sleep at night.=Вы можете спать только ночью. +Leave Bed=Встать с кровати diff --git a/data/games/garage/mods/beds/locale/beds.sk.tr b/data/games/garage/mods/beds/locale/beds.sk.tr new file mode 100644 index 0000000..5f31f0f --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.sk.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Pekná posteľ +Simple Bed=Jednoduchá posteľ +This bed is already occupied!=Táto posteľ je už obsadená +You have to stop moving before going to bed!=Predtým ako si ľahneš do postele, sa musíš prestať pohybovať! +Good morning.=Dobré ráno. +@1 of @2 players are in bed=@1 z @2 hráčov sú v posteli +Force night skip=Nútene preskočiť noc +You can only sleep at night.=Môžeš spať len v noci. +Leave Bed=Opusti posteľ diff --git a/data/games/garage/mods/beds/locale/beds.sv.tr b/data/games/garage/mods/beds/locale/beds.sv.tr new file mode 100644 index 0000000..3b737b4 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.sv.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Fin säng +Simple Bed=Enkel säng +This bed is already occupied!=Den här sängen används redan! +You have to stop moving before going to bed!=Du måste stanna innan du kan lägga dig! +Good morning.=God morgon. +@1 of @2 players are in bed=@1 av @2 spelare försöker sova. +Force night skip=Tvinga att hoppa över natt +You can only sleep at night.=Du kan bara sova på natten. +Leave Bed=Lämna säng diff --git a/data/games/garage/mods/beds/locale/beds.uk.tr b/data/games/garage/mods/beds/locale/beds.uk.tr new file mode 100644 index 0000000..c9db693 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.uk.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=Гарне ліжко +Simple Bed=Просте ліжко +This bed is already occupied!=Це ліжко вже зайняте! +You have to stop moving before going to bed!=Зупиніться перед тим як лягти! +Good morning.=Доброго ранку. +@1 of @2 players are in bed=@1 з @2 гравців(-я) у ліжку +Force night skip=Пропустити ніч +You can only sleep at night.=Ви можете спати лише вночі. +Leave Bed=Встати з ліжка diff --git a/data/games/garage/mods/beds/locale/beds.zh_CN.tr b/data/games/garage/mods/beds/locale/beds.zh_CN.tr new file mode 100644 index 0000000..7e6cfc7 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.zh_CN.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=花式床 +Simple Bed=简易床 +This bed is already occupied!=床上已有人! +You have to stop moving before going to bed!=上床前要停止移动! +Good morning.=早安! +@1 of @2 players are in bed=@2位玩家中的@1位在床上 +Force night skip=强制跳过夜晚 +You can only sleep at night.=你只能在晚上睡觉。 +Leave Bed=离开床 diff --git a/data/games/garage/mods/beds/locale/beds.zh_TW.tr b/data/games/garage/mods/beds/locale/beds.zh_TW.tr new file mode 100644 index 0000000..a0428b4 --- /dev/null +++ b/data/games/garage/mods/beds/locale/beds.zh_TW.tr @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed=花式床 +Simple Bed=簡易床 +This bed is already occupied!=這個床已經被占據了! +You have to stop moving before going to bed!=你必須在上床前停止移動! +Good morning.=早安! +@1 of @2 players are in bed=@2位玩家中的@1位在床上 +Force night skip=強制跳過夜晚 +You can only sleep at night.=你只能在晚上睡覺。 +Leave Bed=離開床 diff --git a/data/games/garage/mods/beds/locale/template.txt b/data/games/garage/mods/beds/locale/template.txt new file mode 100644 index 0000000..a965787 --- /dev/null +++ b/data/games/garage/mods/beds/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: beds +Fancy Bed= +Simple Bed= +This bed is already occupied!= +You have to stop moving before going to bed!= +Good morning.= +@1 of @2 players are in bed= +Force night skip= +You can only sleep at night.= +Leave Bed= diff --git a/data/games/garage/mods/beds/mod.conf b/data/games/garage/mods/beds/mod.conf new file mode 100644 index 0000000..ef88ad1 --- /dev/null +++ b/data/games/garage/mods/beds/mod.conf @@ -0,0 +1,3 @@ +name = beds +description = Minetest Game mod: beds +depends = default, wool, spawn diff --git a/data/games/garage/mods/beds/spawns.lua b/data/games/garage/mods/beds/spawns.lua new file mode 100644 index 0000000..1a2ce81 --- /dev/null +++ b/data/games/garage/mods/beds/spawns.lua @@ -0,0 +1,72 @@ +local world_path = minetest.get_worldpath() +local org_file = world_path .. "/beds_spawns" +local file = world_path .. "/beds_spawns" +local bkwd = false + +-- check for PA's beds mod spawns +local cf = io.open(world_path .. "/beds_player_spawns", "r") +if cf ~= nil then + io.close(cf) + file = world_path .. "/beds_player_spawns" + bkwd = true +end + +function beds.read_spawns() + local spawns = beds.spawn + local input = io.open(file, "r") + if input and not bkwd then + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + spawns[name:sub(2)] = {x = x, y = y, z = z} + until input:read(0) == nil + io.close(input) + elseif input and bkwd then + beds.spawn = minetest.deserialize(input:read("*all")) + input:close() + beds.save_spawns() + os.rename(file, file .. ".backup") + file = org_file + end +end + +beds.read_spawns() + +function beds.save_spawns() + if not beds.spawn then + return + end + local data = {} + local output = io.open(org_file, "w") + for k, v in pairs(beds.spawn) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, k)) + end + output:write(table.concat(data)) + io.close(output) +end + +function beds.set_spawns() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + local p = player:get_pos() + -- but don't change spawn location if borrowing a bed + if not minetest.is_protected(p, name) then + beds.spawn[name] = p + end + end + beds.save_spawns() +end + +function beds.remove_spawns_at(pos) + for name, p in pairs(beds.spawn) do + if vector.equals(vector.round(p), pos) then + beds.spawn[name] = nil + end + end + beds.save_spawns() +end diff --git a/data/games/garage/mods/beds/textures/beds_bed.png b/data/games/garage/mods/beds/textures/beds_bed.png new file mode 100644 index 0000000..d4b02e7 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_fancy.png b/data/games/garage/mods/beds/textures/beds_bed_fancy.png new file mode 100644 index 0000000..1c9fde9 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_fancy.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_foot.png b/data/games/garage/mods/beds/textures/beds_bed_foot.png new file mode 100644 index 0000000..af510bb Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_foot.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_head.png b/data/games/garage/mods/beds/textures/beds_bed_head.png new file mode 100644 index 0000000..b98b110 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_head.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_side1.png b/data/games/garage/mods/beds/textures/beds_bed_side1.png new file mode 100644 index 0000000..8ded54f Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_side1.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_side2.png b/data/games/garage/mods/beds/textures/beds_bed_side2.png new file mode 100644 index 0000000..a6bdb99 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_side2.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_side_bottom.png b/data/games/garage/mods/beds/textures/beds_bed_side_bottom.png new file mode 100644 index 0000000..ed80f75 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_side_bottom.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_side_bottom_r.png b/data/games/garage/mods/beds/textures/beds_bed_side_bottom_r.png new file mode 100644 index 0000000..2d86532 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_side_bottom_r.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_side_top.png b/data/games/garage/mods/beds/textures/beds_bed_side_top.png new file mode 100644 index 0000000..04b2ba1 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_side_top.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_side_top_r.png b/data/games/garage/mods/beds/textures/beds_bed_side_top_r.png new file mode 100644 index 0000000..c3c07b1 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_side_top_r.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_top1.png b/data/games/garage/mods/beds/textures/beds_bed_top1.png new file mode 100644 index 0000000..2b3ae8d Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_top1.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_top2.png b/data/games/garage/mods/beds/textures/beds_bed_top2.png new file mode 100644 index 0000000..b80353c Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_top2.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_top_bottom.png b/data/games/garage/mods/beds/textures/beds_bed_top_bottom.png new file mode 100644 index 0000000..43dcc64 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_top_bottom.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_top_top.png b/data/games/garage/mods/beds/textures/beds_bed_top_top.png new file mode 100644 index 0000000..9b3d08f Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_top_top.png differ diff --git a/data/games/garage/mods/beds/textures/beds_bed_under.png b/data/games/garage/mods/beds/textures/beds_bed_under.png new file mode 100644 index 0000000..1a67367 Binary files /dev/null and b/data/games/garage/mods/beds/textures/beds_bed_under.png differ diff --git a/data/games/garage/mods/benchmarks/init.lua b/data/games/garage/mods/benchmarks/init.lua deleted file mode 100644 index 8f6bb1e..0000000 --- a/data/games/garage/mods/benchmarks/init.lua +++ /dev/null @@ -1,189 +0,0 @@ --- Safeguard against too much optimization. This way the results cannot be optimized --- away, but they can be garbage collected (due to __mode = "k"). -_G._bench_content_ids_data = setmetatable({}, {__mode = "k"}) - -local function bench_name2content() - local t = {} - _G._bench_content_ids_data[t] = true - - local get_content_id = core.get_content_id - - local start = core.get_us_time() - - for i = 1, 200 do - for name in pairs(core.registered_nodes) do - t[#t + 1] = get_content_id(name) - end - end - - local finish = core.get_us_time() - - return (finish - start) / 1000 -end - -local function bench_content2name() - local t = {} - _G._bench_content_ids_data[t] = true - - -- Try to estimate the highest content ID that's used - -- (not accurate but good enough for this test) - local n = 0 - for _ in pairs(core.registered_nodes) do - n = n + 1 - end - - local get_name_from_content_id = core.get_name_from_content_id - - local start = core.get_us_time() - - for i = 1, 200 do - for j = 0, n do - t[#t + 1] = get_name_from_content_id(j) - end - end - - local finish = core.get_us_time() - - return (finish - start) / 1000 -end - -core.register_chatcommand("bench_name2content", { - params = "", - description = "Benchmark: Conversion from node names to content IDs", - func = function(name, param) - core.chat_send_player(name, "Benchmarking core.get_content_id. Warming up ...") - bench_name2content() - core.chat_send_player(name, "Warming up finished, now benchmarking ...") - local time = bench_name2content() - return true, ("Time: %.2f ms"):format(time) - end, -}) - -core.register_chatcommand("bench_content2name", { - params = "", - description = "Benchmark: Conversion from content IDs to node names", - func = function(name, param) - core.chat_send_player(name, "Benchmarking core.get_name_from_content_id. Warming up ...") - bench_content2name() - core.chat_send_player(name, "Warming up finished, now benchmarking ...") - local time = bench_content2name() - return true, ("Time: %.2f ms"):format(time) - end, -}) - -local function get_positions_cube(ppos) - local pos_list = {} - - local i = 1 - for x=2,100 do - for y=2,100 do - for z=2,100 do - pos_list[i] = ppos:offset(x, y, z) - i = i + 1 - end - end - end - - return pos_list -end - -core.register_chatcommand("bench_bulk_set_node", { - params = "", - description = "Benchmark: Bulk-set 99×99×99 stone nodes", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local pos_list = get_positions_cube(player:get_pos()) - - core.chat_send_player(name, "Benchmarking core.bulk_set_node. Warming up ...") - - -- warm up with stone to prevent having different callbacks - -- due to different node topology - core.bulk_set_node(pos_list, {name = "mapgen_stone"}) - - core.chat_send_player(name, "Warming up finished, now benchmarking ...") - - local start_time = core.get_us_time() - for i=1,#pos_list do - core.set_node(pos_list[i], {name = "mapgen_stone"}) - end - local middle_time = core.get_us_time() - core.bulk_set_node(pos_list, {name = "mapgen_stone"}) - local end_time = core.get_us_time() - local msg = string.format("Benchmark results: core.set_node loop: %.2f ms; core.bulk_set_node: %.2f ms", - ((middle_time - start_time)) / 1000, - ((end_time - middle_time)) / 1000 - ) - return true, msg - end, -}) - -core.register_chatcommand("bench_bulk_get_node", { - params = "", - description = "Benchmark: Bulk-get 99×99×99 nodes", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local pos_list = get_positions_cube(player:get_pos()) - local function bench() - local start_time = core.get_us_time() - for i=1,#pos_list do - local n = core.get_node(pos_list[i]) - -- Make sure the name lookup is never optimized away. - -- Table allocation might still be omitted. But only accessing - -- the name of a node is a common pattern anyways. - if n.name == "benchmarks:nonexistent_node" then - error("should never happen") - end - end - return core.get_us_time() - start_time - end - - core.chat_send_player(name, "Benchmarking core.get_node. Warming up ...") - bench() - - core.chat_send_player(name, "Warming up finished, now benchmarking ...") - local result_us = bench() - - local msg = string.format("Benchmark results: core.get_node loop 1: %.2f ms", - result_us / 1000) - return true, msg - end, -}) - -core.register_chatcommand("bench_bulk_swap_node", { - params = "", - description = "Benchmark: Bulk-swap 99×99×99 stone nodes", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local pos_list = get_positions_cube(player:get_pos()) - - core.chat_send_player(name, "Benchmarking core.bulk_swap_node. Warming up ...") - - -- warm up because first execution otherwise becomes - -- significantly slower - core.bulk_swap_node(pos_list, {name = "mapgen_stone"}) - - core.chat_send_player(name, "Warming up finished, now benchmarking ...") - - local start_time = core.get_us_time() - for i=1,#pos_list do - core.swap_node(pos_list[i], {name = "mapgen_stone"}) - end - local middle_time = core.get_us_time() - core.bulk_swap_node(pos_list, {name = "mapgen_stone"}) - local end_time = core.get_us_time() - local msg = string.format("Benchmark results: core.swap_node loop: %.2f ms; core.bulk_swap_node: %.2f ms", - ((middle_time - start_time)) / 1000, - ((end_time - middle_time)) / 1000 - ) - return true, msg - end, -}) diff --git a/data/games/garage/mods/benchmarks/mod.conf b/data/games/garage/mods/benchmarks/mod.conf deleted file mode 100644 index fd8d039..0000000 --- a/data/games/garage/mods/benchmarks/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = benchmarks -description = Adds some benchmark chat commands diff --git a/data/games/garage/mods/binoculars/README.txt b/data/games/garage/mods/binoculars/README.txt new file mode 100644 index 0000000..0c65f6e --- /dev/null +++ b/data/games/garage/mods/binoculars/README.txt @@ -0,0 +1,37 @@ +Minetest Game mod: binoculars +============================= +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (textures) +--------------------------- +paramat (CC BY-SA 3.0): + binoculars_binoculars.png + +Crafting +-------- +binoculars:binoculars + +default:obsidian_glass O +default:bronze_ingot B + +O_O +BBB +O_O + +Usage +----- +In survival mode, use of zoom requires the binoculars item in your inventory, +they will allow a 10 degree field of view. +It can take up to 5 seconds for adding to or removal from inventory to have an +effect, however to instantly allow the use of this zoom 'use' (leftclick) the +item. + +Zoom with a field of view of 15 degrees is automatically allowed in creative +mode and for any player with the 'creative' privilege. + +The 'binoculars.update_player_property()' function is global so can be +redefined by a mod for alternative behaviour. diff --git a/data/games/garage/mods/binoculars/init.lua b/data/games/garage/mods/binoculars/init.lua new file mode 100644 index 0000000..914a861 --- /dev/null +++ b/data/games/garage/mods/binoculars/init.lua @@ -0,0 +1,73 @@ +-- binoculars/init.lua + +-- Mod global namespace + +binoculars = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("binoculars") + + +-- Update player property +-- Global to allow overriding + +function binoculars.update_player_property(player) + local new_zoom_fov = 0 + + if player:get_inventory():contains_item( + "main", "binoculars:binoculars") then + new_zoom_fov = 10 + elseif minetest.is_creative_enabled(player:get_player_name()) then + new_zoom_fov = 15 + end + + -- Only set property if necessary to avoid player mesh reload + if player:get_properties().zoom_fov ~= new_zoom_fov then + player:set_properties({zoom_fov = new_zoom_fov}) + end +end + + +-- Set player property 'on joinplayer' + +minetest.register_on_joinplayer(function(player) + binoculars.update_player_property(player) +end) + + +-- Cyclic update of player property + +local function cyclic_update() + for _, player in ipairs(minetest.get_connected_players()) do + binoculars.update_player_property(player) + end + minetest.after(4.7, cyclic_update) +end + +minetest.after(4.7, cyclic_update) + + +-- Binoculars item + +minetest.register_craftitem("binoculars:binoculars", { + description = S("Binoculars") .. "\n" .. S("Use with 'Zoom' key"), + inventory_image = "binoculars_binoculars.png", + stack_max = 1, + groups = {tool = 1}, + + on_use = function(itemstack, user, pointed_thing) + binoculars.update_player_property(user) + end, +}) + + +-- Crafting + +minetest.register_craft({ + output = "binoculars:binoculars", + recipe = { + {"default:obsidian_glass", "", "default:obsidian_glass"}, + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + {"default:obsidian_glass", "", "default:obsidian_glass"}, + } +}) diff --git a/data/games/garage/mods/binoculars/license.txt b/data/games/garage/mods/binoculars/license.txt new file mode 100644 index 0000000..f3aefda --- /dev/null +++ b/data/games/garage/mods/binoculars/license.txt @@ -0,0 +1,59 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/binoculars/locale/binoculars.de.tr b/data/games/garage/mods/binoculars/locale/binoculars.de.tr new file mode 100644 index 0000000..7bd9b9d --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.de.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Fernglas +Use with 'Zoom' key=Mit „Zoom“-Taste benutzen diff --git a/data/games/garage/mods/binoculars/locale/binoculars.eo.tr b/data/games/garage/mods/binoculars/locale/binoculars.eo.tr new file mode 100644 index 0000000..bec8dc1 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.eo.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binoklo +Use with 'Zoom' key=Uzi per 'Zomo' klavo diff --git a/data/games/garage/mods/binoculars/locale/binoculars.es.tr b/data/games/garage/mods/binoculars/locale/binoculars.es.tr new file mode 100644 index 0000000..7b7e77d --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.es.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Prismáticos +Use with 'Zoom' key=Usar con la tecla 'Zoom' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.fr.tr b/data/games/garage/mods/binoculars/locale/binoculars.fr.tr new file mode 100644 index 0000000..3f8b0bc --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.fr.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Jumelles +Use with 'Zoom' key=Utiliser avec le bouton « Zoom » diff --git a/data/games/garage/mods/binoculars/locale/binoculars.id.tr b/data/games/garage/mods/binoculars/locale/binoculars.id.tr new file mode 100644 index 0000000..59ba2cd --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.id.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Teropong +Use with 'Zoom' key=Gunakan dengan tombol 'Zum' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.it.tr b/data/games/garage/mods/binoculars/locale/binoculars.it.tr new file mode 100644 index 0000000..97c7b86 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.it.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binocolo +Use with 'Zoom' key=Usalo col tasto 'Ingrandimento' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.ja.tr b/data/games/garage/mods/binoculars/locale/binoculars.ja.tr new file mode 100644 index 0000000..9766f46 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.ja.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=双眼鏡 +Use with 'Zoom' key=ズームキーで使います diff --git a/data/games/garage/mods/binoculars/locale/binoculars.jbo.tr b/data/games/garage/mods/binoculars/locale/binoculars.jbo.tr new file mode 100644 index 0000000..e146569 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.jbo.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=lo reldarvistci +Use with 'Zoom' key=.i tu'a le jvinu banro batke cu tadji lo nu pilno diff --git a/data/games/garage/mods/binoculars/locale/binoculars.lv.tr b/data/games/garage/mods/binoculars/locale/binoculars.lv.tr new file mode 100644 index 0000000..0713a03 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.lv.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binoklis +Use with 'Zoom' key=Lietojiet ar 'Pietuvināt' pogu diff --git a/data/games/garage/mods/binoculars/locale/binoculars.ms.tr b/data/games/garage/mods/binoculars/locale/binoculars.ms.tr new file mode 100644 index 0000000..d38e64f --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.ms.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binokular +Use with 'Zoom' key=Guna dengan kekunci 'Zum' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.pl.tr b/data/games/garage/mods/binoculars/locale/binoculars.pl.tr new file mode 100644 index 0000000..9fbd903 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.pl.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Lornetka +Use with 'Zoom' key=Aby użyć naciśnij 'Zoom' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.pt_BR.tr b/data/games/garage/mods/binoculars/locale/binoculars.pt_BR.tr new file mode 100644 index 0000000..4aabfef --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Binóculos +Use with 'Zoom' key=Use com a tecla de 'Zoom' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.ru.tr b/data/games/garage/mods/binoculars/locale/binoculars.ru.tr new file mode 100644 index 0000000..6825f27 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.ru.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Бинокль +Use with 'Zoom' key=Используется клавишей 'Приближение' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.sk.tr b/data/games/garage/mods/binoculars/locale/binoculars.sk.tr new file mode 100644 index 0000000..5008311 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.sk.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Ďalekohľad +Use with 'Zoom' key=Použi s klávesou "Priblíž" diff --git a/data/games/garage/mods/binoculars/locale/binoculars.sv.tr b/data/games/garage/mods/binoculars/locale/binoculars.sv.tr new file mode 100644 index 0000000..f8a01db --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.sv.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Kikare +Use with 'Zoom' key=Använd med 'Zoom'-knappen diff --git a/data/games/garage/mods/binoculars/locale/binoculars.uk.tr b/data/games/garage/mods/binoculars/locale/binoculars.uk.tr new file mode 100644 index 0000000..cec1e2f --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.uk.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=Бінокль +Use with 'Zoom' key=Використовується клавішею 'Наближення' diff --git a/data/games/garage/mods/binoculars/locale/binoculars.zh_CN.tr b/data/games/garage/mods/binoculars/locale/binoculars.zh_CN.tr new file mode 100644 index 0000000..ec46cf8 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=望远镜 +Use with 'Zoom' key=与“缩放”键一起使用 diff --git a/data/games/garage/mods/binoculars/locale/binoculars.zh_TW.tr b/data/games/garage/mods/binoculars/locale/binoculars.zh_TW.tr new file mode 100644 index 0000000..bbe3b39 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/binoculars.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars=望遠鏡 +Use with 'Zoom' key=與“縮放”鍵一起使用 diff --git a/data/games/garage/mods/binoculars/locale/template.txt b/data/games/garage/mods/binoculars/locale/template.txt new file mode 100644 index 0000000..a526462 --- /dev/null +++ b/data/games/garage/mods/binoculars/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: binoculars +Binoculars= +Use with 'Zoom' key= diff --git a/data/games/garage/mods/binoculars/mod.conf b/data/games/garage/mods/binoculars/mod.conf new file mode 100644 index 0000000..4a64ce5 --- /dev/null +++ b/data/games/garage/mods/binoculars/mod.conf @@ -0,0 +1,3 @@ +name = binoculars +description = Minetest Game mod: binoculars +depends = default diff --git a/data/games/garage/mods/binoculars/textures/binoculars_binoculars.png b/data/games/garage/mods/binoculars/textures/binoculars_binoculars.png new file mode 100644 index 0000000..5803d48 Binary files /dev/null and b/data/games/garage/mods/binoculars/textures/binoculars_binoculars.png differ diff --git a/data/games/garage/mods/boats/README.txt b/data/games/garage/mods/boats/README.txt new file mode 100644 index 0000000..26b1b6f --- /dev/null +++ b/data/games/garage/mods/boats/README.txt @@ -0,0 +1,31 @@ +Minetest Game mod: boats +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures and model) +------------------------------------- +Textures: Zeg9 (CC BY-SA 3.0) +Model: thetoon and Zeg9 (CC BY-SA 3.0), + modified by PavelS(SokolovPavel) (CC BY-SA 3.0), + modified by sofar (CC BY-SA 3.0) + +Controls +-------- +Right mouse button = Enter or exit boat when pointing at boat. +Forward = Speed up. + Slow down when moving backwards. +Forward + backward = Enable cruise mode: Boat will accelerate to maximum forward + speed and remain at that speed without needing to hold the + forward key. +Backward = Slow down. + Speed up when moving backwards. + Disable cruise mode. +Left = Turn to the left. + Turn to the right when moving backwards. +Right = Turn to the right. + Turn to the left when moving backwards. diff --git a/data/games/garage/mods/boats/init.lua b/data/games/garage/mods/boats/init.lua new file mode 100644 index 0000000..52360be --- /dev/null +++ b/data/games/garage/mods/boats/init.lua @@ -0,0 +1,290 @@ +-- boats/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("boats") + +-- +-- Helper functions +-- + +local function is_water(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "water") ~= 0 +end + + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + +-- +-- Boat entity +-- + +local boat = { + initial_properties = { + physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the boat to fall through the world if underwater + collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "boats_boat.obj", + textures = {"default_wood.png"}, + }, + + driver = nil, + v = 0, + last_v = 0, + removed = false, + auto = false +} + + +function boat.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and name == self.driver then + -- Cleanup happens in boat.on_detach_child + clicker:set_detach() + + player_api.set_animation(clicker, "stand", 30) + local pos = clicker:get_pos() + pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} + minetest.after(0.1, function() + clicker:set_pos(pos) + end) + elseif not self.driver then + clicker:set_attach(self.object, "", + {x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0}) + + self.driver = name + player_api.player_attached[name] = true + + minetest.after(0.2, function() + player_api.set_animation(clicker, "sit", 30) + end) + clicker:set_look_horizontal(self.object:get_yaw()) + end +end + + +-- If driver leaves server while driving boat +function boat.on_detach_child(self, child) + if child and child:get_player_name() == self.driver then + player_api.player_attached[child:get_player_name()] = false + + self.driver = nil + self.auto = false + end +end + + +function boat.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) + if staticdata then + self.v = tonumber(staticdata) + end + self.last_v = self.v +end + + +function boat.get_staticdata(self) + return tostring(self.v) +end + + +function boat.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + + local name = puncher:get_player_name() + if self.driver and name == self.driver then + self.driver = nil + puncher:set_detach() + player_api.player_attached[name] = false + end + if not self.driver then + self.removed = true + local inv = puncher:get_inventory() + if not minetest.is_creative_enabled(name) + or not inv:contains_item("main", "boats:boat") then + local leftover = inv:add_item("main", "boats:boat") + -- if no room in inventory add a replacement boat to the world + if not leftover:is_empty() then + minetest.add_item(self.object:get_pos(), leftover) + end + end + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + end +end + + +function boat.on_step(self, dtime) + self.v = get_v(self.object:get_velocity()) * math.sign(self.v) + if self.driver then + local driver_objref = minetest.get_player_by_name(self.driver) + if driver_objref then + local ctrl = driver_objref:get_player_control() + if ctrl.up and ctrl.down then + if not self.auto then + self.auto = true + minetest.chat_send_player(self.driver, S("Boat cruise mode on")) + end + elseif ctrl.down then + self.v = self.v - dtime * 2.0 + if self.auto then + self.auto = false + minetest.chat_send_player(self.driver, S("Boat cruise mode off")) + end + elseif ctrl.up or self.auto then + self.v = self.v + dtime * 2.0 + end + if ctrl.left then + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) + else + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) + end + elseif ctrl.right then + if self.v < -0.001 then + self.object:set_yaw(self.object:get_yaw() + dtime * 0.9) + else + self.object:set_yaw(self.object:get_yaw() - dtime * 0.9) + end + end + end + end + local velo = self.object:get_velocity() + if not self.driver and + self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + self.object:set_pos(self.object:get_pos()) + return + end + -- We need to preserve velocity sign to properly apply drag force + -- while moving backward + local drag = dtime * math.sign(self.v) * (0.01 + 0.0796 * self.v * self.v) + -- If drag is larger than velocity, then stop horizontal movement + if math.abs(self.v) <= math.abs(drag) then + self.v = 0 + else + self.v = self.v - drag + end + + local p = self.object:get_pos() + p.y = p.y - 0.5 + local new_velo + local new_acce = {x = 0, y = 0, z = 0} + if not is_water(p) then + local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + if (not nodedef) or nodedef.walkable then + self.v = 0 + new_acce = {x = 0, y = 1, z = 0} + else + new_acce = {x = 0, y = -9.8, z = 0} + end + new_velo = get_velocity(self.v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) + else + p.y = p.y + 1 + if is_water(p) then + local y = self.object:get_velocity().y + if y >= 5 then + y = 5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} + else + new_acce = {x = 0, y = 5, z = 0} + end + new_velo = get_velocity(self.v, self.object:get_yaw(), y) + self.object:set_pos(self.object:get_pos()) + else + new_acce = {x = 0, y = 0, z = 0} + if math.abs(self.object:get_velocity().y) < 1 then + local pos = self.object:get_pos() + pos.y = math.floor(pos.y) + 0.5 + self.object:set_pos(pos) + new_velo = get_velocity(self.v, self.object:get_yaw(), 0) + else + new_velo = get_velocity(self.v, self.object:get_yaw(), + self.object:get_velocity().y) + self.object:set_pos(self.object:get_pos()) + end + end + end + self.object:set_velocity(new_velo) + self.object:set_acceleration(new_acce) +end + + +minetest.register_entity("boats:boat", boat) + + +minetest.register_craftitem("boats:boat", { + description = S("Boat"), + inventory_image = "boats_inventory.png", + wield_image = "boats_wield.png", + wield_scale = {x = 2, y = 2, z = 1}, + liquids_pointable = true, + groups = {flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + if not is_water(pointed_thing.under) then + return itemstack + end + pointed_thing.under.y = pointed_thing.under.y + 0.5 + boat = minetest.add_entity(pointed_thing.under, "boats:boat") + if boat then + if placer then + boat:set_yaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + end + return itemstack + end, +}) + + +minetest.register_craft({ + output = "boats:boat", + recipe = { + {"", "", "" }, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "boats:boat", + burntime = 20, +}) diff --git a/data/games/garage/mods/boats/license.txt b/data/games/garage/mods/boats/license.txt new file mode 100644 index 0000000..d816be5 --- /dev/null +++ b/data/games/garage/mods/boats/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures and model) +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Zeg9 +Copyright (C) 2012-2016 thetoon +Copyright (C) 2012-2016 PavelS(SokolovPavel) +Copyright (C) 2016 sofar (sofar@foo-projects.org) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/boats/locale/boats.de.tr b/data/games/garage/mods/boats/locale/boats.de.tr new file mode 100644 index 0000000..d8eb8d7 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.de.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Schneller Bootsmodus an +Boat cruise mode off=Schneller Bootsmodus aus +Boat=Boot diff --git a/data/games/garage/mods/boats/locale/boats.eo.tr b/data/games/garage/mods/boats/locale/boats.eo.tr new file mode 100644 index 0000000..7d02e2f --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.eo.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=La kroza maniero de la boato estas ŝaltita. +Boat cruise mode off=La kroza maniero de la boato estas malŝaltita. +Boat=Boato diff --git a/data/games/garage/mods/boats/locale/boats.es.tr b/data/games/garage/mods/boats/locale/boats.es.tr new file mode 100644 index 0000000..b9adb72 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.es.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Modo crucero en bote activado +Boat cruise mode off=Modo crucero en bote desactivado +Boat=Bote diff --git a/data/games/garage/mods/boats/locale/boats.fr.tr b/data/games/garage/mods/boats/locale/boats.fr.tr new file mode 100644 index 0000000..f469a0b --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.fr.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Bateau mode rapide activé +Boat cruise mode off=Bateau mode rapide désactivé +Boat=Bateau diff --git a/data/games/garage/mods/boats/locale/boats.id.tr b/data/games/garage/mods/boats/locale/boats.id.tr new file mode 100644 index 0000000..cf37f47 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.id.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Mode perahu jelajah nyala +Boat cruise mode off=Mode perahu jelajah mati +Boat=Perahu diff --git a/data/games/garage/mods/boats/locale/boats.it.tr b/data/games/garage/mods/boats/locale/boats.it.tr new file mode 100644 index 0000000..4a87835 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.it.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Modalità movimento automatico barca attivata +Boat cruise mode off=Modalità movimento automatico barca disattivata +Boat=Barca diff --git a/data/games/garage/mods/boats/locale/boats.ja.tr b/data/games/garage/mods/boats/locale/boats.ja.tr new file mode 100644 index 0000000..ee2d086 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.ja.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=クルージングモード・オン +Boat cruise mode off=クルージングモード・オフ +Boat=ボート diff --git a/data/games/garage/mods/boats/locale/boats.jbo.tr b/data/games/garage/mods/boats/locale/boats.jbo.tr new file mode 100644 index 0000000..c7d534f --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=.i lo bloti cu zmiku le ka klama +Boat cruise mode off=.i lo bloti cu macnu le ka klama +Boat=lo bloti diff --git a/data/games/garage/mods/boats/locale/boats.lv.tr b/data/games/garage/mods/boats/locale/boats.lv.tr new file mode 100644 index 0000000..8d78fa6 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.lv.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Autopilots ieslēgts +Boat cruise mode off=Autopilots izslēgts +Boat=Laiva diff --git a/data/games/garage/mods/boats/locale/boats.ms.tr b/data/games/garage/mods/boats/locale/boats.ms.tr new file mode 100644 index 0000000..df42bc3 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.ms.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Mod jelajah bot dihidupkan +Boat cruise mode off=Mod jelajah bot dimatikan +Boat=Bot diff --git a/data/games/garage/mods/boats/locale/boats.pl.tr b/data/games/garage/mods/boats/locale/boats.pl.tr new file mode 100644 index 0000000..ce43286 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.pl.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Tryb rejsu łodką włączony +Boat cruise mode off=Tryb rejsu łodką wyłączony +Boat=Łódka diff --git a/data/games/garage/mods/boats/locale/boats.pt_BR.tr b/data/games/garage/mods/boats/locale/boats.pt_BR.tr new file mode 100644 index 0000000..1992fdf --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Modo de cruseiro do barco ligado +Boat cruise mode off=Modo de cruseiro do barco desligado +Boat=Barco diff --git a/data/games/garage/mods/boats/locale/boats.ru.tr b/data/games/garage/mods/boats/locale/boats.ru.tr new file mode 100644 index 0000000..972bfb0 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.ru.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Автоход лодки включен +Boat cruise mode off=Автоход лодки выключен +Boat=Лодка diff --git a/data/games/garage/mods/boats/locale/boats.sk.tr b/data/games/garage/mods/boats/locale/boats.sk.tr new file mode 100644 index 0000000..4d313cd --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.sk.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Cestovný režim loďky je zapnutý +Boat cruise mode off=Cestovný režim loďky je vypnutý +Boat=Loďka diff --git a/data/games/garage/mods/boats/locale/boats.sv.tr b/data/games/garage/mods/boats/locale/boats.sv.tr new file mode 100644 index 0000000..248b088 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.sv.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Båtkryssningsläge på +Boat cruise mode off=Båtkryssningsläge av +Boat=Båt diff --git a/data/games/garage/mods/boats/locale/boats.uk.tr b/data/games/garage/mods/boats/locale/boats.uk.tr new file mode 100644 index 0000000..662ba6f --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.uk.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=Режим мандрування на човні увімкнено +Boat cruise mode off=Режим мандрування на човні вимкнено +Boat=Човен diff --git a/data/games/garage/mods/boats/locale/boats.zh_CN.tr b/data/games/garage/mods/boats/locale/boats.zh_CN.tr new file mode 100644 index 0000000..254f2df --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=巡航模式开启 +Boat cruise mode off=巡航模式关闭 +Boat=船 diff --git a/data/games/garage/mods/boats/locale/boats.zh_TW.tr b/data/games/garage/mods/boats/locale/boats.zh_TW.tr new file mode 100644 index 0000000..97b3471 --- /dev/null +++ b/data/games/garage/mods/boats/locale/boats.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on=巡航模式開啟 +Boat cruise mode off=巡航模式關閉 +Boat=船 diff --git a/data/games/garage/mods/boats/locale/template.txt b/data/games/garage/mods/boats/locale/template.txt new file mode 100644 index 0000000..17aedc8 --- /dev/null +++ b/data/games/garage/mods/boats/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: boats +Boat cruise mode on= +Boat cruise mode off= +Boat= diff --git a/data/games/garage/mods/boats/mod.conf b/data/games/garage/mods/boats/mod.conf new file mode 100644 index 0000000..a727f8f --- /dev/null +++ b/data/games/garage/mods/boats/mod.conf @@ -0,0 +1,3 @@ +name = boats +description = Minetest Game mod: boats +depends = default, player_api diff --git a/data/games/garage/mods/boats/models/boats_boat.obj b/data/games/garage/mods/boats/models/boats_boat.obj new file mode 100644 index 0000000..0f21e47 --- /dev/null +++ b/data/games/garage/mods/boats/models/boats_boat.obj @@ -0,0 +1,358 @@ +# Blender v2.76 (sub 11) OBJ File: 'boat.blend' +# www.blender.org +mtllib boat.mtl +o boats_boat +v -6.786140 -3.033999 -9.415440 +v -6.786140 -1.967150 -9.415440 +v -6.786140 -1.967150 8.793510 +v -6.786140 -3.033999 8.793510 +v 5.732520 -1.967150 -9.415440 +v 5.732520 -3.033999 -9.415440 +v 5.732520 -3.033999 8.793510 +v 5.732520 -1.967150 8.793510 +v -2.233900 -3.033999 -9.415440 +v -2.233900 -1.967150 -9.415440 +v -2.233900 -1.967150 8.793510 +v -2.233900 -3.033999 8.793510 +v 2.318340 -3.033999 -9.415440 +v 2.318340 -1.967150 -9.415440 +v 2.318340 -1.967150 8.793510 +v 2.318340 -3.033999 8.793510 +v -3.371960 -3.033999 8.793510 +v -3.371960 -1.967150 8.793510 +v -3.371960 -1.967150 -9.415440 +v -3.371960 -3.033999 -9.415440 +v 2.318340 0.276645 8.793510 +v 1.180280 -1.967150 8.793510 +v 5.732520 0.276645 8.793510 +v 5.732520 1.039180 8.793510 +v 6.870580 0.276645 8.793510 +v 6.870580 -1.967150 8.793510 +v 2.318340 1.039180 8.793510 +v 1.180280 0.276645 8.793510 +v 1.180280 1.039180 8.793510 +v 1.180280 -3.033999 8.793510 +v -2.233900 0.276645 8.793510 +v -3.371960 0.276645 8.793510 +v -2.233900 1.039180 8.793510 +v -3.371960 1.039180 8.793510 +v -6.786140 0.276645 8.793510 +v -7.786200 0.276645 8.793510 +v -7.786200 -1.967150 8.793510 +v -6.786140 1.039180 8.793510 +v 1.180280 -1.967150 -9.415440 +v 1.180280 -3.033999 -9.415440 +v 2.318340 0.276645 -9.415440 +v 1.180280 0.276645 -9.415440 +v 2.318340 1.039180 -9.415440 +v 5.732520 0.276645 -9.415440 +v 6.870580 -1.967150 -9.415440 +v 5.732520 1.039180 -9.415440 +v 6.870580 0.276645 -9.415440 +v 0.042220 1.039180 -9.415440 +v 1.180280 1.039180 -9.415440 +v 0.042220 -1.967150 -9.415440 +v -1.095840 -1.967150 -9.415440 +v -2.233900 0.276645 -9.415440 +v -3.371960 0.276645 -9.415440 +v -2.233900 1.039180 -9.415440 +v -1.095840 1.039180 -9.415440 +v -3.371960 1.039180 -9.415440 +v -6.786140 0.276645 -9.415440 +v -6.786140 1.039180 -9.415440 +v -7.786200 -1.967150 -9.415440 +v -7.786200 0.276645 -9.415440 +v -1.095840 0.156645 -12.044100 +v -1.095840 -4.601110 -9.415440 +v -1.095840 1.039181 -10.802900 +v -1.095840 2.868579 -10.802900 +v -1.095840 2.868580 -7.883420 +v -1.095840 3.746069 -12.034100 +v -1.095840 3.746070 -7.883420 +v -1.095840 0.156645 -14.294900 +v -1.095840 -4.601110 -14.284900 +v 0.042220 -4.601110 -14.284900 +v 0.042220 -4.601110 -9.415440 +v 0.042220 1.039181 -10.802900 +v 0.042220 0.156645 -12.044100 +v 0.042220 2.868579 -10.802900 +v 0.042220 0.156645 -14.294900 +v 0.042220 3.746069 -12.034100 +v 0.042220 3.746070 -7.883420 +v 0.042220 2.868580 -7.883420 +v -1.096322 -3.033999 -9.415440 +v 0.044046 -3.035397 -9.415440 +vt 1.000000 0.187500 +vt -1.000000 0.312500 +vt 1.000000 0.312500 +vt 0.687500 1.000000 +vt 0.500000 0.875000 +vt 0.500000 0.625000 +vt -1.000000 0.062500 +vt 1.000000 0.062500 +vt 1.000000 -0.000000 +vt -1.000000 0.125000 +vt 1.000000 0.125000 +vt 0.437500 0.125000 +vt 0.312500 0.500000 +vt 0.312500 0.125000 +vt 1.000000 0.625000 +vt -1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.187500 0.687500 +vt -0.187500 0.687500 +vt -0.187500 0.312500 +vt 1.000000 0.812500 +vt -1.000000 0.937500 +vt -1.000000 0.812500 +vt 0.812500 0.687500 +vt 1.187500 0.687500 +vt 0.812500 0.312500 +vt 1.000000 0.562500 +vt 0.312500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.750000 +vt -1.000000 0.875000 +vt -1.000000 0.750000 +vt -1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.437500 0.625000 +vt 0.562500 0.437500 +vt 0.562500 0.625000 +vt -1.000000 0.437500 +vt -1.000000 0.000000 +vt 0.500000 0.062500 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt -1.000000 0.250000 +vt -1.000000 0.687500 +vt 1.000000 0.687500 +vt 0.625000 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.250000 +vt 1.000000 0.937500 +vt 0.437500 0.812500 +vt 0.312500 0.312500 +vt 0.312500 0.812500 +vt 0.437500 0.312500 +vt 0.437500 0.437500 +vt 0.687500 0.812500 +vt 0.000000 0.687500 +vt 0.000000 0.812500 +vt -1.000000 0.562500 +vt 0.875000 0.812500 +vt 0.875000 0.687500 +vt 0.250000 0.312500 +vt 0.562500 0.187500 +vt 0.250000 0.187500 +vt -1.000000 0.187500 +vt 0.312500 0.625000 +vt 0.312500 0.187500 +vt 0.312500 -0.187500 +vt 1.000000 -0.187500 +vt 0.687500 0.500000 +vt -0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.437500 0.500000 +vt -1.000000 0.625000 +vt 0.812500 0.187500 +vt 1.187500 0.187500 +vt 1.187500 0.312500 +vt 1.312500 0.312500 +vt 1.312500 0.687500 +vt 0.687500 0.187500 +vt 0.687500 0.312500 +vt 1.187500 0.812500 +vt 0.812500 0.812500 +vt 0.187500 0.312500 +vt 0.312500 0.687500 +vt 0.687500 0.687500 +vt -0.187500 0.187500 +vt 0.187500 0.187500 +vt -0.312500 0.687500 +vt -0.312500 0.312500 +vt 0.187500 0.812500 +vt -0.187500 0.812500 +vt 0.437500 0.687500 +vt 0.437500 0.187500 +vt 0.562500 0.812500 +vt 0.562500 0.687500 +vt 0.312500 0.562500 +vt 1.000000 0.875000 +vt 0.375000 0.062500 +vt -1.000000 0.375000 +vt 0.625000 0.500000 +vt 0.875000 0.562500 +vt 0.937500 0.812500 +vt 0.937500 0.687500 +vt 0.875000 0.937500 +vt 0.562500 0.312500 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.002100 -1.000000 +vn 0.001200 -1.000000 0.000000 +vn 0.000000 0.002800 -1.000000 +vn -0.001200 -1.000000 0.000200 +g boats_boat_boats_boat_None +usemtl None +s off +f 41/1/1 27/2/1 43/3/1 +f 76/4/2 74/5/2 72/6/2 +f 8/7/2 6/1/2 5/8/2 +f 15/9/1 13/10/1 16/11/1 +f 51/12/3 71/13/3 50/14/3 +f 56/15/2 32/16/2 53/17/2 +f 15/18/3 8/19/3 23/20/3 +f 22/21/2 40/22/2 39/23/2 +f 19/24/4 2/25/4 53/26/4 +f 70/27/5 62/28/5 69/29/5 +f 11/30/5 19/31/5 10/32/5 +f 4/15/5 20/33/5 17/34/5 +f 72/35/3 64/36/3 63/37/3 +f 13/8/5 7/38/5 16/7/5 +f 23/39/6 47/11/6 44/9/6 +f 68/40/7 70/41/7 69/42/7 +f 80/43/8 40/10/8 30/11/8 +f 3/15/1 1/32/1 4/30/1 +f 20/44/2 18/27/2 17/45/2 +f 74/17/5 65/46/5 64/47/5 +f 31/43/1 54/47/1 52/48/1 +f 22/47/5 14/43/5 15/48/5 +f 46/1/2 23/7/2 44/8/2 +f 57/21/1 38/22/1 58/49/1 +f 61/50/9 76/51/9 73/52/9 +f 37/45/5 2/23/5 3/21/5 +f 78/28/3 67/53/3 65/54/3 +f 64/5/1 66/4/1 63/6/1 +f 76/55/6 67/56/6 77/57/6 +f 47/17/2 26/10/2 45/11/2 +f 5/16/5 26/47/5 8/17/5 +f 33/58/6 48/59/6 55/60/6 +f 29/38/2 42/3/2 49/29/2 +f 32/44/6 52/21/6 53/45/6 +f 58/15/6 34/33/6 56/34/6 +f 27/7/6 46/29/6 43/8/6 +f 73/61/6 68/62/6 61/63/6 +f 21/58/6 42/29/6 28/38/6 +f 11/29/1 9/58/1 12/27/1 +f 59/45/1 36/2/1 60/3/1 +f 60/9/6 35/10/6 57/11/6 +f 41/1/1 21/64/1 27/2/1 +f 72/6/2 48/65/2 50/66/2 +f 50/66/2 71/67/2 70/68/2 +f 70/68/2 75/17/2 73/69/2 +f 76/4/2 77/70/2 74/5/2 +f 77/70/2 78/71/2 74/5/2 +f 50/66/2 70/68/2 73/69/2 +f 73/69/2 76/4/2 72/6/2 +f 72/6/2 50/66/2 73/69/2 +f 8/7/2 7/64/2 6/1/2 +f 15/9/1 14/39/1 13/10/1 +f 51/12/3 62/72/3 71/13/3 +f 56/15/2 34/73/2 32/16/2 +f 32/26/3 34/74/3 38/75/3 +f 35/76/3 36/77/3 37/78/3 +f 32/26/3 38/75/3 35/76/3 +f 29/66/3 33/79/3 31/80/3 +f 32/26/3 35/76/3 3/25/3 +f 28/51/3 29/66/3 31/80/3 +f 31/80/3 32/26/3 18/24/3 +f 3/25/3 4/81/3 17/82/3 +f 35/76/3 37/78/3 3/25/3 +f 21/83/3 28/51/3 22/84/3 +f 3/25/3 17/82/3 18/24/3 +f 11/85/3 12/55/3 30/52/3 +f 32/26/3 3/25/3 18/24/3 +f 11/85/3 30/52/3 22/84/3 +f 31/80/3 18/24/3 11/85/3 +f 24/86/3 27/87/3 21/83/3 +f 28/51/3 31/80/3 11/85/3 +f 11/85/3 22/84/3 28/51/3 +f 24/86/3 21/83/3 23/20/3 +f 26/88/3 25/89/3 23/20/3 +f 23/20/3 21/83/3 15/18/3 +f 15/18/3 16/90/3 7/91/3 +f 21/83/3 22/84/3 15/18/3 +f 8/19/3 26/88/3 23/20/3 +f 15/18/3 7/91/3 8/19/3 +f 22/21/2 30/49/2 40/22/2 +f 47/89/4 45/88/4 5/19/4 +f 5/19/4 6/91/4 13/90/4 +f 5/19/4 13/90/4 14/18/4 +f 44/20/4 47/89/4 5/19/4 +f 43/87/4 46/86/4 44/20/4 +f 41/83/4 43/87/4 44/20/4 +f 44/20/4 5/19/4 14/18/4 +f 39/84/4 40/52/4 80/50/4 +f 44/20/4 14/18/4 41/83/4 +f 42/51/4 41/83/4 39/84/4 +f 39/84/4 80/50/4 50/92/4 +f 41/83/4 14/18/4 39/84/4 +f 48/93/4 49/66/4 42/51/4 +f 50/92/4 48/93/4 42/51/4 +f 80/50/4 79/94/4 50/92/4 +f 50/92/4 42/51/4 39/84/4 +f 54/79/4 55/62/4 52/80/4 +f 50/92/4 79/94/4 51/95/4 +f 52/80/4 55/62/4 51/95/4 +f 51/95/4 79/94/4 10/85/4 +f 79/94/4 9/55/4 10/85/4 +f 53/26/4 52/80/4 10/85/4 +f 58/75/4 56/74/4 53/26/4 +f 59/78/4 60/77/4 57/76/4 +f 57/76/4 58/75/4 53/26/4 +f 52/80/4 51/95/4 10/85/4 +f 19/24/4 20/82/4 1/81/4 +f 53/26/4 10/85/4 19/24/4 +f 59/78/4 57/76/4 2/25/4 +f 19/24/4 1/81/4 2/25/4 +f 2/25/4 57/76/4 53/26/4 +f 70/27/5 71/96/5 62/28/5 +f 11/30/5 18/97/5 19/31/5 +f 4/15/5 1/73/5 20/33/5 +f 72/35/3 74/54/3 64/36/3 +f 13/8/5 6/29/5 7/38/5 +f 23/39/6 25/10/6 47/11/6 +f 68/40/7 75/98/7 70/41/7 +f 30/11/5 12/17/5 79/99/5 +f 79/99/10 80/43/10 30/11/10 +f 12/17/5 9/16/5 79/99/5 +f 3/15/1 2/73/1 1/32/1 +f 20/44/2 19/58/2 18/27/2 +f 74/17/5 78/100/5 65/46/5 +f 31/43/1 33/99/1 54/47/1 +f 22/47/5 39/99/5 14/43/5 +f 46/1/2 24/64/2 23/7/2 +f 57/21/1 35/23/1 38/22/1 +f 61/50/9 66/53/9 76/51/9 +f 37/45/5 59/44/5 2/23/5 +f 78/28/3 77/51/3 67/53/3 +f 62/67/1 51/66/1 69/68/1 +f 51/66/1 55/65/1 63/6/1 +f 68/17/1 69/68/1 61/69/1 +f 61/69/1 69/68/1 51/66/1 +f 61/69/1 51/66/1 63/6/1 +f 65/71/1 67/70/1 64/5/1 +f 61/69/1 63/6/1 66/4/1 +f 64/5/1 67/70/1 66/4/1 +f 76/55/6 66/85/6 67/56/6 +f 47/17/2 25/16/2 26/10/2 +f 5/16/5 45/99/5 26/47/5 +f 55/60/6 54/101/6 33/58/6 +f 33/58/6 29/22/6 48/59/6 +f 48/59/6 72/102/6 63/103/6 +f 29/22/6 49/104/6 48/59/6 +f 48/59/6 63/103/6 55/60/6 +f 29/38/2 28/2/2 42/3/2 +f 32/44/6 31/23/6 52/21/6 +f 58/15/6 38/73/6 34/33/6 +f 27/7/6 24/38/6 46/29/6 +f 73/61/6 75/105/6 68/62/6 +f 21/58/6 41/27/6 42/29/6 +f 11/29/1 10/38/1 9/58/1 +f 59/45/1 37/44/1 36/2/1 +f 60/9/6 36/39/6 35/10/6 diff --git a/data/games/garage/mods/boats/textures/boats_inventory.png b/data/games/garage/mods/boats/textures/boats_inventory.png new file mode 100644 index 0000000..f9d082e Binary files /dev/null and b/data/games/garage/mods/boats/textures/boats_inventory.png differ diff --git a/data/games/garage/mods/boats/textures/boats_wield.png b/data/games/garage/mods/boats/textures/boats_wield.png new file mode 100644 index 0000000..f998b5b Binary files /dev/null and b/data/games/garage/mods/boats/textures/boats_wield.png differ diff --git a/data/games/garage/mods/bones/README.txt b/data/games/garage/mods/bones/README.txt new file mode 100644 index 0000000..219cc30 --- /dev/null +++ b/data/games/garage/mods/bones/README.txt @@ -0,0 +1,12 @@ +Minetest Game mod: bones +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +All textures: paramat (CC BY-SA 3.0) diff --git a/data/games/garage/mods/bones/init.lua b/data/games/garage/mods/bones/init.lua new file mode 100644 index 0000000..797224c --- /dev/null +++ b/data/games/garage/mods/bones/init.lua @@ -0,0 +1,310 @@ +-- bones/init.lua + +-- Minetest Game mod: bones +-- See README.txt for licensing and other information. + +-- Load support for MT game translation. +local S = minetest.get_translator("bones") + +bones = {} + +local function is_owner(pos, name) + local owner = minetest.get_meta(pos):get_string("owner") + if owner == "" or owner == name or minetest.check_player_privs(name, "protection_bypass") then + return true + end + return false +end + +local function drop(pos, itemstack) + local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count())) + if obj then + obj:set_velocity({ + x = math.random(-10, 10) / 9, + y = 5, + z = math.random(-10, 10) / 9, + }) + end +end + +local function drop_contents(pos) + local inv = minetest.get_meta(pos):get_inventory() + + for i = 1, inv:get_size("main") do + local stk = inv:get_stack("main", i) + drop(pos, stk) + end + minetest.remove_node(pos) +end + +local bones_formspec = + "size[8,9]" .. + "list[current_name;main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + +local share_bones_time = tonumber(minetest.settings:get("share_bones_time")) or 1200 +local share_bones_time_early = tonumber(minetest.settings:get("share_bones_time_early")) or share_bones_time / 4 + +local bones_def = { + description = S("Bones"), + tiles = { + "bones_top.png^[transform2", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "bones_front.png" + }, + paramtype2 = "facedir", + groups = {dig_immediate = 2}, + sounds = default.node_sound_gravel_defaults(), + + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + local name = "" + if player then + name = player:get_player_name() + end + return is_owner(pos, name) and inv:is_empty("main") + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if is_owner(pos, player:get_player_name()) then + return count + end + return 0 + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return 0 + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if is_owner(pos, player:get_player_name()) then + return stack:get_count() + end + return 0 + end, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if meta:get_inventory():is_empty("main") then + local inv = player:get_inventory() + if inv:room_for_item("main", {name = "bones:bones"}) then + inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos, "bones:bones") + end + minetest.remove_node(pos) + end + end, + + on_punch = function(pos, node, player) + if not is_owner(pos, player:get_player_name()) then + return + end + + if not player:is_player() then + drop_contents(pos) + return + end + + if minetest.get_meta(pos):get_string("infotext") == "" then + return + end + + local inv = minetest.get_meta(pos):get_inventory() + local player_inv = player:get_inventory() + local has_space = true + + for i = 1, inv:get_size("main") do + local stk = inv:get_stack("main", i) + if player_inv:room_for_item("main", stk) then + inv:set_stack("main", i, nil) + player_inv:add_item("main", stk) + else + has_space = false + break + end + end + + -- remove bones if player emptied them + if has_space then + if player_inv:room_for_item("main", {name = "bones:bones"}) then + player_inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos,"bones:bones") + end + minetest.remove_node(pos) + end + end, + + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local time = meta:get_int("time") + elapsed + if time >= share_bones_time then + meta:set_string("infotext", S("@1's old bones", meta:get_string("owner"))) + meta:set_string("owner", "") + else + meta:set_int("time", time) + return true + end + end, + on_blast = function(pos) + end, +} + +default.set_inventory_action_loggers(bones_def, "bones") + +minetest.register_node("bones:bones", bones_def) + +local function may_replace(pos, player) + local node_name = minetest.get_node(pos).name + local node_definition = minetest.registered_nodes[node_name] + + -- if the node is unknown, we return false + if not node_definition then + return false + end + + -- allow replacing air + if node_name == "air" then + return true + end + + -- don't replace nodes inside protections + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + + -- allow replacing liquids + if node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + return node_definition.buildable_to +end + +local player_inventory_lists = { "main", "craft" } +bones.player_inventory_lists = player_inventory_lists + +local function is_all_empty(player_inv) + for _, list_name in ipairs(player_inventory_lists) do + if not player_inv:is_empty(list_name) then + return false + end + end + return true +end + +minetest.register_on_dieplayer(function(player) + local bones_mode = minetest.settings:get("bones_mode") or "bones" + if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then + bones_mode = "bones" + end + + local bones_position_message = minetest.settings:get_bool("bones_position_message") == true + local player_name = player:get_player_name() + local pos = vector.round(player:get_pos()) + local pos_string = minetest.pos_to_string(pos) + + -- return if keep inventory set or in creative mode + if bones_mode == "keep" or minetest.is_creative_enabled(player_name) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string)) + end + return + end + + local player_inv = player:get_inventory() + if is_all_empty(player_inv) then + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". No bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string)) + end + return + end + + -- check if it's possible to place bones, if not find space near player + if bones_mode == "bones" and not may_replace(pos, player) then + local air = minetest.find_node_near(pos, 1, {"air"}) + if air then + pos = air + else + bones_mode = "drop" + end + end + + if bones_mode == "drop" then + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + drop(pos, player_inv:get_stack(list_name, i)) + end + player_inv:set_list(list_name, {}) + end + drop(pos, ItemStack("bones:bones")) + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Inventory dropped") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2, and dropped their inventory.", player_name, pos_string)) + end + return + end + + local param2 = minetest.dir_to_facedir(player:get_look_dir()) + minetest.set_node(pos, {name = "bones:bones", param2 = param2}) + + minetest.log("action", player_name .. " dies at " .. pos_string .. + ". Bones placed") + if bones_position_message then + minetest.chat_send_player(player_name, S("@1 died at @2, and bones were placed.", player_name, pos_string)) + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 8 * 4) + + for _, list_name in ipairs(player_inventory_lists) do + for i = 1, player_inv:get_size(list_name) do + local stack = player_inv:get_stack(list_name, i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else -- no space left + drop(pos, stack) + end + end + player_inv:set_list(list_name, {}) + end + + meta:set_string("formspec", bones_formspec) + meta:set_string("owner", player_name) + + if share_bones_time ~= 0 then + meta:set_string("infotext", S("@1's fresh bones", player_name)) + + if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then + meta:set_int("time", 0) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", S("@1's bones", player_name)) + end +end) diff --git a/data/games/garage/mods/bones/license.txt b/data/games/garage/mods/bones/license.txt new file mode 100644 index 0000000..5c20a9c --- /dev/null +++ b/data/games/garage/mods/bones/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + diff --git a/data/games/garage/mods/bones/locale/bones.de.tr b/data/games/garage/mods/bones/locale/bones.de.tr new file mode 100644 index 0000000..83f5c28 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.de.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Knochen +@1's old bones=Alte Knochen von @1 +@1 died at @2.=@1 starb bei @2. +@1 died at @2, and dropped their inventory.=@1 starb bei @2 und ließ das Inventar fallen. +@1 died at @2, and bones were placed.=@1 starb bei @2 und Knochen wurden platziert. +@1's fresh bones=Frische Knochen von @1 +@1's bones=Knochen von @1 diff --git a/data/games/garage/mods/bones/locale/bones.eo.tr b/data/games/garage/mods/bones/locale/bones.eo.tr new file mode 100644 index 0000000..d8028f1 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.eo.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ostoj +@1's old bones=La malfreŝaj ostoj de @1 +@1 died at @2.=@1 mortis ĉe @2 +@1 died at @2, and dropped their inventory.=@1 mortis ĉe @2, kaj delasis sian stokon. +@1 died at @2, and bones were placed.=@1 mortis ĉe @2, kaj ostoj estas demetitaj. +@1's fresh bones=La freŝaj ostoj de @1 +@1's bones=La ostoj de @1 diff --git a/data/games/garage/mods/bones/locale/bones.es.tr b/data/games/garage/mods/bones/locale/bones.es.tr new file mode 100644 index 0000000..9c45513 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.es.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Huesos +@1's old bones=Huesos antiguos de @1 +@1 died at @2.=@1 murió en @2. +@1 died at @2, and dropped their inventory.=@1 murió en @2, y su inventario se desprendió. +@1 died at @2, and bones were placed.=@1 murió en @2, y sus huesos fueron depositados. +@1's fresh bones=Huesos recientes de @1 +@1's bones=Huesos de @1 diff --git a/data/games/garage/mods/bones/locale/bones.fr.tr b/data/games/garage/mods/bones/locale/bones.fr.tr new file mode 100644 index 0000000..cfe01ee --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.fr.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Os +@1's old bones=Vieux os de @1 +@1 died at @2.=@1 est mort à @2. +@1 died at @2, and dropped their inventory.=@1 est mort à @2 et a laissé tomber son inventaire. +@1 died at @2, and bones were placed.=@1 est mort à @2 et ses os ont été placés. +@1's fresh bones=Os frais de @1 +@1's bones=Os de @1 diff --git a/data/games/garage/mods/bones/locale/bones.id.tr b/data/games/garage/mods/bones/locale/bones.id.tr new file mode 100644 index 0000000..3c81acc --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.id.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Tulang +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2 dan meninggalkan barangnya. +@1 died at @2, and bones were placed.=@1 mati di @2 dan tulangnya diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/data/games/garage/mods/bones/locale/bones.it.tr b/data/games/garage/mods/bones/locale/bones.it.tr new file mode 100644 index 0000000..ea3094e --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.it.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ossa +@1's old bones=Ossa vecchie di @1 +@1 died at @2.=@1 è morto alla posizione @2. +@1 died at @2, and dropped their inventory.=@1 è morto alla posizione @2, e ha lasciato a terra il contenuto del suo inventario. +@1 died at @2, and bones were placed.=@1 è morto alla posizione @2, e vi sono state posizionate delle ossa. +@1's fresh bones=Ossa fresche di @1 +@1's bones=Ossa di @1 diff --git a/data/games/garage/mods/bones/locale/bones.ja.tr b/data/games/garage/mods/bones/locale/bones.ja.tr new file mode 100644 index 0000000..8c3f732 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.ja.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=骨 +@1's old bones=@1の古い骨 +@1 died at @2.=@1は@2で死亡しました。 +@1 died at @2, and dropped their inventory.=@1は@2で死亡して持ち物を落としました。 +@1 died at @2, and bones were placed.=@1は@2で死亡して骨が残されました。 +@1's fresh bones=@1の新鮮な骨 +@1's bones=@1の骨 diff --git a/data/games/garage/mods/bones/locale/bones.jbo.tr b/data/games/garage/mods/bones/locale/bones.jbo.tr new file mode 100644 index 0000000..cbb476e --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.jbo.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=lo bongu gunma +@1's old bones=.i ti tolci'o ke bongu gunma po'a la'o zo'i.@1.zo'i +@1 died at @2.=.i la'o zo'i.@1.zo'i pu morsi di'o lo me zoi pos.@2.pos. +@1 died at @2, and dropped their inventory.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije ly. te farlu lo me le dacti liste po ly. +@1 died at @2, and bones were placed.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije lo bongu gunma pu se punji +@1's fresh bones=.i ti cnino ke bongu gunma po'a la'o zo'i.@1.zo'i +@1's bones=.i ti bongu gunma po'a la'o zo'i.@1.zo'i diff --git a/data/games/garage/mods/bones/locale/bones.lv.tr b/data/games/garage/mods/bones/locale/bones.lv.tr new file mode 100644 index 0000000..eb2fce2 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.lv.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Kauli +@1's old bones=@1 vecie kauli +@1 died at @2.=@1 nomira @2. +@1 died at @2, and dropped their inventory.=@1 nomira @2 pazaudēja inventāru. +@1 died at @2, and bones were placed.=@1 nomira @2, un kauli nolikti. +@1's fresh bones=@1 jaunie kauli +@1's bones=@1 kauli diff --git a/data/games/garage/mods/bones/locale/bones.ms.tr b/data/games/garage/mods/bones/locale/bones.ms.tr new file mode 100644 index 0000000..e4b8712 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.ms.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Tulang +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2, dan menjatuhkan inventorinya. +@1 died at @2, and bones were placed.=@1 mati di @2, dan tulang diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/data/games/garage/mods/bones/locale/bones.pl.tr b/data/games/garage/mods/bones/locale/bones.pl.tr new file mode 100644 index 0000000..be48a0c --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.pl.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Kości +@1's old bones=Stare kości @1 +@1 died at @2.=@1 umarł w @2. +@1 died at @2, and dropped their inventory.=@1 umarł w @2, i upuścił swój ekwipunek. +@1 died at @2, and bones were placed.=@1 umarł w @2, kości zostały położone. +@1's fresh bones=Świeże kości @1 +@1's bones=Kości @1 diff --git a/data/games/garage/mods/bones/locale/bones.pt_BR.tr b/data/games/garage/mods/bones/locale/bones.pt_BR.tr new file mode 100644 index 0000000..31339af --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ossos +@1's old bones=Ossos antigos de @1 +@1 died at @2.=@1 morreu em @2. +@1 died at @2, and dropped their inventory.=@1 morreu em @2, e seu inventário foi derrubado. +@1 died at @2, and bones were placed.=@1 morreu em @2, e os ossos foram colocados. +@1's fresh bones=Ossos recentes de @1 +@1's bones=Ossos de @1 diff --git a/data/games/garage/mods/bones/locale/bones.ru.tr b/data/games/garage/mods/bones/locale/bones.ru.tr new file mode 100644 index 0000000..0bc5eaf --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.ru.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Кости +@1's old bones=Старые кости @1 +@1 died at @2.=Игрок @1 умер в @2. +@1 died at @2, and dropped their inventory.=Игрок @1 умер в @2 и потерял содержимое своего инвентаря. +@1 died at @2, and bones were placed.=Игрок @1 умер в @2, кости размещены. +@1's fresh bones=Новые кости @1 +@1's bones=Кости @1 diff --git a/data/games/garage/mods/bones/locale/bones.sk.tr b/data/games/garage/mods/bones/locale/bones.sk.tr new file mode 100644 index 0000000..a32c17d --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.sk.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Kosti +@1's old bones=Staré kosti hráča @1 +@1 died at @2.=@1 zomrel na pozícií @2. +@1 died at @2, and dropped their inventory.=@1 zomrel na pozícií @2 a vysypal svoj inventár. +@1 died at @2, and bones were placed.=@1 zomrel na pozícií @2 a ostali po ňom kosti. +@1's fresh bones=Čerstvé kosti hráča @1 +@1's bones=Kosti hráča @1 diff --git a/data/games/garage/mods/bones/locale/bones.sv.tr b/data/games/garage/mods/bones/locale/bones.sv.tr new file mode 100644 index 0000000..9df9b0f --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.sv.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Ben +@1's old bones=@1s Gamla ben +@1 died at @2.=@1 dog på @2. +@1 died at @2, and dropped their inventory.=@1 dog på @2, och tappade deras saker. +@1 died at @2, and bones were placed.=@1 dog på @2, och deras ben var placerade. +@1's fresh bones=@1s färska ben +@1's bones=@1s ben diff --git a/data/games/garage/mods/bones/locale/bones.uk.tr b/data/games/garage/mods/bones/locale/bones.uk.tr new file mode 100644 index 0000000..00b4ff4 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.uk.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=Кістки +@1's old bones=Старі кістки @1 +@1 died at @2.=@1 загинув на координатах @2. +@1 died at @2, and dropped their inventory.=@1 загинув на координатах @2 та втратив вміст свого інвентарю. +@1 died at @2, and bones were placed.=@1 загинув на координатах @2, було розміщено кістки. +@1's fresh bones=Свіжі кістки @1 +@1's bones=Кістки @1 diff --git a/data/games/garage/mods/bones/locale/bones.zh_CN.tr b/data/games/garage/mods/bones/locale/bones.zh_CN.tr new file mode 100644 index 0000000..7911e37 --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.zh_CN.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=骨骸 +@1's old bones=@1的旧骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2死亡,丢掉了所有物品。 +@1 died at @2, and bones were placed.=@1在@2死亡,已放置骨骸。 +@1's fresh bones=@1的新鲜骨骸 +@1's bones=@1的骨骸 diff --git a/data/games/garage/mods/bones/locale/bones.zh_TW.tr b/data/games/garage/mods/bones/locale/bones.zh_TW.tr new file mode 100644 index 0000000..1a94d2f --- /dev/null +++ b/data/games/garage/mods/bones/locale/bones.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: bones +Bones=骨骸 +@1's old bones=@1的舊骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2死亡,丟掉了物品欄。 +@1 died at @2, and bones were placed.=@1在@2死亡,骨骸被放置。 +@1's fresh bones=@1的新鮮骨骸 +@1's bones=@1的骨骸 diff --git a/data/games/garage/mods/bones/locale/template.txt b/data/games/garage/mods/bones/locale/template.txt new file mode 100644 index 0000000..4ac8d45 --- /dev/null +++ b/data/games/garage/mods/bones/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: bones +Bones= +@1's old bones= +@1 died at @2.= +@1 died at @2, and dropped their inventory.= +@1 died at @2, and bones were placed.= +@1's fresh bones= +@1's bones= diff --git a/data/games/garage/mods/bones/mod.conf b/data/games/garage/mods/bones/mod.conf new file mode 100644 index 0000000..371997b --- /dev/null +++ b/data/games/garage/mods/bones/mod.conf @@ -0,0 +1,3 @@ +name = bones +description = Minetest Game mod: bones +depends = default diff --git a/data/games/garage/mods/bones/textures/bones_bottom.png b/data/games/garage/mods/bones/textures/bones_bottom.png new file mode 100644 index 0000000..d3d5d32 Binary files /dev/null and b/data/games/garage/mods/bones/textures/bones_bottom.png differ diff --git a/data/games/garage/mods/bones/textures/bones_front.png b/data/games/garage/mods/bones/textures/bones_front.png new file mode 100644 index 0000000..1617d8f Binary files /dev/null and b/data/games/garage/mods/bones/textures/bones_front.png differ diff --git a/data/games/garage/mods/bones/textures/bones_rear.png b/data/games/garage/mods/bones/textures/bones_rear.png new file mode 100644 index 0000000..05ee2a1 Binary files /dev/null and b/data/games/garage/mods/bones/textures/bones_rear.png differ diff --git a/data/games/garage/mods/bones/textures/bones_side.png b/data/games/garage/mods/bones/textures/bones_side.png new file mode 100644 index 0000000..c8ac505 Binary files /dev/null and b/data/games/garage/mods/bones/textures/bones_side.png differ diff --git a/data/games/garage/mods/bones/textures/bones_top.png b/data/games/garage/mods/bones/textures/bones_top.png new file mode 100644 index 0000000..63786da Binary files /dev/null and b/data/games/garage/mods/bones/textures/bones_top.png differ diff --git a/data/games/garage/mods/broken/init.lua b/data/games/garage/mods/broken/init.lua deleted file mode 100644 index dcbc47d..0000000 --- a/data/games/garage/mods/broken/init.lua +++ /dev/null @@ -1,11 +0,0 @@ --- Register stuff with empty definitions to test if Luanti fallback options --- for these things work properly. - --- The itemstrings are deliberately kept descriptive to keep them easy to --- recognize. - -core.register_node("broken:node_with_empty_definition", {}) -core.register_tool("broken:tool_with_empty_definition", {}) -core.register_craftitem("broken:craftitem_with_empty_definition", {}) - -core.register_entity("broken:entity_with_empty_definition", {}) diff --git a/data/games/garage/mods/broken/mod.conf b/data/games/garage/mods/broken/mod.conf deleted file mode 100644 index a24378a..0000000 --- a/data/games/garage/mods/broken/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = broken -description = Register items and an entity with empty definitions to test fallback diff --git a/data/games/garage/mods/bucket/README.txt b/data/games/garage/mods/bucket/README.txt new file mode 100644 index 0000000..d19f873 --- /dev/null +++ b/data/games/garage/mods/bucket/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: bucket +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Kahrl (LGPLv2.1+) +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures) +--------------------------- +ElementW (CC BY-SA 3.0) diff --git a/data/games/garage/mods/bucket/init.lua b/data/games/garage/mods/bucket/init.lua index bce5843..b026ee0 100644 --- a/data/games/garage/mods/bucket/init.lua +++ b/data/games/garage/mods/bucket/init.lua @@ -1,27 +1,248 @@ --- Bucket: Punch liquid source or flowing liquid to collect it +-- Minetest Game mod: bucket +-- See README.txt for licensing and other information. -core.register_tool("bucket:bucket", { - description = "Bucket".."\n".. - "Picks up liquid nodes", +-- Load support for MT game translation. +local S = minetest.get_translator("bucket") + + +minetest.register_alias("bucket", "bucket:bucket_empty") +minetest.register_alias("bucket_water", "bucket:bucket_water") +minetest.register_alias("bucket_lava", "bucket:bucket_lava") + +minetest.register_craft({ + output = "bucket:bucket_empty 1", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + } +}) + +bucket = {} +bucket.liquids = {} + +local function check_protection(pos, name, text) + if minetest.is_protected(pos, name) then + minetest.log("action", (name ~= "" and name or "A mod") + .. " tried to " .. text + .. " at protected position " + .. minetest.pos_to_string(pos) + .. " with a bucket") + minetest.record_protection_violation(pos, name) + return true + end + return false +end + +local function log_action(pos, name, action) + minetest.log("action", (name ~= "" and name or "A mod") + .. " " .. action .. " at " .. minetest.pos_to_string(pos) .. " with a bucket") +end + +-- Register a new liquid +-- source = name of the source node +-- flowing = name of the flowing node +-- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- inventory_image = texture of the new bucket item (ignored if itemname == nil) +-- name = text description of the bucket item +-- groups = (optional) groups of the bucket item, for example {water_bucket = 1} +-- force_renew = (optional) bool. Force the liquid source to renew if it has a +-- source neighbour, even if defined as 'liquid_renewable = false'. +-- Needed to avoid creating holes in sloping rivers. +-- This function can be called from any mod (that depends on bucket). +function bucket.register_liquid(source, flowing, itemname, inventory_image, name, + groups, force_renew) + bucket.liquids[source] = { + source = source, + flowing = flowing, + itemname = itemname, + force_renew = force_renew, + } + bucket.liquids[flowing] = bucket.liquids[source] + + if itemname ~= nil then + minetest.register_craftitem(itemname, { + description = name, + inventory_image = inventory_image, + stack_max = 1, + liquids_pointable = true, + groups = groups, + + on_place = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return + end + + local node = minetest.get_node_or_nil(pointed_thing.under) + local ndef = node and minetest.registered_nodes[node.name] + + -- Call on_rightclick if the pointed node defines it + if ndef and ndef.on_rightclick and + not (user and user:is_player() and + user:get_player_control().sneak) then + return ndef.on_rightclick( + pointed_thing.under, + node, user, + itemstack) + end + + local lpos + + -- Check if pointing to a buildable node + if ndef and ndef.buildable_to then + -- buildable; replace the node + lpos = pointed_thing.under + else + -- not buildable to; place the liquid above + -- check if the node above can be replaced + + lpos = pointed_thing.above + node = minetest.get_node_or_nil(lpos) + local above_ndef = node and minetest.registered_nodes[node.name] + + if not above_ndef or not above_ndef.buildable_to then + -- do not remove the bucket with the liquid + return itemstack + end + end + + local pname = user and user:get_player_name() or "" + if check_protection(lpos, pname, "place "..source) then + return + end + + minetest.set_node(lpos, {name = source}) + log_action(lpos, pname, "placed " .. source) + return ItemStack("bucket:bucket_empty") + end + }) + end +end + +minetest.register_craftitem("bucket:bucket_empty", { + description = S("Empty Bucket"), inventory_image = "bucket.png", - stack_max = 1, + groups = {tool = 1}, liquids_pointable = true, - groups = { disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) - -- Must be pointing to node - if pointed_thing.type ~= "node" then + if pointed_thing.type == "object" then + pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil) + return user:get_wielded_item() + elseif pointed_thing.type ~= "node" then + -- do nothing if it's neither object nor node return end - -- Check if pointing to a liquid - local n = core.get_node(pointed_thing.under) - local def = core.registered_nodes[n.name] - if def ~= nil and (def.liquidtype == "source" or def.liquidtype == "flowing") then - core.add_node(pointed_thing.under, {name="air"}) - local inv = user:get_inventory() - if inv then - inv:add_item("main", ItemStack(n.name)) + -- Check if pointing to a liquid source + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local liquiddef = bucket.liquids[node.name] + local item_count = user:get_wielded_item():get_count() + + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source then + local pname = user:get_player_name() + if check_protection(pos, pname, "take ".. node.name) then + return end + + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + if inv:room_for_item("main", {name=liquiddef.itemname}) then + inv:add_item("main", liquiddef.itemname) + else + local upos = user:get_pos() + upos.y = math.floor(upos.y + 0.5) + minetest.add_item(upos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = "bucket:bucket_empty "..tostring(item_count-1) + + end + + -- force_renew requires a source neighbour + local source_neighbor = false + if liquiddef.force_renew then + source_neighbor = + minetest.find_node_near(pos, 1, liquiddef.source) + end + if source_neighbor and liquiddef.force_renew then + log_action(pos, pname, "picked up " .. liquiddef.source .. " (force renewed)") + else + minetest.add_node(pos, {name = "air"}) + log_action(pos, pname, "picked up " .. liquiddef.source) + end + + return ItemStack(giving_back) + else + -- non-liquid nodes will have their on_punch triggered + local node_def = minetest.registered_nodes[node.name] + if node_def then + node_def.on_punch(pos, node, user, pointed_thing) + end + return user:get_wielded_item() end end, }) +bucket.register_liquid( + "default:water_source", + "default:water_flowing", + "bucket:bucket_water", + "bucket_water.png", + S("Water Bucket"), + {tool = 1, water_bucket = 1} +) + +-- River water source is 'liquid_renewable = false' to avoid horizontal spread +-- of water sources in sloping rivers that can cause water to overflow +-- riverbanks and cause floods. +-- River water source is instead made renewable by the 'force renew' option +-- used here. + +bucket.register_liquid( + "default:river_water_source", + "default:river_water_flowing", + "bucket:bucket_river_water", + "bucket_river_water.png", + S("River Water Bucket"), + {tool = 1, water_bucket = 1}, + true +) + +bucket.register_liquid( + "default:lava_source", + "default:lava_flowing", + "bucket:bucket_lava", + "bucket_lava.png", + S("Lava Bucket"), + {tool = 1} +) + +minetest.register_craft({ + type = "fuel", + recipe = "bucket:bucket_lava", + burntime = 60, + replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}}, +}) + +-- Register buckets as dungeon loot +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + {name = "bucket:bucket_empty", chance = 0.55}, + -- water in deserts/ice or above ground, lava otherwise + {name = "bucket:bucket_water", chance = 0.45, + types = {"sandstone", "desert", "ice"}}, + {name = "bucket:bucket_water", chance = 0.45, y = {0, 32768}, + types = {"normal"}}, + {name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1}, + types = {"normal"}}, + }) +end diff --git a/data/games/garage/mods/bucket/license.txt b/data/games/garage/mods/bucket/license.txt new file mode 100644 index 0000000..6245d64 --- /dev/null +++ b/data/games/garage/mods/bucket/license.txt @@ -0,0 +1,51 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 Kahrl +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2011-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2015-2016 ElementW + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/bucket/locale/bucket.de.tr b/data/games/garage/mods/bucket/locale/bucket.de.tr new file mode 100644 index 0000000..570dff1 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.de.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Leerer Eimer +Water Bucket=Wassereimer +River Water Bucket=Flusswassereimer +Lava Bucket=Lavaeimer diff --git a/data/games/garage/mods/bucket/locale/bucket.eo.tr b/data/games/garage/mods/bucket/locale/bucket.eo.tr new file mode 100644 index 0000000..65d8ec8 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.eo.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Malplena sitelo +Water Bucket=Sitelo da akvo +River Water Bucket=Sitelo da rivera akvo +Lava Bucket=Sitelo da lafo diff --git a/data/games/garage/mods/bucket/locale/bucket.es.tr b/data/games/garage/mods/bucket/locale/bucket.es.tr new file mode 100644 index 0000000..91a0623 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.es.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Cubo vacío +Water Bucket=Cubo con agua +River Water Bucket=Cubo con agua de río +Lava Bucket=Cubo con lava diff --git a/data/games/garage/mods/bucket/locale/bucket.fr.tr b/data/games/garage/mods/bucket/locale/bucket.fr.tr new file mode 100644 index 0000000..5065150 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.fr.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Seau vide +Water Bucket=Seau d'eau +River Water Bucket=Seau d'eau de rivière +Lava Bucket=Seau de lave diff --git a/data/games/garage/mods/bucket/locale/bucket.id.tr b/data/games/garage/mods/bucket/locale/bucket.id.tr new file mode 100644 index 0000000..5662563 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.id.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Ember Kosong +Water Bucket=Ember Air +River Water Bucket=Ember Air Sungai +Lava Bucket=Ember Lava diff --git a/data/games/garage/mods/bucket/locale/bucket.it.tr b/data/games/garage/mods/bucket/locale/bucket.it.tr new file mode 100644 index 0000000..beca28c --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.it.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Secchio vuoto +Water Bucket=Secchio d'acqua +River Water Bucket=Secchio d'acqua di fiume +Lava Bucket=Secchio di lava diff --git a/data/games/garage/mods/bucket/locale/bucket.ja.tr b/data/games/garage/mods/bucket/locale/bucket.ja.tr new file mode 100644 index 0000000..06a401a --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.ja.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=空のバケツ +Water Bucket=水入りバケツ +River Water Bucket=河川水入りバケツ +Lava Bucket=溶岩入りバケツ diff --git a/data/games/garage/mods/bucket/locale/bucket.jbo.tr b/data/games/garage/mods/bucket/locale/bucket.jbo.tr new file mode 100644 index 0000000..e40d2b9 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.jbo.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=lo baktu be no da +Water Bucket=lo baktu be lo djacu +River Water Bucket=lo baktu be lo rirxe djacu +Lava Bucket=lo baktu be lo likro'i diff --git a/data/games/garage/mods/bucket/locale/bucket.lv.tr b/data/games/garage/mods/bucket/locale/bucket.lv.tr new file mode 100644 index 0000000..5d6e2c4 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.lv.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Tukšs spainis +Water Bucket=Spainis ar ūdeni +River Water Bucket=Spainis ar upes ūdeni +Lava Bucket=Spainis ar lavu diff --git a/data/games/garage/mods/bucket/locale/bucket.ms.tr b/data/games/garage/mods/bucket/locale/bucket.ms.tr new file mode 100644 index 0000000..02ba38a --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.ms.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Baldi Kosong +Water Bucket=Baldi Air +River Water Bucket=Baldi Air Sungai +Lava Bucket=Baldi Lava diff --git a/data/games/garage/mods/bucket/locale/bucket.pl.tr b/data/games/garage/mods/bucket/locale/bucket.pl.tr new file mode 100644 index 0000000..31600f1 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.pl.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Puste wiadro +Water Bucket=Wiadro z wodą +River Water Bucket=Wiadro z rzeczną wodą +Lava Bucket=Wiadro z lawą diff --git a/data/games/garage/mods/bucket/locale/bucket.pt_BR.tr b/data/games/garage/mods/bucket/locale/bucket.pt_BR.tr new file mode 100644 index 0000000..429acac --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Balde Vazio +Water Bucket=Balde de Água +River Water Bucket=Balde de Água do Rio +Lava Bucket=Balde de Lava diff --git a/data/games/garage/mods/bucket/locale/bucket.ru.tr b/data/games/garage/mods/bucket/locale/bucket.ru.tr new file mode 100644 index 0000000..080ebfc --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.ru.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Пустое ведро +Water Bucket=Ведро с водой +River Water Bucket=Ведро с речной водой +Lava Bucket=Ведро с лавой diff --git a/data/games/garage/mods/bucket/locale/bucket.sk.tr b/data/games/garage/mods/bucket/locale/bucket.sk.tr new file mode 100644 index 0000000..0327b20 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.sk.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Prázdne vedro +Water Bucket=Vedro s vodou +River Water Bucket=Vedro s vodou z rieky +Lava Bucket=Vedro s lávou diff --git a/data/games/garage/mods/bucket/locale/bucket.sv.tr b/data/games/garage/mods/bucket/locale/bucket.sv.tr new file mode 100644 index 0000000..59ee62d --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.sv.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Tom hink +Water Bucket=Vattenhink +River Water Bucket=Flodvattenshink +Lava Bucket=Lavahink diff --git a/data/games/garage/mods/bucket/locale/bucket.uk.tr b/data/games/garage/mods/bucket/locale/bucket.uk.tr new file mode 100644 index 0000000..3486d1e --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.uk.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=Порожнє відро +Water Bucket=Відро з водою +River Water Bucket=Відро з річковою водою +Lava Bucket=Відро з лавою diff --git a/data/games/garage/mods/bucket/locale/bucket.zh_CN.tr b/data/games/garage/mods/bucket/locale/bucket.zh_CN.tr new file mode 100644 index 0000000..fda5bfc --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.zh_CN.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=空桶 +Water Bucket=水桶 +River Water Bucket=河水桶 +Lava Bucket=岩浆桶 diff --git a/data/games/garage/mods/bucket/locale/bucket.zh_TW.tr b/data/games/garage/mods/bucket/locale/bucket.zh_TW.tr new file mode 100644 index 0000000..965d657 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/bucket.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket=空桶 +Water Bucket=水桶 +River Water Bucket=河水桶 +Lava Bucket=岩漿桶 diff --git a/data/games/garage/mods/bucket/locale/template.txt b/data/games/garage/mods/bucket/locale/template.txt new file mode 100644 index 0000000..a37c103 --- /dev/null +++ b/data/games/garage/mods/bucket/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: bucket +Empty Bucket= +Water Bucket= +River Water Bucket= +Lava Bucket= diff --git a/data/games/garage/mods/bucket/mod.conf b/data/games/garage/mods/bucket/mod.conf index d14deb4..fef4687 100644 --- a/data/games/garage/mods/bucket/mod.conf +++ b/data/games/garage/mods/bucket/mod.conf @@ -1,2 +1,4 @@ name = bucket -description = Minimal bucket to pick up liquids +description = Minetest Game mod: bucket +depends = default +optional_depends = dungeon_loot diff --git a/data/games/garage/mods/bucket/textures/bucket.png b/data/games/garage/mods/bucket/textures/bucket.png index 6779528..17b0c49 100644 Binary files a/data/games/garage/mods/bucket/textures/bucket.png and b/data/games/garage/mods/bucket/textures/bucket.png differ diff --git a/data/games/garage/mods/bucket/textures/bucket_lava.png b/data/games/garage/mods/bucket/textures/bucket_lava.png index dfcae65..ac6108d 100644 Binary files a/data/games/garage/mods/bucket/textures/bucket_lava.png and b/data/games/garage/mods/bucket/textures/bucket_lava.png differ diff --git a/data/games/garage/mods/bucket/textures/bucket_river_water.png b/data/games/garage/mods/bucket/textures/bucket_river_water.png new file mode 100644 index 0000000..d4648bb Binary files /dev/null and b/data/games/garage/mods/bucket/textures/bucket_river_water.png differ diff --git a/data/games/garage/mods/bucket/textures/bucket_water.png b/data/games/garage/mods/bucket/textures/bucket_water.png index e164b0a..5af836b 100644 Binary files a/data/games/garage/mods/bucket/textures/bucket_water.png and b/data/games/garage/mods/bucket/textures/bucket_water.png differ diff --git a/data/games/garage/mods/butterflies/README.txt b/data/games/garage/mods/butterflies/README.txt new file mode 100644 index 0000000..a7f52a0 --- /dev/null +++ b/data/games/garage/mods/butterflies/README.txt @@ -0,0 +1,14 @@ +Minetest Game mod: Butterflies +============================== +Adds butterflies to the world on mapgen, which can be caught in a net if the +fireflies mod is also enabled. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + butterflies_butterfly_*.png + butterflies_butterfly_*_animated.png \ No newline at end of file diff --git a/data/games/garage/mods/butterflies/init.lua b/data/games/garage/mods/butterflies/init.lua new file mode 100644 index 0000000..ad3c79f --- /dev/null +++ b/data/games/garage/mods/butterflies/init.lua @@ -0,0 +1,121 @@ +-- butterflies/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("butterflies") + +-- Legacy compatibility, when pointabilities don't exist, pointable is set to true. +local pointable_compat = not minetest.features.item_specific_pointabilities + +-- register butterflies +local butter_list = { + {"white", S("White Butterfly")}, + {"red", S("Red Butterfly")}, + {"violet", S("Violet Butterfly")} +} + +for i in ipairs (butter_list) do + local name = butter_list[i][1] + local desc = butter_list[i][2] + + minetest.register_node("butterflies:butterfly_"..name, { + description = desc, + drawtype = "plantlike", + tiles = {{ + name = "butterflies_butterfly_"..name.."_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3 + }, + }}, + inventory_image = "butterflies_butterfly_"..name..".png", + wield_image = "butterflies_butterfly_"..name..".png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + pointable = pointable_compat, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.set_node(pos, {name = "butterflies:hidden_butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) + + minetest.register_node("butterflies:hidden_butterfly_"..name, { + drawtype = "airlike", + inventory_image = "butterflies_butterfly_"..name..".png^default_invisible_node_overlay.png", + wield_image = "butterflies_butterfly_"..name..".png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) >= 11 then + minetest.set_node(pos, {name = "butterflies:butterfly_"..name}) + end + minetest.get_node_timer(pos):start(30) + end + }) +end + +-- register decoration +minetest.register_decoration({ + name = "butterflies:butterfly", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.005, + biomes = {"grassland", "deciduous_forest"}, + y_max = 31000, + y_min = 1, + decoration = { + "butterflies:butterfly_white", + "butterflies:butterfly_red", + "butterflies:butterfly_violet" + }, + spawn_by = "group:flower", + num_spawn_by = 1 +}) + +-- get decoration ID +local butterflies = minetest.get_decoration_id("butterflies:butterfly") +minetest.set_gen_notify({decoration = true}, {butterflies}) + +-- start nodetimers +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + + for _, pos in ipairs(gennotify["decoration#"..butterflies] or {}) do + local deco_pos = {x = pos.x, y = pos.y + 3, z = pos.z} + table.insert(poslist, deco_pos) + end + + if #poslist ~= 0 then + for i = 1, #poslist do + local pos = poslist[i] + minetest.get_node_timer(pos):start(1) + end + end +end) diff --git a/data/games/garage/mods/butterflies/license.txt b/data/games/garage/mods/butterflies/license.txt new file mode 100644 index 0000000..eebdad6 --- /dev/null +++ b/data/games/garage/mods/butterflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +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. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/data/games/garage/mods/butterflies/locale/butterflies.de.tr b/data/games/garage/mods/butterflies/locale/butterflies.de.tr new file mode 100644 index 0000000..2f1b982 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.de.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Weißer Schmetterling +Red Butterfly=Roter Schmetterling +Violet Butterfly=Violetter Schmetterling diff --git a/data/games/garage/mods/butterflies/locale/butterflies.eo.tr b/data/games/garage/mods/butterflies/locale/butterflies.eo.tr new file mode 100644 index 0000000..be09eb7 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.eo.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Blanka papilio +Red Butterfly=Ruĝa papilio +Violet Butterfly=Violkolora papilio diff --git a/data/games/garage/mods/butterflies/locale/butterflies.es.tr b/data/games/garage/mods/butterflies/locale/butterflies.es.tr new file mode 100644 index 0000000..59a28eb --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.es.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Mariposa blanca +Red Butterfly=Mariposa roja +Violet Butterfly=Mariposa violeta diff --git a/data/games/garage/mods/butterflies/locale/butterflies.fr.tr b/data/games/garage/mods/butterflies/locale/butterflies.fr.tr new file mode 100644 index 0000000..8f5c094 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.fr.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Papillon blanc +Red Butterfly=Papillon rouge +Violet Butterfly=Papillon violet diff --git a/data/games/garage/mods/butterflies/locale/butterflies.id.tr b/data/games/garage/mods/butterflies/locale/butterflies.id.tr new file mode 100644 index 0000000..d4429a6 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.id.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Kupu-Kupu Putih +Red Butterfly=Kupu-Kupu Merah +Violet Butterfly=Kupu-Kupu Ungu diff --git a/data/games/garage/mods/butterflies/locale/butterflies.it.tr b/data/games/garage/mods/butterflies/locale/butterflies.it.tr new file mode 100644 index 0000000..ec65da6 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.it.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Farfalla bianca +Red Butterfly=Farfalla rossa +Violet Butterfly=Farfalla viola diff --git a/data/games/garage/mods/butterflies/locale/butterflies.ja.tr b/data/games/garage/mods/butterflies/locale/butterflies.ja.tr new file mode 100644 index 0000000..5a22d6b --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.ja.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=白色の蝶 +Red Butterfly=赤色の蝶 +Violet Butterfly=紫色の蝶 diff --git a/data/games/garage/mods/butterflies/locale/butterflies.jbo.tr b/data/games/garage/mods/butterflies/locale/butterflies.jbo.tr new file mode 100644 index 0000000..f003e00 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=lo blabi toldi +Red Butterfly=lo xunre toldi +Violet Butterfly=lo zirpu toldi diff --git a/data/games/garage/mods/butterflies/locale/butterflies.lv.tr b/data/games/garage/mods/butterflies/locale/butterflies.lv.tr new file mode 100644 index 0000000..d17eb6c --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.lv.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Balts taurenis +Red Butterfly=Sarkans taurenis +Violet Butterfly=Violets taurenis diff --git a/data/games/garage/mods/butterflies/locale/butterflies.ms.tr b/data/games/garage/mods/butterflies/locale/butterflies.ms.tr new file mode 100644 index 0000000..b8bde85 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.ms.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Rama-Rama Putih +Red Butterfly=Rama-Rama Merah +Violet Butterfly=Rama-Rama Ungu diff --git a/data/games/garage/mods/butterflies/locale/butterflies.pl.tr b/data/games/garage/mods/butterflies/locale/butterflies.pl.tr new file mode 100644 index 0000000..577f0b8 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.pl.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Biały motyl +Red Butterfly=Czerwony motyl +Violet Butterfly=Fioletowy motyl diff --git a/data/games/garage/mods/butterflies/locale/butterflies.pt_BR.tr b/data/games/garage/mods/butterflies/locale/butterflies.pt_BR.tr new file mode 100644 index 0000000..af3539e --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Borboleta Branca +Red Butterfly=Borboleta Vermelha +Violet Butterfly=Borboleta Violeta diff --git a/data/games/garage/mods/butterflies/locale/butterflies.ru.tr b/data/games/garage/mods/butterflies/locale/butterflies.ru.tr new file mode 100644 index 0000000..6881f1c --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.ru.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Белая бабочка +Red Butterfly=Красная бабочка +Violet Butterfly=Фиолетовая бабочка diff --git a/data/games/garage/mods/butterflies/locale/butterflies.sk.tr b/data/games/garage/mods/butterflies/locale/butterflies.sk.tr new file mode 100644 index 0000000..c3086e7 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.sk.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Biely motýlik +Red Butterfly=Červený motýlik +Violet Butterfly=Fialový motýlik diff --git a/data/games/garage/mods/butterflies/locale/butterflies.sv.tr b/data/games/garage/mods/butterflies/locale/butterflies.sv.tr new file mode 100644 index 0000000..77bfb34 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.sv.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Vit fjäril +Red Butterfly=Röd fjäril +Violet Butterfly=Violett fjäril diff --git a/data/games/garage/mods/butterflies/locale/butterflies.uk.tr b/data/games/garage/mods/butterflies/locale/butterflies.uk.tr new file mode 100644 index 0000000..8779b00 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.uk.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=Білий метелик +Red Butterfly=Червоний метелик +Violet Butterfly=Фіолетовий метелик diff --git a/data/games/garage/mods/butterflies/locale/butterflies.zh_CN.tr b/data/games/garage/mods/butterflies/locale/butterflies.zh_CN.tr new file mode 100644 index 0000000..24e0bd1 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=白蝴蝶 +Red Butterfly=红蝴蝶 +Violet Butterfly=紫蝴蝶 diff --git a/data/games/garage/mods/butterflies/locale/butterflies.zh_TW.tr b/data/games/garage/mods/butterflies/locale/butterflies.zh_TW.tr new file mode 100644 index 0000000..8d927c1 --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/butterflies.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly=白蝴蝶 +Red Butterfly=紅蝴蝶 +Violet Butterfly=紫蝴蝶 diff --git a/data/games/garage/mods/butterflies/locale/template.txt b/data/games/garage/mods/butterflies/locale/template.txt new file mode 100644 index 0000000..d89503a --- /dev/null +++ b/data/games/garage/mods/butterflies/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: butterflies +White Butterfly= +Red Butterfly= +Violet Butterfly= diff --git a/data/games/garage/mods/butterflies/mod.conf b/data/games/garage/mods/butterflies/mod.conf new file mode 100644 index 0000000..1c66497 --- /dev/null +++ b/data/games/garage/mods/butterflies/mod.conf @@ -0,0 +1,3 @@ +name = butterflies +description = Minetest Game mod: Butterflies +depends = default, flowers diff --git a/data/games/garage/mods/butterflies/textures/butterflies_butterfly_red.png b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_red.png new file mode 100644 index 0000000..8edfc36 Binary files /dev/null and b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_red.png differ diff --git a/data/games/garage/mods/butterflies/textures/butterflies_butterfly_red_animated.png b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_red_animated.png new file mode 100644 index 0000000..4a2097b Binary files /dev/null and b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_red_animated.png differ diff --git a/data/games/garage/mods/butterflies/textures/butterflies_butterfly_violet.png b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_violet.png new file mode 100644 index 0000000..8b8c29d Binary files /dev/null and b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_violet.png differ diff --git a/data/games/garage/mods/butterflies/textures/butterflies_butterfly_violet_animated.png b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_violet_animated.png new file mode 100644 index 0000000..3f9d72e Binary files /dev/null and b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_violet_animated.png differ diff --git a/data/games/garage/mods/butterflies/textures/butterflies_butterfly_white.png b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_white.png new file mode 100644 index 0000000..db4eaec Binary files /dev/null and b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_white.png differ diff --git a/data/games/garage/mods/butterflies/textures/butterflies_butterfly_white_animated.png b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_white_animated.png new file mode 100644 index 0000000..e7cada3 Binary files /dev/null and b/data/games/garage/mods/butterflies/textures/butterflies_butterfly_white_animated.png differ diff --git a/data/games/garage/mods/callbacks/entities.lua b/data/games/garage/mods/callbacks/entities.lua deleted file mode 100644 index 340af17..0000000 --- a/data/games/garage/mods/callbacks/entities.lua +++ /dev/null @@ -1,101 +0,0 @@ --- Entities that test their callbacks - -local message = function(msg) - core.log("action", "[callbacks] "..msg) - core.chat_send_all(msg) -end - -local get_object_name = function(obj) - local name = "" - if obj then - if obj:is_player() then - name = obj:get_player_name() - else - name = "" - end - end - return name -end - -local spos = function(self) - return core.pos_to_string(vector.round(self.object:get_pos())) -end - --- Callback test entity (all callbacks except on_step) -core.register_entity("callbacks:callback", { - initial_properties = { - visual = "upright_sprite", - textures = { "callbacks_callback_entity.png" }, - }, - - on_activate = function(self, staticdata, dtime_s) - message("Callback entity: on_activate! pos="..spos(self).."; dtime_s="..dtime_s) - end, - on_deactivate = function(self, removal) - message("Callback entity: on_deactivate! pos="..spos(self) .. "; removal=" .. tostring(removal)) - end, - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) - local name = get_object_name(puncher) - message( - "Callback entity: on_punch! ".. - "pos="..spos(self).."; puncher="..name.."; ".. - "time_from_last_punch="..time_from_last_punch.."; ".. - "tool_capabilities="..tostring(dump(tool_capabilities)).."; ".. - "dir="..tostring(dump(dir)).."; damage="..damage) - end, - on_rightclick = function(self, clicker) - local name = get_object_name(clicker) - message("Callback entity: on_rightclick! pos="..spos(self).."; clicker="..name) - end, - on_death = function(self, killer) - local name = get_object_name(killer) - message("Callback entity: on_death! pos="..spos(self).."; killer="..name) - end, - on_attach_child = function(self, child) - local name = get_object_name(child) - message("Callback entity: on_attach_child! pos="..spos(self).."; child="..name) - end, - on_detach_child = function(self, child) - local name = get_object_name(child) - message("Callback entity: on_detach_child! pos="..spos(self).."; child="..name) - end, - on_detach = function(self, parent) - local name = get_object_name(parent) - message("Callback entity: on_detach! pos="..spos(self).."; parent="..name) - end, - get_staticdata = function(self) - message("Callback entity: get_staticdata! pos="..spos(self)) - end, -}) - --- Only test on_step callback -core.register_entity("callbacks:callback_step", { - visual = "upright_sprite", - textures = { "callbacks_callback_entity_step.png" }, - on_step = function(self, dtime) - message("on_step callback entity: on_step! pos="..spos(self).."; dtime="..dtime) - end, -}) - --- Callback punch with nil puncher -core.register_entity("callbacks:callback_puncher", { - initial_properties = { - visual = "upright_sprite", - textures = { "callbacks_callback_entity.png" }, - infotext = "Callback entity for nil puncher test.", - }, - - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) - if puncher then - puncher:punch(nil, time_from_last_punch, tool_capabilities, dir) - self.object:punch(nil, time_from_last_punch, tool_capabilities, dir) - else - message( - "Callback entity: on_punch with nil puncher ".. - "pos="..spos(self).."; ".. - "time_from_last_punch="..time_from_last_punch.."; ".. - "tool_capabilities="..dump(tool_capabilities).."; ".. - "dir="..dump(dir).."; damage="..damage) - end - end, -}) diff --git a/data/games/garage/mods/callbacks/init.lua b/data/games/garage/mods/callbacks/init.lua deleted file mode 100644 index ff2da97..0000000 --- a/data/games/garage/mods/callbacks/init.lua +++ /dev/null @@ -1,4 +0,0 @@ -dofile(core.get_modpath("callbacks").."/items.lua") -dofile(core.get_modpath("callbacks").."/nodes.lua") -dofile(core.get_modpath("callbacks").."/entities.lua") -dofile(core.get_modpath("callbacks").."/players.lua") diff --git a/data/games/garage/mods/callbacks/items.lua b/data/games/garage/mods/callbacks/items.lua deleted file mode 100644 index 880f393..0000000 --- a/data/games/garage/mods/callbacks/items.lua +++ /dev/null @@ -1,120 +0,0 @@ --- --- Item callbacks --- - -local function print_to_everything(msg) - core.log("action", "[callbacks] " .. msg) - core.chat_send_all(msg) -end - -core.register_craftitem("callbacks:callback_item_1", { - description = "Callback Test Item 1".."\n".. - "Tests callbacks: on_secondary_use, on_drop, on_pickup, on_use, after_use".."\n".. - "Punch/Drop + Sneak: Switch to Callback Test Item 2".."\n".. - "Aux1 + pickup item: Print additional on_pickup arguments", - inventory_image = "callbacks_callback_item_1.png", - wield_image = "callbacks_callback_item_1.png", - groups = { callback_test = 1 }, - - on_secondary_use = function(itemstack, user, pointed_thing) - print_to_everything("[callbacks:callback_item_1 on_secondary_use] " .. itemstack:get_name()) - local ctrl = user and user:get_player_control() or {} - if ctrl.sneak then - itemstack = ItemStack(itemstack) - itemstack:set_name("callbacks:callback_item_2") - return itemstack - end - end, - - on_drop = function(itemstack, dropper, pos) - print_to_everything("[callbacks:callback_item_1 on_drop] " .. itemstack:get_name()) - local ctrl = dropper and dropper:get_player_control() or {} - if ctrl.sneak then - itemstack = ItemStack(itemstack) - itemstack:set_name("callbacks:callback_item_2") - end - - return core.item_drop(itemstack, dropper, pos) - end, - - on_pickup = function(itemstack, picker, pointed_thing, ...) - print_to_everything("[callbacks:callback_item_1 on_pickup]") - assert(pointed_thing.ref:get_luaentity().name == "__builtin:item") - local ctrl = picker and picker:get_player_control() or {} - if ctrl.aux1 then - -- Debug message - print_to_everything("on_pickup dump:") - print_to_everything(dump({...})) - end - if ctrl.sneak then - -- Pick up one item of the other kind at once - local taken = itemstack:take_item() - taken:set_name("callbacks:callback_item_2") - local leftover = core.item_pickup(taken, picker, pointed_thing, ...) - leftover:set_name("callbacks:callback_item_1") - itemstack:add_item(leftover) - return itemstack - elseif ctrl.up then - -- Don't pick up - return - elseif ctrl.left then - -- Eat it - return core.do_item_eat(2, nil, itemstack, picker, pointed_thing) - else - -- Normal: pick up everything - return core.item_pickup(itemstack, picker, pointed_thing, ...) - end - end, - - on_use = function(itemstack, user, pointed_thing) - print_to_everything("[callbacks:callback_item_1 on_use] " .. itemstack:get_name()) - local ctrl = user and user:get_player_control() or {} - if ctrl.sneak then - itemstack = ItemStack(itemstack) - itemstack:set_name("callbacks:callback_item_2") - return itemstack - end - end, - - after_use = function(itemstack, user, node, digparams) -- never called - print_to_everything("[callbacks:callback_item_1 after_use]") - local ctrl = user and user:get_player_control() or {} - if ctrl.up then - itemstack = ItemStack(itemstack) - itemstack:set_name("callbacks:callback_item_2") - return itemstack - end - end, -}) - -core.register_craftitem("callbacks:callback_item_2", { - description = "Callback Test Item 2".."\n".. - "Punch to switch to Callback Test Item 1", - inventory_image = "callbacks_callback_item_2.png", - wield_image = "callbacks_callback_item_2.png", - groups = { callback_test = 1 }, - - on_use = function(itemstack, user, pointed_thing) - print_to_everything("[callbacks:callback_item_2 on_use]") - itemstack = ItemStack(itemstack) - itemstack:set_name("callbacks:callback_item_1") - return itemstack - end, -}) - -core.register_on_item_pickup(function(itemstack, picker, pointed_thing, time_from_last_punch, ...) - assert(not pointed_thing or pointed_thing.ref:get_luaentity().name == "__builtin:item") - - local item_name = itemstack:get_name() - if item_name ~= "callbacks:callback_item_1" and item_name ~= "callbacks:callback_item_2" then - return - end - print_to_everything("["..item_name.." register_on_item_pickup]") - - local ctrl = picker and picker:get_player_control() or {} - if item_name == "callbacks:callback_item_2" and not ctrl.sneak then - -- Same here. Pick up the other item type. - itemstack:set_name("callbacks:callback_item_1") - return picker:get_inventory():add_item("main", itemstack) - end -end) diff --git a/data/games/garage/mods/callbacks/mod.conf b/data/games/garage/mods/callbacks/mod.conf deleted file mode 100644 index 7f7b6b8..0000000 --- a/data/games/garage/mods/callbacks/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = callbacks -description = Adds various callback-related stuff diff --git a/data/games/garage/mods/callbacks/nodes.lua b/data/games/garage/mods/callbacks/nodes.lua deleted file mode 100644 index 67f4be4..0000000 --- a/data/games/garage/mods/callbacks/nodes.lua +++ /dev/null @@ -1,51 +0,0 @@ -local function print_to_everything(msg) - core.log("action", "[callbacks] " .. msg) - core.chat_send_all(msg) -end - -core.register_node("callbacks:callback_node", { - description = "Callback Test Node (construct/destruct/timer)".."\n".. - "Tests callbacks: on_construct, after_place_node, on_destruct, after_destruct, after_dig_node, on_timer", - tiles = {"callbacks_callback_node.png"}, - groups = {callback_test=1, dig_immediate=3}, - -- This was known to cause a bug in core.item_place_node() when used - -- via core.place_node(), causing a placer with no position - paramtype2 = "facedir", - drop = "", - - on_construct = function(pos) - print_to_everything("callbacks:callback_node:on_construct("..core.pos_to_string(pos)..")") - local meta = core.get_meta(pos) - meta:set_string("mine", "test") - local timer = core.get_node_timer(pos) - timer:start(4, 3) - end, - - after_place_node = function(pos, placer) - print_to_everything("callbacks:callback_node:after_place_node("..core.pos_to_string(pos)..")") - local meta = core.get_meta(pos) - if meta:get_string("mine") == "test" then - print_to_everything("correct metadata found") - else - print_to_everything("incorrect metadata found") - end - end, - - on_destruct = function(pos) - print_to_everything("callbacks:callback_node:on_destruct("..core.pos_to_string(pos)..")") - end, - - after_destruct = function(pos) - print_to_everything("callbacks:callback_node:after_destruct("..core.pos_to_string(pos)..")") - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - print_to_everything("callbacks:callback_node:after_dig_node("..core.pos_to_string(pos)..")") - end, - - on_timer = function(pos, elapsed) - print_to_everything("callbacks:callback_node:on_timer(): elapsed="..dump(elapsed)) - return true - end, -}) - diff --git a/data/games/garage/mods/callbacks/players.lua b/data/games/garage/mods/callbacks/players.lua deleted file mode 100644 index 2e9b2fa..0000000 --- a/data/games/garage/mods/callbacks/players.lua +++ /dev/null @@ -1,11 +0,0 @@ - -local message = function(msg) - core.log("action", "[callbacks] "..msg) - core.chat_send_all(msg) -end - -core.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) - if not hitter then - message("Player "..player:get_player_name().." punched without hitter.") - end -end) diff --git a/data/games/garage/mods/callbacks/textures/callbacks_callback_entity.png b/data/games/garage/mods/callbacks/textures/callbacks_callback_entity.png deleted file mode 100644 index 5125cc6..0000000 Binary files a/data/games/garage/mods/callbacks/textures/callbacks_callback_entity.png and /dev/null differ diff --git a/data/games/garage/mods/callbacks/textures/callbacks_callback_entity_step.png b/data/games/garage/mods/callbacks/textures/callbacks_callback_entity_step.png deleted file mode 100644 index 7676150..0000000 Binary files a/data/games/garage/mods/callbacks/textures/callbacks_callback_entity_step.png and /dev/null differ diff --git a/data/games/garage/mods/callbacks/textures/callbacks_callback_item_1.png b/data/games/garage/mods/callbacks/textures/callbacks_callback_item_1.png deleted file mode 100644 index 070b534..0000000 Binary files a/data/games/garage/mods/callbacks/textures/callbacks_callback_item_1.png and /dev/null differ diff --git a/data/games/garage/mods/callbacks/textures/callbacks_callback_item_2.png b/data/games/garage/mods/callbacks/textures/callbacks_callback_item_2.png deleted file mode 100644 index d90903a..0000000 Binary files a/data/games/garage/mods/callbacks/textures/callbacks_callback_item_2.png and /dev/null differ diff --git a/data/games/garage/mods/callbacks/textures/callbacks_callback_node.png b/data/games/garage/mods/callbacks/textures/callbacks_callback_node.png deleted file mode 100644 index e9d8743..0000000 Binary files a/data/games/garage/mods/callbacks/textures/callbacks_callback_node.png and /dev/null differ diff --git a/data/games/garage/mods/carts/README.txt b/data/games/garage/mods/carts/README.txt new file mode 100644 index 0000000..c0be2d7 --- /dev/null +++ b/data/games/garage/mods/carts/README.txt @@ -0,0 +1,23 @@ +Carts (formerly boost_cart) +========================== + +Carts, based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2]. + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX by Gambit (permissive +license). + + +[1] https://github.com/SmallJoker/boost_cart/ +[2] https://github.com/PilzAdam/carts/ +[3] https://github.com/stujones11/railcart/ + + +Features +---------- +- A fast cart for your railway or roller coaster (up to 7 m/s!) +- Boost and brake rails +- Rail junction switching with the 'right-left' walking keys +- Handbrake with the 'back' key diff --git a/data/games/garage/mods/carts/cart_entity.lua b/data/games/garage/mods/carts/cart_entity.lua new file mode 100644 index 0000000..3dfebe1 --- /dev/null +++ b/data/games/garage/mods/carts/cart_entity.lua @@ -0,0 +1,430 @@ +-- carts/cart_entity.lua + +-- support for MT game translation. +local S = carts.get_translator + +local cart_entity = { + initial_properties = { + physical = false, -- otherwise going uphill breaks + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + textures = {"carts_cart.png"}, + }, + + driver = nil, + punched = false, -- used to re-send velocity and position + velocity = {x=0, y=0, z=0}, -- only used on punch + old_dir = {x=1, y=0, z=0}, -- random value to start the cart on punch + old_pos = nil, + old_switch = 0, + railtype = nil, + attached_items = {} +} + +function cart_entity:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + carts:manage_attachment(clicker, nil) + elseif not self.driver then + carts:manage_attachment(clicker, self.object) + self.driver = player_name + end +end + +function cart_entity:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + if string.sub(staticdata, 1, string.len("return")) ~= "return" then + return + end + local data = minetest.deserialize(staticdata) + if type(data) ~= "table" then + return + end + self.railtype = data.railtype + self.old_dir = data.old_dir or self.old_dir +end + +function cart_entity:get_staticdata() + return minetest.serialize({ + railtype = self.railtype, + old_dir = self.old_dir + }) +end + +-- 0.5.x and later: When the driver leaves +function cart_entity:on_detach_child(child) + if child and child:get_player_name() == self.driver then + -- Clean up eye height + carts:manage_attachment(child, nil) + self.driver = nil + end +end + +function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:get_pos() + local vel = self.object:get_velocity() + if not self.railtype or vector.equals(vel, {x=0, y=0, z=0}) then + local node = minetest.get_node(pos).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + -- Punched by non-player + if not puncher or not puncher:is_player() then + local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 2) + self.punched = true + return + end + -- Player digs cart by sneak-punch + if puncher:get_player_control().sneak then + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + end + -- Detach driver and items + if self.driver then + if self.old_pos then + self.object:set_pos(self.old_pos) + end + local player = minetest.get_player_by_name(self.driver) + carts:manage_attachment(player, nil) + end + for _, obj_ in ipairs(self.attached_items) do + if obj_ then + obj_:set_detach() + end + end + -- Pick up cart + local inv = puncher:get_inventory() + if not minetest.is_creative_enabled(puncher:get_player_name()) + or not inv:contains_item("main", "carts:cart") then + local leftover = inv:add_item("main", "carts:cart") + -- If no room in inventory add a replacement cart to the world + if not leftover:is_empty() then + minetest.add_item(self.object:get_pos(), leftover) + end + end + self.object:remove() + return + end + -- Player punches cart to alter velocity + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > carts.punch_speed_max then + return + end + end + + local punch_dir = carts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = carts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + local punch_interval = 1 + -- Faulty tool registrations may cause the interval to be set to 0 ! + if tool_capabilities and (tool_capabilities.full_punch_interval or 0) > 0 then + punch_interval = tool_capabilities.full_punch_interval + end + time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) + local f = 2 * (time_from_last_punch / punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_dir = cart_dir + self.punched = true +end + +local function rail_on_step_event(handler, obj, dtime) + if handler then + handler(obj, dtime) + end +end + +-- sound refresh interval = 1.0sec +local function rail_sound(self, dtime) + if not self.sound_ttl then + self.sound_ttl = 1.0 + return + elseif self.sound_ttl > 0 then + self.sound_ttl = self.sound_ttl - dtime + return + end + self.sound_ttl = 1.0 + if self.sound_handle then + local handle = self.sound_handle + self.sound_handle = nil + minetest.after(0.2, minetest.sound_stop, handle) + end + local vel = self.object:get_velocity() + local speed = vector.length(vel) + if speed > 0 then + self.sound_handle = minetest.sound_play( + "carts_cart_moving", { + object = self.object, + gain = (speed / carts.speed_max) / 2, + loop = true, + }) + end +end + +local function get_railparams(pos) + local node = minetest.get_node(pos) + return carts.railparams[node.name] or {} +end + +local v3_len = vector.length +local function rail_on_step(self, dtime) + local vel = self.object:get_velocity() + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:set_velocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local pos = self.object:get_pos() + local dir = carts:velocity_to_dir(vel) + local dir_changed = not vector.equals(dir, self.old_dir) + local update = {} + + if self.old_pos and not self.punched and not dir_changed then + local flo_pos = vector.round(pos) + local flo_old = vector.round(self.old_pos) + if vector.equals(flo_pos, flo_old) then + -- Do not check one node multiple times + return + end + end + + local ctrl, player + + -- Get player controls + if self.driver then + player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end + + local stop_wiggle = false + if self.old_pos and not dir_changed then + -- Detection for "skipping" nodes (perhaps use average dtime?) + -- It's sophisticated enough to take the acceleration in account + local acc = self.object:get_acceleration() + local distance = dtime * (v3_len(vel) + 0.5 * dtime * v3_len(acc)) + + local new_pos, new_dir = carts:pathfinder( + pos, self.old_pos, self.old_dir, distance, ctrl, + self.old_switch, self.railtype + ) + + if new_pos then + -- No rail found: set to the expected position + pos = new_pos + update.pos = true + dir = new_dir + end + elseif self.old_pos and self.old_dir.y ~= 1 and not self.punched then + -- Stop wiggle + stop_wiggle = true + end + + local railparams + + -- dir: New moving direction of the cart + -- switch_keys: Currently pressed L(1) or R(2) key, + -- used to ignore the key on the next rail node + local switch_keys + dir, switch_keys = carts:get_rail_direction( + pos, dir, ctrl, self.old_switch, self.railtype + ) + dir_changed = not vector.equals(dir, self.old_dir) + + local acc = 0 + if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then + dir = vector.new(self.old_dir) + vel = {x = 0, y = 0, z = 0} + local pos_r = vector.round(pos) + if not carts:is_rail(pos_r, self.railtype) + and self.old_pos then + pos = self.old_pos + elseif not stop_wiggle then + -- End of rail: Smooth out. + pos = pos_r + dir_changed = false + dir.y = 0 + else + pos.y = math.floor(pos.y + 0.5) + end + update.pos = true + update.vel = true + else + -- Direction change detected + if dir_changed then + vel = vector.multiply(dir, math.abs(vel.x + vel.z)) + update.vel = true + if dir.y ~= self.old_dir.y then + pos = vector.round(pos) + update.pos = true + end + end + -- Center on the rail + if dir.z ~= 0 and math.floor(pos.x + 0.5) ~= pos.x then + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + if dir.x ~= 0 and math.floor(pos.z + 0.5) ~= pos.z then + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + + -- Slow down or speed up.. + acc = dir.y * -4.0 + + -- Get rail for corrected position + railparams = get_railparams(pos) + + -- no need to check for railparams == nil since we always make it exist. + local speed_mod = railparams.acceleration + if speed_mod and speed_mod ~= 0 then + -- Try to make it similar to the original carts mod + acc = acc + speed_mod + else + -- Handbrake or coast + if ctrl and ctrl.down then + acc = acc - 3 + else + acc = acc - 0.4 + end + end + end + + -- Limit cart speed + local vel_len = vector.length(vel) + if vel_len > carts.speed_max then + vel = vector.multiply(vel, carts.speed_max / vel_len) + update.vel = true + end + if vel_len >= carts.speed_max and acc > 0 then + acc = 0 + end + + self.object:set_acceleration(vector.multiply(dir, acc)) + + self.old_pos = vector.round(pos) + self.old_dir = vector.new(dir) + self.old_switch = switch_keys + + if self.punched then + -- Collect dropped items + for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do + local ent = obj_:get_luaentity() + -- Careful here: physical_state and disable_physics are item-internal APIs + if ent and ent.name == "__builtin:item" and ent.physical_state then + ent:disable_physics() + obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + self.attached_items[#self.attached_items + 1] = obj_ + end + end + self.punched = false + update.vel = true + end + + railparams = railparams or get_railparams(pos) + + if not (update.vel or update.pos) then + rail_on_step_event(railparams.on_step, self, dtime) + return + end + + local yaw = 0 + if dir.x < 0 then + yaw = 0.5 + elseif dir.x > 0 then + yaw = 1.5 + elseif dir.z < 0 then + yaw = 1 + end + self.object:set_yaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + if update.vel then + self.object:set_velocity(vel) + end + if update.pos then + if dir_changed then + self.object:set_pos(pos) + else + self.object:move_to(pos) + end + end + + -- call event handler + rail_on_step_event(railparams.on_step, self, dtime) +end + +function cart_entity:on_step(dtime) + rail_on_step(self, dtime) + rail_sound(self, dtime) +end + +minetest.register_entity("carts:cart", cart_entity) + +minetest.register_craftitem("carts:cart", { + description = S("Cart") .. "\n" .. S("(Sneak+Click to pick up)"), + inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_front.png", "carts_cart_side.png"), + wield_image = "carts_cart_front.png", + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return + end + if carts:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "carts:cart") + elseif carts:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "carts:cart") + else + return + end + + minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, + {pos = pointed_thing.above}, true) + + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "carts:cart", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) diff --git a/data/games/garage/mods/carts/functions.lua b/data/games/garage/mods/carts/functions.lua new file mode 100644 index 0000000..36b7e12 --- /dev/null +++ b/data/games/garage/mods/carts/functions.lua @@ -0,0 +1,252 @@ +function carts:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function carts:manage_attachment(player, obj) + if not player then + return + end + local status = obj ~= nil + local player_name = player:get_player_name() + if obj and player:get_attach() == obj then + return + end + player_api.player_attached[player_name] = status + + if status then + player:set_attach(obj, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0}) + player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) + + -- player_api does not update the animation + -- when the player is attached, reset to default animation + player_api.set_animation(player, "stand") + else + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + end +end + +function carts:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=carts:get_sign(v.x), y=carts:get_sign(v.y), z=0} + else + return {x=0, y=carts:get_sign(v.y), z=carts:get_sign(v.z)} + end +end + +function carts:is_rail(pos, railtype) + local node = minetest.get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if minetest.get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return minetest.get_item_group(node, "connect_to_raillike") == railtype +end + +function carts:check_front_up_down(pos, dir_, check_up, railtype) + local dir = vector.new(dir_) + local cur + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + -- Up + if check_up then + dir.y = 1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + return nil +end + +function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur + local left_check, right_check = true, true + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + local straight_priority = ctrl and dir.y ~= 0 + + -- Normal, to disallow rail switching up- & downhill + if straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = self:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = self:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + if not straight_priority then + cur = self:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + end + + -- Left, if not already checked + if left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = carts:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function carts:pathfinder(pos_, old_pos, old_dir, distance, ctrl, + pf_switch, railtype) + + local pos = vector.round(pos_) + if vector.equals(old_pos, pos) then + return + end + + local pf_pos = vector.round(old_pos) + local pf_dir = vector.new(old_dir) + distance = math.min(carts.path_distance_max, + math.floor(distance + 1)) + + for i = 1, distance do + pf_dir, pf_switch = self:get_rail_direction( + pf_pos, pf_dir, ctrl, pf_switch or 0, railtype) + + if vector.equals(pf_dir, {x=0, y=0, z=0}) then + -- No way forwards + return pf_pos, pf_dir + end + + pf_pos = vector.add(pf_pos, pf_dir) + + if vector.equals(pf_pos, pos) then + -- Success! Cart moved on correctly + return + end + end + -- Not found. Put cart to predicted position + return pf_pos, pf_dir +end + +function carts:register_rail(name, def_overwrite, railparams) + local def = { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + sounds = default.node_sound_metal_defaults() + } + for k, v in pairs(def_overwrite) do + def[k] = v + end + if not def.inventory_image then + def.wield_image = def.tiles[1] + def.inventory_image = def.tiles[1] + end + + if railparams then + carts.railparams[name] = table.copy(railparams) + end + + minetest.register_node(name, def) +end + +function carts:get_rail_groups(additional_groups) + -- Get the default rail groups and add more when a table is given + local groups = { + dig_immediate = 2, + attached_node = 1, + rail = 1, + connect_to_raillike = minetest.raillike_group("rail") + } + if type(additional_groups) == "table" then + for k, v in pairs(additional_groups) do + groups[k] = v + end + end + return groups +end diff --git a/data/games/garage/mods/carts/init.lua b/data/games/garage/mods/carts/init.lua new file mode 100644 index 0000000..69d59d9 --- /dev/null +++ b/data/games/garage/mods/carts/init.lua @@ -0,0 +1,28 @@ +-- carts/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("carts") + +carts = {} +carts.modpath = minetest.get_modpath("carts") +carts.railparams = {} +carts.get_translator = S + +-- Maximal speed of the cart in m/s (min = -1) +carts.speed_max = 7 +-- Set to -1 to disable punching the cart from inside (min = -1) +carts.punch_speed_max = 5 +-- Maximal distance for the path correction (for dtime peaks) +carts.path_distance_max = 3 + + +dofile(carts.modpath.."/functions.lua") +dofile(carts.modpath.."/rails.lua") +dofile(carts.modpath.."/cart_entity.lua") + +-- Register rails as dungeon loot +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + name = "carts:rail", chance = 0.35, count = {1, 6} + }) +end diff --git a/data/games/garage/mods/carts/license.txt b/data/games/garage/mods/carts/license.txt new file mode 100644 index 0000000..e2781ac --- /dev/null +++ b/data/games/garage/mods/carts/license.txt @@ -0,0 +1,54 @@ + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media +----------------- + +CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except +if other license is mentioned. + + +Authors +--------- +Originally from PixelBOX (Gambit): + carts_cart_side.png + carts_cart_top.png + carts_cart_front.png* + carts_cart.png* + +sofar + stujones11: + carts_cart.b3d and carts_cart.blend + +hexafraction, modified by sofar + carts_rail_*.png + +http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0 + carts_cart_moving.*.ogg diff --git a/data/games/garage/mods/carts/locale/carts.de.tr b/data/games/garage/mods/carts/locale/carts.de.tr new file mode 100644 index 0000000..89a33ac --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.de.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Lore +(Sneak+Click to pick up)=(Schleichen u. Klicken zum Aufheben) +Rail=Schiene +Powered Rail=Antriebsschiene +Brake Rail=Bremsschiene diff --git a/data/games/garage/mods/carts/locale/carts.eo.tr b/data/games/garage/mods/carts/locale/carts.eo.tr new file mode 100644 index 0000000..22b5280 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.eo.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Ĉaro +(Sneak+Click to pick up)=(Ŝteliri+Alklaki por reprini) +Rail=Relo +Powered Rail=Elektra relo +Brake Rail=Bremsa relo diff --git a/data/games/garage/mods/carts/locale/carts.es.tr b/data/games/garage/mods/carts/locale/carts.es.tr new file mode 100644 index 0000000..c0857a1 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.es.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagoneta +(Sneak+Click to pick up)=(Agacharse+Clic para recoger) +Rail=Raíl +Powered Rail=Raíl energizado +Brake Rail=Raíl de frenado diff --git a/data/games/garage/mods/carts/locale/carts.fr.tr b/data/games/garage/mods/carts/locale/carts.fr.tr new file mode 100644 index 0000000..b092f14 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.fr.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Chariot +(Sneak+Click to pick up)=(Se baisser + clic pour ramasser) +Rail=Rail +Powered Rail=Rail de traction +Brake Rail=Rail de freinage diff --git a/data/games/garage/mods/carts/locale/carts.id.tr b/data/games/garage/mods/carts/locale/carts.id.tr new file mode 100644 index 0000000..ce0db92 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.id.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Kereta +(Sneak+Click to pick up)=(Menyelinap + Klik untuk ambil) +Rail=Rel +Powered Rail=Rel Bertenaga +Brake Rail=Rel Rem diff --git a/data/games/garage/mods/carts/locale/carts.it.tr b/data/games/garage/mods/carts/locale/carts.it.tr new file mode 100644 index 0000000..c28e403 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.it.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagone +(Sneak+Click to pick up)=(Strisciare+Click per raccoglierlo) +Rail=Binario +Powered Rail=Binario alimentato +Brake Rail=Binario freno diff --git a/data/games/garage/mods/carts/locale/carts.ja.tr b/data/games/garage/mods/carts/locale/carts.ja.tr new file mode 100644 index 0000000..30c14ce --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.ja.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=トロッコ +(Sneak+Click to pick up)=(スニークキーとクリックで乗ります) +Rail=レール +Powered Rail=パワードレール +Brake Rail=ブレーキレール diff --git a/data/games/garage/mods/carts/locale/carts.jbo.tr b/data/games/garage/mods/carts/locale/carts.jbo.tr new file mode 100644 index 0000000..b48c542 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.jbo.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=lo carce +(Sneak+Click to pick up)=to lo nu dzibi'o je cu samxa'e te cabra cu tadji lo nu lebna toi +Rail=lo teryre'e +Powered Rail=lo se dikca teryre'e +Brake Rail=lo terjabre teryre'e diff --git a/data/games/garage/mods/carts/locale/carts.lv.tr b/data/games/garage/mods/carts/locale/carts.lv.tr new file mode 100644 index 0000000..91fc663 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.lv.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagons +(Sneak+Click to pick up)=(Lavieties un klikšķiniet, lai paceltu) +Rail=Sliedes +Powered Rail=Elektrizētas sliedes +Brake Rail=Bremžu sliedes diff --git a/data/games/garage/mods/carts/locale/carts.ms.tr b/data/games/garage/mods/carts/locale/carts.ms.tr new file mode 100644 index 0000000..e8944e9 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.ms.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Pedati +(Sneak+Click to pick up)=(Selinap+Klik untuk ambil balik) +Rail=Landasan +Powered Rail=Landasan Berkuasa +Brake Rail=Landasan Brek diff --git a/data/games/garage/mods/carts/locale/carts.pl.tr b/data/games/garage/mods/carts/locale/carts.pl.tr new file mode 100644 index 0000000..d0cb879 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.pl.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Wagonik +(Sneak+Click to pick up)=(Skradanie+Naciśnij aby zebrać) +Rail=Tory +Powered Rail=Napędzane tory +Brake Rail=Hamujące tory diff --git a/data/games/garage/mods/carts/locale/carts.pt_BR.tr b/data/games/garage/mods/carts/locale/carts.pt_BR.tr new file mode 100644 index 0000000..b92f91e --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Carrinho +(Sneak+Click to pick up)=(Esgueirar + Clique para pegar) +Rail=Trilho +Powered Rail=Trilho Energizado +Brake Rail=Trilho de Freio diff --git a/data/games/garage/mods/carts/locale/carts.ru.tr b/data/games/garage/mods/carts/locale/carts.ru.tr new file mode 100644 index 0000000..cd683be --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.ru.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Вагонетка +(Sneak+Click to pick up)=(Пригнитесь и кликните по вагонетке, чтобы забрать) +Rail=Рельсы +Powered Rail=Ускоряющие рельсы +Brake Rail=Тормозящие рельсы diff --git a/data/games/garage/mods/carts/locale/carts.sk.tr b/data/games/garage/mods/carts/locale/carts.sk.tr new file mode 100644 index 0000000..6303a49 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.sk.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vozík +(Sneak+Click to pick up)=(Zakrádanie sa + Klik pre zdvihnutie) +Rail=Koľajnica +Powered Rail=Koľajnica s pohonom +Brake Rail=Brzdná koľajnica diff --git a/data/games/garage/mods/carts/locale/carts.sv.tr b/data/games/garage/mods/carts/locale/carts.sv.tr new file mode 100644 index 0000000..0521ca8 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.sv.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Vagn +(Sneak+Click to pick up)=(Shift+Klicka för att plocka upp) +Rail=Räls +Powered Rail=Aktiverad räls +Brake Rail=Bromsräls diff --git a/data/games/garage/mods/carts/locale/carts.uk.tr b/data/games/garage/mods/carts/locale/carts.uk.tr new file mode 100644 index 0000000..3e16c72 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.uk.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=Вагонетка +(Sneak+Click to pick up)=(Пригніться та натисніть, щоби підібрати) +Rail=Рейки +Powered Rail=Електричні рейки +Brake Rail=Гальмівні рейки diff --git a/data/games/garage/mods/carts/locale/carts.zh_CN.tr b/data/games/garage/mods/carts/locale/carts.zh_CN.tr new file mode 100644 index 0000000..953cdef --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.zh_CN.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=矿车 +(Sneak+Click to pick up)=(潜行+单击以捡起) +Rail=铁轨 +Powered Rail=动力铁轨 +Brake Rail=制动铁轨 diff --git a/data/games/garage/mods/carts/locale/carts.zh_TW.tr b/data/games/garage/mods/carts/locale/carts.zh_TW.tr new file mode 100644 index 0000000..f6300d4 --- /dev/null +++ b/data/games/garage/mods/carts/locale/carts.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: carts +Cart=礦車 +(Sneak+Click to pick up)=(潛行+單擊以撿起) +Rail=鐵軌 +Powered Rail=動力鐵軌 +Brake Rail=制動鐵軌 diff --git a/data/games/garage/mods/carts/locale/template.txt b/data/games/garage/mods/carts/locale/template.txt new file mode 100644 index 0000000..a67d95f --- /dev/null +++ b/data/games/garage/mods/carts/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: carts +Cart= +(Sneak+Click to pick up)= +Rail= +Powered Rail= +Brake Rail= diff --git a/data/games/garage/mods/carts/mod.conf b/data/games/garage/mods/carts/mod.conf new file mode 100644 index 0000000..0eab35c --- /dev/null +++ b/data/games/garage/mods/carts/mod.conf @@ -0,0 +1,4 @@ +name = carts +description = Carts (formerly boost_cart) +depends = default, player_api +optional_depends = dungeon_loot diff --git a/data/games/garage/mods/carts/models/carts_cart.b3d b/data/games/garage/mods/carts/models/carts_cart.b3d new file mode 100644 index 0000000..b8b7c3a Binary files /dev/null and b/data/games/garage/mods/carts/models/carts_cart.b3d differ diff --git a/data/games/garage/mods/carts/models/carts_cart.blend b/data/games/garage/mods/carts/models/carts_cart.blend new file mode 100644 index 0000000..3446fb1 Binary files /dev/null and b/data/games/garage/mods/carts/models/carts_cart.blend differ diff --git a/data/games/garage/mods/carts/rails.lua b/data/games/garage/mods/carts/rails.lua new file mode 100644 index 0000000..8bd2ba1 --- /dev/null +++ b/data/games/garage/mods/carts/rails.lua @@ -0,0 +1,64 @@ +-- carts/rails.lua + +-- support for MT game translation. +local S = carts.get_translator + +carts:register_rail("carts:rail", { + description = S("Rail"), + tiles = { + "carts_rail_straight.png", "carts_rail_curved.png", + "carts_rail_t_junction.png", "carts_rail_crossing.png" + }, + inventory_image = "carts_rail_straight.png", + wield_image = "carts_rail_straight.png", + groups = carts:get_rail_groups(), +}, {}) + +minetest.register_craft({ + output = "carts:rail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + +minetest.register_alias("default:rail", "carts:rail") + + +carts:register_rail("carts:powerrail", { + description = S("Powered Rail"), + tiles = { + "carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png", + "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = 5}) + +minetest.register_craft({ + output = "carts:powerrail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_crystal", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + + +carts:register_rail("carts:brakerail", { + description = S("Brake Rail"), + tiles = { + "carts_rail_straight_brk.png", "carts_rail_curved_brk.png", + "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = -3}) + +minetest.register_craft({ + output = "carts:brakerail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) diff --git a/data/games/garage/mods/carts/sounds/carts_cart_moving.1.ogg b/data/games/garage/mods/carts/sounds/carts_cart_moving.1.ogg new file mode 100644 index 0000000..869e765 Binary files /dev/null and b/data/games/garage/mods/carts/sounds/carts_cart_moving.1.ogg differ diff --git a/data/games/garage/mods/carts/sounds/carts_cart_moving.2.ogg b/data/games/garage/mods/carts/sounds/carts_cart_moving.2.ogg new file mode 100644 index 0000000..b4cc508 Binary files /dev/null and b/data/games/garage/mods/carts/sounds/carts_cart_moving.2.ogg differ diff --git a/data/games/garage/mods/carts/sounds/carts_cart_moving.3.ogg b/data/games/garage/mods/carts/sounds/carts_cart_moving.3.ogg new file mode 100644 index 0000000..e19a782 Binary files /dev/null and b/data/games/garage/mods/carts/sounds/carts_cart_moving.3.ogg differ diff --git a/data/games/garage/mods/carts/textures/carts_cart.png b/data/games/garage/mods/carts/textures/carts_cart.png new file mode 100644 index 0000000..dd6c88c Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_cart.png differ diff --git a/data/games/garage/mods/carts/textures/carts_cart_front.png b/data/games/garage/mods/carts/textures/carts_cart_front.png new file mode 100644 index 0000000..0b3015b Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_cart_front.png differ diff --git a/data/games/garage/mods/carts/textures/carts_cart_side.png b/data/games/garage/mods/carts/textures/carts_cart_side.png new file mode 100644 index 0000000..69b7fdd Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_cart_side.png differ diff --git a/data/games/garage/mods/carts/textures/carts_cart_top.png b/data/games/garage/mods/carts/textures/carts_cart_top.png new file mode 100644 index 0000000..8959483 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_cart_top.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_crossing.png b/data/games/garage/mods/carts/textures/carts_rail_crossing.png new file mode 100644 index 0000000..99dab9e Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_crossing.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_crossing_brk.png b/data/games/garage/mods/carts/textures/carts_rail_crossing_brk.png new file mode 100644 index 0000000..ae71d7e Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_crossing_brk.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_crossing_pwr.png b/data/games/garage/mods/carts/textures/carts_rail_crossing_pwr.png new file mode 100644 index 0000000..fc57b08 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_crossing_pwr.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_curved.png b/data/games/garage/mods/carts/textures/carts_rail_curved.png new file mode 100644 index 0000000..cb1beac Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_curved.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_curved_brk.png b/data/games/garage/mods/carts/textures/carts_rail_curved_brk.png new file mode 100644 index 0000000..cff2a30 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_curved_brk.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_curved_pwr.png b/data/games/garage/mods/carts/textures/carts_rail_curved_pwr.png new file mode 100644 index 0000000..2cd0770 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_curved_pwr.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_straight.png b/data/games/garage/mods/carts/textures/carts_rail_straight.png new file mode 100644 index 0000000..764333b Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_straight.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_straight_brk.png b/data/games/garage/mods/carts/textures/carts_rail_straight_brk.png new file mode 100644 index 0000000..cea7b1b Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_straight_brk.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_straight_pwr.png b/data/games/garage/mods/carts/textures/carts_rail_straight_pwr.png new file mode 100644 index 0000000..764fa61 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_straight_pwr.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_t_junction.png b/data/games/garage/mods/carts/textures/carts_rail_t_junction.png new file mode 100644 index 0000000..0f3fd25 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_t_junction.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_t_junction_brk.png b/data/games/garage/mods/carts/textures/carts_rail_t_junction_brk.png new file mode 100644 index 0000000..5905d01 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_t_junction_brk.png differ diff --git a/data/games/garage/mods/carts/textures/carts_rail_t_junction_pwr.png b/data/games/garage/mods/carts/textures/carts_rail_t_junction_pwr.png new file mode 100644 index 0000000..5656555 Binary files /dev/null and b/data/games/garage/mods/carts/textures/carts_rail_t_junction_pwr.png differ diff --git a/data/games/garage/mods/chest/chest.lua b/data/games/garage/mods/chest/chest.lua deleted file mode 100644 index 251133a..0000000 --- a/data/games/garage/mods/chest/chest.lua +++ /dev/null @@ -1,52 +0,0 @@ -local function print_to_everything(msg) - core.log("action", "[chest] " .. msg) - core.chat_send_all(msg) -end - -core.register_node("chest:chest", { - description = "Chest" .. "\n" .. - "32 inventory slots", - tiles ={"chest_chest.png^[sheet:2x2:0,0", "chest_chest.png^[sheet:2x2:0,0", - "chest_chest.png^[sheet:2x2:1,0", "chest_chest.png^[sheet:2x2:1,0", - "chest_chest.png^[sheet:2x2:1,0", "chest_chest.png^[sheet:2x2:0,1"}, - paramtype2 = "4dir", - groups = {dig_immediate=2,choppy=3,meta_is_privatizable=1}, - is_ground_content = false, - on_construct = function(pos) - local meta = core.get_meta(pos) - meta:set_string("formspec", - "size[8,9]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]" .. - "listring[]") - meta:set_string("infotext", "Chest") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = core.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - print_to_everything("Chest: ".. player:get_player_name() .. " triggered 'allow put' (10) event for " .. stack:to_string()) - return 10 - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - print_to_everything("Chest: ".. player:get_player_name() .. " triggered 'allow take' (20) event for " .. stack:to_string()) - return 20 - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - print_to_everything("Chest: ".. player:get_player_name() .. " triggered 'allow move' (30) event") - return 30 - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - print_to_everything("Chest: ".. player:get_player_name() .. " put " .. stack:to_string()) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - print_to_everything("Chest: ".. player:get_player_name() .. " took " .. stack:to_string()) - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - print_to_everything("Chest: ".. player:get_player_name() .. " moved " .. count) - end, -}) diff --git a/data/games/garage/mods/chest/detached.lua b/data/games/garage/mods/chest/detached.lua deleted file mode 100644 index bf6eea9..0000000 --- a/data/games/garage/mods/chest/detached.lua +++ /dev/null @@ -1,58 +0,0 @@ -local ALLOW_PUT_MAX = 1 -local ALLOW_TAKE_MAX = 4 - -local function print_to_everything(msg) - core.log("action", "[chest] " .. msg) - core.chat_send_all(msg) -end - --- Create a detached inventory -local inv = core.create_detached_inventory("detached_inventory", { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - print_to_everything("Detached inventory: "..player:get_player_name().." triggered allow_move") - return count -- Allow all - end, - allow_put = function(inv, listname, index, stack, player) - print_to_everything("Detached inventory: "..player:get_player_name().." triggered allow_put for "..stack:to_string().." (max. allowed: "..ALLOW_PUT_MAX..")") - return ALLOW_PUT_MAX -- Allow to put a limited amount of items - end, - allow_take = function(inv, listname, index, stack, player) - print_to_everything("Detached inventory: "..player:get_player_name().." triggered allow_take for "..stack:to_string().." (max. allowed: "..ALLOW_TAKE_MAX..")") - return ALLOW_TAKE_MAX -- Allow to take a limited amount of items - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - print_to_everything("Detached inventory: " .. player:get_player_name().." moved item(s)") - end, - on_put = function(inv, listname, index, stack, player) - print_to_everything("Detached inventory: " .. player:get_player_name().." put "..stack:to_string()) - end, - on_take = function(inv, listname, index, stack, player) - print_to_everything("Detached inventory: " .. player:get_player_name().." took "..stack:to_string()) - end, -}) -inv:set_size("main", 8*3) - - --- Add a special chest to grant access to this inventory -core.register_node("chest:detached_chest", { - description = "Detached Chest" .. "\n" .. - "Grants access to a shared detached inventory" .."\n" .. - "Max. item put count: "..ALLOW_PUT_MAX .."\n".. - "Max. item take count: "..ALLOW_TAKE_MAX, - tiles = {"chest_detached_chest.png^[sheet:2x2:0,0", "chest_detached_chest.png^[sheet:2x2:0,0", - "chest_detached_chest.png^[sheet:2x2:1,0", "chest_detached_chest.png^[sheet:2x2:1,0", - "chest_detached_chest.png^[sheet:2x2:1,0", "chest_detached_chest.png^[sheet:2x2:0,1"}, - paramtype2 = "4dir", - groups = {dig_immediate=2,choppy=3,meta_is_privatizable=1}, - is_ground_content = false, - on_construct = function(pos) - local meta = core.get_meta(pos) - meta:set_string("formspec", - "size[8,9]".. - "list[detached:detached_inventory;main;0,0;8,3;0]".. - "list[current_player;main;0,5;8,4;]".. - "listring[]") - meta:set_string("infotext", "Detached Chest") - end, -}) - diff --git a/data/games/garage/mods/chest/init.lua b/data/games/garage/mods/chest/init.lua deleted file mode 100644 index fad6cfd..0000000 --- a/data/games/garage/mods/chest/init.lua +++ /dev/null @@ -1,2 +0,0 @@ -dofile(core.get_modpath("chest").."/chest.lua") -dofile(core.get_modpath("chest").."/detached.lua") diff --git a/data/games/garage/mods/chest/mod.conf b/data/games/garage/mods/chest/mod.conf deleted file mode 100644 index 7661297..0000000 --- a/data/games/garage/mods/chest/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = chest -description = A simple chest to store items. Also adds a detached inventory test diff --git a/data/games/garage/mods/chest/textures/chest_chest.png b/data/games/garage/mods/chest/textures/chest_chest.png deleted file mode 100644 index 824b4d5..0000000 Binary files a/data/games/garage/mods/chest/textures/chest_chest.png and /dev/null differ diff --git a/data/games/garage/mods/chest/textures/chest_detached_chest.png b/data/games/garage/mods/chest/textures/chest_detached_chest.png deleted file mode 100644 index 8e5dafe..0000000 Binary files a/data/games/garage/mods/chest/textures/chest_detached_chest.png and /dev/null differ diff --git a/data/games/garage/mods/chest_of_everything/init.lua b/data/games/garage/mods/chest_of_everything/init.lua deleted file mode 100644 index e8a1728..0000000 --- a/data/games/garage/mods/chest_of_everything/init.lua +++ /dev/null @@ -1,353 +0,0 @@ -local F = core.formspec_escape -local S = core.get_translator("chest_of_everything") - -local detached_inventories = {} - --- Per-player lists (indexed by player name) -local current_pages = {} -- current page number -local current_max_pages = {} -- current max. page number -local current_searches = {} -- current search string - -local SLOTS_W = 10 -local SLOTS_H = 5 -local SLOTS = SLOTS_W * SLOTS_H - --- This determines how the items are sorted --- "by_type": Sort by item type (tool/craftitem/node/"chest_of_everything" items), then alphabetically by itemstring --- "abc": Alphabetically by itemstring -local SORT_MODE = "by_type" - -local all_items_list -- cached list of all items - --- Create detached inventories -local function add_detached_inventories(player) - local name = player:get_player_name() - local inv_items = core.create_detached_inventory("chest_of_everything_items_"..name, { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - return 0 - end, - allow_put = function(inv, listname, index, stack, player) - return 0 - end, - allow_take = function(inv, listname, index, stack, player) - return -1 - end, - }, name) - local inv_trash = core.create_detached_inventory("chest_of_everything_trash_"..name, { - allow_take = function(inv, listname, index, stack, player) - return 0 - end, - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - return 0 - end, - on_put = function(inv, listname, index, stack, player) - inv:set_list(listname, {}) - end, - }, name) - inv_trash:set_size("main", 1) - detached_inventories[name] = { items = inv_items, trash = inv_trash } -end - -local sort_items_by_type = function(item1, item2) - --[[ Sort items in this order: - * Bag of Everything - * Chest of Everything - * Test tools - * Other tools - * Craftitems - * Other items - * Items from the 'broken' mod - * Dummy items ]] - local def1 = core.registered_items[item1] - local def2 = core.registered_items[item2] - local tool1 = def1.type == "tool" - local tool2 = def2.type == "tool" - local testtool1 = core.get_item_group(item1, "testtool") == 1 - local testtool2 = core.get_item_group(item2, "testtool") == 1 - local dummy1 = core.get_item_group(item1, "dummy") == 1 - local dummy2 = core.get_item_group(item2, "dummy") == 1 - local broken1 = def1.mod_origin == "broken" - local broken2 = def2.mod_origin == "broken" - local craftitem1 = def1.type == "craft" - local craftitem2 = def2.type == "craft" - if item1 == "chest_of_everything:bag" then - return true - elseif item2 == "chest_of_everything:bag" then - return false - elseif item1 == "chest_of_everything:chest" then - return true - elseif item2 == "chest_of_everything:chest" then - return false - elseif dummy1 and not dummy2 then - return false - elseif not dummy1 and dummy2 then - return true - elseif broken1 and not broken2 then - return false - elseif not broken1 and broken2 then - return true - elseif testtool1 and not testtool2 then - return true - elseif not testtool1 and testtool2 then - return false - elseif tool1 and not tool2 then - return true - elseif not tool1 and tool2 then - return false - elseif craftitem1 and not craftitem2 then - return true - elseif not craftitem1 and craftitem2 then - return false - else - return item1 < item2 - end -end - -local sort_items_alphabetically = function(item1, item2) - return item1 < item2 -end - -local collect_items = function(filter, lang_code) - local items = {} - if filter then - filter = string.trim(filter) - filter = string.lower(filter) -- to make sure the search is case-insensitive - end - for itemstring, def in pairs(core.registered_items) do - if itemstring ~= "" and itemstring ~= "unknown" and itemstring ~= "ignore" then - if filter and lang_code then - local desc = ItemStack(itemstring):get_description() - local matches - -- First, try to match original description - if desc ~= "" then - local ldesc = string.lower(desc) - matches = string.match(ldesc, filter) ~= nil - -- Second, try to match translated description - if not matches then - local tdesc = core.get_translated_string(lang_code, desc) - if tdesc ~= "" then - tdesc = string.lower(tdesc) - matches = string.match(tdesc, filter) ~= nil - end - end - -- Third, try to match translated short description - if not matches then - local sdesc = ItemStack(itemstring):get_short_description() - if sdesc ~= "" then - sdesc = core.get_translated_string(lang_code, sdesc) - sdesc = string.lower(sdesc) - matches = string.match(sdesc, filter) ~= nil - end - end - - end - -- Fourth, try to match itemstring - if not matches then - matches = string.match(itemstring, filter) ~= nil - end - - -- If item was matched, add to item list - if matches then - table.insert(items, itemstring) - end - else - table.insert(items, itemstring) - end - end - end - local compare - if SORT_MODE == "by_type" then - compare = sort_items_by_type - elseif SORT_MODE == "abc" then - compare = sort_items_alphabetically - end - table.sort(items, compare) - - return items -end - -local function update_inventory(name) - local search = current_searches[name] or "" - local items - if search == "" then - items = all_items_list - else - local lang_code = core.get_player_information(name).lang_code - items = collect_items(search, lang_code) - end - local max_page = math.ceil(#items / SLOTS) - current_max_pages[name] = max_page - - local inv = detached_inventories[name].items - inv:set_size("main", #items) - inv:set_list("main", items) - if not current_pages[name] then - current_pages[name] = 1 - end - if current_pages[name] > max_page then - current_pages[name] = max_page - end - if current_pages[name] < 1 then - current_pages[name] = 1 - end -end - -local function get_formspec(page, name) - local start = 0 + (page-1)*SLOTS - if not name then - return "" - end - local player = core.get_player_by_name(name) - local playerinvsize = player:get_inventory():get_size("main") - local hotbarsize = player:hud_get_hotbar_itemcount() - local pinv_w, pinv_h, pinv_x - pinv_w = hotbarsize - pinv_h = math.ceil(playerinvsize / pinv_w) - pinv_w = math.min(pinv_w, 10) - pinv_h = math.min(pinv_w, 4) - pinv_x = 0 - if pinv_w < 9 then - pinv_x = 1 - end - - local pagestr = "" - local max_page = current_max_pages[name] - if max_page > 1 then - pagestr = "button[0,5.45;1,1;chest_of_everything_prev;"..F(S("<")).."]".. - "button[1,5.45;1,1;chest_of_everything_next;"..F(S(">")).."]".. - "label[0,5.1;"..F(S("Page: @1/@2", page, max_page)).."]" - end - - local search_text = current_searches[name] or "" - - local inventory_list - if current_max_pages[name] > 0 then - inventory_list = "list[detached:chest_of_everything_items_"..name..";main;0,0;"..SLOTS_W..","..SLOTS_H..";"..start.."]" - else - inventory_list = "label[2.5,2.5;"..F(S("No items found.")).."]" - if search_text ~= "" then - inventory_list = inventory_list .. "button[2.5,3.25;3,0.8;search_button_reset_big;"..F(S("Reset search")).."]" - end - end - - return "size[10,10.5]".. - inventory_list .. - "list[current_player;main;"..pinv_x..",6.75;"..pinv_w..","..pinv_h..";]" .. - "label[9,5.1;"..F(S("Trash:")).."]" .. - "list[detached:chest_of_everything_trash_"..name..";main;9,5.5;1,1]" .. - "field[2.2,5.75;4,1;search;;"..F(search_text).."]" .. - "field_enter_after_edit[search;true]" .. - "field_close_on_enter[search;false]" .. - "button[6,5.45;1.6,1;search_button_start;"..F(S("Search")).."]" .. - "button[7.6,5.45;0.8,1;search_button_reset;"..F(S("X")).."]" .. - "tooltip[search_button_reset;"..F(S("Reset search")).."]" .. - pagestr .. - "listring[detached:chest_of_everything_items_"..name..";main]".. - "listring[current_player;main]".. - "listring[detached:chest_of_everything_trash_"..name..";main]" -end - -local show_formspec = function(name) - local page = current_pages[name] - local form = get_formspec(page, name) - core.show_formspec(name, "chest_of_everything:getitem", form) - return true -end - -core.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "chest_of_everything:getitem" then - return - end - local name = player:get_player_name() - local page = current_pages[name] - local old_page = page - -- Next page or previous page - if fields.chest_of_everything_next or fields.chest_of_everything_prev then - if fields.chest_of_everything_next then - page = page + 1 - elseif fields.chest_of_everything_prev then - page = page - 1 - end - -- Handle page change - if page < 1 then - page = 1 - end - local max_page = current_max_pages[name] - if page > max_page then - page = max_page - end - if page ~= old_page then - current_pages[name] = page - show_formspec(name) - end - return - -- Search - elseif (fields.search_button_start or (fields.key_enter and fields.key_enter_field == "search")) and fields.search then - current_searches[name] = fields.search - update_inventory(name) - show_formspec(name, fields.search) - return - -- Reset search - elseif (fields.search_button_reset or fields.search_button_reset_big) then - current_searches[name] = "" - update_inventory(name) - show_formspec(name) - return - end -end) - -core.register_tool("chest_of_everything:bag", { - description = S("Bag of Everything") .. "\n" .. - S("Grants access to all items"), - inventory_image = "chest_of_everything_bag.png", - wield_image = "chest_of_everything_bag.png", - groups = { disable_repair = 1 }, - on_use = function(itemstack, user) - if user and user:is_player() then - local name = user:get_player_name() - show_formspec(name) - end - end, -}) - -core.register_node("chest_of_everything:chest", { - description = S("Chest of Everything") .. "\n" .. - S("Grants access to all items"), - tiles ={"chest_of_everything_chest.png^[sheet:2x2:0,0", "chest_of_everything_chest.png^[sheet:2x2:0,0", - "chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:1,0", - "chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:0,1"}, - paramtype2 = "4dir", - groups = { dig_immediate=2, choppy=3 }, - is_ground_content = false, - on_construct = function(pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", S("Chest of Everything")) - end, - on_rightclick = function(pos, node, clicker) - if clicker and clicker:is_player() then - local name = clicker:get_player_name() - show_formspec(name) - end - end, -}) - - -core.register_on_mods_loaded(function() - all_items_list = collect_items() -end) - -core.register_on_joinplayer(function(player) - local name = player:get_player_name() - current_searches[name] = "" - current_pages[name] = 1 - current_max_pages[name] = 0 - add_detached_inventories(player) - update_inventory(name) -end) - -core.register_on_leaveplayer(function(player) - local name = player:get_player_name() - current_pages[name] = nil - current_max_pages[name] = nil - current_searches[name] = nil -end) diff --git a/data/games/garage/mods/chest_of_everything/mod.conf b/data/games/garage/mods/chest_of_everything/mod.conf deleted file mode 100644 index 50dc2d5..0000000 --- a/data/games/garage/mods/chest_of_everything/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = chest_of_everything -description = Adds the chest of everything and bag of everything from which you can take all items diff --git a/data/games/garage/mods/chest_of_everything/textures/chest_of_everything_bag.png b/data/games/garage/mods/chest_of_everything/textures/chest_of_everything_bag.png deleted file mode 100644 index 7c18907..0000000 Binary files a/data/games/garage/mods/chest_of_everything/textures/chest_of_everything_bag.png and /dev/null differ diff --git a/data/games/garage/mods/chest_of_everything/textures/chest_of_everything_chest.png b/data/games/garage/mods/chest_of_everything/textures/chest_of_everything_chest.png deleted file mode 100644 index 6b2fd58..0000000 Binary files a/data/games/garage/mods/chest_of_everything/textures/chest_of_everything_chest.png and /dev/null differ diff --git a/data/games/garage/mods/creative/README.txt b/data/games/garage/mods/creative/README.txt new file mode 100644 index 0000000..32e8d22 --- /dev/null +++ b/data/games/garage/mods/creative/README.txt @@ -0,0 +1,17 @@ +Minetest Game mod: creative +=========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Jean-Patrick G. (kilbith) (MIT) + +Author of media (textures) +-------------------------- +paramat (CC BY-SA 3.0): +* creative_prev_icon.png +* creative_next_icon.png +* creative_search_icon.png +* creative_clear_icon.png +* creative_trash_icon.png derived from a texture by kilbith (CC BY-SA 3.0) diff --git a/data/games/garage/mods/creative/init.lua b/data/games/garage/mods/creative/init.lua new file mode 100644 index 0000000..f345697 --- /dev/null +++ b/data/games/garage/mods/creative/init.lua @@ -0,0 +1,103 @@ +-- creative/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("creative") + +creative = {} +creative.get_translator = S + +local function update_sfinv(name) + minetest.after(0, function() + local player = minetest.get_player_by_name(name) + if player then + if sfinv.get_page(player):sub(1, 9) == "creative:" then + sfinv.set_page(player, sfinv.get_homepage_name(player)) + else + sfinv.set_player_inventory_formspec(player) + end + end + end) +end + +minetest.register_privilege("creative", { + description = S("Allow player to use creative inventory"), + give_to_singleplayer = false, + give_to_admin = false, + on_grant = update_sfinv, + on_revoke = update_sfinv, +}) + +-- Override the engine's creative mode function +local old_is_creative_enabled = minetest.is_creative_enabled + +function minetest.is_creative_enabled(name) + if name == "" then + return old_is_creative_enabled(name) + end + return minetest.check_player_privs(name, {creative = true}) or + old_is_creative_enabled(name) +end + +-- For backwards compatibility: +function creative.is_enabled_for(name) + return minetest.is_creative_enabled(name) +end + +dofile(minetest.get_modpath("creative") .. "/inventory.lua") + +if minetest.is_creative_enabled("") then + minetest.register_on_mods_loaded(function() + -- Dig time is modified according to difference (leveldiff) between tool + -- 'maxlevel' and node 'level'. Digtime is divided by the larger of + -- leveldiff and 1. + -- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been + -- increased such that nodes of differing levels have an insignificant + -- effect on digtime. + local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + + -- Override the hand tool + minetest.override_item("", { + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + -- dig_immediate group doesn't use value 1. Value 3 is instant dig + dig_immediate = + {times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256}, + }, + damage_groups = {fleshy = 10}, + } + }) + end) +end + +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + if placer and placer:is_player() then + return minetest.is_creative_enabled(placer:get_player_name()) + end +end) + +-- Don't pick up if the item is already in the inventory +local old_handle_node_drops = minetest.handle_node_drops +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() or + not minetest.is_creative_enabled(digger:get_player_name()) then + return old_handle_node_drops(pos, drops, digger) + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end +end diff --git a/data/games/garage/mods/creative/inventory.lua b/data/games/garage/mods/creative/inventory.lua new file mode 100644 index 0000000..f018afe --- /dev/null +++ b/data/games/garage/mods/creative/inventory.lua @@ -0,0 +1,261 @@ +-- creative/inventory.lua + +-- support for MT game translation. +local S = creative.get_translator + +local player_inventory = {} +local inventory_cache = {} + +local function init_creative_cache(items) + inventory_cache[items] = {} + local i_cache = inventory_cache[items] + + for name, def in pairs(items) do + if def.groups.not_in_creative_inventory ~= 1 and + def.description and def.description ~= "" then + i_cache[name] = def + end + end + table.sort(i_cache) + return i_cache +end + +function creative.init_creative_inventory(player) + local player_name = player:get_player_name() + player_inventory[player_name] = { + size = 0, + filter = "", + start_i = 0, + old_filter = nil, -- use only for caching in update_creative_inventory + old_content = nil + } + + minetest.create_detached_inventory("creative_" .. player_name, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + local name = player2 and player2:get_player_name() or "" + if not minetest.is_creative_enabled(name) or + to_list == "main" then + return 0 + end + return count + end, + allow_put = function(inv, listname, index, stack, player2) + return 0 + end, + allow_take = function(inv, listname, index, stack, player2) + local name = player2 and player2:get_player_name() or "" + if not minetest.is_creative_enabled(name) then + return 0 + end + return -1 + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + end, + on_take = function(inv, listname, index, stack, player2) + if stack and stack:get_count() > 0 then + minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory") + end + end, + }, player_name) + + return player_inventory[player_name] +end + +local NO_MATCH = 999 +local function match(s, filter) + if filter == "" then + return 0 + end + if s:lower():find(filter, 1, true) then + return #s - #filter + end + return NO_MATCH +end + +local function description(def, lang_code) + local s = def.description + if lang_code then + s = minetest.get_translated_string(lang_code, s) + end + return s:gsub("\n.*", "") -- First line only +end + +function creative.update_creative_inventory(player_name, tab_content) + local inv = player_inventory[player_name] or + creative.init_creative_inventory(minetest.get_player_by_name(player_name)) + local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) + + if inv.filter == inv.old_filter and tab_content == inv.old_content then + return + end + inv.old_filter = inv.filter + inv.old_content = tab_content + + local items = inventory_cache[tab_content] or init_creative_cache(tab_content) + + local lang + local player_info = minetest.get_player_information(player_name) + if player_info and player_info.lang_code ~= "" then + lang = player_info.lang_code + end + + local creative_list = {} + local order = {} + for name, def in pairs(items) do + local m = match(description(def), inv.filter) + if m > 0 then + m = math.min(m, match(description(def, lang), inv.filter)) + end + if m > 0 then + m = math.min(m, match(name, inv.filter)) + end + + if m < NO_MATCH then + creative_list[#creative_list+1] = name + -- Sort by match value first so closer matches appear earlier + order[name] = string.format("%02d", m) .. name + end + end + + table.sort(creative_list, function(a, b) return order[a] < order[b] end) + + player_inv:set_size("main", #creative_list) + player_inv:set_list("main", creative_list) + inv.size = #creative_list +end + +-- Create the trash field +local trash = minetest.create_detached_inventory("trash", { + -- Allow the stack to be placed and remove it in on_put() + -- This allows the creative inventory to restore the stack + allow_put = function(inv, listname, index, stack, player) + return stack:get_count() + end, + on_put = function(inv, listname) + inv:set_list(listname, {}) + end, +}) +trash:set_size("main", 1) + +creative.formspec_add = "" + +function creative.register_tab(name, title, items) + sfinv.register_page("creative:" .. name, { + title = title, + is_in_nav = function(self, player, context) + return minetest.is_creative_enabled(player:get_player_name()) + end, + get = function(self, player, context) + local player_name = player:get_player_name() + creative.update_creative_inventory(player_name, items) + local inv = player_inventory[player_name] + local pagenum = math.floor(inv.start_i / (4*8) + 1) + local pagemax = math.max(math.ceil(inv.size / (4*8)), 1) + local esc = minetest.formspec_escape + return sfinv.make_formspec(player, context, + (inv.size == 0 and ("label[3,2;"..esc(S("No items to show.")).."]") or "") .. + "label[5.8,4.15;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" .. + [[ + image[4.08,4.2;0.8,0.8;creative_trash_icon.png] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] + list[detached:trash;main;4.02,4.1;1,1;] + listring[] + image_button[5,4.05;0.8,0.8;creative_prev_icon.png;creative_prev;] + image_button[7.25,4.05;0.8,0.8;creative_next_icon.png;creative_next;] + image_button[2.63,4.05;0.8,0.8;creative_search_icon.png;creative_search;] + image_button[3.25,4.05;0.8,0.8;creative_clear_icon.png;creative_clear;] + ]] .. + "tooltip[creative_search;" .. esc(S("Search")) .. "]" .. + "tooltip[creative_clear;" .. esc(S("Reset")) .. "]" .. + "tooltip[creative_prev;" .. esc(S("Previous page")) .. "]" .. + "tooltip[creative_next;" .. esc(S("Next page")) .. "]" .. + "listring[current_player;main]" .. + "field_enter_after_edit[creative_filter;true]" .. + "field_close_on_enter[creative_filter;false]" .. + "field[0.3,4.2;2.8,1.2;creative_filter;;" .. esc(inv.filter) .. "]" .. + "listring[detached:creative_" .. player_name .. ";main]" .. + "list[detached:creative_" .. player_name .. ";main;0,0;8,4;" .. tostring(inv.start_i) .. "]" .. + creative.formspec_add, true) + end, + on_enter = function(self, player, context) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + if inv then + inv.start_i = 0 + end + end, + on_player_receive_fields = function(self, player, context, fields) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + assert(inv) + + if fields.creative_clear then + inv.start_i = 0 + inv.filter = "" + sfinv.set_player_inventory_formspec(player, context) + elseif (fields.creative_search or + fields.key_enter_field == "creative_filter") + and fields.creative_filter then + inv.start_i = 0 + inv.filter = fields.creative_filter:sub(1, 128) -- truncate to a sane length + :gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + :lower() -- search is case insensitive + sfinv.set_player_inventory_formspec(player, context) + elseif not fields.quit then + local start_i = inv.start_i or 0 + + if fields.creative_prev then + start_i = start_i - 4*8 + if start_i < 0 then + start_i = inv.size - (inv.size % (4*8)) + if inv.size == start_i then + start_i = math.max(0, inv.size - (4*8)) + end + end + elseif fields.creative_next then + start_i = start_i + 4*8 + if start_i >= inv.size then + start_i = 0 + end + end + + inv.start_i = start_i + sfinv.set_player_inventory_formspec(player, context) + end + end + }) +end + +-- Sort registered items +local registered_nodes = {} +local registered_tools = {} +local registered_craftitems = {} + +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_items) do + local group = def.groups or {} + + local nogroup = not (group.node or group.tool or group.craftitem) + if group.node or (nogroup and minetest.registered_nodes[name]) then + registered_nodes[name] = def + elseif group.tool or (nogroup and minetest.registered_tools[name]) then + registered_tools[name] = def + elseif group.craftitem or (nogroup and minetest.registered_craftitems[name]) then + registered_craftitems[name] = def + end + end +end) + +creative.register_tab("all", S("All"), minetest.registered_items) +creative.register_tab("nodes", S("Nodes"), registered_nodes) +creative.register_tab("tools", S("Tools"), registered_tools) +creative.register_tab("craftitems", S("Items"), registered_craftitems) + +local old_homepage_name = sfinv.get_homepage_name +function sfinv.get_homepage_name(player) + if minetest.is_creative_enabled(player:get_player_name()) then + return "creative:all" + else + return old_homepage_name(player) + end +end diff --git a/data/games/garage/mods/creative/license.txt b/data/games/garage/mods/creative/license.txt new file mode 100644 index 0000000..50ff9c7 --- /dev/null +++ b/data/games/garage/mods/creative/license.txt @@ -0,0 +1,61 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 Jean-Patrick G. (kilbith) +Copyright (C) 2018 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/creative/locale/creative.de.tr b/data/games/garage/mods/creative/locale/creative.de.tr new file mode 100644 index 0000000..ddd88dd --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.de.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Spieler erlauben, das Kreativinventar zu benutzen +No items to show.=Keine Gegenstände vorhanden. +Search=Suchen +Reset=Zurücksetzen +Previous page=Vorherige Seite +Next page=Nächste Seite +All=Alles +Nodes=Blöcke +Tools=Werkzeuge +Items=Gegenstände diff --git a/data/games/garage/mods/creative/locale/creative.eo.tr b/data/games/garage/mods/creative/locale/creative.eo.tr new file mode 100644 index 0000000..8142baf --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.eo.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permesi ke la ludanto uzu la kreeman stokon +No items to show.= +Search=Serĉi +Reset=Rekomencigi +Previous page=Antaŭa paĝo +Next page=Sekva paĝo +All=Ĉio +Nodes=Nodoj +Tools=Iloj +Items=Objektoj diff --git a/data/games/garage/mods/creative/locale/creative.es.tr b/data/games/garage/mods/creative/locale/creative.es.tr new file mode 100644 index 0000000..ceeb32f --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.es.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permitir al jugador usar el inventario creativo +No items to show.=Sin artículos que mostrar. +Search=Buscar +Reset=Reiniciar +Previous page=Pág. siguiente +Next page=Pág. anterior +All=Todos +Nodes=Nodos +Tools=Herramientas +Items=Objetos diff --git a/data/games/garage/mods/creative/locale/creative.fr.tr b/data/games/garage/mods/creative/locale/creative.fr.tr new file mode 100644 index 0000000..89a4222 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.fr.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permettre aux joueurs d'utiliser l'inventaire du mode créatif +No items to show.= +Search=Rechercher +Reset=Réinitialiser +Previous page=Page précédente +Next page=Page suivante +All=Tout +Nodes=Nœuds +Tools=Outils +Items=Article diff --git a/data/games/garage/mods/creative/locale/creative.id.tr b/data/games/garage/mods/creative/locale/creative.id.tr new file mode 100644 index 0000000..5b859c4 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.id.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Bolehkan pemain menggunakan inventaris kreatif +No items to show.=Tiada barang untuk ditampilkan. +Search=Cari +Reset=Atur ulang +Previous page=Halaman sebelumnya +Next page=Halaman selanjutnya +All=Semua +Nodes=Nodus +Tools=Perkakas +Items=Barang diff --git a/data/games/garage/mods/creative/locale/creative.it.tr b/data/games/garage/mods/creative/locale/creative.it.tr new file mode 100644 index 0000000..736bc94 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.it.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permette al giocatore di usare l'inventario creativo +No items to show.= +Search=Cerca +Reset=Azzera +Previous page=Pagina precedente +Next page=Pagina successiva +All=Tutto +Nodes=Nodi +Tools=Strumenti +Items=Oggetti diff --git a/data/games/garage/mods/creative/locale/creative.ja.tr b/data/games/garage/mods/creative/locale/creative.ja.tr new file mode 100644 index 0000000..2d734e5 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.ja.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=プレーヤーにクリエイティブ インベントリーの使用を許可する +No items to show.= +Search=検索 +Reset=リセット +Previous page=前のページ +Next page=次のページ +All=すべて +Nodes=ブロック +Tools=道具 +Items=アイテム diff --git a/data/games/garage/mods/creative/locale/creative.jbo.tr b/data/games/garage/mods/creative/locale/creative.jbo.tr new file mode 100644 index 0000000..d8640b1 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.jbo.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=zifre le ka pilno le finti ke dacti liste +No items to show.= +Search=sisku +Reset=kraga'igau +Previous page=lidne +Next page=selyli'e +All=ro dacti +Nodes=bliku +Tools=tutci +Items=dacti diff --git a/data/games/garage/mods/creative/locale/creative.lv.tr b/data/games/garage/mods/creative/locale/creative.lv.tr new file mode 100644 index 0000000..de8662e --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.lv.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Atļaut spēlētājam izmantot radošo inventāru +No items to show.=Nav priekšmetu ko paradīt. +Search=Meklēt +Reset=Nodzēst +Previous page=Iepriekšējā lappuse +Next page=Nākošā lappuse +All=Viss +Nodes=Bloki +Tools=Rīki +Items=Priekšmeti diff --git a/data/games/garage/mods/creative/locale/creative.ms.tr b/data/games/garage/mods/creative/locale/creative.ms.tr new file mode 100644 index 0000000..98178f1 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.ms.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Benarkan pemain menggunakan inventori kreatif +No items to show.=Tiada item untuk ditunjukkan. +Search=Cari +Reset=Tetap semula +Previous page=Halaman sebelumnya +Next page=Halaman seterusnya +All=Semua +Nodes=Nod +Tools=Alatan +Items=Item diff --git a/data/games/garage/mods/creative/locale/creative.pl.tr b/data/games/garage/mods/creative/locale/creative.pl.tr new file mode 100644 index 0000000..1fe7857 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.pl.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Zezwól graczom na używanie kreatywnego ekwipunku +No items to show.= +Search=Wyszukaj +Reset=Zresetuj +Previous page=Poprzednia strona +Next page=Następna strona +All=Wszystko +Nodes=Bloki +Tools=Narzędzia +Items=Przedmioty diff --git a/data/games/garage/mods/creative/locale/creative.pt_BR.tr b/data/games/garage/mods/creative/locale/creative.pt_BR.tr new file mode 100644 index 0000000..b66edcc --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Permitir o jogador usar o inventário criativo +No items to show.= +Search=Pesquisar +Reset=Redefinir +Previous page=Página anterior +Next page=Próxima página +All=Todos +Nodes=Blocos +Tools=Ferramentas +Items=Itens diff --git a/data/games/garage/mods/creative/locale/creative.ru.tr b/data/games/garage/mods/creative/locale/creative.ru.tr new file mode 100644 index 0000000..b0bb757 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.ru.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Разрешить игроку использовать творческий инвентарь +No items to show.=Нет предметов. +Search=Поиск +Reset=Сброс +Previous page=Предыдущая страница +Next page=Следующая страница +All=Всё +Nodes=Ноды +Tools=Инструменты +Items=Предметы diff --git a/data/games/garage/mods/creative/locale/creative.sk.tr b/data/games/garage/mods/creative/locale/creative.sk.tr new file mode 100644 index 0000000..0aa8d0e --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.sk.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Povolí hráčovi použivať kreatívny inventár +No items to show.= +Search=Hľadaj +Reset=Vrátiť späť +Previous page=Predchádzajúca stránka +Next page=Nasledujúca stránka +All=Všetko +Nodes=Kocky +Tools=Nástroje +Items=Veci diff --git a/data/games/garage/mods/creative/locale/creative.sv.tr b/data/games/garage/mods/creative/locale/creative.sv.tr new file mode 100644 index 0000000..ddba02d --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.sv.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Tillåt spelare att använda kreativa saker +No items to show.= +Search=Sök +Reset=Återställ +Previous page=Förra sida +Next page=Nästa sida +All=Alla +Nodes=Noder +Tools=Verktyg +Items=Saker diff --git a/data/games/garage/mods/creative/locale/creative.uk.tr b/data/games/garage/mods/creative/locale/creative.uk.tr new file mode 100644 index 0000000..c0a817c --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.uk.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=Дозволити гравцю використовувати творчий інвентар +No items to show.=Немає результатів. +Search=Пошук +Reset=Скинути +Previous page=Попередня сторінка +Next page=Наступна сторінка +All=Все +Nodes=Ноди +Tools=Інструменти +Items=Предмети diff --git a/data/games/garage/mods/creative/locale/creative.zh_CN.tr b/data/games/garage/mods/creative/locale/creative.zh_CN.tr new file mode 100644 index 0000000..27d3e86 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.zh_CN.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=允许玩家使用创造模式物品栏 +No items to show.= +Search=搜索 +Reset=重置 +Previous page=上一页 +Next page=下一页 +All=所有 +Nodes=节点 +Tools=工具 +Items=物品 diff --git a/data/games/garage/mods/creative/locale/creative.zh_TW.tr b/data/games/garage/mods/creative/locale/creative.zh_TW.tr new file mode 100644 index 0000000..ae9b156 --- /dev/null +++ b/data/games/garage/mods/creative/locale/creative.zh_TW.tr @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory=允許玩家使用創造模式物品欄 +No items to show.= +Search=搜索 +Reset=重置 +Previous page=上一頁 +Next page=下一頁 +All=所有 +Nodes=節點 +Tools=工具 +Items=物品 diff --git a/data/games/garage/mods/creative/locale/template.txt b/data/games/garage/mods/creative/locale/template.txt new file mode 100644 index 0000000..ee593fe --- /dev/null +++ b/data/games/garage/mods/creative/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: creative +Allow player to use creative inventory= +No items to show.= +Search= +Reset= +Previous page= +Next page= +All= +Nodes= +Tools= +Items= diff --git a/data/games/garage/mods/creative/mod.conf b/data/games/garage/mods/creative/mod.conf new file mode 100644 index 0000000..37d0d67 --- /dev/null +++ b/data/games/garage/mods/creative/mod.conf @@ -0,0 +1,3 @@ +name = creative +description = Minetest Game mod: creative +depends = sfinv diff --git a/data/games/garage/mods/creative/textures/creative_clear_icon.png b/data/games/garage/mods/creative/textures/creative_clear_icon.png new file mode 100644 index 0000000..ab421d9 Binary files /dev/null and b/data/games/garage/mods/creative/textures/creative_clear_icon.png differ diff --git a/data/games/garage/mods/creative/textures/creative_next_icon.png b/data/games/garage/mods/creative/textures/creative_next_icon.png new file mode 100644 index 0000000..4a3637d Binary files /dev/null and b/data/games/garage/mods/creative/textures/creative_next_icon.png differ diff --git a/data/games/garage/mods/creative/textures/creative_prev_icon.png b/data/games/garage/mods/creative/textures/creative_prev_icon.png new file mode 100644 index 0000000..d5e3c27 Binary files /dev/null and b/data/games/garage/mods/creative/textures/creative_prev_icon.png differ diff --git a/data/games/garage/mods/creative/textures/creative_search_icon.png b/data/games/garage/mods/creative/textures/creative_search_icon.png new file mode 100644 index 0000000..421b833 Binary files /dev/null and b/data/games/garage/mods/creative/textures/creative_search_icon.png differ diff --git a/data/games/garage/mods/creative/textures/creative_trash_icon.png b/data/games/garage/mods/creative/textures/creative_trash_icon.png new file mode 100644 index 0000000..a0f6d23 Binary files /dev/null and b/data/games/garage/mods/creative/textures/creative_trash_icon.png differ diff --git a/data/games/garage/mods/default/README.txt b/data/games/garage/mods/default/README.txt new file mode 100644 index 0000000..e8b78a7 --- /dev/null +++ b/data/games/garage/mods/default/README.txt @@ -0,0 +1,407 @@ +Minetest Game mod: default +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +The torch code was derived by sofar from the 'torches' mod by +BlockMen (LGPLv2.1+) + +Authors of media (textures, sounds, models and schematics) +---------------------------------------------------------- +Everything not listed in here: +celeron55, Perttu Ahola (CC BY-SA 3.0) + + +Textures +-------- +Cisoun's texture pack (CC BY-SA 3.0): + default_jungletree.png + default_lava.png + default_leaves.png + default_sapling.png + default_bush_sapling.png + default_stone.png + default_tree.png + default_tree_top.png + default_water.png + +RealBadAngel's animated water (CC BY-SA 3.0): + default_water_source_animated.png + default_water_flowing_animated.png + +VanessaE (CC BY-SA 3.0): + default_torch_animated.png + default_torch_on_ceiling_animated.png + default_torch_on_floor_animated.png + default_torch_on_floor.png + default_desert_sand.png + default_desert_stone.png + default_sand.png + default_mese_crystal.png + default_mese_crystal_fragment.png + +Calinou (CC BY-SA 3.0): + default_brick.png + default_papyrus.png + default_mineral_copper.png + +PilzAdam (CC BY-SA 3.0): + default_jungleleaves.png + default_junglesapling.png + default_obsidian_glass.png + default_obsidian_shard.png + default_mineral_gold.png + +jojoa1997 (CC BY-SA 3.0): + default_obsidian.png + +InfinityProject (CC BY-SA 3.0): + default_mineral_diamond.png + +Splizard (CC BY-SA 3.0): + default_pine_sapling.png + default_pine_needles.png + +Zeg9 (CC BY-SA 3.0): + default_coal_block.png + +paramat (CC BY-SA 3.0): + wieldhand.png -- Copied from character.png by Jordach (CC BY-SA 3.0) + default_pinetree.png + default_pinetree_top.png + default_pinewood.png + default_acacia_leaves.png + default_acacia_leaves_simple.png + default_acacia_sapling.png + default_acacia_bush_sapling.png + default_pine_bush_sapling.png + default_acacia_tree.png + default_acacia_tree_top.png + default_acacia_wood.png + default_acacia_bush_stem.png + default_bush_stem.png + default_pine_bush_stem.png + default_junglewood.png + default_jungletree_top.png + default_sandstone_brick.png + default_obsidian_brick.png + default_stone_brick.png + default_desert_stone_brick.png + default_sandstone_block.png + default_obsidian_block.png + default_stone_block.png + default_desert_stone_block.png + default_river_water.png + default_river_water_source_animated.png + default_river_water_flowing_animated.png + default_dry_grass.png + default_dry_grass_side.png + default_dry_grass_*.png + default_grass_side.png -- Derived from a texture by TumeniNodes (CC-BY-SA 3.0) + default_mese_block.png + default_silver_sand.png + default_mese_post_light_side.png + default_mese_post_light_side_dark.png + default_mese_post_light_top.png + default_silver_sandstone.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_silver_sandstone_brick.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_silver_sandstone_block.png -- Derived from a texture by GreenXenith (CC-BY-SA 3.0) + default_bookshelf_slot.png -- Derived from a texture by Gambit (CC-BY-SA 3.0) + default_marram_grass_*.png -- Derived from textures by TumeniNodes (CC-BY-SA 3.0) + default_emergent_jungle_sapling.png + default_permafrost.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + default_stones.png -- Derived from a texture by sofar (CC0 1.0) + default_stones_side.png -- Derived from a texture by sofar (CC0 1.0) + default_moss.png + default_moss_side.png + default_fence_rail_acacia_wood + default_fence_rail_aspen_wood -- Derived from a texture by sofar (CC BY-SA 3.0) + default_fence_rail_junglewood + default_fence_rail_pine_wood + default_fence_rail_wood -- Derived from a texture by BlockMen (CC BY-SA 3.0) + gui_hotbar.png + gui_hotbar_selected.png + +TumeniNodes (CC BY-SA 3.0): + default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) + default_coniferous_litter.png + default_coniferous_litter_side.png + default_grass.png + default_dry_dirt.png + +BlockMen (CC BY-SA 3.0): + default_aspen_leaves.png -- Derived from Sofar's texture + default_wood.png + default_clay_brick.png + default_iron_ingot.png + default_gold_ingot.png + default_tool_steelsword.png + default_diamond.png + default_tool_*.png + default_lava_source_animated.png + default_lava_flowing_animated.png + default_stick.png + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + default_mineral_mese.png + default_meselamp.png + gui_formbg.png + gui_furnace_arrow_bg.png + gui_furnace_arrow_fg.png + gui_hb_bg.png + +sofar (CC BY-SA 3.0): + default_aspen_sapling + default_aspen_tree + default_aspen_tree_top, derived from default_pine_tree_top (by paramat) + default_aspen_wood, derived from default_pine_wood (by paramat) + default_chest_inside + +sofar (CC0 1.0): + default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel + +Neuromancer (CC BY-SA 3.0): + default_cobble.png, based on texture by Brane praefect + default_mossycobble.png, based on texture by Brane praefect + default_furnace_*.png + +Gambit (CC BY-SA 3.0): + default_bronze_ingot.png + default_copper_ingot.png + default_copper_lump.png + default_iron_lump.png + default_gold_lump.png + default_clay_lump.png + default_coal_lump.png + default_grass_*.png + default_paper.png + default_diamond_block.png + default_ladder_steel.png + default_sign_wall_wood.png + default_flint.png + default_snow.png + default_snow_side.png + default_snowball.png + default_book.png + +asl97 (CC BY-SA 3.0): + default_ice.png + +Pithydon (CC BY-SA 3.0) + default_coral_brown.png + default_coral_orange.png + default_coral_skeleton.png + +Ferk (CC0 1.0): + default_item_smoke.png + +npx (CC BY-SA 3.0): + default_rainforest_litter.png + default_rainforest_litter_side.png + +kaeza (CC-BY-SA 3.0): + default_desert_sandstone.png + default_desert_sandstone_brick.png + default_desert_sandstone_block.png + +kilbith (CC BY-SA 3.0): + default_steel_block.png + default_copper_block.png + default_bronze_block.png + default_gold_block.png + default_tin_block.png + default_mineral_tin.png + default_tin_ingot.png + default_tin_lump.png + +tobyplowy (CC BY-SA 3.0): + default_kelp.png + +CloudyProton (CC BY-SA 3.0): + default_book_written.png, based on default_book.png by Gambit + +Mossmanikin (CC BY-SA 3.0): + default_fern_*.png + +random-geek (CC BY-SA 3.0): + default_blueberries.png + default_blueberry_overlay.png + default_blueberry_bush_leaves.png, derived from default_bush_leaves (by paramat) + default_blueberry_bush_sapling.png + default_dirt.png -- Derived from a texture by Neuromancer (CC BY-SA 3.0) + +Krock (CC0 1.0): + default_glass.png + default_glass_detail.png + +Topywo (CC BY-SA 3.0) + default_coral_cyan.png + default_coral_green.png + default_coral_pink.png + +Extex101 (CC BY-SA 3.0) + default_large_cactus_seedling.png + default_dry_shrub.png -- Derived from the original texture by celeron55 + +An0n3m0us (CC BY-SA 3.0): + heart.png -- Derived from a texture by KevDoy (CC BY-SA 3.0) + bubble.png -- Derived from a texture by BlockMen (CC BY-SA 3.0) + + +Sounds +------ +Glass breaking sounds (CC BY 3.0): + 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ + 2: http://www.freesound.org/people/Tomlija/sounds/97669/ + 3: http://www.freesound.org/people/lsprice/sounds/88808/ + +Mito551 (sounds) (CC BY-SA 3.0): + default_dig_crumbly.*.ogg + default_dig_dig_immediate.ogg + default_dig_oddly_breakable_by_hand.ogg + default_dug_node.*.ogg + default_grass_footstep.1.ogg + default_grass_footstep.2.ogg + default_grass_footstep.3.ogg + default_gravel_footstep.*.ogg + default_place_node.*.ogg + default_place_node_hard.*.ogg + default_glass_footstep.ogg + default_wood_footstep.1.ogg + default_wood_footstep.2.ogg + default_dirt_footstep.1.ogg + default_dirt_footstep.2.ogg + default_glass_footstep.ogg + +Metal sounds: + default_dig_metal.ogg - yadronoff - CC-BY-3.0 + - https://www.freesound.org/people/yadronoff/sounds/320397/ + default_dug_metal.*.ogg - Iwan Gabovitch - qubodup - CC0 + - http://opengameart.org/users/qubodup + default_metal_footstep.*.ogg - (CC0 1.0) - CC0 1.0 + - https://freesound.org/people/mypantsfelldown/sounds/398937/ + default_place_node_metal.*.ogg - Ogrebane - CC0 + - http://opengameart.org/content/wood-and-metal-sound-effects-volume-2 + +Tool breaking sounds added by sofar: CC-BY-3.0 + default_tool_breaks.* - http://www.freesound.org/people/HerbertBoland/sounds/33206/ + +AGFX (CC BY 3.0): +https://www.freesound.org/people/AGFX/packs/1253/ + default_water_footstep.1.ogg + default_water_footstep.2.ogg + default_water_footstep.3.ogg + +blukotek (CC0 1.0): +https://www.freesound.org/people/blukotek/sounds/251660/ + default_dig_snappy.ogg + +Chests sounds added by sofar, derived of several files mixed together: + default_chest_open.ogg + default_chest_close.ogg + - http://www.freesound.org/people/Sevin7/sounds/269722/ CC0 + - http://www.freesound.org/people/Percy%20Duke/sounds/23448/ CC-BY-3.0 + - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0 + - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0 + - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0 + +Ryding (CC0 1.0): +http://freesound.org/people/Ryding/sounds/94337/ + default_snow_footstep.*.ogg + +Ferk (CC0 1.0): + default_item_smoke.ogg, based on a sound by http://opengameart.org/users/bart + +sonictechtonic (CC BY 3.0): +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg + +Sheyvan (CC0 1.0): +https://freesound.org/people/Sheyvan/sounds/476113/ + default_dig_choppy.*.ogg + +lolamadeus (CC0 1.0): +https://freesound.org/people/lolamadeus/sounds/179341/ + default_gravel_dig.*.ogg + default_gravel_dug.*.ogg + +Benboncan (CC BY 3.0): +https://freesound.org/people/Benboncan/sounds/71823/ + default_dig_cracky.*.ogg + +Erdie (CC BY 3.0): +https://freesound.org/people/Erdie/sounds/41579/ + default_hard_footstep.*.ogg + +worthahep88 (CC0 1.0): +https://freesound.org/people/worthahep88/sounds/319224/ + default_sand_footstep.*.ogg + +dheming (CC BY 3.0): +https://freesound.org/people/dheming/sounds/268023/ + default_ice_dig.*.ogg + +InspectorJ (CC BY 3.0): +https://freesound.org/people/InspectorJ/sounds/416967/ + default_ice_footstep.*.ogg + +Angel_Perez_Grandi (CC BY 3.0): +https://freesound.org/people/Angel_Perez_Grandi/sounds/49190/ + default_ice_dug.ogg + +iankath (CC0 1.0) +https://freesound.org/people/iankath/sounds/173991/ + default_furnace_active.ogg + + +Models +------ +sofar (CC BY-SA 3.0): + chest_open.obj + torch_ceiling.obj + torch_floor.obj + torch_wall.obj + + +Schematics +---------- +paramat (CC BY-SA 3.0): + acacia_bush.mts + acacia_tree.mts + acacia_tree_from_sapling.mts + apple_tree.mts + apple_tree_from_sapling.mts + aspen_tree.mts + aspen_tree_from_sapling.mts + bush.mts + emergent_jungle_tree.mts + emergent_jungle_tree_from_sapling.mts + jungle_tree.mts + jungle_tree_from_sapling.mts + large_cactus.mts + papyrus.mts + pine_tree.mts + pine_tree_from_sapling.mts + snowy_pine_tree_from_sapling.mts + small_pine_tree.mts + small_pine_tree_from_sapling.mts + snowy_small_pine_tree_from_sapling.mts + +Shara RedCat (CC BY-SA 3.0): + acacia_log.mts + apple_log.mts + aspen_log.mts + jungle_log.mts + pine_log.mts + +TumeniNodes (CC BY-SA 3.0): + pine_bush.mts + +random-geek (CC BY-SA 3.0): + blueberry_bush.mts diff --git a/data/games/garage/mods/default/aliases.lua b/data/games/garage/mods/default/aliases.lua new file mode 100644 index 0000000..6db3fc8 --- /dev/null +++ b/data/games/garage/mods/default/aliases.lua @@ -0,0 +1,77 @@ +-- mods/default/aliases.lua + +-- Aliases to support loading worlds using nodes following the old naming convention +-- These can also be helpful when using chat commands, for example /giveme +minetest.register_alias("stone", "default:stone") +minetest.register_alias("stone_with_coal", "default:stone_with_coal") +minetest.register_alias("stone_with_iron", "default:stone_with_iron") +minetest.register_alias("dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("dirt_with_grass_footsteps", "default:dirt_with_grass_footsteps") +minetest.register_alias("dirt", "default:dirt") +minetest.register_alias("sand", "default:sand") +minetest.register_alias("gravel", "default:gravel") +minetest.register_alias("sandstone", "default:sandstone") +minetest.register_alias("clay", "default:clay") +minetest.register_alias("brick", "default:brick") +minetest.register_alias("tree", "default:tree") +minetest.register_alias("jungletree", "default:jungletree") +minetest.register_alias("junglegrass", "default:junglegrass") +minetest.register_alias("leaves", "default:leaves") +minetest.register_alias("cactus", "default:cactus") +minetest.register_alias("papyrus", "default:papyrus") +minetest.register_alias("bookshelf", "default:bookshelf") +minetest.register_alias("glass", "default:glass") +minetest.register_alias("wooden_fence", "default:fence_wood") +minetest.register_alias("rail", "carts:rail") +minetest.register_alias("ladder", "default:ladder_wood") +minetest.register_alias("wood", "default:wood") +minetest.register_alias("mese", "default:mese") +minetest.register_alias("cloud", "default:cloud") +minetest.register_alias("water_flowing", "default:water_flowing") +minetest.register_alias("water_source", "default:water_source") +minetest.register_alias("lava_flowing", "default:lava_flowing") +minetest.register_alias("lava_source", "default:lava_source") +minetest.register_alias("torch", "default:torch") +minetest.register_alias("sign_wall", "default:sign_wall_wood") +minetest.register_alias("furnace", "default:furnace") +minetest.register_alias("chest", "default:chest") +minetest.register_alias("locked_chest", "default:chest_locked") +minetest.register_alias("cobble", "default:cobble") +minetest.register_alias("mossycobble", "default:mossycobble") +minetest.register_alias("steelblock", "default:steelblock") +minetest.register_alias("sapling", "default:sapling") +minetest.register_alias("apple", "default:apple") + +minetest.register_alias("WPick", "default:pick_wood") +minetest.register_alias("STPick", "default:pick_stone") +minetest.register_alias("SteelPick", "default:pick_steel") +minetest.register_alias("MesePick", "default:pick_mese") +minetest.register_alias("WShovel", "default:shovel_wood") +minetest.register_alias("STShovel", "default:shovel_stone") +minetest.register_alias("SteelShovel", "default:shovel_steel") +minetest.register_alias("WAxe", "default:axe_wood") +minetest.register_alias("STAxe", "default:axe_stone") +minetest.register_alias("SteelAxe", "default:axe_steel") +minetest.register_alias("WSword", "default:sword_wood") +minetest.register_alias("STSword", "default:sword_stone") +minetest.register_alias("SteelSword", "default:sword_steel") + +minetest.register_alias("Stick", "default:stick") +minetest.register_alias("paper", "default:paper") +minetest.register_alias("book", "default:book") +minetest.register_alias("lump_of_coal", "default:coal_lump") +minetest.register_alias("lump_of_iron", "default:iron_lump") +minetest.register_alias("lump_of_clay", "default:clay_lump") +minetest.register_alias("steel_ingot", "default:steel_ingot") +minetest.register_alias("clay_brick", "default:clay_brick") +minetest.register_alias("snow", "default:snow") + +-- 'mese_block' was used for a while for the block form of mese +minetest.register_alias("default:mese_block", "default:mese") + +-- Aliases for corrected pine node names +minetest.register_alias("default:pinetree", "default:pine_tree") +minetest.register_alias("default:pinewood", "default:pine_wood") + +minetest.register_alias("default:ladder", "default:ladder_wood") +minetest.register_alias("default:sign_wall", "default:sign_wall_wood") diff --git a/data/games/garage/mods/default/chests.lua b/data/games/garage/mods/default/chests.lua new file mode 100644 index 0000000..1d9b150 --- /dev/null +++ b/data/games/garage/mods/default/chests.lua @@ -0,0 +1,380 @@ +default.chest = {} + +-- support for MT game translation. +local S = default.get_translator + +function default.chest.get_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = + "size[8,9]" .. + "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[nodemeta:" .. spos .. ";main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + return formspec +end + +function default.chest.chest_lid_obstructed(pos) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local def = minetest.registered_nodes[minetest.get_node(above).name] + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def and + (def.drawtype == "airlike" or + def.drawtype == "signlike" or + def.drawtype == "torchlike" or + (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then + return false + end + return true +end + +function default.chest.chest_lid_close(pn) + local chest_open_info = default.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap + + default.chest.open_chests[pn] = nil + for k, v in pairs(default.chest.open_chests) do + if vector.equals(v.pos, pos) then + -- another player is also looking at the chest + return true + end + end + + local node = minetest.get_node(pos) + minetest.after(0.2, function() + local current_node = minetest.get_node(pos) + if current_node.name ~= swap .. "_open" then + -- the chest has already been replaced, don't try to replace what's there. + return + end + minetest.swap_node(pos, {name = swap, param2 = node.param2}) + minetest.sound_play(sound, {gain = 0.3, pos = pos, + max_hear_distance = 10}, true) + end) +end + +default.chest.open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local pn = player:get_player_name() + + if formname ~= "default:chest" then + if default.chest.open_chests[pn] then + default.chest.chest_lid_close(pn) + end + + return + end + + if not (fields.quit and default.chest.open_chests[pn]) then + return + end + + default.chest.chest_lid_close(pn) + + return true +end) + +minetest.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + if default.chest.open_chests[pn] then + default.chest.chest_lid_close(pn) + end +end) + +function default.chest.register_chest(prefixed_name, d) + local name = prefixed_name:sub(1,1) == ':' and prefixed_name:sub(2,-1) or prefixed_name + local def = table.copy(d) + def.drawtype = "mesh" + def.visual = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.legacy_facedir_simple = true + def.is_ground_content = false + + if def.protected then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Locked Chest")) + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", S("Locked Chest (owned by @1)", meta:get_string("owner"))) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and + default.can_interact_with_node(player, pos) + end + def.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return count + end + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not default.can_interact_with_node(player, pos) then + return 0 + end + return stack:get_count() + end + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not default.can_interact_with_node(clicker, pos) then + return itemstack + end + + local cn = clicker:get_player_name() + + if default.chest.open_chests[cn] then + default.chest.chest_lid_close(cn) + end + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}, true) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, cn, + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[cn] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function() end + def.on_key_use = function(pos, player) + local secret = minetest.get_meta(pos):get_string("key_lock_secret") + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if itemstack:get_meta():get_string("") == "" then + return + end + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_meta():get_string("")).secret) + itemstack:set_metadata("") + end + + if secret ~= key_meta:get_string("secret") then + return + end + + minetest.show_formspec( + player:get_player_name(), + "default:chest_locked", + default.chest.get_chest_formspec(pos) + ) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + minetest.record_protection_violation(pos, pn) + minetest.chat_send_player(pn, S("You do not own this chest.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked chest"), owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Chest")) + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end + def.on_rightclick = function(pos, node, clicker) + local cn = clicker:get_player_name() + + if default.chest.open_chests[cn] then + default.chest.chest_lid_close(cn) + end + + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}, true) + if not default.chest.chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + cn, + "default:chest", default.chest.get_chest_formspec(pos)) + default.chest.open_chests[cn] = { pos = pos, + sound = def.sound_close, swap = name } + end + def.on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = name + minetest.remove_node(pos) + return drops + end + end + + default.set_inventory_action_loggers(def, "chest") + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + for i = 1, #def_opened.tiles do + if type(def_opened.tiles[i]) == "string" then + def_opened.tiles[i] = {name = def_opened.tiles[i], backface_culling = true} + elseif def_opened.tiles[i].backface_culling == nil then + def_opened.tiles[i].backface_culling = true + end + end + def_opened.drop = name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = "fixed", + fixed = { -1/2, -1/2, -1/2, 1/2, 3/16, 1/2 }, + } + def_opened.can_dig = function() + return false + end + def_opened.on_blast = function() end + + def_closed.mesh = nil + def_closed.drawtype = nil + def_closed.tiles[6] = def.tiles[5] -- swap textures around for "normal" + def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh + def_closed.tiles[3] = def.tiles[3].."^[transformFX" + + minetest.register_node(prefixed_name, def_closed) + minetest.register_node(prefixed_name .. "_open", def_opened) + + -- convert old chests to this new variant + if name == "default:chest" or name == "default:chest_locked" then + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name:sub(9,-1) .. "_v2", + nodenames = {name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "") + local inv = meta:get_inventory() + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end + end + }) + end + + -- close opened chests on load + local modname, chestname = prefixed_name:match("^(:?.-):(.*)$") + minetest.register_lbm({ + label = "close opened chests on load", + name = modname .. ":close_" .. chestname .. "_open", + nodenames = {prefixed_name .. "_open"}, + run_at_every_load = true, + action = function(pos, node) + node.name = prefixed_name + minetest.swap_node(pos, node) + end + }) +end + +default.chest.register_chest("default:chest", { + description = S("Chest"), + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_front.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, +}) + +default.chest.register_chest("default:chest_locked", { + description = S("Locked Chest"), + tiles = { + "default_chest_top.png", + "default_chest_top.png", + "default_chest_side.png", + "default_chest_side.png", + "default_chest_lock.png", + "default_chest_inside.png" + }, + sounds = default.node_sound_wood_defaults(), + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, + protected = true, +}) + +minetest.register_craft({ + output = "default:chest", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:chest_locked", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "default:steel_ingot", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:chest_locked", + recipe = {"default:chest", "default:steel_ingot"}, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest_locked", + burntime = 30, +}) diff --git a/data/games/garage/mods/default/crafting.lua b/data/games/garage/mods/default/crafting.lua new file mode 100644 index 0000000..ecbe9d1 --- /dev/null +++ b/data/games/garage/mods/default/crafting.lua @@ -0,0 +1,737 @@ +-- mods/default/crafting.lua + +minetest.register_craft({ + output = "default:wood 4", + recipe = { + {"default:tree"}, + } +}) + +minetest.register_craft({ + output = "default:junglewood 4", + recipe = { + {"default:jungletree"}, + } +}) + +minetest.register_craft({ + output = "default:pine_wood 4", + recipe = { + {"default:pine_tree"}, + } +}) + +minetest.register_craft({ + output = "default:acacia_wood 4", + recipe = { + {"default:acacia_tree"}, + } +}) + +minetest.register_craft({ + output = "default:aspen_wood 4", + recipe = { + {"default:aspen_tree"}, + } +}) + +minetest.register_craft({ + output = "default:wood", + recipe = { + {"default:bush_stem"}, + } +}) + +minetest.register_craft({ + output = "default:acacia_wood", + recipe = { + {"default:acacia_bush_stem"}, + } +}) + +minetest.register_craft({ + output = "default:pine_wood", + recipe = { + {"default:pine_bush_stem"}, + } +}) + +minetest.register_craft({ + output = "default:sign_wall_steel 3", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"", "group:stick", ""}, + } +}) + +minetest.register_craft({ + output = "default:sign_wall_wood 3", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"", "group:stick", ""}, + } +}) + +minetest.register_craft({ + output = "default:coalblock", + recipe = { + {"default:coal_lump", "default:coal_lump", "default:coal_lump"}, + {"default:coal_lump", "default:coal_lump", "default:coal_lump"}, + {"default:coal_lump", "default:coal_lump", "default:coal_lump"}, + } +}) + +minetest.register_craft({ + output = "default:steelblock", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:copperblock", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:tinblock", + recipe = { + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:bronzeblock", + recipe = { + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:bronzeblock"}, + } +}) + +minetest.register_craft({ + output = "default:goldblock", + recipe = { + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:diamondblock", + recipe = { + {"default:diamond", "default:diamond", "default:diamond"}, + {"default:diamond", "default:diamond", "default:diamond"}, + {"default:diamond", "default:diamond", "default:diamond"}, + } +}) + +minetest.register_craft({ + output = "default:sandstone", + recipe = { + {"default:sand", "default:sand"}, + {"default:sand", "default:sand"}, + } +}) + +minetest.register_craft({ + output = "default:sand 4", + recipe = { + {"default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:sandstonebrick 4", + recipe = { + {"default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:sandstone_block 9", + recipe = { + {"default:sandstone", "default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone", "default:sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone", + recipe = { + {"default:desert_sand", "default:desert_sand"}, + {"default:desert_sand", "default:desert_sand"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sand 4", + recipe = { + {"default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone_brick 4", + recipe = { + {"default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_sandstone_block 9", + recipe = { + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + {"default:desert_sandstone", "default:desert_sandstone", "default:desert_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone", + recipe = { + {"default:silver_sand", "default:silver_sand"}, + {"default:silver_sand", "default:silver_sand"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sand 4", + recipe = { + {"default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone_brick 4", + recipe = { + {"default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:silver_sandstone_block 9", + recipe = { + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + {"default:silver_sandstone", "default:silver_sandstone", "default:silver_sandstone"}, + } +}) + +minetest.register_craft({ + output = "default:clay", + recipe = { + {"default:clay_lump", "default:clay_lump"}, + {"default:clay_lump", "default:clay_lump"}, + } +}) + +minetest.register_craft({ + output = "default:brick", + recipe = { + {"default:clay_brick", "default:clay_brick"}, + {"default:clay_brick", "default:clay_brick"}, + } +}) + +minetest.register_craft({ + output = "default:bookshelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"default:book", "default:book", "default:book"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:ladder_wood 5", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "", "group:stick"}, + } +}) + +minetest.register_craft({ + output = "default:ladder_steel 15", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:mese", + recipe = { + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + } +}) + +minetest.register_craft({ + output = "default:meselamp", + recipe = { + {"default:glass"}, + {"default:mese_crystal"}, + } +}) + +minetest.register_craft({ + output = "default:obsidian", + recipe = { + {"default:obsidian_shard", "default:obsidian_shard", "default:obsidian_shard"}, + {"default:obsidian_shard", "default:obsidian_shard", "default:obsidian_shard"}, + {"default:obsidian_shard", "default:obsidian_shard", "default:obsidian_shard"}, + } +}) + +minetest.register_craft({ + output = "default:obsidianbrick 4", + recipe = { + {"default:obsidian", "default:obsidian"}, + {"default:obsidian", "default:obsidian"} + } +}) + +minetest.register_craft({ + output = "default:obsidian_block 9", + recipe = { + {"default:obsidian", "default:obsidian", "default:obsidian"}, + {"default:obsidian", "default:obsidian", "default:obsidian"}, + {"default:obsidian", "default:obsidian", "default:obsidian"}, + } +}) + +minetest.register_craft({ + output = "default:stonebrick 4", + recipe = { + {"default:stone", "default:stone"}, + {"default:stone", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "default:stone_block 9", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "default:stone", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_stonebrick 4", + recipe = { + {"default:desert_stone", "default:desert_stone"}, + {"default:desert_stone", "default:desert_stone"}, + } +}) + +minetest.register_craft({ + output = "default:desert_stone_block 9", + recipe = { + {"default:desert_stone", "default:desert_stone", "default:desert_stone"}, + {"default:desert_stone", "default:desert_stone", "default:desert_stone"}, + {"default:desert_stone", "default:desert_stone", "default:desert_stone"}, + } +}) + +minetest.register_craft({ + output = "default:snowblock", + recipe = { + {"default:snow", "default:snow", "default:snow"}, + {"default:snow", "default:snow", "default:snow"}, + {"default:snow", "default:snow", "default:snow"}, + } +}) + +minetest.register_craft({ + output = "default:snow 9", + recipe = { + {"default:snowblock"}, + } +}) + +minetest.register_craft({ + output = "default:emergent_jungle_sapling", + recipe = { + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + {"default:junglesapling", "default:junglesapling", "default:junglesapling"}, + } +}) + +minetest.register_craft({ + output = "default:large_cactus_seedling", + recipe = { + {"", "default:cactus", ""}, + {"default:cactus", "default:cactus", "default:cactus"}, + {"", "default:cactus", ""}, + } +}) + + +-- +-- Crafting (tool repair) +-- + +minetest.register_craft({ + type = "toolrepair", + additional_wear = -0.02, +}) + + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "group:sand", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:obsidian_glass", + recipe = "default:obsidian_shard", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:mossycobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:desert_stone", + recipe = "default:desert_cobble", +}) + + +-- +-- Fuels +-- + +-- Support use of group:tree, includes default:tree which has the same burn time +minetest.register_craft({ + type = "fuel", + recipe = "group:tree", + burntime = 30, +}) + +-- Burn time for all woods are in order of wood density, +-- which is also the order of wood colour darkness: +-- aspen, pine, apple, acacia, jungle + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_tree", + burntime = 22, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_tree", + burntime = 26, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_tree", + burntime = 34, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:jungletree", + burntime = 38, +}) + + +-- Support use of group:wood, includes default:wood which has the same burn time +minetest.register_craft({ + type = "fuel", + recipe = "group:wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_wood", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglewood", + burntime = 9, +}) + + +-- Support use of group:sapling, includes default:sapling which has the same burn time +minetest.register_craft({ + type = "fuel", + recipe = "group:sapling", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_sapling", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_sapling", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_sapling", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:aspen_sapling", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_sapling", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_sapling", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglesapling", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:emergent_jungle_sapling", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_aspen_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_pine_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_acacia_wood", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_junglewood", + burntime = 9, +}) + + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_aspen_wood", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_pine_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_wood", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_acacia_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_rail_junglewood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_stem", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_stem", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_bush_stem", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglegrass", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:leaves", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:cactus", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:large_cactus_seedling", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:papyrus", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bookshelf", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:ladder_wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:lava_source", + burntime = 60, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sign_wall_wood", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coalblock", + burntime = 370, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:dry_grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fern_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:marram_grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:dry_shrub", + burntime = 2, +}) diff --git a/data/games/garage/mods/default/craftitems.lua b/data/games/garage/mods/default/craftitems.lua new file mode 100644 index 0000000..4cc5f8d --- /dev/null +++ b/data/games/garage/mods/default/craftitems.lua @@ -0,0 +1,543 @@ +-- mods/default/craftitems.lua + +-- support for MT game translation. +local S = default.get_translator + +local esc = minetest.formspec_escape +local formspec_size = "size[8,8]" + +local function formspec_core(tab) + if tab == nil then tab = 1 else tab = tostring(tab) end + return "tabheader[0,0;book_header;" .. + esc(S("Write")) .. "," .. + esc(S("Read")) .. ";" .. + tab .. ";false;false]" +end + +local function formspec_write(title, text) + return "field[0.5,1;7.5,0;title;" .. esc(S("Title:")) .. ";" .. + esc(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;text;" .. esc(S("Contents:")) .. ";" .. + esc(text) .. "]" .. + "button_exit[2.5,7.5;3,1;save;" .. esc(S("Save")) .. "]" +end + +local function formspec_read(owner, title, string, text, page, page_max) + return "label[0.5,0.5;" .. esc(S("by @1", owner)) .. "]" .. + "tablecolumns[color;text]" .. + "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. + "table[0.4,0;7,0.5;title;#FFFF00," .. esc(title) .. "]" .. + "textarea[0.5,1.5;7.5,7;;" .. + esc(string ~= "" and string or text) .. ";]" .. + "button[2.4,7.6;0.8,0.8;book_prev;<]" .. + "label[3.2,7.7;" .. esc(S("Page @1 of @2", page, page_max)) .. "]" .. + "button[4.9,7.6;0.8,0.8;book_next;>]" +end + +local function formspec_string(lpp, page, lines, string) + for i = ((lpp * page) - lpp) + 1, lpp * page do + if not lines[i] then break end + string = string .. lines[i] .. "\n" + end + return string +end + +local book_writers = {} + +minetest.register_on_leaveplayer(function(player) + book_writers[player:get_player_name()] = nil +end) + +local tab_number +local lpp = 14 -- Lines per book's page +local function book_on_use(itemstack, user) + local player_name = user:get_player_name() + local meta = itemstack:get_meta() + local title, text, owner = "", "", player_name + local page, page_max, lines, string = 1, 1, {}, "" + + -- Backwards compatibility + local old_data = minetest.deserialize(itemstack:get_meta():get_string("")) + if old_data then + meta:from_table({ fields = old_data }) + end + + local data = meta:to_table().fields + + if data.owner then + title = data.title or "" + text = data.text or "" + owner = data.owner + + for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do + lines[#lines+1] = str + end + + if data.page then + page = data.page + page_max = data.page_max + string = formspec_string(lpp, page, lines, string) + end + end + + local formspec + if title == "" and text == "" then + formspec = formspec_write(title, text) + elseif owner == player_name then + local tab = tab_number or 1 + if tab == 2 then + formspec = formspec_core(tab) .. + formspec_read(owner, title, string, text, page, page_max) + else + formspec = formspec_core(tab) .. formspec_write(title, text) + end + else + formspec = formspec_read(owner, title, string, text, page, page_max) + end + + minetest.show_formspec(player_name, "default:book", formspec_size .. formspec) + -- Store the wield index in case the user accidentally switches before the formspec is shown + book_writers[player_name] = {wield_index = user:get_wield_index()} + return itemstack +end + +local max_text_size = 10000 +local max_title_size = 80 +local short_title_size = 35 +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:book" then + return + end + local player_name = player:get_player_name() + local inv = player:get_inventory() + if not book_writers[player_name] then + return + end + local wield_index = book_writers[player_name].wield_index + local wield_list = player:get_wield_list() + local stack = inv:get_stack(wield_list, wield_index) + local written = stack:get_name() == "default:book_written" + if stack:get_name() ~= "default:book" and not written then + -- No book in the wield slot, abort & inform the player + minetest.chat_send_player(player_name, S("The book you were writing to mysteriously disappeared.")) + return + end + local data = stack:get_meta():to_table().fields + + local title = data.title or "" + local text = data.text or "" + + if fields.book_header ~= nil and data.owner == player_name then + local contents + local tab = tonumber(fields.book_header) + if tab == 1 then + contents = formspec_core(tab) .. + formspec_write(title, text) + elseif tab == 2 then + local lines, string = {}, "" + for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do + lines[#lines+1] = str + end + string = formspec_string(lpp, data.page, lines, string) + contents = formspec_read(player_name, title, string, + text, data.page, data.page_max) + else + return -- malicious data + end + tab_number = tab + local formspec = formspec_size .. formspec_core(tab) .. contents + minetest.show_formspec(player_name, "default:book", formspec) + return + end + + if fields.quit then + book_writers[player_name] = nil + end + + if fields.save and fields.title and fields.text then + local new_stack + if not written then + local count = stack:get_count() + if count == 1 then + stack:set_name("default:book_written") + else + stack:set_count(count - 1) + new_stack = ItemStack("default:book_written") + end + end + + if data.owner ~= player_name and title ~= "" and text ~= "" then + return + end + + if not data then data = {} end + data.title = fields.title:sub(1, max_title_size) + data.owner = player:get_player_name() + local short_title = data.title + -- Don't bother triming the title if the trailing dots would make it longer + if #short_title > short_title_size + 3 then + short_title = short_title:sub(1, short_title_size) .. "..." + end + data.description = S("\"@1\" by @2", short_title, data.owner) + data.text = fields.text:sub(1, max_text_size) + data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n") + data.text = data.text:gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + data.page = 1 + data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) + + if new_stack then + new_stack:get_meta():from_table({ fields = data }) + if inv:room_for_item("main", new_stack) then + inv:add_item("main", new_stack) + else + minetest.add_item(player:get_pos(), new_stack) + end + else + stack:get_meta():from_table({ fields = data }) + end + + elseif fields.book_next or fields.book_prev then + if not data.page then + return + end + + data.page = tonumber(data.page) + data.page_max = tonumber(data.page_max) + + if fields.book_next then + data.page = data.page + 1 + if data.page > data.page_max then + data.page = 1 + end + else + data.page = data.page - 1 + if data.page == 0 then + data.page = data.page_max + end + end + + stack:get_meta():from_table({fields = data}) + stack = book_on_use(stack, player) + end + + -- Update stack + inv:set_stack(wield_list, wield_index, stack) +end) + + +-- +-- Craftitem registry +-- + +minetest.register_craftitem("default:blueberries", { + description = S("Blueberries"), + inventory_image = "default_blueberries.png", + groups = {food_blueberries = 1, food_berry = 1}, + on_use = minetest.item_eat(2), +}) + +minetest.register_craftitem("default:book", { + description = S("Book"), + inventory_image = "default_book.png", + groups = {book = 1, flammable = 3}, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:book_written", { + description = S("Book with Text"), + inventory_image = "default_book_written.png", + groups = {book = 1, not_in_creative_inventory = 1, flammable = 3}, + stack_max = 1, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:bronze_ingot", { + description = S("Bronze Ingot"), + inventory_image = "default_bronze_ingot.png" +}) + +minetest.register_craftitem("default:clay_brick", { + description = S("Clay Brick"), + inventory_image = "default_clay_brick.png", +}) + +minetest.register_craftitem("default:clay_lump", { + description = S("Clay Lump"), + inventory_image = "default_clay_lump.png", +}) + +minetest.register_craftitem("default:coal_lump", { + description = S("Coal Lump"), + inventory_image = "default_coal_lump.png", + groups = {coal = 1, flammable = 1} +}) + +minetest.register_craftitem("default:copper_ingot", { + description = S("Copper Ingot"), + inventory_image = "default_copper_ingot.png" +}) + +minetest.register_craftitem("default:copper_lump", { + description = S("Copper Lump"), + inventory_image = "default_copper_lump.png" +}) + +minetest.register_craftitem("default:diamond", { + description = S("Diamond"), + inventory_image = "default_diamond.png", +}) + +minetest.register_craftitem("default:flint", { + description = S("Flint"), + inventory_image = "default_flint.png" +}) + +minetest.register_craftitem("default:gold_ingot", { + description = S("Gold Ingot"), + inventory_image = "default_gold_ingot.png" +}) + +minetest.register_craftitem("default:gold_lump", { + description = S("Gold Lump"), + inventory_image = "default_gold_lump.png" +}) + +minetest.register_craftitem("default:iron_lump", { + description = S("Iron Lump"), + inventory_image = "default_iron_lump.png" +}) + +minetest.register_craftitem("default:mese_crystal", { + description = S("Mese Crystal"), + inventory_image = "default_mese_crystal.png", +}) + +minetest.register_craftitem("default:mese_crystal_fragment", { + description = S("Mese Crystal Fragment"), + inventory_image = "default_mese_crystal_fragment.png", +}) + +minetest.register_craftitem("default:obsidian_shard", { + description = S("Obsidian Shard"), + inventory_image = "default_obsidian_shard.png", +}) + +minetest.register_craftitem("default:paper", { + description = S("Paper"), + inventory_image = "default_paper.png", + groups = {flammable = 3}, +}) + +minetest.register_craftitem("default:steel_ingot", { + description = S("Steel Ingot"), + inventory_image = "default_steel_ingot.png" +}) + +minetest.register_craftitem("default:stick", { + description = S("Stick"), + inventory_image = "default_stick.png", + groups = {stick = 1, flammable = 2}, +}) + +minetest.register_craftitem("default:tin_ingot", { + description = S("Tin Ingot"), + inventory_image = "default_tin_ingot.png" +}) + +minetest.register_craftitem("default:tin_lump", { + description = S("Tin Lump"), + inventory_image = "default_tin_lump.png" +}) + +-- +-- Crafting recipes +-- + +minetest.register_craft({ + output = "default:book", + recipe = { + {"default:paper"}, + {"default:paper"}, + {"default:paper"}, + } +}) + +default.register_craft_metadata_copy("default:book", "default:book_written") + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:clay_brick 4", + recipe = { + {"default:brick"}, + } +}) + +minetest.register_craft({ + output = "default:clay_lump 4", + recipe = { + {"default:clay"}, + } +}) + +minetest.register_craft({ + output = "default:coal_lump 9", + recipe = { + {"default:coalblock"}, + } +}) + +minetest.register_craft({ + output = "default:copper_ingot 9", + recipe = { + {"default:copperblock"}, + } +}) + +minetest.register_craft({ + output = "default:diamond 9", + recipe = { + {"default:diamondblock"}, + } +}) + +minetest.register_craft({ + output = "default:gold_ingot 9", + recipe = { + {"default:goldblock"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal", + recipe = { + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal 9", + recipe = { + {"default:mese"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal_fragment 9", + recipe = { + {"default:mese_crystal"}, + } +}) + +minetest.register_craft({ + output = "default:obsidian_shard 9", + recipe = { + {"default:obsidian"} + } +}) + +minetest.register_craft({ + output = "default:paper", + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"}, + } +}) + +minetest.register_craft({ + output = "default:steel_ingot 9", + recipe = { + {"default:steelblock"}, + } +}) + +minetest.register_craft({ + output = "default:stick 4", + recipe = { + {"group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:tin_ingot 9", + recipe = { + {"default:tinblock"}, + } +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:clay_brick", + recipe = "default:clay_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:copper_ingot", + recipe = "default:copper_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "default:gold_lump", +}) + + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "default:iron_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:tin_ingot", + recipe = "default:tin_lump", +}) + +-- +-- Fuels +-- + +minetest.register_craft({ + type = "fuel", + recipe = "default:book", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:book_written", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coal_lump", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:paper", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:stick", + burntime = 1, +}) diff --git a/data/games/garage/mods/default/functions.lua b/data/games/garage/mods/default/functions.lua new file mode 100644 index 0000000..e426415 --- /dev/null +++ b/data/games/garage/mods/default/functions.lua @@ -0,0 +1,836 @@ +-- +-- Sounds +-- + +function default.node_sound_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "", gain = 1.0} + tbl.dug = tbl.dug or + {name = "default_dug_node", gain = 0.25} + tbl.place = tbl.place or + {name = "default_place_node_hard", gain = 1.0} + return tbl +end + +function default.node_sound_stone_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_hard_footstep", gain = 0.2} + tbl.dug = tbl.dug or + {name = "default_hard_footstep", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_dirt_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_dirt_footstep", gain = 0.25} + tbl.dig = tbl.dig or + {name = "default_dig_crumbly", gain = 0.4} + tbl.dug = tbl.dug or + {name = "default_dirt_footstep", gain = 1.0} + tbl.place = tbl.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_sand_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_sand_footstep", gain = 0.05} + tbl.dug = tbl.dug or + {name = "default_sand_footstep", gain = 0.15} + tbl.place = tbl.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_gravel_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_gravel_footstep", gain = 0.25} + tbl.dig = tbl.dig or + {name = "default_gravel_dig", gain = 0.35} + tbl.dug = tbl.dug or + {name = "default_gravel_dug", gain = 1.0} + tbl.place = tbl.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_wood_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_wood_footstep", gain = 0.15} + tbl.dig = tbl.dig or + {name = "default_dig_choppy", gain = 0.4} + tbl.dug = tbl.dug or + {name = "default_wood_footstep", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_leaves_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_grass_footstep", gain = 0.45} + tbl.dug = tbl.dug or + {name = "default_grass_footstep", gain = 0.7} + tbl.place = tbl.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_glass_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_glass_footstep", gain = 0.3} + tbl.dig = tbl.dig or + {name = "default_glass_footstep", gain = 0.5} + tbl.dug = tbl.dug or + {name = "default_break_glass", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_ice_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_ice_footstep", gain = 0.15} + tbl.dig = tbl.dig or + {name = "default_ice_dig", gain = 0.5} + tbl.dug = tbl.dug or + {name = "default_ice_dug", gain = 0.5} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_metal_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_metal_footstep", gain = 0.2} + tbl.dig = tbl.dig or + {name = "default_dig_metal", gain = 0.5} + tbl.dug = tbl.dug or + {name = "default_dug_metal", gain = 0.5} + tbl.place = tbl.place or + {name = "default_place_node_metal", gain = 0.5} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_water_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_water_footstep", gain = 0.2} + default.node_sound_defaults(tbl) + return tbl +end + +function default.node_sound_snow_defaults(tbl) + tbl = tbl or {} + tbl.footstep = tbl.footstep or + {name = "default_snow_footstep", gain = 0.2} + tbl.dig = tbl.dig or + {name = "default_snow_footstep", gain = 0.3} + tbl.dug = tbl.dug or + {name = "default_snow_footstep", gain = 0.3} + tbl.place = tbl.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(tbl) + return tbl +end + + +-- +-- Lavacooling +-- + +default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + minetest.set_node(pos, {name = "default:obsidian"}) + else -- Lava flowing + minetest.set_node(pos, {name = "default:stone"}) + end + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.2}, true) +end + +if minetest.settings:get_bool("enable_lavacooling") ~= false then + minetest.register_abm({ + label = "Lava cooling", + nodenames = {"default:lava_source", "default:lava_flowing"}, + neighbors = {"group:cools_lava", "group:water"}, + interval = 2, + chance = 2, + catch_up = false, + action = function(...) + default.cool_lava(...) + end, + }) +end + + +-- +-- Optimized helper to put all items in an inventory into a drops list +-- + +function default.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n+1] = stack:to_table() + n = n + 1 + end + end +end + + +-- +-- Papyrus and cactus growing +-- + +-- Wrapping the functions in ABM action is necessary to make overriding them possible + +function default.grow_cactus(pos, node) + if node.param2 >= 4 then + return + end + pos.y = pos.y - 1 + if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:cactus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:cactus"}) + return true +end + +function default.grow_papyrus(pos, node) + pos.y = pos.y - 1 + local name = minetest.get_node(pos).name + if name ~= "default:dirt" and + name ~= "default:dirt_with_grass" and + name ~= "default:dirt_with_dry_grass" and + name ~= "default:dirt_with_rainforest_litter" and + name ~= "default:dry_dirt" and + name ~= "default:dry_dirt_with_dry_grass" then + return + end + if not minetest.find_node_near(pos, 3, {"group:water"}) then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:papyrus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:papyrus"}) + return true +end + +minetest.register_abm({ + label = "Grow cactus", + nodenames = {"default:cactus"}, + neighbors = {"group:sand"}, + interval = 12, + chance = 83, + action = function(...) + default.grow_cactus(...) + end +}) + +minetest.register_abm({ + label = "Grow papyrus", + nodenames = {"default:papyrus"}, + -- Grows on the dirt and surface dirt nodes of the biomes papyrus appears in, + -- including the old savanna nodes. + -- 'default:dirt_with_grass' is here only because it was allowed before. + neighbors = { + "default:dirt", + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_rainforest_litter", + "default:dry_dirt", + "default:dry_dirt_with_dry_grass", + }, + interval = 14, + chance = 71, + action = function(...) + default.grow_papyrus(...) + end +}) + + +-- +-- Dig upwards +-- + +local in_dig_up = false + +function default.dig_up(pos, node, digger, max_height) + if in_dig_up then return end -- Do not recurse + if digger == nil then return end + max_height = max_height or 100 + + in_dig_up = true + for y = 1, max_height do + local up_pos = vector.offset(pos, 0, y, 0) + local up_node = minetest.get_node(up_pos) + if up_node.name ~= node.name then + break + end + if not minetest.node_dig(up_pos, up_node, digger) then + break + end + end + in_dig_up = false +end + +-- errors are hard to handle, instead we rely on resetting this value the next step +minetest.register_globalstep(function() + in_dig_up = false +end) + + +-- +-- Fence registration helper +-- +local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 + +function default.register_fence(name, def) + local fence_texture = "default_fence_overlay.png^" .. def.texture .. + "^default_fence_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16, 3/16, -1/2, 1/16, 5/16, -1/8 }, + {-1/16, -5/16, -1/2, 1/16, -3/16, -1/8 }}, + connect_left = {{-1/2, 3/16, -1/16, -1/8, 5/16, 1/16}, + {-1/2, -5/16, -1/16, -1/8, -3/16, 1/16}}, + connect_back = {{-1/16, 3/16, 1/8, 1/16, 5/16, 1/2 }, + {-1/16, -5/16, 1/8, 1/16, -3/16, 1/2 }}, + connect_right = {{ 1/8, 3/16, -1/16, 1/2, 5/16, 1/16}, + { 1/8, -5/16, -1/16, 1/2, -3/16, 1/16}} + }, + collision_box = { + type = "connected", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2 + fence_collision_extra, 1/8}, + -- connect_top = + -- connect_bottom = + connect_front = {-1/8, -1/2, -1/2, 1/8, 1/2 + fence_collision_extra, -1/8}, + connect_left = {-1/2, -1/2, -1/8, -1/8, 1/2 + fence_collision_extra, 1/8}, + connect_back = {-1/8, -1/2, 1/8, 1/8, 1/2 + fence_collision_extra, 1/2}, + connect_right = { 1/8, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} + }, + connects_to = {"group:fence", "group:wood", "group:tree", "group:wall"}, + inventory_image = fence_texture, + wield_image = fence_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + local material = def.material + def.texture = nil + def.material = nil + + minetest.register_node(name, def) + + -- Register crafting recipe, trim away starting colon if any + if not material then return end + name = string.gsub(name, "^:", "") + minetest.register_craft({ + output = name .. " 4", + recipe = { + { material, 'group:stick', material }, + { material, 'group:stick', material }, + } + }) +end + + +-- +-- Fence rail registration helper +-- + +function default.register_fence_rail(name, def) + local fence_rail_texture = "default_fence_rail_overlay.png^" .. def.texture .. + "^default_fence_rail_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/16, 3/16, -1/16, 1/16, 5/16, 1/16}, + {-1/16, -3/16, -1/16, 1/16, -5/16, 1/16}}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16, 3/16, -1/2, 1/16, 5/16, -1/16}, + {-1/16, -5/16, -1/2, 1/16, -3/16, -1/16}}, + connect_left = {{-1/2, 3/16, -1/16, -1/16, 5/16, 1/16}, + {-1/2, -5/16, -1/16, -1/16, -3/16, 1/16}}, + connect_back = {{-1/16, 3/16, 1/16, 1/16, 5/16, 1/2 }, + {-1/16, -5/16, 1/16, 1/16, -3/16, 1/2 }}, + connect_right = {{ 1/16, 3/16, -1/16, 1/2, 5/16, 1/16}, + { 1/16, -5/16, -1/16, 1/2, -3/16, 1/16}} + }, + collision_box = { + type = "connected", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2 + fence_collision_extra, 1/8}, + -- connect_top = + -- connect_bottom = + connect_front = {-1/8, -1/2, -1/2, 1/8, 1/2 + fence_collision_extra, -1/8}, + connect_left = {-1/2, -1/2, -1/8, -1/8, 1/2 + fence_collision_extra, 1/8}, + connect_back = {-1/8, -1/2, 1/8, 1/8, 1/2 + fence_collision_extra, 1/2}, + connect_right = { 1/8, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} + }, + connects_to = {"group:fence", "group:wall"}, + inventory_image = fence_rail_texture, + wield_image = fence_rail_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + local material = def.material + def.texture = nil + def.material = nil + + minetest.register_node(name, def) + + -- Register crafting recipe, trim away starting colon if any + if not material then return end + name = string.gsub(name, "^:", "") + minetest.register_craft({ + output = name .. " 16", + recipe = { + { material, material }, + { "", ""}, + { material, material }, + } + }) +end + +-- +-- Mese post registration helper +-- + +function default.register_mesepost(name, def) + local post_texture = def.texture .. "^default_mese_post_light_side.png^[makealpha:0,0,0" + local post_texture_dark = def.texture .. "^default_mese_post_light_side_dark.png^[makealpha:0,0,0" + -- Allow almost everything to be overridden + local default_fields = { + wield_image = post_texture, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16}, + }, + }, + paramtype = "light", + tiles = {def.texture, def.texture, post_texture_dark, post_texture_dark, post_texture, post_texture}, + use_texture_alpha = "opaque", + light_source = default.LIGHT_MAX, + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + } + for k, v in pairs(default_fields) do + if def[k] == nil then + def[k] = v + end + end + + local material = def.material + def.texture = nil + def.material = nil + + minetest.register_node(name, def) + + -- Register crafting recipe, trim away starting colon if any + if not material then return end + name = string.gsub(name, "^:", "") + minetest.register_craft({ + output = name .. " 4", + recipe = { + {'', 'default:glass', ''}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'', material, ''}, + } + }) +end + +-- +-- Leafdecay +-- + +-- Prevent decay of placed leaves + +default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end +end + +-- Leafdecay +local function leafdecay_after_destruct(pos, oldnode, def) + for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), + vector.add(pos, def.radius), def.leaves)) do + local node = minetest.get_node(v) + local timer = minetest.get_node_timer(v) + if node.param2 ~= 1 and not timer:is_started() then + timer:start(math.random(20, 120) / 10) + end + end +end + +local movement_gravity = tonumber( + minetest.settings:get("movement_gravity")) or 9.81 + +local function leafdecay_on_timer(pos, def) + if minetest.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node.name) + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or + not is_leaf then + minetest.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + minetest.remove_node(pos) + minetest.check_for_falling(pos) + + -- spawn a few particles for the removed node + minetest.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}), + maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -movement_gravity, 0), + maxacc = vector.new(0, -movement_gravity, 0), + minsize = 0, + maxsize = 0, + node = node, + }) +end + +function default.register_leafdecay(def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + for _, v in pairs(def.trunks) do + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + for _, v in pairs(def.leaves) do + minetest.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, def) + end, + }) + end +end + + +-- +-- Convert default:dirt to something that fits the environment +-- + +minetest.register_abm({ + label = "Grass spread", + nodenames = {"default:dirt"}, + neighbors = { + "air", + "group:grass", + "group:dry_grass", + "default:snow", + }, + interval = 6, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + if (minetest.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type") + if p2 then + local n3 = minetest.get_node(p2) + minetest.set_node(pos, {name = n3.name}) + return + end + + -- Else, any seeding nodes on top? + local name = minetest.get_node(above).name + -- Snow check is cheapest, so comes first + if name == "default:snow" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + elseif minetest.get_item_group(name, "grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_grass"}) + elseif minetest.get_item_group(name, "dry_grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_dry_grass"}) + end + end +}) + + +-- +-- Grass and dry grass removed in darkness +-- + +minetest.register_abm({ + label = "Grass covered", + nodenames = {"group:spreading_dirt_type", "default:dry_dirt_with_dry_grass"}, + interval = 8, + chance = 50, + catch_up = false, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or + nodedef.paramtype == "light") and + nodedef.liquidtype == "none") then + if node.name == "default:dry_dirt_with_dry_grass" then + minetest.set_node(pos, {name = "default:dry_dirt"}) + else + minetest.set_node(pos, {name = "default:dirt"}) + end + end + end +}) + + +-- +-- Moss growth on cobble near water +-- + +local moss_correspondences = { + ["default:cobble"] = "default:mossycobble", + ["stairs:slab_cobble"] = "stairs:slab_mossycobble", + ["stairs:stair_cobble"] = "stairs:stair_mossycobble", + ["stairs:stair_inner_cobble"] = "stairs:stair_inner_mossycobble", + ["stairs:stair_outer_cobble"] = "stairs:stair_outer_mossycobble", + ["walls:cobble"] = "walls:mossycobble", +} +minetest.register_abm({ + label = "Moss growth", + nodenames = {"default:cobble", "stairs:slab_cobble", "stairs:stair_cobble", + "stairs:stair_inner_cobble", "stairs:stair_outer_cobble", + "walls:cobble"}, + neighbors = {"group:water"}, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + node.name = moss_correspondences[node.name] + if node.name then + minetest.set_node(pos, node) + end + end +}) + +-- +-- Register a craft to copy the metadata of items +-- + +function default.register_craft_metadata_copy(ingredient, result) + minetest.register_craft({ + type = "shapeless", + output = result, + recipe = {ingredient, result} + }) + + minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack:get_name() ~= result then + return + end + + local original + local index + for i = 1, #old_craft_grid do + if old_craft_grid[i]:get_name() == result then + original = old_craft_grid[i] + index = i + end + end + if not original then + return + end + local copymeta = original:get_meta():to_table() + itemstack:get_meta():from_table(copymeta) + -- put the book with metadata back in the craft grid + craft_inv:set_stack("craft", index, original) + end) +end + +-- +-- Log API / helpers +-- + +local log_non_player_actions = minetest.settings:get_bool("log_non_player_actions", false) + +local is_pos = function(v) + return type(v) == "table" and + type(v.x) == "number" and type(v.y) == "number" and type(v.z) == "number" +end + +function default.log_player_action(player, ...) + local msg = player:get_player_name() + if player.is_fake_player or not player:is_player() then + if not log_non_player_actions then + return + end + msg = msg .. "(" .. (type(player.is_fake_player) == "string" + and player.is_fake_player or "*") .. ")" + end + for _, v in ipairs({...}) do + -- translate pos + local part = is_pos(v) and minetest.pos_to_string(v) or v + -- no leading spaces before punctuation marks + msg = msg .. (string.match(part, "^[;,.]") and "" or " ") .. part + end + minetest.log("action", msg) +end + +local nop = function() end +function default.set_inventory_action_loggers(def, name) + local on_move = def.on_metadata_inventory_move or nop + def.on_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + default.log_player_action(player, "moves stuff in", name, "at", pos) + return on_move(pos, from_list, from_index, to_list, to_index, count, player) + end + local on_put = def.on_metadata_inventory_put or nop + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + default.log_player_action(player, "moves", stack:get_name(), stack:get_count(), "to", name, "at", pos) + return on_put(pos, listname, index, stack, player) + end + local on_take = def.on_metadata_inventory_take or nop + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + default.log_player_action(player, "takes", stack:get_name(), stack:get_count(), "from", name, "at", pos) + return on_take(pos, listname, index, stack, player) + end +end + +-- +-- NOTICE: This method is not an official part of the API yet. +-- This method may change in future. +-- + +function default.can_interact_with_node(player, pos) + if player and player:is_player() then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + else + return false + end + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + if not owner or owner == "" or owner == player:get_player_name() then + return true + end + + -- Is player wielding the right key? + local item = player:get_wielded_item() + if minetest.get_item_group(item:get_name(), "key") == 1 then + local key_meta = item:get_meta() + + if key_meta:get_string("secret") == "" then + local key_oldmeta = item:get_meta():get_string("") + if key_oldmeta == "" or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string("secret", minetest.parse_json(key_oldmeta).secret) + item:set_metadata("") + end + + return meta:get_string("key_lock_secret") == key_meta:get_string("secret") + end + + return false +end diff --git a/data/games/garage/mods/default/furnace.lua b/data/games/garage/mods/default/furnace.lua new file mode 100644 index 0000000..4ef4e02 --- /dev/null +++ b/data/games/garage/mods/default/furnace.lua @@ -0,0 +1,436 @@ +-- default/furnace.lua + +-- support for MT game translation. +local S = default.get_translator + +-- List of sound handles for active furnace +local furnace_fire_sounds = {} + +-- +-- Formspecs +-- + +function default.get_furnace_active_formspec(fuel_percent, item_percent) + return "size[8,8.5]".. + "list[context;src;2.75,0.5;1,1;]".. + "list[context;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[context;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +function default.get_furnace_inactive_formspec() + return "size[8,8.5]".. + "list[context;src;2.75,0.5;1,1;]".. + "list[context;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[context;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if inv:is_empty("src") then + meta:set_string("infotext", S("Furnace is empty")) + end + return stack:get_count() + 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) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function stop_furnace_sound(pos, fadeout_step) + local hash = minetest.hash_node_position(pos) + local sound_ids = furnace_fire_sounds[hash] + if sound_ids then + for _, sound_id in ipairs(sound_ids) do + minetest.sound_fade(sound_id, -1, 0) + end + furnace_fire_sounds[hash] = nil + end +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) +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Initialize 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 fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + local dst_full = false + + local timer_elapsed = meta:get_int("timer_elapsed") or 0 + meta:set_int("timer_elapsed", timer_elapsed + 1) + + local cookable, cooked + local fuel + + local update = true + local items_smelt = 0 + while elapsed > 0 and update do + update = false + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = cooked.time ~= 0 + + local el = math.min(elapsed, fuel_totaltime - fuel_time) + 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 + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + el + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + el + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = src_time - cooked.time + update = true + else + dst_full = true + end + items_smelt = items_smelt + 1 + else + -- Item could not be cooked: probably missing fuel + update = true + end + end + else + -- Furnace ran out of fuel + if cookable 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 + fuel_totaltime = 0 + src_time = 0 + else + -- prevent blocking of fuel inventory (for automatization mods) + local is_fuel = minetest.get_craft_result({method = "fuel", width = 1, items = {afterfuel.items[1]:to_string()}}) + if is_fuel.time == 0 then + table.insert(fuel.replacements, afterfuel.items[1]) + inv:set_stack("fuel", 1, "") + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + end + -- Put replacements in dst list or drop them on the furnace. + local replacements = fuel.replacements + if replacements[1] then + local leftover = inv:add_item("dst", replacements[1]) + if not leftover:is_empty() then + local above = vector.new(pos.x, pos.y + 1, pos.z) + local drop_pos = minetest.find_node_near(above, 1, {"air"}) or above + minetest.item_drop(replacements[1], nil, drop_pos) + end + end + update = true + fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time) + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + src_time = 0 + end + fuel_time = 0 + end + + elapsed = elapsed - el + end + + if items_smelt > 0 then + -- Play cooling sound + minetest.sound_play("default_cool_lava", + { pos = pos, max_hear_distance = 16, gain = 0.07 * math.min(items_smelt, 7) }, true) + 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, infotext and node + -- + local formspec + local item_state + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + if dst_full then + item_state = S("100% (output full)") + else + item_state = S("@1%", item_percent) + end + else + if srclist and not srclist[1]:is_empty() then + item_state = S("Not cookable") + else + item_state = S("Empty") + end + end + + local fuel_state = S("Empty") + local active = false + local result = false + + if fuel_totaltime ~= 0 then + active = true + local fuel_percent = 100 - math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = S("@1%", fuel_percent) + formspec = default.get_furnace_active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + -- make sure timer restarts automatically + result = true + + -- Play sound every 5 seconds while the furnace is active + if timer_elapsed == 0 or (timer_elapsed + 1) % 5 == 0 then + local sound_id = minetest.sound_play("default_furnace_active", + {pos = pos, max_hear_distance = 16, gain = 0.25}) + local hash = minetest.hash_node_position(pos) + furnace_fire_sounds[hash] = furnace_fire_sounds[hash] or {} + table.insert(furnace_fire_sounds[hash], sound_id) + -- Only remember the 3 last sound handles + if #furnace_fire_sounds[hash] > 3 then + table.remove(furnace_fire_sounds[hash], 1) + end + -- Remove the sound ID automatically from table after 11 seconds + minetest.after(11, function() + if not furnace_fire_sounds[hash] then + return + end + for f=#furnace_fire_sounds[hash], 1, -1 do + if furnace_fire_sounds[hash][f] == sound_id then + table.remove(furnace_fire_sounds[hash], f) + end + end + if #furnace_fire_sounds[hash] == 0 then + furnace_fire_sounds[hash] = nil + end + end) + end + else + if fuellist and not fuellist[1]:is_empty() then + fuel_state = S("@1%", 0) + end + formspec = default.get_furnace_inactive_formspec() + swap_node(pos, "default:furnace") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + meta:set_int("timer_elapsed", 0) + + stop_furnace_sound(pos) + end + + + local infotext + if active then + infotext = S("Furnace active") + else + infotext = S("Furnace inactive") + end + infotext = infotext .. "\n" .. S("(Item: @1; Fuel: @2)", item_state, fuel_state) + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + + return result +end + +-- +-- Node definitions +-- + +local function apply_logger(def) + default.set_inventory_action_loggers(def, "furnace") + return def +end + +minetest.register_node("default:furnace", apply_logger({ + description = S("Furnace"), + 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 = {cracky=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + on_timer = furnace_node_timer, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('fuel', 1) + inv:set_size('dst', 4) + furnace_node_timer(pos, 0) + end, + + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_put = function(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) + -- check whether the furnace is empty or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "src", drops) + default.get_inventory_drops(pos, "fuel", drops) + default.get_inventory_drops(pos, "dst", drops) + drops[#drops+1] = "default:furnace" + minetest.remove_node(pos) + return drops + 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, +})) + +minetest.register_node("default:furnace_active", apply_logger({ + description = S("Furnace"), + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + on_timer = furnace_node_timer, + on_destruct = function(pos) + stop_furnace_sound(pos) + end, + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +})) + +minetest.register_craft({ + output = "default:furnace", + recipe = { + {"group:stone", "group:stone", "group:stone"}, + {"group:stone", "", "group:stone"}, + {"group:stone", "group:stone", "group:stone"}, + } +}) diff --git a/data/games/garage/mods/default/init.lua b/data/games/garage/mods/default/init.lua new file mode 100644 index 0000000..649b5c0 --- /dev/null +++ b/data/games/garage/mods/default/init.lua @@ -0,0 +1,95 @@ +-- Minetest Game mod: default +-- See README.txt for licensing and other information. + +-- The API documentation in here was moved into game_api.txt + +-- Load support for MT game translation. +local S = minetest.get_translator("default") + +-- Definitions made by this mod that other mods can use too +default = {} + +default.LIGHT_MAX = 14 +default.get_translator = S + +-- Check for engine features required by MTG +-- This provides clear error behaviour when MTG is newer than the installed engine +-- and avoids obscure, hard to debug runtime errors. +-- This section should be updated before release and older checks can be dropped +-- when newer ones are introduced. +if ItemStack("").add_wear_by_uses == nil then + error("\nThis version of Minetest Game is incompatible with your engine version ".. + "(which is too old). You should download a version of Minetest Game that ".. + "matches the installed engine version.\n") +end + +-- GUI related stuff +minetest.register_on_joinplayer(function(player) + -- Set formspec prepend + local formspec = [[ + bgcolor[#080808BB;true] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]] + local name = player:get_player_name() + local info = minetest.get_player_information(name) + if info.formspec_version > 1 then + formspec = formspec .. "background9[5,5;1,1;gui_formbg.png;true;10]" + else + formspec = formspec .. "background[5,5;1,1;gui_formbg.png;true]" + end + player:set_formspec_prepend(formspec) + + -- Set hotbar textures + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") +end) + +function default.get_hotbar_bg(x,y) + local out = "" + for i=0,7,1 do + out = out .."image["..x+i..","..y..";1,1;gui_hb_bg.png]" + end + return out +end + +default.gui_survival_form = "size[8,8.5]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "list[current_player;craft;1.75,0.5;3,3;]".. + "list[current_player;craftpreview;5.75,1.5;1,1;]".. + "image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "listring[current_player;main]".. + "listring[current_player;craft]".. + default.get_hotbar_bg(0,4.25) + +-- Load files +local default_path = minetest.get_modpath("default") + +dofile(default_path.."/functions.lua") +dofile(default_path.."/trees.lua") +dofile(default_path.."/nodes.lua") +dofile(default_path.."/chests.lua") +dofile(default_path.."/furnace.lua") +dofile(default_path.."/torch.lua") +dofile(default_path.."/tools.lua") +dofile(default_path.."/item_entity.lua") +dofile(default_path.."/craftitems.lua") +dofile(default_path.."/crafting.lua") +dofile(default_path.."/mapgen.lua") +dofile(default_path.."/aliases.lua") +dofile(default_path.."/legacy.lua") + +-- Smoke test that is run via ./util/test/run.sh +if minetest.settings:get_bool("minetest_game_smoke_test") then + minetest.after(0, function() + minetest.emerge_area(vector.new(0, 0, 0), vector.new(32, 32, 32)) + local pos = vector.new(9, 9, 9) + local function check() + if minetest.get_node(pos).name ~= "ignore" then + minetest.request_shutdown() + return + end + minetest.after(0, check) + end + check() + end) +end diff --git a/data/games/garage/mods/default/item_entity.lua b/data/games/garage/mods/default/item_entity.lua new file mode 100644 index 0000000..50b4cd0 --- /dev/null +++ b/data/games/garage/mods/default/item_entity.lua @@ -0,0 +1,86 @@ +-- mods/default/item_entity.lua + +local builtin_item = minetest.registered_entities["__builtin:item"] + +-- strictly speaking none of this is part of the API, so do some checks +-- and if it looks wrong skip the modifications +if not builtin_item or type(builtin_item.set_item) ~= "function" or type(builtin_item.on_step) ~= "function" then + minetest.log("warning", "Builtin item entity does not look as expected, skipping overrides.") + return +end + +local item = { + set_item = function(self, itemstring, ...) + builtin_item.set_item(self, itemstring, ...) + + local stack = ItemStack(itemstring) + local itemdef = minetest.registered_items[stack:get_name()] + if itemdef and itemdef.groups.flammable ~= 0 then + self.flammable = itemdef.groups.flammable + end + end, + + burn_up = function(self) + -- disappear in a smoke puff + local p = self.object:get_pos() + self.object:remove() + minetest.sound_play("default_item_smoke", { + pos = p, + gain = 1.0, + max_hear_distance = 8, + }, true) + minetest.add_particlespawner({ + amount = 3, + time = 0.1, + minpos = {x = p.x - 0.1, y = p.y + 0.1, z = p.z - 0.1 }, + maxpos = {x = p.x + 0.1, y = p.y + 0.2, z = p.z + 0.1 }, + minvel = {x = 0, y = 2.5, z = 0}, + maxvel = {x = 0, y = 2.5, z = 0}, + minacc = {x = -0.15, y = -0.02, z = -0.15}, + maxacc = {x = 0.15, y = -0.01, z = 0.15}, + minexptime = 4, + maxexptime = 6, + minsize = 5, + maxsize = 5, + collisiondetection = true, + texture = "default_item_smoke.png" + }) + end, + + on_step = function(self, dtime, ...) + builtin_item.on_step(self, dtime, ...) + + if self.flammable then + -- flammable, check for igniters every 10 s + self.ignite_timer = (self.ignite_timer or 0) + dtime + if self.ignite_timer > 10 then + self.ignite_timer = 0 + + local pos = self.object:get_pos() + if pos == nil then + return -- object already deleted + end + local node = minetest.get_node_or_nil(pos) + if not node then + return + end + + -- Immediately burn up flammable items in lava + if minetest.get_item_group(node.name, "lava") > 0 then + self:burn_up() + else + -- otherwise there'll be a chance based on its igniter value + local burn_chance = self.flammable + * minetest.get_item_group(node.name, "igniter") + if burn_chance > 0 and math.random(0, burn_chance) ~= 0 then + self:burn_up() + end + end + end + end + end, +} + +-- set defined item as new __builtin:item, with the old one as fallback table +setmetatable(item, { __index = builtin_item }) +minetest.register_entity(":__builtin:item", item) diff --git a/data/games/garage/mods/default/legacy.lua b/data/games/garage/mods/default/legacy.lua new file mode 100644 index 0000000..a2d812d --- /dev/null +++ b/data/games/garage/mods/default/legacy.lua @@ -0,0 +1,49 @@ +-- mods/default/legacy.lua + +-- Horrible stuff to support old code registering falling nodes +-- Don't use this and never do what this does, it's completely wrong! +-- (More specifically, the client and the C++ code doesn't get the group) +function default.register_falling_node(nodename, texture) + minetest.log("error", debug.traceback()) + minetest.log('error', "WARNING: default.register_falling_node is deprecated") + if minetest.registered_nodes[nodename] then + minetest.registered_nodes[nodename].groups.falling_node = 1 + end +end + +function default.spawn_falling_node(p, nodename) + spawn_falling_node(p, nodename) +end + +-- Liquids +WATER_ALPHA = minetest.registered_nodes["default:water_source"].alpha +WATER_VISC = minetest.registered_nodes["default:water_source"].liquid_viscosity +LAVA_VISC = minetest.registered_nodes["default:lava_source"].liquid_viscosity +LIGHT_MAX = default.LIGHT_MAX + +-- Formspecs +default.gui_suvival_form = default.gui_survival_form +default.gui_bg = "" +default.gui_bg_img = "" +default.gui_slots = "" + +-- Players +if minetest.get_modpath("player_api") then + default.registered_player_models = player_api.registered_models + default.player_register_model = player_api.register_model + default.player_attached = player_api.player_attached + default.player_get_animation = player_api.get_animation + default.player_set_model = player_api.set_model + default.player_set_textures = player_api.set_textures + default.player_set_animation = player_api.set_animation +end + +-- Chests +default.register_chest = default.chest.register_chest + +-- Check for a volume intersecting protection +function default.intersects_protection(minp, maxp, player_name, interval) + minetest.log("warning", "default.intersects_protection() is " .. + "deprecated, use minetest.is_area_protected() instead.") + return minetest.is_area_protected(minp, maxp, player_name, interval) +end diff --git a/data/games/garage/mods/default/license.txt b/data/games/garage/mods/default/license.txt new file mode 100644 index 0000000..625f0f8 --- /dev/null +++ b/data/games/garage/mods/default/license.txt @@ -0,0 +1,158 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2023: + + celeron55, Perttu Ahola + Cisoun + G4JC + VanessaE + RealBadAngel + Calinou + MirceaKitsune + Jordach + PilzAdam + jojoa1997 + InfinityProject + Splizard + Zeg9 + paramat + BlockMen + sofar + Neuromancer + Gambit + asl97 + KevDoy + Mito551 + GreenXenith + kaeza + kilbith + tobyplowy + CloudyProton + TumeniNodes + Mossmanikin + random-geek + Extex101 + An0n3m0us + Lopano + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) + +Copyright (C) 2009 cmusounddesign +Copyright (C) 2010 Tomlija +Copyright (C) 2010 lsprice +Copyright (C) 2014 sonictechtonic +Copyright (C) 2015 yadronoff +Copyright (C) 2007 HerbertBoland +Copyright (C) 2006 AGFX + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication + +Iwan Gabovitch +Ottomaani138 +Ogrebane +blukotek +Sevin7 +Yoyodaman234 +Ryding + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/data/games/garage/mods/default/locale/default.de.tr b/data/games/garage/mods/default/locale/default.de.tr new file mode 100644 index 0000000..cb0ec1e --- /dev/null +++ b/data/games/garage/mods/default/locale/default.de.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Abgeschlossene Truhe +Locked Chest (owned by @1)=Abgeschlossene Truhe (Eigentum von @1) +You do not own this chest.=Ihnen gehört diese Truhe nicht. +a locked chest=eine abgeschlossene Truhe +Chest=Truhe +Write=Schreiben +Read=Lesen +Title:=Titel: +Contents:=Inhalt: +Save=Speichern +by @1=von @1 +Page @1 of @2=Seite @1 von @2 +The book you were writing to mysteriously disappeared.=Das Buch, an dem Sie geschrieben haben, ist auf mysteriöse Weise verschwunden. +"@1" by @2=„@1“ von @2 +Blueberries=Blaubeeren +Book=Buch +Book with Text=Buch mit Text +Bronze Ingot=Bronzebarren +Clay Brick=Tonziegel +Clay Lump=Tonklumpen +Coal Lump=Kohleklumpen +Copper Ingot=Kupferbarren +Copper Lump=Kupferklumpen +Diamond=Diamant +Flint=Feuerstein +Gold Ingot=Goldbarren +Gold Lump=Goldklumpen +Iron Lump=Eisenklumpen +Mese Crystal=Mesekristall +Mese Crystal Fragment=Mesekristallfragment +Obsidian Shard=Obsidianscherbe +Paper=Papier +Steel Ingot=Stahlbarren +Stick=Stock +Tin Ingot=Zinnbarren +Tin Lump=Zinnklumpen +Furnace is empty=Ofen ist leer +100% (output full)=100% (Ausgabe voll) +@1%=@1% +Not cookable=Nicht kochbar +Empty=Leer +Furnace active=Ofen aktiv +Furnace inactive=Ofen inaktiv +(Item: @1; Fuel: @2)=(Gegenstand: @1; Brennstoff: @2) +Furnace=Ofen +Stone=Stein +Cobblestone=Kopfsteinpflaster +Stone Brick=Steinziegel +Stone Block=Steinblock +Mossy Cobblestone=Moosiges Kopfsteinpflaster +Desert Stone=Wüstenstein +Desert Cobblestone=Wüstenkopfsteinpflaster +Desert Stone Brick=Wüstensteinziegel +Desert Stone Block=Wüstensteinblock +Sandstone=Sandstein +Sandstone Brick=Sandsteinziegel +Sandstone Block=Sandsteinblock +Desert Sandstone=Wüstensandstein +Desert Sandstone Brick=Wüstensandsteinziegel +Desert Sandstone Block=Wüstensandsteinblock +Silver Sandstone=Silbersandstein +Silver Sandstone Brick=Silbersandsteinziegel +Silver Sandstone Block=Silbersandsteinblock +Obsidian=Obsidian +Obsidian Brick=Obsidianziegel +Obsidian Block=Obsidianblock +Dirt=Erde +Dirt with Grass=Erde mit Gras +Dirt with Grass and Footsteps=Erde mit Gras und Fußstapfen +Dirt with Savanna Grass=Erde mit Savannengras +Dirt with Snow=Erde mit Schnee +Dirt with Rainforest Litter=Erde mit Regenwaldboden +Dirt with Coniferous Litter=Erde mit Nadelwaldboden +Savanna Dirt=Savannenerde +Savanna Dirt with Savanna Grass=Savannenerde mit Savannengras +Permafrost=Permafrost +Permafrost with Stones=Permafrost mit Steinen +Permafrost with Moss=Permafrost mit Moos +Sand=Sand +Desert Sand=Wüstensand +Silver Sand=Silbersand +Gravel=Kies +Clay=Ton +Snow=Schnee +Snow Block=Schneeblock +Ice=Eis +Cave Ice=Höhleneis +Apple Tree=Apfelbaum +Apple Wood Planks=Apfelbaumplanken +Apple Tree Sapling=Apfelbaumsetzling +Apple Tree Leaves=Apfelbaumblätter +Apple=Apfel +Apple Marker=Apfelmarkierung +Jungle Tree=Dschungelbaum +Jungle Wood Planks=Dschungelholzplanken +Jungle Tree Leaves=Dschungelbaumblätter +Jungle Tree Sapling=Dschungelbaumsetzling +Emergent Jungle Tree Sapling=Hervorstehender Dschungelbaumsetzling +Pine Tree=Kiefernbaum +Pine Wood Planks=Kiefernholzplanken +Pine Needles=Kiefernnadeln +Pine Tree Sapling=Kiefernbaumsetzling +Acacia Tree=Akazienbaum +Acacia Wood Planks=Akazienholzplanken +Acacia Tree Leaves=Akazienbaumblätter +Acacia Tree Sapling=Akazienbaumsetzling +Aspen Tree=Espenbaum +Aspen Wood Planks=Espenholzplanken +Aspen Tree Leaves=Espenbaumblätter +Aspen Tree Sapling=Espenbaumsetzling +Coal Ore=Kohleerz +Coal Block=Kohleblock +Iron Ore=Eisenerz +Steel Block=Stahlblock +Copper Ore=Kupfererz +Copper Block=Kupferblock +Tin Ore=Zinnerz +Tin Block=Zinnblock +Bronze Block=Bronzeblock +Mese Ore=Meseerz +Mese Block=Meseblock +Gold Ore=Golderz +Gold Block=Goldblock +Diamond Ore=Diamanterz +Diamond Block=Diamantblock +Cactus=Kaktus +Large Cactus Seedling=Großer Kaktussämling +Papyrus=Papyrus +Dry Shrub=Trockener Busch +Jungle Grass=Dschungelgras +Grass=Gras +Savanna Grass=Savannengras +Fern=Farn +Marram Grass=Dünengras +Bush Stem=Buschstamm +Bush Leaves=Buschblätter +Bush Sapling=Buschsetzling +Blueberry Bush Leaves with Berries=Blaubeerbuschblätter mit Beeren +Blueberry Bush Leaves=Blaubeerbuschblätter +Blueberry Bush Sapling=Blaubeerbuschsetzling +Acacia Bush Stem=Akazienbuschstamm +Acacia Bush Leaves=Akazienbuschblätter +Acacia Bush Sapling=Akazienbuschsetzling +Pine Bush Stem=Kiefernbuschstamm +Pine Bush Needles=Kiefernbuschnadeln +Pine Bush Sapling=Kiefernbuschsetzling +Kelp=Seetang +Green Coral=Grüne Koralle +Pink Coral=Rosa Koralle +Cyan Coral=Türkise Koralle +Brown Coral=Braune Koralle +Orange Coral=Orange Koralle +Coral Skeleton=Korallenskelett +Water Source=Wasserquelle +Flowing Water=Fließendes Wasser +River Water Source=Flusswasserquelle +Flowing River Water=Fließendes Flusswasser +Lava Source=Lavaquelle +Flowing Lava=Fließende Lava +Empty Bookshelf=Leeres Bücherregal +Bookshelf (@1 written, @2 empty books)=Bücherregal (@1 beschriebene, @2 leere Bücher) +Bookshelf=Bücherregal +Text too long=Text zu lang +"@1"=„@1“ +Wooden Sign=Holzschild +Steel Sign=Stahlschild +Wooden Ladder=Holzleiter +Steel Ladder=Stahlleiter +Apple Wood Fence=Apfelholzzaun +Acacia Wood Fence=Akazienholzzaun +Jungle Wood Fence=Dschungelholzzaun +Pine Wood Fence=Kiefernholzzaun +Aspen Wood Fence=Espenholzzaun +Apple Wood Fence Rail=Apfelholzzaungeländer +Acacia Wood Fence Rail=Akazienholzzaungeländer +Jungle Wood Fence Rail=Dschungelholzzaungeländer +Pine Wood Fence Rail=Kiefernholzzaungeländer +Aspen Wood Fence Rail=Espenholzzaungeländer +Glass=Glas +Obsidian Glass=Obsidianglas +Brick Block=Ziegelblock +Mese Lamp=Meselampe +Apple Wood Mese Post Light=Apfelholzmesestandlampe +Acacia Wood Mese Post Light=Akazienholzmesestandlampe +Jungle Wood Mese Post Light=Dschungelholzmesestandlampe +Pine Wood Mese Post Light=Kiefernholzmesestandlampe +Aspen Wood Mese Post Light=Espenholzmesestandlampe +Cloud=Wolke +Wooden Pickaxe=Holzspitzhacke +Stone Pickaxe=Steinspitzhacke +Bronze Pickaxe=Bronzespitzhacke +Steel Pickaxe=Stahlspitzhacke +Mese Pickaxe=Mesespitzhacke +Diamond Pickaxe=Diamantspitzhacke +Wooden Shovel=Holzschaufel +Stone Shovel=Steinschaufel +Bronze Shovel=Bronzeschaufel +Steel Shovel=Stahlschaufel +Mese Shovel=Meseschaufel +Diamond Shovel=Diamantschaufel +Wooden Axe=Holzaxt +Stone Axe=Steinaxt +Bronze Axe=Bronzeaxt +Steel Axe=Stahlaxt +Mese Axe=Meseaxt +Diamond Axe=Diamantaxt +Wooden Sword=Holzschwert +Stone Sword=Steinschwert +Bronze Sword=Bronzeschwert +Steel Sword=Stahlschwert +Mese Sword=Meseschwert +Diamond Sword=Diamantschwert +Torch=Fackel +@1 will intersect protection on growth.=@1 wird bei Wachstum mit geschützter Zone überlappen. + + +##### not used anymore ##### + +Mese Post Light=Mesestandlampe diff --git a/data/games/garage/mods/default/locale/default.eo.tr b/data/games/garage/mods/default/locale/default.eo.tr new file mode 100644 index 0000000..8454c6d --- /dev/null +++ b/data/games/garage/mods/default/locale/default.eo.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Ŝlosita kesto +Locked Chest (owned by @1)=Ŝlosita kesto (de @1) +You do not own this chest.=Vi ne posedas ĉi tiun keston. +a locked chest=ŝlosita kesto +Chest=Kesto +Write=Skribi +Read=Legi +Title:=Titolo: +Contents:=Enhavo: +Save=Konservi +by @1=per @1 +Page @1 of @2=Paĝo @1 el @2 +The book you were writing to mysteriously disappeared.=La libro, kiun vi skribis, mistere malaperis. +"@1" by @2="@1" per @2 +Blueberries=Mirteloj +Book=Libro +Book with Text=Libro kun teksto +Bronze Ingot=Bronza ingoto +Clay Brick=Argila briko +Clay Lump=Argila bulo +Coal Lump=Karba bulo +Copper Ingot=Kupra ingoto +Copper Lump=Kupra bulo +Diamond=Diamanto +Flint=Siliko +Gold Ingot=Ora ingoto +Gold Lump=Ora bulo +Iron Lump=Fera bulo +Mese Crystal=Mesea kristalo +Mese Crystal Fragment=Mesea kristala ero +Obsidian Shard=Obsidiana peceto +Paper=Papero +Steel Ingot=Ŝtala ingoto +Stick=Bastono +Tin Ingot=Stana ingoto +Tin Lump=Stana bulo +Furnace is empty=Forno estas malplena +100% (output full)=100% (plena eligo) +@1%=@1% +Not cookable=Nekuirebla +Empty=Malplena +Furnace active=Forno laboras +Furnace inactive=Forno ne laboras +(Item: @1; Fuel: @2)=(Objekto: @1; Brulaĵo: @2) +Furnace=Forno +Stone=Ŝtono +Cobblestone=Pavimŝtono +Stone Brick=Ŝtona briko +Stone Block=Ŝtona bloko +Mossy Cobblestone=Muska pavimŝtono +Desert Stone=Dezerta ŝtono +Desert Cobblestone=Dezerta pavimŝtono +Desert Stone Brick=Dezerta ŝtona briko +Desert Stone Block=Dezerta ŝtona bloko +Sandstone=Sablaŝtono +Sandstone Brick=Sablaŝtono briko +Sandstone Block=Sablaŝtono bloko +Desert Sandstone=Dezerta sablaŝtono +Desert Sandstone Brick=Dezerta sablaŝtono briko +Desert Sandstone Block=Dezerta sablaŝtono bloko +Silver Sandstone=Arĝenta sablaŝtono +Silver Sandstone Brick=Arĝenta sablaŝtono briko +Silver Sandstone Block=Arĝenta sablaŝtono bloko +Obsidian=Obsidiano +Obsidian Brick=Obsidiana briko +Obsidian Block=Obsidiana bloko +Dirt=Tero +Dirt with Grass=Tero kun herbo +Dirt with Grass and Footsteps=Tero kun herbo kaj piedpaŝoj +Dirt with Savanna Grass=Tero kun savana herbo +Dirt with Snow=Tero kun neĝo +Dirt with Rainforest Litter=Tero kun pluvarbara folioj +Dirt with Coniferous Litter=Tero kun koniferaj folioj +Savanna Dirt=Savana tero +Savanna Dirt with Savanna Grass=Savana tero kun savana herbo +Permafrost=Ĉiamfrosto +Permafrost with Stones=Ĉiamfrosto kun ŝtonoj +Permafrost with Moss=Ĉiamfrosto kun musko +Sand=Sablo +Desert Sand=Dezerta sablo +Silver Sand=Arĝenta sablo +Gravel=Gruzo +Clay=Argilo +Snow=Neĝo +Snow Block=Neĝa bloko +Ice=Glacio +Cave Ice=Kaverna glacio +Apple Tree=Pomarbo +Apple Wood Planks=Pomarbaj lignaj tabuloj +Apple Tree Sapling=Pomarba arbido +Apple Tree Leaves=Pomarbaj folioj +Apple=Pomo +Apple Marker=Poma marko +Jungle Tree=Ĝangala arbo +Jungle Wood Planks=Ĝangalaj lignaj tabuloj +Jungle Tree Leaves=Ĝangalaj arbaj folioj +Jungle Tree Sapling=Ĝangala arba arbido +Emergent Jungle Tree Sapling=Nova ĝangala arba arbido +Pine Tree=Pino +Pine Wood Planks=Pinaj lignaj tabuloj +Pine Needles=Pinpingloj +Pine Tree Sapling=Pina arbido +Acacia Tree=Akacio +Acacia Wood Planks=Akaciaj lignaj tabuloj +Acacia Tree Leaves=Akaciaj folioj +Acacia Tree Sapling=Akacia arbido +Aspen Tree=Tremolo +Aspen Wood Planks=Tremolaj lignaj tabuloj +Aspen Tree Leaves=Tremolaj folioj +Aspen Tree Sapling=Tremola arbido +Coal Ore=Karba minaĵo +Coal Block=Karba bloko +Iron Ore=Fera minaĵo +Steel Block=Ŝtala bloko +Copper Ore=Kupra minaĵo +Copper Block=Kupra bloko +Tin Ore=Stana minaĵo +Tin Block=Stana bloko +Bronze Block=Bronza bloko +Mese Ore=Mesea minaĵo +Mese Block=Mesea bloko +Gold Ore=Ora minaĵo +Gold Block=Ora bloko +Diamond Ore=Diamanta minaĵo +Diamond Block=Diamanta bloko +Cactus=Kakto +Large Cactus Seedling=Granda kakta kreskaĵo +Papyrus=Papiruso +Dry Shrub=Seka arbetaĵo +Jungle Grass=Ĝangala herbo +Grass=Herbo +Savanna Grass=Savana herbo +Fern=Filiko +Marram Grass=Amofilo +Bush Stem=Arbateĵa tubo +Bush Leaves=Arbateĵaj folioj +Bush Sapling=Arbateĵa arbido +Blueberry Bush Leaves with Berries=Mirtelaj arbateĵaj folioj kaj beroj +Blueberry Bush Leaves=Mirtelaj arbateĵaj folioj +Blueberry Bush Sapling=Mirtela arbateĵa arbido +Acacia Bush Stem=Akacia arbateĵa tubo +Acacia Bush Leaves=Akaciaj arbateĵaj folioj +Acacia Bush Sapling=Akacia arbateĵa arbido +Pine Bush Stem=Pina arbateĵa tubo +Pine Bush Needles=Pinaj arbateĵaj pingloj +Pine Bush Sapling=Pina arbateĵa arbido +Kelp=Fuko +Green Coral=Verda koralo +Pink Coral=Rozkolora koralo +Cyan Coral=Bluverda koralo +Brown Coral=Bruna koralo +Orange Coral=Oranĝkolora koralo +Coral Skeleton=Korala framo +Water Source=Akva fonto +Flowing Water=Flua akvo +River Water Source=Rivera akva fonto +Flowing River Water=Flua rivera akvo +Lava Source=Lafa fonto +Flowing Lava=Flua lafa +Empty Bookshelf=Malplena librobreto +Bookshelf (@1 written, @2 empty books)=Librobreto (@1 skriba(j), @2 malplena(j) libro(j)) +Bookshelf=Librobreto +Text too long=Tro longa teksto +"@1"= +Wooden Sign=Ligna signo +Steel Sign=Ŝtala signo +Wooden Ladder=Ligna ŝtupetaro +Steel Ladder=Ŝtala ŝtupetaro +Apple Wood Fence=Poma ligna barilo +Acacia Wood Fence=Akacia ligna barilo +Jungle Wood Fence=Ĝangala ligna barilo +Pine Wood Fence=Pina ligna barilo +Aspen Wood Fence=Tremola ligna barilo +Apple Wood Fence Rail=Poma ligna barila relo +Acacia Wood Fence Rail=Akacia ligna barila relo +Jungle Wood Fence Rail=Ĝangala ligna barila relo +Pine Wood Fence Rail=Pina ligna barila relo +Aspen Wood Fence Rail=Tremola ligna barila relo +Glass=Vitro +Obsidian Glass=Obsidiana vitro +Brick Block=Brika bloko +Mese Lamp=Mesea lampo +Apple Wood Mese Post Light=Poma ligna mesea fosta lampo +Acacia Wood Mese Post Light=Akacia ligna mesea fosta lampo +Jungle Wood Mese Post Light=Ĝangala ligna mesea fosta lampo +Pine Wood Mese Post Light=Pina ligna mesea fosta lampo +Aspen Wood Mese Post Light=Tremola ligna mesea fosta lampo +Cloud=Nubo +Wooden Pickaxe=Ligna pioĉo +Stone Pickaxe=Ŝtona pioĉo +Bronze Pickaxe=Bronza pioĉo +Steel Pickaxe=Ŝtala pioĉo +Mese Pickaxe=Mesea pioĉo +Diamond Pickaxe=Diamanta pioĉo +Wooden Shovel=Ligna fosilo +Stone Shovel=Ŝtona fosilo +Bronze Shovel=Bronza fosilo +Steel Shovel=Ŝtala fosilo +Mese Shovel=Mesea fosilo +Diamond Shovel=Diamanta fosilo +Wooden Axe=Ligna hakilo +Stone Axe=Ŝtona hakilo +Bronze Axe=Bronza hakilo +Steel Axe=Ŝtala hakilo +Mese Axe=Mesea hakilo +Diamond Axe=Diamanta hakilo +Wooden Sword=Ligna glavo +Stone Sword=Ŝtona glavo +Bronze Sword=Bronza glavo +Steel Sword=Ŝtala glavo +Mese Sword=Mesea glavo +Diamond Sword=Diamanta glavo +Torch=Torĉo +@1 will intersect protection on growth.=@1 sekcos protekton dum kresko. + + +##### not used anymore ##### + +Mese Post Light=Mesea fosta lampo diff --git a/data/games/garage/mods/default/locale/default.es.tr b/data/games/garage/mods/default/locale/default.es.tr new file mode 100644 index 0000000..d08c2d2 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.es.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Cofre cerrado +Locked Chest (owned by @1)=Cofre cerrado (propiedad de @1) +You do not own this chest.=Este cofre no te pertenece. +a locked chest=un cofre cerrado +Chest=Cofre +Write= +Read= +Title:=Título: +Contents:=Contenidos: +Save=Guardar +by @1=por @1 +Page @1 of @2=Página @1 de @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" por @2 +Blueberries=Arándanos +Book=Libro +Book with Text=Libro escrito +Bronze Ingot=Lingote de bronce +Clay Brick=Ladrillo de arcilla +Clay Lump=Bola de arcilla +Coal Lump=Carbón +Copper Ingot=Lingote de cobre +Copper Lump=Pepita de cobre +Diamond=Diamante +Flint=Pedernal +Gold Ingot=Lingote de oro +Gold Lump=Pepita de oro +Iron Lump=Pepita de hierro +Mese Crystal=Cristal de mese +Mese Crystal Fragment=Fragmento de cristal de mese +Obsidian Shard=Esquirla de obsidiana +Paper=Papel +Steel Ingot=Lingote de acero +Stick=Palo +Tin Ingot=Lingote de estaño +Tin Lump=Pepita de estaño +Furnace is empty=El horno está vacío +100% (output full)=100% (salida completa) +@1%=@1% +Not cookable=No se puede cocinar +Empty=Vacío +Furnace active=Horno activado +Furnace inactive=Horno desactivado +(Item: @1; Fuel: @2)=(Objeto: @1; Combustible: @2) +Furnace=Horno +Stone=Piedra +Cobblestone=Adoquín +Stone Brick=Ladrillo de piedra +Stone Block=Bloque de piedra +Mossy Cobblestone=Adoquín musgoso +Desert Stone=Piedra desértica +Desert Cobblestone=Adoquín desértico +Desert Stone Brick=Ladrillo de piedra desértica +Desert Stone Block=Bloque de piedra desértica +Sandstone=Piedra arenisca +Sandstone Brick=Ladrillo de arenisca +Sandstone Block=Bloque de arenisca +Desert Sandstone=Piedra arenisca desértica +Desert Sandstone Brick=Ladrillo de arenisca desértica +Desert Sandstone Block=Bloque de arenisca deśertica +Silver Sandstone=Piedra arenisca plateada +Silver Sandstone Brick=Ladrillo de arenisca plateada +Silver Sandstone Block=Bloque de arenisca plateada +Obsidian=Obsidiana +Obsidian Brick=Ladrillo de obsidiana +Obsidian Block=Bloque de obsidiana +Dirt=Tierra +Dirt with Grass=Tierra con pasto +Dirt with Grass and Footsteps=Tierra con pasto y pisadas +Dirt with Savanna Grass=Tierra con hierba de sabana +Dirt with Snow=Tierra con nieve +Dirt with Rainforest Litter=Tierra con hojarasca de selva tropical +Dirt with Coniferous Litter=Tierra con hojarasca de coníferas +Savanna Dirt=Tierra de sabana +Savanna Dirt with Savanna Grass=Tierra de sabana con hierba de sabana +Permafrost=Permafrost +Permafrost with Stones=Permafrost pedregoso +Permafrost with Moss=Permafrost musgoso +Sand=Arena +Desert Sand=Arena desértica +Silver Sand=Arena plateada +Gravel=Grava +Clay=Arcilla +Snow=Nieve +Snow Block=Bloque de nieve +Ice=Hielo +Cave Ice=Hielo de cueva +Apple Tree=Madera de manzano +Apple Wood Planks=Tablas de manzano +Apple Tree Sapling=Retoño de manzano +Apple Tree Leaves=Hojas de manzano +Apple=Manzana +Apple Marker=Marcador de manzano +Jungle Tree=Madera de árbol tropical +Jungle Wood Planks=Tablas de madera tropical +Jungle Tree Leaves=Hojas de árbol tropical +Jungle Tree Sapling=Retoño de árbol tropical +Emergent Jungle Tree Sapling=Retoño de árbol tropical +Pine Tree=Madera de pino +Pine Wood Planks=Tablas de pino +Pine Needles=Agujas de pino +Pine Tree Sapling=Retoño de pino +Acacia Tree=Madera de acacia +Acacia Wood Planks=Tablas de acacia +Acacia Tree Leaves=Hojas de acacia +Acacia Tree Sapling=Retoño de acacia +Aspen Tree=Madera de álamo +Aspen Wood Planks=Tablas de álamo +Aspen Tree Leaves=Hojas de álamo +Aspen Tree Sapling=Retoño de álamo +Coal Ore=Mineral de carbón +Coal Block=Bloque de carbón +Iron Ore=Mineral de hierro +Steel Block=Bloque de acero +Copper Ore=Mineral de cobre +Copper Block=Bloque de cobre +Tin Ore=Mineral de estaño +Tin Block=Bloque de estaño +Bronze Block=Bloque de bronce +Mese Ore=Mineral de mese +Mese Block=Bloque de mese +Gold Ore=Mineral de oro +Gold Block=Bloque de oro +Diamond Ore=Mineral de diamante +Diamond Block=Bloque de diamante +Cactus=Cáctus +Large Cactus Seedling=Vástago grande de cactus +Papyrus=Papiro +Dry Shrub=Arbusto seco +Jungle Grass=Pasto de jungla +Grass=Pasto +Savanna Grass=Hierba de sabana +Fern=Helecho +Marram Grass=Carrizo +Bush Stem=Tallo de arbusto +Bush Leaves=Hojas de arbusto +Bush Sapling=Retoño de arbusto +Blueberry Bush Leaves with Berries=Hojas de arbusto de arándano con bayas +Blueberry Bush Leaves=Hojas de arbusto de arándano +Blueberry Bush Sapling=Retoño de arbusto de arándano +Acacia Bush Stem=Tallo de arbusto de acacia +Acacia Bush Leaves=Hojas de arbusto de acacia +Acacia Bush Sapling=Retoño de arbusto de acacia +Pine Bush Stem=Tallo de arbusto de pino +Pine Bush Needles=Agujas de arbusto de pino +Pine Bush Sapling=Retoño de arbusto de pino +Kelp=Alga marina +Green Coral=Coral verde +Pink Coral=Coral rosa +Cyan Coral=Coral cián +Brown Coral=Coral café +Orange Coral=Coral naranja +Coral Skeleton=Esqueleto de coral +Water Source=Fuente de agua +Flowing Water=Fluído de agua +River Water Source=Fuente de agua de río +Flowing River Water=Fluído de agua de río +Lava Source=Fuente de lava +Flowing Lava=Fluído de lava +Empty Bookshelf=Librería vacía +Bookshelf (@1 written, @2 empty books)=Librería(@1 escritos, @2 libros en blanco) +Bookshelf=Librería +Text too long=Texto demasiado largo +"@1"="@1" +Wooden Sign=Cartel de madera +Steel Sign=Cartel de acero +Wooden Ladder=Escalera de madera +Steel Ladder=Escalera de acero +Apple Wood Fence=Cerca de manzano +Acacia Wood Fence=Cerca de acacia +Jungle Wood Fence=Cerca de madera tropical +Pine Wood Fence=Cerca de pino +Aspen Wood Fence=Cerca de álamo +Apple Wood Fence Rail=Listones de manzano para cerca +Acacia Wood Fence Rail=Listones de acacia para cerca +Jungle Wood Fence Rail=Listones de madera tropical para cerca +Pine Wood Fence Rail=Listones de pino para cerca +Aspen Wood Fence Rail=Listones de álamo para cerca +Glass=Vidrio +Obsidian Glass=Vidrio de obsidiana +Brick Block=Bloque de ladrillo +Mese Lamp=Lámpara de mese +Apple Wood Mese Post Light=Poste de luz de madera de manzano +Acacia Wood Mese Post Light=Poste de luz de madera de acacia +Jungle Wood Mese Post Light=Poste de luz de madera de jungla +Pine Wood Mese Post Light=Poste de luz de madera de pino +Aspen Wood Mese Post Light=Poste de luz de madera de álamo +Cloud=Nube +Wooden Pickaxe=Pico de madera +Stone Pickaxe=Pico de piedra +Bronze Pickaxe=Pico de bronce +Steel Pickaxe=Pico de acero +Mese Pickaxe=Pico de mese +Diamond Pickaxe=Pico de diamante +Wooden Shovel=Pala de madera +Stone Shovel=Pala de piedra +Bronze Shovel=Pala de bronce +Steel Shovel=Pala de acero +Mese Shovel=Pala de mese +Diamond Shovel=Pala de diamante +Wooden Axe=Hacha de madera +Stone Axe=Hacha de piedra +Bronze Axe=Hacha de bronce +Steel Axe=Hacha de acero +Mese Axe=Hacha de mese +Diamond Axe=Hacha de diamante +Wooden Sword=Espada de madera +Stone Sword=Espada de piedra +Bronze Sword=Espada de bronce +Steel Sword=Espada de acero +Mese Sword=Espada de mese +Diamond Sword=Espada de diamante +Torch=Antorcha +@1 will intersect protection on growth.=@1 intersectará con protección cuando crezca. + + +##### not used anymore ##### + +Dirt with Dry Grass=Tierra con pasto seco +Dry Dirt=Tierra Seca +Dry Dirt with Dry Grass=Tierra seca con pasto seco +Dry Grass=Pasto seco +Mese Post Light=Poste de luz de mese diff --git a/data/games/garage/mods/default/locale/default.fr.tr b/data/games/garage/mods/default/locale/default.fr.tr new file mode 100644 index 0000000..8f694fb --- /dev/null +++ b/data/games/garage/mods/default/locale/default.fr.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Coffre verrouillé +Locked Chest (owned by @1)=Coffre verrouillé (possédé par @1) +You do not own this chest.=Ce coffre ne vous appartient pas. +a locked chest=un coffre verrouillé +Chest=Coffre +Write=Écrire +Read=Lire +Title:=Titre : +Contents:=Contenu : +Save=Sauvegarder +by @1=de @1 +Page @1 of @2=Page @1 sur @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2=« @1 » de @2 +Blueberries=Myrtille +Book=Livre +Book with Text=Livre avec du texte +Bronze Ingot=Lingot de bronze +Clay Brick=Brique d'argile +Clay Lump=Morceau d'argile +Coal Lump=Morceau de charbon +Copper Ingot=Lingot de cuivre +Copper Lump=Morceau de cuivre +Diamond=Diamant +Flint=Silex +Gold Ingot=Lingot d'or +Gold Lump=Morceau d'or +Iron Lump=Morceau de fer +Mese Crystal=Cristal de Mese +Mese Crystal Fragment=Fragment de cristal de Mese +Obsidian Shard=Tesson d'obsidienne +Paper=Papier +Steel Ingot=Lingot d'acier +Stick=Baton +Tin Ingot=Lingot d'étain +Tin Lump=Morceau d'étain +Furnace is empty=Le four est vide +100% (output full)=100% (Sortie pleine) +@1%=@1% +Not cookable=Ne se cuit pas +Empty=Vide +Furnace active=Four actif +Furnace inactive=Four inactif +(Item: @1; Fuel: @2)=(Article: @1; Carburant: @2) +Furnace=Four +Stone=Pierre +Cobblestone=Pavé +Stone Brick=Brique de pierre +Stone Block=Bloc de pierre +Mossy Cobblestone=Pavé moussu +Desert Stone=Pierre du désert +Desert Cobblestone=Pavé de pierre du désert +Desert Stone Brick=Brique de pierre du désert +Desert Stone Block=Bloc de pierre du désert +Sandstone=Grès +Sandstone Brick=Brique de grès +Sandstone Block=Bloc de grès +Desert Sandstone=Grès du désert +Desert Sandstone Brick=Brique de grès du désert +Desert Sandstone Block=Bloc de grès du désert +Silver Sandstone=Grès argenté +Silver Sandstone Brick=Brique de grès argenté +Silver Sandstone Block=Bloc de grès argenté +Obsidian=Obsidienne +Obsidian Brick=Brique d'obsidienne +Obsidian Block=Bloc d'obsidienne +Dirt=Terre +Dirt with Grass=Terre avec de l'herbe +Dirt with Grass and Footsteps=Terre avec de l'herbe et des traces de pas +Dirt with Savanna Grass=Terre avec de l'herbe de savane +Dirt with Snow=Terre avec de la neige +Dirt with Rainforest Litter=Terre avec sol de forêt humide +Dirt with Coniferous Litter=Terre avec sol de forêt de conifère +Savanna Dirt=Terre de la savane +Savanna Dirt with Savanna Grass=Terre de la savane avec son herbe +Permafrost=Pergélisol +Permafrost with Stones=Pergélisol avec de la pierre +Permafrost with Moss=Pergélisol avec de la mousse +Sand=Sable +Desert Sand=Sable du désert +Silver Sand=Sable argenté +Gravel=Gravier +Clay=Argile +Snow=Neige +Snow Block=Bloc de neige +Ice=Glace +Cave Ice=Glace de grotte +Apple Tree=Pommier +Apple Wood Planks=Planche de pommier +Apple Tree Sapling=Pousse de pommier +Apple Tree Leaves=Feuilles de pommier +Apple=Pomme +Apple Marker=Marqueur de pomme +Jungle Tree=Arbre de la jungle +Jungle Wood Planks=Planche d'arbre de la jungle +Jungle Tree Leaves=Feuilles d'arbre de la jungle +Jungle Tree Sapling=Pousse d'arbre de la jungle +Emergent Jungle Tree Sapling=Pousse d'arbre de la jungle émergent +Pine Tree=Pin +Pine Wood Planks=Planche de pin +Pine Needles=Aiguilles de pin +Pine Tree Sapling=Pousse de pin +Acacia Tree=Acacia +Acacia Wood Planks=Planche d'acacia +Acacia Tree Leaves=Feuilles d'acacia +Acacia Tree Sapling=Pousse d'acacia +Aspen Tree=Tremble +Aspen Wood Planks=Planche de tremble +Aspen Tree Leaves=Feuilles de tremble +Aspen Tree Sapling=Pousse de tremble +Coal Ore=Minerai de charbon +Coal Block=Bloc de charbon +Iron Ore=Minerai de fer +Steel Block=Bloc d'acier +Copper Ore=Minerai de cuivre +Copper Block=Bloc de cuivre +Tin Ore=Minerai d'étain +Tin Block=Bloc d'étain +Bronze Block=Bloc de bronze +Mese Ore=Minerai de Mese +Mese Block=Bloc de Mese +Gold Ore=Minerai d'or +Gold Block=Bloc d'or +Diamond Ore=Minerai de diamant +Diamond Block=Bloc de diamant +Cactus=Cactus +Large Cactus Seedling=Grand plan de cactus +Papyrus=Papyrus +Dry Shrub=Arbuste sec +Jungle Grass=Herbe de la jungle +Grass=Herbe +Savanna Grass=Herbe de la savane +Fern=Fougère +Marram Grass=Ammophile +Bush Stem=Tige de buisson +Bush Leaves=Feuilles de buisson +Bush Sapling=Pousse de buisson +Blueberry Bush Leaves with Berries=Buisson de myrtille avec des myrtilles +Blueberry Bush Leaves=Feuilles de buisson à myrtilles +Blueberry Bush Sapling=Pousse de buisson à myrtilles +Acacia Bush Stem=Tige de buisson d'acacia +Acacia Bush Leaves=Feuilles de buisson d'acacia +Acacia Bush Sapling=Pousses de buisson d'acacia +Pine Bush Stem=Tige de buisson de pin +Pine Bush Needles=Aiguilles de buisson de pin +Pine Bush Sapling=Pousse de buisson de pin +Kelp=Varech +Green Coral=Corail vert +Pink Coral=Corail rose +Cyan Coral=Corail cyan +Brown Coral=Corail marron +Orange Coral=Corail orange +Coral Skeleton=Squelette de corail +Water Source=Source d'eau +Flowing Water=Écoulement d'eau +River Water Source=Source d'eau de rivière +Flowing River Water=Écoulement d'eau de rivière +Lava Source=Source de lave +Flowing Lava=Écoulement de lave +Empty Bookshelf=Bibliothèque vide +Bookshelf (@1 written, @2 empty books)=Bibliothèque (@1 écrits, @2 livres vides) +Bookshelf=Bibliothèque +Text too long=Texte trop longue +"@1"=« @1 » +Wooden Sign=Panneau en bois +Steel Sign=Panneau en acier +Wooden Ladder=Échelle en bois +Steel Ladder=Échelle en acier +Apple Wood Fence=Barrière de bois de pommier +Acacia Wood Fence=Barrière de bois d'acacia +Jungle Wood Fence=Barrière de bois de la jungle +Pine Wood Fence=Barrière de bois de pin +Aspen Wood Fence=Barrière de bois de tremble +Apple Wood Fence Rail=Clôture de bois de pommier +Acacia Wood Fence Rail=Clôture de bois d'acacia +Jungle Wood Fence Rail=Clôture de bois de la jungle +Pine Wood Fence Rail=Clôture de bois de pin +Aspen Wood Fence Rail=Clôture de bois de tremble +Glass=Verre +Obsidian Glass=Verre d'obsidienne +Brick Block=Bloc de brique +Mese Lamp=Lampe de Mese +Apple Wood Mese Post Light=Réverbère de Mese en bois de pommier +Acacia Wood Mese Post Light=Réverbère de Mese en bois d'acacia +Jungle Wood Mese Post Light=Réverbère de Mese en bois de la jungle +Pine Wood Mese Post Light=Réverbère de Mese en bois de pin +Aspen Wood Mese Post Light=Réverbère de Mese en bois de tremble +Cloud=Nuage +Wooden Pickaxe=Pioche en bois +Stone Pickaxe=Pioche en pierre +Bronze Pickaxe=Pioche en bronze +Steel Pickaxe=Pioche en acier +Mese Pickaxe=Pioche de Mese +Diamond Pickaxe=Pioche en diamant +Wooden Shovel=Pelle en bois +Stone Shovel=Pelle en pierre +Bronze Shovel=Pelle en bronze +Steel Shovel=Pelle en acier +Mese Shovel=Pelle en Mese +Diamond Shovel=Pelle en diamant +Wooden Axe=Hache en bois +Stone Axe=Hache en pierre +Bronze Axe=Hache en bronze +Steel Axe=Hache en acier +Mese Axe=Hache en Mese +Diamond Axe=Hache en diamant +Wooden Sword=Epée en bois +Stone Sword=Épée en pierre +Bronze Sword=Épée en bronze +Steel Sword=Épée en acier +Mese Sword=Épée en Mese +Diamond Sword=Épée en diamant +Torch=Torche +@1 will intersect protection on growth.=@1 chevauchera la zone protégée avec la croissance. + + +##### not used anymore ##### + +Dirt with Dry Grass=Terre avec de l'herbe sèche +Dry Dirt=Terre sèche +Dry Dirt with Dry Grass=Terre sèche avec de l'herbe sèche +Dry Grass=Herbe sèche +Mese Post Light=Réverbère de Mese diff --git a/data/games/garage/mods/default/locale/default.id.tr b/data/games/garage/mods/default/locale/default.id.tr new file mode 100644 index 0000000..c60b5b0 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.id.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Peti Terkunci +Locked Chest (owned by @1)=Peti Terkunci (milik @1) +You do not own this chest.=Anda bukan pemilik peti ini. +a locked chest=peti terkunci +Chest=Peti +Write=Tulis +Read=Baca +Title:=Judul: +Contents:=Isi: +Save=Simpan +by @1=oleh @1 +Page @1 of @2=Halaman @1 dari @2 +The book you were writing to mysteriously disappeared.=Buku yang Anda tulis menghilang secara misterius. +"@1" by @2="@1" oleh @2 +Blueberries=Bluberi +Book=Buku +Book with Text=Buku Tertulis +Bronze Ingot=Perunggu Batangan +Clay Brick=Bata +Clay Lump=Bongkahan Tanah Liat +Coal Lump=Bongkahan Batu Bara +Copper Ingot=Tembaga Batangan +Copper Lump=Bongkahan Tembaga +Diamond=Berlian +Flint=Batu Api +Gold Ingot=Emas Batangan +Gold Lump=Bongkahan Emas +Iron Lump=Bongkahan Besi +Mese Crystal=Kristal Mese +Mese Crystal Fragment=Pecahan Kristal Mese +Obsidian Shard=Pecahan Obsidian +Paper=Kertas +Steel Ingot=Baja Batangan +Stick=Tongkat +Tin Ingot=Timah Batangan +Tin Lump=Bongkahan Timah +Furnace is empty=Tungku kosong +100% (output full)=100% (keluaran penuh) +@1%=@1% +Not cookable=Tidak bisa dimasak +Empty=Kosong +Furnace active=Tungku nyala +Furnace inactive=Tungku mati +(Item: @1; Fuel: @2)=(Barang: @1; Bahan Bakar: @2) +Furnace=Tungku +Stone=Batu +Cobblestone=Bongkahan Batu +Stone Brick=Tembok Batu +Stone Block=Balok Batu +Mossy Cobblestone=Bongkahan Batu Berlumut +Desert Stone=Batu Gurun +Desert Cobblestone=Bongkahan Batu Gurun +Desert Stone Brick=Tembok Batu Gurun +Desert Stone Block=Balok Batu Gurun +Sandstone=Batu Pasir +Sandstone Brick=Tembok Batu Pasir +Sandstone Block=Balok Batu Pasir +Desert Sandstone=Batu Pasir Gurun +Desert Sandstone Brick=Tembok Batu Pasir Gurun +Desert Sandstone Block=Balok Batu Pasir Gurun +Silver Sandstone=Batu Pasir Perak +Silver Sandstone Brick=Tembok Batu Pasir Perak +Silver Sandstone Block=Balok Batu Pasir Perak +Obsidian=Obsidian +Obsidian Brick=Tembok Obsidian +Obsidian Block=Balok Obsidian +Dirt=Tanah +Dirt with Grass=Tanah Berumput +Dirt with Grass and Footsteps=Tanah Berumput dengan Jejak Kaki +Dirt with Savanna Grass=Tanah Berumput Sabana +Dirt with Snow=Tanah Bersalju +Dirt with Rainforest Litter=Tanah Berserasah Hutan Hujan +Dirt with Coniferous Litter=Tanah Berserasah Hutan Konifer +Savanna Dirt=Tanah Sabana +Savanna Dirt with Savanna Grass=Tanah Sabana Berumput Sabana +Permafrost=Ibun Abadi +Permafrost with Stones=Ibun Abadi Berbatu +Permafrost with Moss=Ibun Abadi Berlumut +Sand=Pasir +Desert Sand=Pasir Gurun +Silver Sand=Pasir Perak +Gravel=Kerikil +Clay=Tanah Liat +Snow=Salju +Snow Block=Balok Salju +Ice=Es +Cave Ice=Es Gua +Apple Tree=Pohon Apel +Apple Wood Planks=Papan Kayu Pohon Apel +Apple Tree Sapling=Anak Pohon Apel +Apple Tree Leaves=Daun Pohon Apel +Apple=Apel +Apple Marker=Penanda Apel +Jungle Tree=Pohon Hutan Rimba +Jungle Wood Planks=Papan Kayu Pohon Rimba +Jungle Tree Leaves=Daun Pohon Rimba +Jungle Tree Sapling=Anak Pohon Rimba +Emergent Jungle Tree Sapling=Anak Pohon Rimba Bertumbuh +Pine Tree=Pohon Pinus +Pine Wood Planks=Papan Kayu Pinus +Pine Needles=Daun Pinus +Pine Tree Sapling=Anak Pohon Pinus +Acacia Tree=Pohon Akasia +Acacia Wood Planks=Papan Kayu Akasia +Acacia Tree Leaves=Daun Akasia +Acacia Tree Sapling=Anak Pohon Akasia +Aspen Tree=Pohon Aspen +Aspen Wood Planks=Papan Kayu Aspen +Aspen Tree Leaves=Daun Aspen +Aspen Tree Sapling=Anak Pohon Aspen +Coal Ore=Bijih Batu Bara +Coal Block=Balok Batu Bara +Iron Ore=Bijih Besi +Steel Block=Balok Baja +Copper Ore=Bijih Tembaga +Copper Block=Balok Tembaga +Tin Ore=Bijih Timah +Tin Block=Balok Timah +Bronze Block=Balok Perunggu +Mese Ore=Bijih Mese +Mese Block=Balok Mese +Gold Ore=Bijih Emas +Gold Block=Balok Emas +Diamond Ore=Bijih Berlian +Diamond Block=Balok Berlian +Cactus=Kaktus +Large Cactus Seedling=Bibit Kaktus Besar +Papyrus=Papirus +Dry Shrub=Semak Kering +Jungle Grass=Rumput Rimba +Grass=Rumput +Savanna Grass=Rumput Sabana +Fern=Pakis +Marram Grass=Rumput Pantai +Bush Stem=Batang Semak +Bush Leaves=Daun Semak +Bush Sapling=Anak Semak +Blueberry Bush Leaves with Berries=Daun Semak Bluberi Berbuah +Blueberry Bush Leaves=Daun Semak Bluberi +Blueberry Bush Sapling=Anak Semak Bluberi +Acacia Bush Stem=Batang Semak Akasia +Acacia Bush Leaves=Daun Semak Akasia +Acacia Bush Sapling=Bibit Semak Akasia +Pine Bush Stem=Batang Semak Pinus +Pine Bush Needles=Daun Semak Pinus +Pine Bush Sapling=Bibit Semak Pinus +Kelp=Kelp +Green Coral=Koral Hijau +Pink Coral=Koral Merah Muda +Cyan Coral=Koral Sian +Brown Coral=Koral Cokelat +Orange Coral=Koral Oranye +Coral Skeleton=Kerangka Koral +Water Source=Mata Air +Flowing Water=Aliran Air +River Water Source=Mata Air Sungai +Flowing River Water=Aliran Air Sungai +Lava Source=Sumber Lava +Flowing Lava=Aliran Lava +Empty Bookshelf=Rak Buku Kosong +Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku tertulis, @2 buku kosong) +Bookshelf=Rak Buku +Text too long=Teks terlalu panjang +"@1"="@1" +Wooden Sign=Penanda Kayu +Steel Sign=Penanda Baja +Wooden Ladder=Tangga Kayu +Steel Ladder=Tangga Baja +Apple Wood Fence=Pagar Kayu Apel +Acacia Wood Fence=Pagar Akasia +Jungle Wood Fence=Pagar Kayu Rimba +Pine Wood Fence=Pagar Pinus +Aspen Wood Fence=Pagar Aspen +Apple Wood Fence Rail=Rel Pagar Kayu Apel +Acacia Wood Fence Rail=Rel Pagar Akasia +Jungle Wood Fence Rail=Rel Pagar Kayu Rimba +Pine Wood Fence Rail=Rel Pagar Pinus +Aspen Wood Fence Rail=Rel Pagar Aspen +Glass=Kaca +Obsidian Glass=Kaca Obsidian +Brick Block=Balok Bata +Mese Lamp=Lampu Mese +Apple Wood Mese Post Light=Lampu Taman Mese Kayu Apel +Acacia Wood Mese Post Light=Lampu Taman Mese Kayu Akasia +Jungle Wood Mese Post Light=Lampu Taman Mese Kayu Rimba +Pine Wood Mese Post Light=Lampu Taman Mese Kayu Pinus +Aspen Wood Mese Post Light=Lampu Taman Mese Kayu Aspen +Cloud=Awan +Wooden Pickaxe=Belencong Kayu +Stone Pickaxe=Belencong Batu +Bronze Pickaxe=Belencong Perunggu +Steel Pickaxe=Belencong Baja +Mese Pickaxe=Belencong Mese +Diamond Pickaxe=Belencong Berlian +Wooden Shovel=Sekop Kayu +Stone Shovel=Sekop Batu +Bronze Shovel=Sekop Perunggu +Steel Shovel=Sekop Baja +Mese Shovel=Sekop Mese +Diamond Shovel=Sekop Berlian +Wooden Axe=Kapak Kayu +Stone Axe=Kapak Batu +Bronze Axe=Kapak Perunggu +Steel Axe=Kapak Baja +Mese Axe=Kapak Mese +Diamond Axe=Kapak Berlian +Wooden Sword=Pedang Kayu +Stone Sword=Pedang Batu +Bronze Sword=Pedang Perunggu +Steel Sword=Pedang Baja +Mese Sword=Pedang Mese +Diamond Sword=Pedang Berlian +Torch=Obor +@1 will intersect protection on growth.=@1 akan memotong perlindungan ketika tumbuh. + + +##### not used anymore ##### + +Mese Post Light=Lampu Taman Mese diff --git a/data/games/garage/mods/default/locale/default.it.tr b/data/games/garage/mods/default/locale/default.it.tr new file mode 100644 index 0000000..3940665 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.it.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Baule chiuso a chiave +Locked Chest (owned by @1)=Baule chiuso a chiave (di proprietà di @1) +You do not own this chest.=Questo baule non ti appartiene. +a locked chest=un baule chiuso a chiave +Chest=Baule +Write= +Read= +Title:= +Contents:= +Save= +by @1= +Page @1 of @2= +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" di @2 +Blueberries=Mirtilli +Book=Libro +Book with Text=Libro con testo +Bronze Ingot=Lingotto di bronzo +Clay Brick=Mattone d'argilla +Clay Lump=Grumo d'argilla +Coal Lump=Grumo di carbone +Copper Ingot=Lingotto di rame +Copper Lump=Grumo di rame +Diamond=Diamante +Flint=Selce +Gold Ingot=Lingotto d'oro +Gold Lump=Grumo d'oro +Iron Lump=Grumo di ferro +Mese Crystal=Cristallo di mese +Mese Crystal Fragment=Frammento di cristallo di mese +Obsidian Shard=Scheggia d'ossidiana +Paper=Carta +Steel Ingot=Lingotto d'acciaio +Stick=Bastone +Tin Ingot=Lingotto di stagno +Tin Lump=Grumo di stagno +Furnace is empty=La fornace è vuota +100% (output full)=100% (uscita piena) +@1%=@1% +Not cookable=Non cucinabile +Empty=Vuota +Furnace active=Fornace attiva +Furnace inactive=Fornace inattiva +(Item: @1; Fuel: @2)=(Oggetto: @1; Combustibile: @2) +Furnace=Fornace +Stone=Pietra +Cobblestone=Ciottoli +Stone Brick=Mattone di pietra +Stone Block=Blocco di pietra +Mossy Cobblestone=Ciottoli muschiosi +Desert Stone=Pietra del deserto +Desert Cobblestone=Ciottoli del deserto +Desert Stone Brick=Mattone di pietra del deserto +Desert Stone Block=Blocco di pietra del deserto +Sandstone=Arenaria +Sandstone Brick=Mattone d'arenaria +Sandstone Block=Blocco d'arenaria +Desert Sandstone=Arenaria del deserto +Desert Sandstone Brick=Mattone d'arenaria del deserto +Desert Sandstone Block=Blocco d'arenaria del deserto +Silver Sandstone=Arenaria argentata +Silver Sandstone Brick=Mattone d'arenaria argentata +Silver Sandstone Block=Blocco d'arenaria argentata +Obsidian=Ossidiana +Obsidian Brick=Mattone d'ossidiana +Obsidian Block=Blocco d'ossidiana +Dirt=Terra +Dirt with Grass=Terra con erba +Dirt with Grass and Footsteps=Terra con erba e impronte +Dirt with Savanna Grass= +Dirt with Snow=Terra con neve +Dirt with Rainforest Litter=Terra con detriti della foresta pluviale +Dirt with Coniferous Litter=Terra con detriti di conifera +Savanna Dirt= +Savanna Dirt with Savanna Grass= +Permafrost=Permafrost +Permafrost with Stones=Permafrost con pietra +Permafrost with Moss=Permafrost con muschio +Sand=Sabbia +Desert Sand=Sabbia del deserto +Silver Sand=Sabbia argentata +Gravel=Ghiaia +Clay=Argilla +Snow=Neve +Snow Block=Blocco di neve +Ice=Ghiaccio +Cave Ice=Ghiaccio di caverna +Apple Tree=Melo +Apple Wood Planks=Assi di melo +Apple Tree Sapling=Alberello di melo +Apple Tree Leaves=Foglie di melo +Apple=Mela +Apple Marker=Marcatore mela +Jungle Tree=Albero della giungla +Jungle Wood Planks=Assi di legno della giungla +Jungle Tree Leaves=Foglie di albero della giungla +Jungle Tree Sapling=Alberello della giungla +Emergent Jungle Tree Sapling=Alberello della giungla emergente +Pine Tree=Pino +Pine Wood Planks=Assi di legno di pino +Pine Needles=Aghi di pino +Pine Tree Sapling=Alberello di pino +Acacia Tree=Acacia +Acacia Wood Planks=Assi di legno d'acacia +Acacia Tree Leaves=Foglie d'acacia +Acacia Tree Sapling=Alberello d'acacia +Aspen Tree=Pioppo +Aspen Wood Planks=Assi di legno di pioppo +Aspen Tree Leaves=Foglie di pioppo +Aspen Tree Sapling=Alberello di pioppo +Coal Ore=Minerale di carbone +Coal Block=Blocco di carbone +Iron Ore=Minerale di ferro +Steel Block=Blocco d'acciaio +Copper Ore=Minerale di rame +Copper Block=Blocco di rame +Tin Ore=Minerale di stagno +Tin Block=Blocco di stagno +Bronze Block=Blocco di bronzo +Mese Ore=Minerale di mese +Mese Block=Blocco di mese +Gold Ore=Minerale d'oro +Gold Block=Blocco d'oro +Diamond Ore=Minerale di diamante +Diamond Block=Blocco di diamante +Cactus=Cactus +Large Cactus Seedling=Piantina di cactus grande +Papyrus=Papiro +Dry Shrub=Arbusto secco +Jungle Grass=Erba della giungla +Grass=Erba +Savanna Grass= +Fern=Felce +Marram Grass=Ammofila arenaria +Bush Stem=Fusto di cespuglio +Bush Leaves=Foglie di cespuglio +Bush Sapling=Alberello di cespuglio +Blueberry Bush Leaves with Berries=Foglie di cespuglio di mirtilli con bacche +Blueberry Bush Leaves=Foglie di cespuglio di mirtilli +Blueberry Bush Sapling=Alberello di cespuglio di mirtilli +Acacia Bush Stem=Fusto di cespuglio d'acacia +Acacia Bush Leaves=Foglie di cespuglio d'acacia +Acacia Bush Sapling=Alberello di cespuglio d'acacia +Pine Bush Stem=Fusto di cespuglio di pino +Pine Bush Needles=Aghi di cespuglio di pino +Pine Bush Sapling=Alberello di cespuglio di pino +Kelp=Alga +Green Coral=Corallo verde +Pink Coral=Corallo rosa +Cyan Coral=Corallo ciano +Brown Coral=Corallo marrone +Orange Coral=Corallo arancione +Coral Skeleton=Scheletro di corallo +Water Source=Fonte d'acqua +Flowing Water=Acqua corrente +River Water Source=Fonte d'acqua di fiume +Flowing River Water=Acqua corrente di fiume +Lava Source=Fonte di lava +Flowing Lava=Lava corrente +Empty Bookshelf=Libreria vuota +Bookshelf (@1 written, @2 empty books)=Libreria (@1 scritti, @2 vuoti) +Bookshelf=Libreria +Text too long=Testo troppo lungo +"@1"= +Wooden Sign=Cartello di legno +Steel Sign=Cartello d'acciaio +Wooden Ladder=Scala a pioli di legno +Steel Ladder=Scala a pioli d'acciaio +Apple Wood Fence=Recinzione di legno di melo +Acacia Wood Fence=Recinzione di legno d'acacia +Jungle Wood Fence=Recinzione di legno della giungla +Pine Wood Fence=Recinzione di legno di pino +Aspen Wood Fence=Recinzione di legno di pioppo +Apple Wood Fence Rail=Ringhiera della recinzione di legno di melo +Acacia Wood Fence Rail=Ringhiera della recinzione di legno d'acacia +Jungle Wood Fence Rail=Ringhiera della recinzione di legno della giungla +Pine Wood Fence Rail=Ringhiera della recinzione di legno di pino +Aspen Wood Fence Rail=Ringhiera della recinzione di legno di pioppo +Glass=Vetro +Obsidian Glass=Vetro d'ossidiana +Brick Block=Blocco di mattone +Mese Lamp=Lampada di mese +Apple Wood Mese Post Light= +Acacia Wood Mese Post Light= +Jungle Wood Mese Post Light= +Pine Wood Mese Post Light= +Aspen Wood Mese Post Light= +Cloud=Nuvola +Wooden Pickaxe=Piccone di legno +Stone Pickaxe=Piccone di pietra +Bronze Pickaxe=Piccone di bronzo +Steel Pickaxe=Piccone d'acciaio +Mese Pickaxe=Piccone di mese +Diamond Pickaxe=Piccone di diamante +Wooden Shovel=Pala di legno +Stone Shovel=Pala di pietra +Bronze Shovel=Pala di bronzo +Steel Shovel=Pala d'acciaio +Mese Shovel=Pala di mese +Diamond Shovel=Pala di diamante +Wooden Axe=Ascia di legno +Stone Axe=Ascia di pietra +Bronze Axe=Ascia di bronzo +Steel Axe=Ascia d'acciaio +Mese Axe=Ascia di mese +Diamond Axe=Ascia di diamante +Wooden Sword=Spada di legno +Stone Sword=Spada di pietra +Bronze Sword=Spada di bronzo +Steel Sword=Spada d'acciaio +Mese Sword=Spada di mese +Diamond Sword=Spada di diamante +Torch=Torcia +@1 will intersect protection on growth.=@1 crescendo attraverserà la protezione. + + +##### not used anymore ##### + +Dirt with Dry Grass=Terra con erba secca +Dry Dirt=Terra asciutta +Dry Dirt with Dry Grass=Terra asciutta con erba secca +Dry Grass=Erba secca +Mese Post Light=Lampioncino di mese diff --git a/data/games/garage/mods/default/locale/default.ja.tr b/data/games/garage/mods/default/locale/default.ja.tr new file mode 100644 index 0000000..cf30e45 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.ja.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=鍵のかかったチェスト +Locked Chest (owned by @1)=鍵のかかったチェスト(@1所有) +You do not own this chest.=あなたはこのチェストの所有者ではありません。 +a locked chest=ロックされたチェスト +Chest=チェスト +Write=書き込む +Read=読む +Title:=題名 +Contents:=内容 +Save=保存 +by @1=@1著 +Page @1 of @2=@1 / @2 ページ +The book you were writing to mysteriously disappeared.=あなたが書いていた本が、不思議なことに消えました。 +"@1" by @2=@2著「@1」 +Blueberries=ブルーベリー +Book=本 +Book with Text=記入済みの本 +Bronze Ingot=青銅インゴット +Clay Brick=粘土レンガ +Clay Lump=粘土玉 +Coal Lump=石炭 +Copper Ingot=銅インゴット +Copper Lump=銅の粗鉱 +Diamond=ダイヤモンド +Flint=火打ち石 +Gold Ingot=金インゴット +Gold Lump=金の粗鉱 +Iron Lump=鉄の粗鉱 +Mese Crystal=メセクリスタル +Mese Crystal Fragment=メセクリスタルの破片 +Obsidian Shard=黒曜石の欠片 +Paper=紙 +Steel Ingot=鉄インゴット +Stick=棒 +Tin Ingot=スズインゴット +Tin Lump=スズの粗鉱 +Furnace is empty=かまどは空です +100% (output full)=100%(フル出力) +@1%=@1% +Not cookable=調理できません +Empty=空 +Furnace active=かまどは燃えてます +Furnace inactive=かまどは消えています +(Item: @1; Fuel: @2)=(アイテム: @1; 燃料: @2) +Furnace=かまど +Stone=石 +Cobblestone=丸石 +Stone Brick=石レンガ +Stone Block=石ブロック +Mossy Cobblestone=苔むした丸石 +Desert Stone=砂漠の石 +Desert Cobblestone=砂漠の丸石 +Desert Stone Brick=砂漠の石レンガ +Desert Stone Block=砂漠の石ブロック +Sandstone=砂岩 +Sandstone Brick=砂岩レンガ +Sandstone Block=砂岩ブロック +Desert Sandstone=砂漠の砂岩 +Desert Sandstone Brick=砂漠の砂岩レンガ +Desert Sandstone Block=砂漠の砂岩ブロック +Silver Sandstone=銀色の砂岩 +Silver Sandstone Brick=銀色の砂岩レンガ +Silver Sandstone Block=銀色の砂岩ブロック +Obsidian=黒曜石 +Obsidian Brick=黒曜石レンガ +Obsidian Block=黒曜石ブロック +Dirt=土 +Dirt with Grass=草に覆われた土 +Dirt with Grass and Footsteps=足跡と草に覆われた土 +Dirt with Savanna Grass=サバンナの草に覆われた土 +Dirt with Snow=雪に覆われた土 +Dirt with Rainforest Litter=熱帯雨林の落葉に覆われた土 +Dirt with Coniferous Litter=針葉樹の落葉に覆われた土 +Savanna Dirt=サバンナの土 +Savanna Dirt with Savanna Grass=サバンナの草に覆われたサバンナの土 +Permafrost=永久凍土 +Permafrost with Stones=石に覆われた永久凍土 +Permafrost with Moss=苔に覆われた永久凍土 +Sand=砂 +Desert Sand=砂漠の砂 +Silver Sand=銀色の砂 +Gravel=砂利 +Clay=粘土 +Snow=雪 +Snow Block=雪ブロック +Ice=氷 +Cave Ice=洞窟の氷 +Apple Tree=リンゴの原木 +Apple Wood Planks=リンゴの木の板材 +Apple Tree Sapling=リンゴの木の苗木 +Apple Tree Leaves=リンゴの木の葉 +Apple=リンゴ +Apple Marker=リンゴのマーカー +Jungle Tree=ジャングルの原木 +Jungle Wood Planks=ジャングルの木の板材 +Jungle Tree Leaves=ジャングルの木の葉 +Jungle Tree Sapling=ジャングルの木の苗木 +Emergent Jungle Tree Sapling=ジャングルの超高木の苗木 +Pine Tree=マツの原木 +Pine Wood Planks=マツの木の板材 +Pine Needles=マツの木の葉 +Pine Tree Sapling=マツの木の苗木 +Acacia Tree=アカシアの原木 +Acacia Wood Planks=アカシアの木の板材 +Acacia Tree Leaves=アカシアの木の葉 +Acacia Tree Sapling=アカシアの木の苗木 +Aspen Tree=ポプラの原木 +Aspen Wood Planks=ポプラの木の板材 +Aspen Tree Leaves=ポプラの木の葉 +Aspen Tree Sapling=ポプラの木の苗木 +Coal Ore=石炭鉱石 +Coal Block=石炭ブロック +Iron Ore=鉄鉱石 +Steel Block=鉄ブロック +Copper Ore=銅鉱石 +Copper Block=銅ブロック +Tin Ore=スズ鉱石 +Tin Block=スズブロック +Bronze Block=青銅ブロック +Mese Ore=メセ鉱石 +Mese Block=メセブロック +Gold Ore=金鉱石 +Gold Block=金ブロック +Diamond Ore=ダイヤモンド鉱石 +Diamond Block=ダイヤモンドブロック +Cactus=サボテン +Large Cactus Seedling=大きなサボテンの苗 +Papyrus=パピルス +Dry Shrub=枯れた低木 +Jungle Grass=ジャングルの草 +Grass=草 +Savanna Grass=サバンナの草 +Fern=シダ +Marram Grass=マラムの草 +Bush Stem=低木の幹 +Bush Leaves=低木の葉 +Bush Sapling=低木の苗木 +Blueberry Bush Leaves with Berries=ブルーベリーの実った低木 +Blueberry Bush Leaves=ブルーベリーの低木の葉 +Blueberry Bush Sapling=ブルーベリーの低木の苗木 +Acacia Bush Stem=アカシアの低木の幹 +Acacia Bush Leaves=アカシアの低木の葉 +Acacia Bush Sapling=アカシアの低木の苗木 +Pine Bush Stem=マツの低木の幹 +Pine Bush Needles=マツの低木の葉 +Pine Bush Sapling=マツの低木の苗木 +Kelp=コンブ +Green Coral=緑色のサンゴ +Pink Coral=桃色のサンゴ +Cyan Coral=青緑色のサンゴ +Brown Coral=茶色のサンゴ +Orange Coral=橙色のサンゴ +Coral Skeleton=サンゴのしがい +Water Source=水源 +Flowing Water=流れる水 +River Water Source=河川水源 +Flowing River Water=流れる河川水 +Lava Source=溶岩 +Flowing Lava=流れる溶岩 +Empty Bookshelf=空の本棚 +Bookshelf (@1 written, @2 empty books)=本棚(記述済み @1 冊, 未記述 @2 冊) +Bookshelf=本棚 +Text too long=テキストが長すぎます +"@1"=「@1」 +Wooden Sign=木製の看板 +Steel Sign=鉄の看板 +Wooden Ladder=木製のはしご +Steel Ladder=鉄のはしご +Apple Wood Fence=リンゴ材のフェンス +Acacia Wood Fence=アカシア材のフェンス +Jungle Wood Fence=ジャングル材のフェンス +Pine Wood Fence=マツ材のフェンス +Aspen Wood Fence=ポプラ材のフェンス +Apple Wood Fence Rail=リンゴ材のフェンスレール +Acacia Wood Fence Rail=アカシア材のフェンスレール +Jungle Wood Fence Rail=ジャングル材のフェンスレール +Pine Wood Fence Rail=マツ材のフェンスレール +Aspen Wood Fence Rail=ポプラ材のフェンスレール +Glass=ガラス +Obsidian Glass=黒曜石ガラス +Brick Block=レンガブロック +Mese Lamp=メセのランプ +Apple Wood Mese Post Light=リンゴ材のメセ灯柱 +Acacia Wood Mese Post Light=アカシア材のメセ灯柱 +Jungle Wood Mese Post Light=ジャングル材のメセ灯柱 +Pine Wood Mese Post Light=マツ材のメセ灯柱 +Aspen Wood Mese Post Light=ポプラ材のメセ灯柱 +Cloud=雲 +Wooden Pickaxe=木製のツルハシ +Stone Pickaxe=石のツルハシ +Bronze Pickaxe=青銅のツルハシ +Steel Pickaxe=鉄のツルハシ +Mese Pickaxe=メセのツルハシ +Diamond Pickaxe=ダイヤモンドのツルハシ +Wooden Shovel=木製のシャベル +Stone Shovel=石のシャベル +Bronze Shovel=青銅のシャベル +Steel Shovel=鉄のシャベル +Mese Shovel=メセのシャベル +Diamond Shovel=ダイヤモンドのシャベル +Wooden Axe=木製の斧 +Stone Axe=石の斧 +Bronze Axe=青銅の斧 +Steel Axe=鉄の斧 +Mese Axe=メセの斧 +Diamond Axe=ダイヤモンドの斧 +Wooden Sword=木製の剣 +Stone Sword=石の剣 +Bronze Sword=青銅の剣 +Steel Sword=鉄の剣 +Mese Sword=メセの剣 +Diamond Sword=ダイヤモンドの剣 +Torch=松明 +@1 will intersect protection on growth.=@1は成長するとき保護と交差します。 diff --git a/data/games/garage/mods/default/locale/default.jbo.tr b/data/games/garage/mods/default/locale/default.jbo.tr new file mode 100644 index 0000000..5ae9722 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.jbo.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=lo selstela gairvau +Locked Chest (owned by @1)=.i ti selstela gairvau po la'o zo'i.@1.zo'i +You do not own this chest.=.i do na ponse lo ti gairvau +a locked chest=lo selstela gairvau +Chest=lo gairvau +Write=ciska +Read=tcidu +Title:=cmene +Contents:=se cukta +Save=rejgau +by @1=la'o zo'i.@1.zo'i te cukta +Page @1 of @2=meirmoi fe li @1 li @2 +The book you were writing to mysteriously disappeared.=lo cukta poi do ciska ke'a cu cizra canci +"@1" by @2=lo cukta be la'o gy.@1.gy. bei la'o zo'i.@2.zo'i +Blueberries=lo blajba +Book=lo cukta +Book with Text=lo cukta joi selci'a +Bronze Ingot=lo ransu manfybli +Clay Brick=lo kitybli +Clay Lump=lo kliti bakfu +Coal Lump=lo kolme bakfu +Copper Ingot=lo tunka manfybli +Copper Lump=lo tunka bakfu +Diamond=lo tabjme +Flint=lo fagyro'i +Gold Ingot=lo solji manfybli +Gold Lump=lo solji bakfu +Iron Lump=lo tirse bakfu +Mese Crystal=lo za'e krilrmese +Mese Crystal Fragment=lo za'e krilrmese spisa +Obsidian Shard=lo je'erma'ablaci spisa +Paper=lo pelji +Steel Ingot=lo gasta manfybli +Stick=lo grana +Tin Ingot=lo tinci manfybli +Tin Lump=lo tinci bakfu +Furnace is empty=.i lo toknu cu kunti +100% (output full)=100 ce'i to lo se zbasu cu culno toi +@1%=@1 ce'i +Not cookable=na kakne le ka se jukpa +Empty=ti kunti +Furnace active=.i lo toknu cu tolcando +Furnace inactive=.i lo toknu cu cando +(Item: @1; Fuel: @2)=to jukpa @1 @2 +Furnace=lo toknu +Stone=lo rokci +Cobblestone=lo lolro'iboi +Stone Brick=lo morna rokci +Stone Block=lo rokci bliku +Mossy Cobblestone=lo clika lolro'iboi +Desert Stone=lo cantu'a rokci +Desert Cobblestone=lo cantu'a lolro'iboi +Desert Stone Brick=lo morna ke cantu'a rokci +Desert Stone Block=lo cantu'a rokci bliku +Sandstone=lo canro'i +Sandstone Brick=lo morna canro'i +Sandstone Block=lo canro'i bliku +Desert Sandstone=lo cantu'a canro'i +Desert Sandstone Brick=lo morna ke cantu'a canro'i +Desert Sandstone Block=lo cantu'a canro'i bliku +Silver Sandstone=lo rijyska canro'i +Silver Sandstone Brick=lo morna ke rijyska canro'i +Silver Sandstone Block=lo rijyska canro'i bliku +Obsidian=lo je'erma'ablaci +Obsidian Brick=lo morna je'erma'ablaci +Obsidian Block=lo je'erma'ablaci bliku +Dirt=lo dertu +Dirt with Grass=lo dertu joi srasu +Dirt with Grass and Footsteps=lo dertu joi srasu jebo stapa bo prina +Dirt with Savanna Grass=lo dertu joi sudytu'a bo srasu +Dirt with Snow=lo dertu joi snime +Dirt with Rainforest Litter=lo dertu joi glatimdemricfoi bo festi +Dirt with Coniferous Litter=lo dertu joi ckunu bo festi +Savanna Dirt=lo sudytu'a dertu +Savanna Dirt with Savanna Grass=lo sudysu'a bo dertu joi sudytu'a bo srasu +Permafrost=lo vi'orbisloi +Permafrost with Stones=lo vi'orbisloi joi rokci +Permafrost with Moss=lo vi'orbisloi joi clika +Sand=lo canre +Desert Sand=lo cantu'a canre +Silver Sand=lo rijyska canre +Gravel=lo cmaro'i +Clay=lo kliti +Snow=lo snime +Snow Block=lo snime bliku +Ice=lo bisli +Cave Ice=lo kevzda bisli +Apple Tree=lo plisytricu ricystani +Apple Wood Planks=lo plisymudri tanbo +Apple Tree Sapling=lo plisytricu ciftricu +Apple Tree Leaves=lo plisytricu pezli +Apple=lo plise +Apple Marker=lo plise barna +Jungle Tree=lo glatimdemricfoi ricystani +Jungle Wood Planks=lo glatimdemricfoi mudri tanbo +Jungle Tree Leaves=lo glatimdemricfoi pezli +Jungle Tree Sapling=lo glatimdemricfoi ciftricu +Emergent Jungle Tree Sapling=lo barda ke glatimdemricfoi ciftricu +Pine Tree=lo ckunu ricystani +Pine Wood Planks=lo ku'urmudri tanbo +Pine Needles=lo ckunu jezpezli +Pine Tree Sapling=lo ckunu ciftricu +Acacia Tree=lo atkaci,ia ricystani +Acacia Wood Planks=lo atkaci,ia mudri tanbo +Acacia Tree Leaves=lo atkaci,ia pezli +Acacia Tree Sapling=lo atkaci,ia ciftricu +Aspen Tree=lo ricrpopulu ricystani +Aspen Wood Planks=lo mudrpopulu tanbo +Aspen Tree Leaves=lo ricrpopulu pezli +Aspen Tree Sapling=lo ricrpopulu ciftricu +Coal Ore=lo kolme kunra +Coal Block=lo kolme bliku +Iron Ore=lo tirse kunra +Steel Block=lo gasta bliku +Copper Ore=lo tunka kunra +Copper Block=lo tunka bliku +Tin Ore=lo tinci kunra +Tin Block=lo tinci bliku +Bronze Block=lo ransu bliku +Mese Ore=lo za'e kunrmese +Mese Block=lo za'e blikrmese +Gold Ore=lo solji kunra +Gold Block=lo solji bliku +Diamond Ore=lo tabjme kunra +Diamond Block=lo tabjme bliku +Cactus=lo jesyspa +Large Cactus Seedling=lo barda ke jesyspa tsiju +Papyrus=lo misryplespa +Dry Shrub=lo sudga dzitricu +Jungle Grass=lo glatimdemricfoi srasu +Grass=lo srasu +Savanna Grass=lo sudytu'a srasu +Fern=lo filcina +Marram Grass=lo xaskoi srasu +Bush Stem=lo dzitricu stani +Bush Leaves=lo dzitricu pezli +Bush Sapling=lo dzitricu ciftricu +Blueberry Bush Leaves with Berries=lo ke blajba dzitricu pezli ke'e joi jbari +Blueberry Bush Leaves=lo blajba dzitricu pezli +Blueberry Bush Sapling=lo blajba dzitrcu ciftricu +Acacia Bush Stem=lo atkaci,ia dzitricu stani +Acacia Bush Leaves=lo atkaci,ia dzitricu pezli +Acacia Bush Sapling=lo atkaci,ia dzitricu ciftricu +Pine Bush Stem=lo ckunu dzitricu stani +Pine Bush Needles=lo ckunu dzitricu jezpezli +Pine Bush Sapling=lo ckunu dzitricu ciftricu +Kelp=lo vraike +Green Coral=lo crino pevypanje +Pink Coral=lo xunblabi pevypanje +Cyan Coral=lo cicna pevypanje +Brown Coral=lo bunre pevypanje +Orange Coral=lo narju pevypanje +Coral Skeleton=lo pevypanje greku +Water Source=lo djacu velflecu +Flowing Water=lo flecu djacu +River Water Source=lo rirxe djacu velflecu +Flowing River Water=lo flecu ke rirxe djacu +Lava Source=lo likro'i velflecu +Flowing Lava=lo flecu likro'i +Empty Bookshelf=.i ti kunti ckukajna +Bookshelf (@1 written, @2 empty books)=.i ti ckukajna to @1 cukta joi selci'a .ije @2 kunti cukta toi +Bookshelf=lo ckukajna +Text too long=.i lo lerpoi cu dukse lo ka clani +"@1"=zoi sy.@1.sy. +Wooden Sign=lo mudri sinxa +Steel Sign=lo gasta sinxa +Wooden Ladder=lo mudri rajyserti +Steel Ladder=lo gasta rajyserti +Apple Wood Fence=lo plisymudri garbi'u +Acacia Wood Fence=lo atkaci,ia mudri garbi'u +Jungle Wood Fence=lo glatimdemricfoi mudri garbi'u +Pine Wood Fence=lo ku'urmudri garbi'u +Aspen Wood Fence=lo mudrpopulu garbi'u +Apple Wood Fence Rail=lo plisymudri garbi'u garna +Acacia Wood Fence Rail=lo atkaci,ia mudri garbi'u garna +Jungle Wood Fence Rail=lo glatimdemricfoi mudri garbi'u garna +Pine Wood Fence Rail=lo ku'urmudri garbi'u garna +Aspen Wood Fence Rail=lo mudrpopulu garbi'u garna +Glass=lo blaci +Obsidian Glass=lo je'erma'ablaci blaci +Brick Block=lo kitybli bliku +Mese Lamp=lo za'e gusrmese +Apple Wood Mese Post Light=lo plisymudri ke kamju za'e gusrmese +Acacia Wood Mese Post Light=lo atkaci,ia mudri ke kamju za'e gusrmese +Jungle Wood Mese Post Light=lo glatimdemricfoi mudri ke kamju za'e gusrmese +Pine Wood Mese Post Light=lo ku'urmudri ke kamju za'e gusrmese +Aspen Wood Mese Post Light=lo mudrpopulu ke kamju za'e gusrmese +Cloud=lo dilnu +Wooden Pickaxe=lo mudri velkakpymru +Stone Pickaxe=lo rokci velkakpymru +Bronze Pickaxe=lo ransu velkakpymru +Steel Pickaxe=lo gasta velkakpymru +Mese Pickaxe=lo za'e kunrmese velkakpymru +Diamond Pickaxe=lo tabjme velkakpymru +Wooden Shovel=lo mudri canpa +Stone Shovel=lo rokci canpa +Bronze Shovel=lo ransu canpa +Steel Shovel=lo gasta canpa +Mese Shovel=lo za'e kunrmese canpa +Diamond Shovel=lo tabjme canpa +Wooden Axe=lo mudri ka'amru +Stone Axe=lo rokci ka'amru +Bronze Axe=lo ransu ka'amru +Steel Axe=lo gasta ka'amru +Mese Axe=lo za'e kunrmese ka'amru +Diamond Axe=lo tabjme ka'amru +Wooden Sword=lo mudri cladakyxa'i +Stone Sword=lo rokci cladakyxa'i +Bronze Sword=lo ransu cladakyxa'i +Steel Sword=lo gasta cladakyxa'i +Mese Sword=lo za'e kunrmese cladakyxa'i +Diamond Sword=lo tabjme cladakyxa'i +Torch=lo fagytergu'i +@1 will intersect protection on growth.=.i @1 cu ba kruca lo bandu ca lo nu banro diff --git a/data/games/garage/mods/default/locale/default.lv.tr b/data/games/garage/mods/default/locale/default.lv.tr new file mode 100644 index 0000000..b0a1de0 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.lv.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Aizslēgta lāde +Locked Chest (owned by @1)=Aizslēgta lāde (Saimnieks: @1) +You do not own this chest.=Jums nepieder šī lāde. +a locked chest=aizslēgta lāde +Chest=Lāde +Write=Rakstīt +Read=Lasīt +Title:=Virsraksts: +Contents:=Saturs: +Save=Saglabāt +by @1=autors @1 +Page @1 of @2=@1 lappuse no @2 +The book you were writing to mysteriously disappeared.=Grāmata, kuru rakstījāt, pēkšņi pazuda. +"@1" by @2="@1" @2 +Blueberries=Mellenes +Book=Grāmata +Book with Text=Grāmata ar tekstu +Bronze Ingot=Bronzas stienis +Clay Brick=Māla ķieģelis +Clay Lump=Māla pika +Coal Lump=Ogle +Copper Ingot=Vara stienis +Copper Lump=Vara rūdas gabals +Diamond=Dimants +Flint=Krams +Gold Ingot=Zelta stienis +Gold Lump=Zelta rūdas gabals +Iron Lump=Dzelzs rūdas gabals +Mese Crystal=Mēzes kristāls +Mese Crystal Fragment=Mēzes kristāla fragments +Obsidian Shard=Obsidiāna skaida +Paper=Papīrs +Steel Ingot=Tērauda stienis +Stick=Puļķis +Tin Ingot=Alvas stienis +Tin Lump=Alvas rūdas gabals +Furnace is empty=Krāsns ir tukša +100% (output full)=100% (izeja pilna) +@1%=@1% +Not cookable=Nav gatavojams +Empty=Tukšs +Furnace active=Krāsns kurās +Furnace inactive=Krāsns nekurās +(Item: @1; Fuel: @2)=(Priekšmets: @1; Degviela: @2) +Furnace=Krāsns +Stone=Akmens +Cobblestone=Mūrakmens +Stone Brick=Akmens ķieģeļi +Stone Block=Akmens bloks +Mossy Cobblestone=Apsūnojis mūrakmens +Desert Stone=Tuksneša akmens +Desert Cobblestone=Tuksneša mūrakmens +Desert Stone Brick=Tuksneša akmens ķieģeļi +Desert Stone Block=Tuksneša akmens bloks +Sandstone=Smilšakmens +Sandstone Brick=Smilšakmens ķieģeļi +Sandstone Block=Smilšakmens bloks +Desert Sandstone=Tuksnesa smilšakmens +Desert Sandstone Brick=Tuksneša smilšakmens ķieģeļi +Desert Sandstone Block=Tuksneša smilšakmens bloks +Silver Sandstone=Baltais smilšakmens +Silver Sandstone Brick=Baltā smilšakmens ķieģeļi +Silver Sandstone Block=Baltā smilšakmens bloks +Obsidian=Obsidiāns +Obsidian Brick=Obsidiāna ķieģeļi +Obsidian Block=Obsidiāna bloks +Dirt=Zeme +Dirt with Grass=Zeme ar zāli +Dirt with Grass and Footsteps=Pēdaina zeme ar zāli +Dirt with Savanna Grass=Zeme ar savannas zāli +Dirt with Snow=Zeme ar sniegu +Dirt with Rainforest Litter=Zeme ar lietusmeža zemsedzi +Dirt with Coniferous Litter=Zeme ar skujām +Savanna Dirt=Savannas zeme +Savanna Dirt with Savanna Grass=Savannas zeme ar savannas zāli +Permafrost=Mūžīgais sasalums +Permafrost with Stones=Mūžīgais sasalums ar akmentiņiem +Permafrost with Moss=Mūžīgais sasalums ar sūnām +Sand=Smilts +Desert Sand=Tuksneša smilts +Silver Sand=Baltā smilts +Gravel=Grants +Clay=Māla bloks +Snow=Sniegs +Snow Block=Sniega bloks +Ice=Ledus +Cave Ice=Alu ledus +Apple Tree=Ābele +Apple Wood Planks=Ābolkoka dēļi +Apple Tree Sapling=Ābeles dzinums +Apple Tree Leaves=Ābeles lapas +Apple=Ābols +Apple Marker=Ābola marķieris +Jungle Tree=Džungļu koks +Jungle Wood Planks=Džungļu koka dēļi +Jungle Tree Leaves=Džungļu koka lapas +Jungle Tree Sapling=Džungļu koka dzinums +Emergent Jungle Tree Sapling=Augsta džungļu koka dzinums +Pine Tree=Skujkoks +Pine Wood Planks=Skujkoka dēļi +Pine Needles=Skujas +Pine Tree Sapling=Skujkoka dzinums +Acacia Tree=Akācija +Acacia Wood Planks=Akācijas dēļi +Acacia Tree Leaves=Akācijas lapas +Acacia Tree Sapling=Akācijas dzinums +Aspen Tree=Apse +Aspen Wood Planks=Apses koka dēļi +Aspen Tree Leaves=Apses lapas +Aspen Tree Sapling=Apses dzinums +Coal Ore=Akmeņogļu rūda +Coal Block=Akmeņogļu bloks +Iron Ore=Dzelzs rūda +Steel Block=Tērauda bloks +Copper Ore=Vara rūda +Copper Block=Vara bloks +Tin Ore=Alvas rūda +Tin Block=Alvas bloks +Bronze Block=Bronzas bloks +Mese Ore=Mēzes rūda +Mese Block=Mēzes bloks +Gold Ore=Zelta rūda +Gold Block=Zelta bloks +Diamond Ore=Dimanta rūda +Diamond Block=Dimanta bloks +Cactus=Kaktuss +Large Cactus Seedling=Liela kaktusa dzinums +Papyrus=Papiruss +Dry Shrub=Izžuvis krūmiņš +Jungle Grass=Džungļu zāle +Grass=Zāle +Savanna Grass=Savannas zāle +Fern=Paparde +Marram Grass=Kāpu niedre +Bush Stem=Krūma stumbrājs +Bush Leaves=Krūma lapas +Bush Sapling=Krūma dzinums +Blueberry Bush Leaves with Berries=Melleņu krūms ar ogām +Blueberry Bush Leaves=Melleņu krūms +Blueberry Bush Sapling=Melleņu krūma dzinums +Acacia Bush Stem=Akācijas krūma stumbrājs +Acacia Bush Leaves=Akācijas krūma lapas +Acacia Bush Sapling=Akācijas krūma dzinums +Pine Bush Stem=Skujaina krūma stumbrājs +Pine Bush Needles=Skujaina krūma lapas +Pine Bush Sapling=Skujaina krūma dzinums +Kelp=Brūnaļģes +Green Coral=Zaļš korallis +Pink Coral=Rozā korallis +Cyan Coral=Ciānkrāsas korallis +Brown Coral=Brūns korallis +Orange Coral=Oranžs korallis +Coral Skeleton=Koraļļa skelets +Water Source=Ūdens avots +Flowing Water=Plūstošs ūdens +River Water Source=Upes ūdens avots +Flowing River Water=Tekošs upes ūdens +Lava Source=Lavas avots +Flowing Lava=Plūstoša lava +Empty Bookshelf=Tukss grāmatplaukts +Bookshelf (@1 written, @2 empty books)=Grāmatplauktā (@1 rakstītas, @2 tukšas grāmatas) +Bookshelf=Grāmatplaukts +Text too long=Teksts par garu +"@1"="@1" +Wooden Sign=Koka zīme +Steel Sign=Tērauda zīme +Wooden Ladder=Koka kāpnes +Steel Ladder=Tērauda kāpnes +Apple Wood Fence=Ābolkoka žogs +Acacia Wood Fence=Akācijas žogs +Jungle Wood Fence=Džungļu koka žogs +Pine Wood Fence=Skujkoka žogs +Aspen Wood Fence=Apses koka žogs +Apple Wood Fence Rail=Ābolkoka žoga margas +Acacia Wood Fence Rail=Akācijas žoga margas +Jungle Wood Fence Rail=Džungļu koka žoga margas +Pine Wood Fence Rail=Skujkoka žoga margas +Aspen Wood Fence Rail=Apses žoga margas +Glass=Stikls +Obsidian Glass=Obsidiāna stikls +Brick Block=Ķieģeļu bloks +Mese Lamp=Mēzes lampa +Apple Wood Mese Post Light=Ābolkoka mēzes lampa +Acacia Wood Mese Post Light=Akācijas mēzes lampa +Jungle Wood Mese Post Light=Džungļu koka mēzes lampa +Pine Wood Mese Post Light=Skujkoka mēzes lampa +Aspen Wood Mese Post Light=Apses koka mēzes lampa +Cloud=Mākonis +Wooden Pickaxe=Koka cērte +Stone Pickaxe=Akmens cērte +Bronze Pickaxe=Bronzas cērte +Steel Pickaxe=Tērauda cērte +Mese Pickaxe=Mēzes cērte +Diamond Pickaxe=Dimanta cērte +Wooden Shovel=Koka lāpsta +Stone Shovel=Akmens lāpsta +Bronze Shovel=Bronzas lāpsta +Steel Shovel=Tērauda lāpsta +Mese Shovel=Mēzes lāpsta +Diamond Shovel=Dimanta lāpsta +Wooden Axe=Koka cirvis +Stone Axe=Akmens cirvis +Bronze Axe=Bronzas cirvis +Steel Axe=Tērauda cirvis +Mese Axe=Mēzes cirvis +Diamond Axe=Dimanta cirvis +Wooden Sword=Koka zobens +Stone Sword=Akmens zobens +Bronze Sword=Bronzas zobens +Steel Sword=Tērauda zobens +Mese Sword=Mēzes zobens +Diamond Sword=Dimanta zobens +Torch=Lāpa +@1 will intersect protection on growth.=@1 augot krustos aisargājamo zonu. diff --git a/data/games/garage/mods/default/locale/default.ms.tr b/data/games/garage/mods/default/locale/default.ms.tr new file mode 100644 index 0000000..0395afa --- /dev/null +++ b/data/games/garage/mods/default/locale/default.ms.tr @@ -0,0 +1,224 @@ +# textdomain: default +Locked Chest=Peti Berkunci +Locked Chest (owned by @1)=Peti Berkunci (milik @1) +You do not own this chest.=Ini bukan peti milik anda. +a locked chest=peti berkunci +Chest=Peti +Write=Tulis +Read=Baca +Title:=Tajuk: +Contents:=Kandungan: +Save=Simpan +by @1=oleh @1 +Page @1 of @2=Halaman @1 daripada @2 +The book you were writing to mysteriously disappeared.=Buku yang anda tulis hilang secara misterinya. +"@1" by @2="@1" oleh @2 +Blueberries=Beri Biru +Book=Buku +Book with Text=Buku Bertulisan +Bronze Ingot=Jongkong Gangsa +Clay Brick=Bata Tanah Liat +Clay Lump=Longgokan Tanah Liat +Coal Lump=Longgokan Batu Arang +Copper Ingot=Jongkong Tembaga +Copper Lump=Longgokan Tembaga +Diamond=Berlian +Flint=Batu Api +Gold Ingot=Jongkong Emas +Gold Lump=Longgokan Emas +Iron Lump=Longgokan Besi +Mese Crystal=Kristal Mese +Mese Crystal Fragment=Serpihan Kristal Mese +Obsidian Shard=Serpihan Obsidia +Paper=Kertas +Steel Ingot=Jongkong Keluli +Stick=Serpihan Kayu +Tin Ingot=Jongkong Timah +Tin Lump=Longgokan Timah +Furnace is empty=Relau masih kosong +100% (output full)=100% (keluaran penuh) +@1%=@1% +Not cookable=Tidak boleh dimasak +Empty=Kosong +Furnace active=Relau aktif +Furnace inactive=Relau tidak aktif +(Item: @1; Fuel: @2)=(Item: @1; Bahan api: @2) +Furnace=Relau +Stone=Batu +Cobblestone=Batu Buntar +Stone Brick=Bata Batu +Stone Block=Bongkah Batu +Mossy Cobblestone=Batu Buntar Berlumut +Desert Stone=Batu Gurun +Desert Cobblestone=Batu Buntar Gurun +Desert Stone Brick=Bata Batu Gurun +Desert Stone Block=Bongkah Batu Gurun +Sandstone=Batu Pasir +Sandstone Brick=Bata Batu Pasir +Sandstone Block=Bongkah Batu Pasir +Desert Sandstone=Batu Pasir Gurun +Desert Sandstone Brick=Bata Batu Pasir Gurun +Desert Sandstone Block=Bongkah Batu Pasir Gurun +Silver Sandstone=Batu Pasir Perak +Silver Sandstone Brick=Bata Batu Pasir Perak +Silver Sandstone Block=Bongkah Batu Pasir Perak +Obsidian=Obsidia +Obsidian Brick=Bata Obsidia +Obsidian Block=Bongkah Obsidia +Dirt=Tanah +Dirt with Grass=Tanah Berumput +Dirt with Grass and Footsteps=Tanah Berumput dan Tapak Kaki +Dirt with Savanna Grass=Tanah Berumput Savana +Dirt with Snow=Tanah Bersalji +Dirt with Rainforest Litter=Tanah Bersarap Hutan Hujan +Dirt with Coniferous Litter=Tanah Bersarap Hutan Konifer +Savanna Dirt=Tanah Savana +Savanna Dirt with Savanna Grass=Tanah Savana Berumput Savana +Permafrost=Ibun Abadi +Permafrost with Stones=Ibun Abadi Berbatu +Permafrost with Moss=Ibun Abadi Berlumut +Sand=Pasir +Desert Sand=Pasir Gurun +Silver Sand=Pasir Perak +Gravel=Kelikir +Clay=Tanah Liat +Snow=Salji +Snow Block=Bongkah Salji +Ice=Ais +Cave Ice=Ais Gua +Apple Tree=Kayu Pokok Epal +Apple Wood Planks=Papan Kayu Epal +Apple Tree Sapling=Anak Pokok Epal +Apple Tree Leaves=Daun Pokok Epal +Apple=Epal +Apple Marker=Penanda Epal +Jungle Tree=Kayu Pokok Hutan +Jungle Wood Planks=Papan Kayu Hutan +Jungle Tree Leaves=Daun Pokok Hutan +Jungle Tree Sapling=Anak Pokok Hutan +Emergent Jungle Tree Sapling=Anak Pokok Hutan Kembang +Pine Tree=Kayu Pokok Pain +Pine Wood Planks=Papan Kayu Pain +Pine Needles=Daun Pokok Pain +Pine Tree Sapling=Anak Pokok Pain +Acacia Tree=Kayu Pokok Akasia +Acacia Wood Planks=Papan Kayu Akasia +Acacia Tree Leaves=Daun Pokok Akasia +Acacia Tree Sapling=Anak Pokok Akasia +Aspen Tree=Kayu Pokok Aspen +Aspen Wood Planks=Papan Kayu Aspen +Aspen Tree Leaves=Daun Pokok Aspen +Aspen Tree Sapling=Anak Pokok Aspen +Coal Ore=Bijih Batu Arang +Coal Block=Bongkah Batu Arang +Iron Ore=Bijih Besi +Steel Block=Bongkah Keluli +Copper Ore=Bijih Tembaga +Copper Block=Bongkah Tembaga +Tin Ore=Bijih Timah +Tin Block=Bongkah Timah +Bronze Block=Bongkah Gangsa +Mese Ore=Bijih Mese +Mese Block=Bongkah Mese +Gold Ore=Bijih Emas +Gold Block=Bongkah Emas +Diamond Ore=Bijih Intan +Diamond Block=Bongkah Intan +Cactus=Kaktus +Large Cactus Seedling=Benih Kaktus Besar +Papyrus=Papirus +Dry Shrub=Pokok Renek Kering +Jungle Grass=Rumput Hutan +Grass=Rumput +Savanna Grass=Rumput Savana +Fern=Paku Pakis +Marram Grass=Rumput Maram +Bush Stem=Batang Belukar +Bush Leaves=Daun Belukar +Bush Sapling=Anak Belukar +Blueberry Bush Leaves with Berries=Daun Belukar Beri Biru Berberi +Blueberry Bush Leaves=Daun Belukar Beri Biru +Blueberry Bush Sapling=Anak Belukar Beri Biru +Acacia Bush Stem=Batang Belukar Akasia +Acacia Bush Leaves=Daun Belukar Akasia +Acacia Bush Sapling=Anak Belukar Akasia +Pine Bush Stem=Batang Belukar Pain +Pine Bush Needles=Daun Belukar Pain +Pine Bush Sapling=Anak Belukar Pain +Kelp=Kelpa +Green Coral=Batu Karang Hijau +Pink Coral=Batu Karang Merah Jambu +Cyan Coral=Batu Karang Biru Kehijauan +Brown Coral=Batu Karang Perang +Orange Coral=Batu Karang Jingga +Coral Skeleton= Rangka Karang +Water Source=Sumber Air +Flowing Water=Air Mengalir +River Water Source=Sumber Air Sungai +Flowing River Water=Air Sungai Mengalir +Lava Source=Sumber Lava +Flowing Lava=Lava Mengalir +Empty Bookshelf=Rak Buku Kosong +Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku bertulis, @2 buku kosong) +Bookshelf=Rak Buku +Text too long=Tulisan terlalu panjang +"@1"="@1" +Wooden Sign=Papan Tanda Kayu +Steel Sign=Papan Tanda Keluli +Wooden Ladder=Tangga Panjat Kayu +Steel Ladder=Tangga Panjat Keluli +Apple Wood Fence=Pagar Kayu Epal +Acacia Wood Fence=Pagar Kayu Akasia +Jungle Wood Fence=Pagar Kayu Hutan +Pine Wood Fence=Pagar Kayu Pain +Aspen Wood Fence=Pagar Kayu Aspen +Apple Wood Fence Rail=Pagar Rel Kayu Epal +Acacia Wood Fence Rail=Pagar Rel Kayu Akasia +Jungle Wood Fence Rail=Pagar Rel Kayu Hutan +Pine Wood Fence Rail=Pagar Rel Kayu Pain +Aspen Wood Fence Rail=Pagar Rel Kayu Aspen +Glass=Kaca +Obsidian Glass=Kaca Obsidia +Brick Block=Bongkah Bata +Mese Lamp=Lampu Mese +Apple Wood Mese Post Light=Lampu Tiang Mese Kayu Epal +Acacia Wood Mese Post Light=Lampu Tiang Mese Kayu Akasia +Jungle Wood Mese Post Light=Lampu Tiang Mese Kayu Hutan +Pine Wood Mese Post Light=Lampu Tiang Mese Kayu Pain +Aspen Wood Mese Post Light=Lampu Tiang Mese Kayu Aspen +Cloud=Awan +Wooden Pickaxe=Beliung Kayu +Stone Pickaxe=Beliung Batu +Bronze Pickaxe=Beliung Gangsa +Steel Pickaxe=Beliung Keluli +Mese Pickaxe=Beliung Mese +Diamond Pickaxe=Beliung Intan +Wooden Shovel=Penyodok Kayu +Stone Shovel=Penyodok Batu +Bronze Shovel=Penyodok Gangsa +Steel Shovel=Penyodok Keluli +Mese Shovel=Penyodok Mese +Diamond Shovel=Penyodok Intan +Wooden Axe=Kapak Kayu +Stone Axe=Kapak Batu +Bronze Axe=Kapak Gangsa +Steel Axe=Kapak Keluli +Mese Axe=Kapak Mese +Diamond Axe=Kapak Intan +Wooden Sword=Pedang Kayu +Stone Sword=Pedang Batu +Bronze Sword=Pedang Gangsa +Steel Sword=Pedang Keluli +Mese Sword=Pedang Mese +Diamond Sword=Pedang Intan +Torch=Obor +@1 will intersect protection on growth.=@1 akan masuk kawasan perlindungan lain apabila ia tumbuh. + + +##### not used anymore ##### + +Dirt with Dry Grass=Tanah Berumput Kering +Dry Dirt=Tanah Kering +Dry Dirt with Dry Grass=Tanah Kering Berumput Kering +Dry Grass=Rumput Kering +Mese Post Light=Lampu Tiang Mese diff --git a/data/games/garage/mods/default/locale/default.pl.tr b/data/games/garage/mods/default/locale/default.pl.tr new file mode 100644 index 0000000..dd08b84 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.pl.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Zablokowana skrzynia +Locked Chest (owned by @1)=Zablokowana skrzynia (właściciel: @1) +You do not own this chest.=Nie jesteś właścicielem tej skrzyni. +a locked chest=zablokowana skrzynia +Chest=Skrzynia +Write=Zapis +Read=Odczyt +Title:=Tytuł: +Contents:=Zawartość: +Save=Zapisz +by @1=autor: @1 +Page @1 of @2=Strona @1 z @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" przez @2 +Blueberries=Jagody +Book=Książka +Book with Text=Zapisana książka +Bronze Ingot=Sztabka brązu +Clay Brick=Gliniana cegła +Clay Lump=Glina +Coal Lump=Węgiel +Copper Ingot=Sztabka miedzi +Copper Lump=Bryłka miedzi +Diamond=Diament +Flint=Krzemień +Gold Ingot=Sztabka złota +Gold Lump=Bryłka złota +Iron Lump=Bryłka żelaza +Mese Crystal=Kryształ Mese +Mese Crystal Fragment=Fragment kryształu Mese +Obsidian Shard=Odłamek obsydianu +Paper=Papier +Steel Ingot=Sztabka stali +Stick=Patyk +Tin Ingot=Sztabka cyny +Tin Lump=Bryłka cyny +Furnace is empty=Piec jest pusty +100% (output full)=100% (zapełnione) +@1%=@1% +Not cookable=Nie nadaje się do przepalania +Empty=Puste +Furnace active=Piec aktywny +Furnace inactive=Piec nieaktywny +(Item: @1; Fuel: @2)=(Przedmiot: @1; Paliwo: @2) +Furnace=Piec +Stone=Kamień +Cobblestone=Bruk +Stone Brick=Kamienne cegły +Stone Block=Blok kamienia +Mossy Cobblestone=Bruk z mchem +Desert Stone=Pustynny kamień +Desert Cobblestone=Pustynny bruk +Desert Stone Brick=Pustynne kamienne cegły +Desert Stone Block=Blok pustynnego kamienia +Sandstone=Piaskowiec +Sandstone Brick=Cegły z piaskowca +Sandstone Block=Blok piaskowca +Desert Sandstone=Pustynny piaskowiec +Desert Sandstone Brick=Cegły z pustynnego piaskowca +Desert Sandstone Block=Blok pustynnego piaskowca +Silver Sandstone=Srebrny piaskowiec +Silver Sandstone Brick=Cegły z srebrnego piaskowca +Silver Sandstone Block=Blok srebrnego piaskowca +Obsidian=Obsydian +Obsidian Brick=Obsydianowe cegły +Obsidian Block=Blok obsydianu +Dirt=Ziemia +Dirt with Grass=Ziemia z trawą +Dirt with Grass and Footsteps=Ziemia z trawą i śladami +Dirt with Savanna Grass=Ziemia z sawannową trawą +Dirt with Snow=Ziemia ze śniegiem +Dirt with Rainforest Litter=Ziemia ze ściółką lasu deszczowego +Dirt with Coniferous Litter=Ziemia ze ściółką lasu iglastego +Savanna Dirt=Sawannowa ziemia +Savanna Dirt with Savanna Grass=Sawannowa ziemia z sawannową trawą +Permafrost=Zmarzlina +Permafrost with Stones=Zmarzlina z kamieniami +Permafrost with Moss=Zmarzlina z mchem +Sand=Piasek +Desert Sand=Pustynny piasek +Silver Sand=Srebrny piasek +Gravel=Żwir +Clay=Glina +Snow=Śnieg +Snow Block=Blok śniegu +Ice=Lód +Cave Ice=Jaskiniowy lód +Apple Tree=Jabłkowe drewno +Apple Wood Planks=Deski z drzewa jabłkowego +Apple Tree Sapling=Sadzonka drzewa jabłkowego +Apple Tree Leaves=Liście drzewa jabłkowego +Apple=Jabłko +Apple Marker=Znacznik jabłka +Jungle Tree=Dżunglowe drewno +Jungle Wood Planks=Deski z dżunglowego drzewa +Jungle Tree Leaves=Liście dżunglowego drzewa +Jungle Tree Sapling=Sadzonka dżunglowego drzewa +Emergent Jungle Tree Sapling=Wyłaniająca się sadzonka dżunglowego drzewa +Pine Tree=Sosnowe drewno +Pine Wood Planks=Deski z sosnowego drzewa +Pine Needles=Sosnowe igły +Pine Tree Sapling=Sadzonka sosnowego drzewa +Acacia Tree=Akacjowe drewno +Acacia Wood Planks=Deski z akacjowego drzewa +Acacia Tree Leaves=Liście akacjowego drzewa +Acacia Tree Sapling=Sadzonka akacjowego drzewa +Aspen Tree=Brzozowe drzewo +Aspen Wood Planks=Deski z brzozowego drzewa +Aspen Tree Leaves=Liście brzozowego drzewa +Aspen Tree Sapling=Sadzonka brzozowego drzewa +Coal Ore=Ruda węgla +Coal Block=Blok węgla +Iron Ore=Ruda żelaza +Steel Block=Blok stali +Copper Ore=Ruda miedzi +Copper Block=Blok miedzi +Tin Ore=Ruda cyny +Tin Block=Blok cyny +Bronze Block=Blok brązu +Mese Ore=Ruda Mese +Mese Block=Blok Mese +Gold Ore=Ruda złota +Gold Block=Blok złota +Diamond Ore=Ruda diamentu +Diamond Block=Blok diamentu +Cactus=Kaktus +Large Cactus Seedling=Sadzonka dużego kaktusa +Papyrus=Papirus +Dry Shrub=Uschnięty krzak +Jungle Grass=Dżunglowa trawa +Grass=Trawa +Savanna Grass=Sawannowa trawa +Fern=Paproć +Marram Grass=Trzcinnik leśny +Bush Stem=Korzeń krzaku +Bush Leaves=Liście krzaku +Bush Sapling=Sadzonka krzaku +Blueberry Bush Leaves with Berries=Liście jagodowego krzaku z jagodami +Blueberry Bush Leaves=Liście jagodowego krzaku +Blueberry Bush Sapling=Sadzonka jagodowego krzaku +Acacia Bush Stem=Korzeń akacjowego krzaku +Acacia Bush Leaves=Liście akacjowego krzaku +Acacia Bush Sapling=Sadzonka akacjowego krzaku +Pine Bush Stem=Korzeń sosnowego krzaku +Pine Bush Needles=Igły sosnowego krzaku +Pine Bush Sapling=Sadzonka sosnowego krzaku +Kelp=Wodorost +Green Coral=Zielony koralowiec +Pink Coral=Różowy koralowiec +Cyan Coral=Cyjanowy koralowiec +Brown Coral=Brązowy koralowiec +Orange Coral=Pomarańczowy koralowiec +Coral Skeleton=Szkielet koralowca +Water Source=Źródło wody +Flowing Water=Płynąca woda +River Water Source=Źródło wody rzecznej +Flowing River Water=Płynąca woda rzeczna +Lava Source=Źródło lawy +Flowing Lava=Płynąca lawa +Empty Bookshelf=Pusta półka na książki +Bookshelf (@1 written, @2 empty books)=Półka na książki (@1 zapisanych, @2 pustych książek) +Bookshelf=Półka na książki +Text too long=Tekst jest zbyt długi +"@1"="@1" +Wooden Sign=Drewniana tabliczka +Steel Sign=Stalowa tabliczka +Wooden Ladder=Drewniana drabina +Steel Ladder=Stalowa drabina +Apple Wood Fence=Płot z jabłkowego drzewa +Acacia Wood Fence=Płot z akacjowego drzewa +Jungle Wood Fence=Płot z dżunglowego drzewa +Pine Wood Fence=Płot z sosnowego drzewa +Aspen Wood Fence=Płot z brzozowego drzewa +Apple Wood Fence Rail=Szyna ogrodzeniowa z jabłkowego drzewa +Acacia Wood Fence Rail=Szyna ogrodzeniowa z akacjowego drzewa +Jungle Wood Fence Rail=Szyna ogrodzeniowa z dżunglowego drzewa +Pine Wood Fence Rail=Szyna ogrodzeniowa z sosnowego drzewa +Aspen Wood Fence Rail=Szyna ogrodzeniowa z brzozowego drzewa +Glass=Szkło +Obsidian Glass=Obsydianowe szkło +Brick Block=Blok cegieł +Mese Lamp=Lampa Mese +Apple Wood Mese Post Light=Lampa Mese z obramowaniem z jabłkowego drzewa +Acacia Wood Mese Post Light=Lampa Mese z obramowaniem z akacjowego drzewa +Jungle Wood Mese Post Light=Lampa Mese z obramowaniem z dżunglowego drzewa +Pine Wood Mese Post Light=Lampa Mese z obramowaniem z sosnowego drzewa +Aspen Wood Mese Post Light=Lampa Mese z obramowaniem z brzozowego drzewa +Cloud=Chmura +Wooden Pickaxe=Drewniany kilof +Stone Pickaxe=Kamienny kilof +Bronze Pickaxe=Brązowy kilof +Steel Pickaxe=Stalowy kilof +Mese Pickaxe=Mesowy kilof +Diamond Pickaxe=Diamentowy kilof +Wooden Shovel=Drewniana łopata +Stone Shovel=Kamienna łopata +Bronze Shovel=Brązowa łopata +Steel Shovel=Stalowa łopata +Mese Shovel=Mesowa łopata +Diamond Shovel=Diamentowa łopata +Wooden Axe=Drewniana siekiera +Stone Axe=Kamienna siekiera +Bronze Axe=Brązowa siekiera +Steel Axe=Stalowa siekiera +Mese Axe=Mesowa siekiera +Diamond Axe=Diamentowa siekiera +Wooden Sword=Drewniany miecz +Stone Sword=Kamienny miecz +Bronze Sword=Brązowy miecz +Steel Sword=Stalowy miecz +Mese Sword=Mesowy miecz +Diamond Sword=Diamentowy miecz +Torch=Pochodnia +@1 will intersect protection on growth.=@1 będzie kolidować z ochroną terenu podczas rośnięcia. diff --git a/data/games/garage/mods/default/locale/default.pt.tr b/data/games/garage/mods/default/locale/default.pt.tr new file mode 100644 index 0000000..80ad587 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.pt.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Baú Trancado +Locked Chest (owned by @1)=Baú Trancado (pertence a @1) +You do not own this chest.=Você não é dono deste baú. +a locked chest=um baú trancado +Chest=Baú +Write= +Read= +Title:=Título: +Contents:=Conteúdo: +Save=Salvar +by @1=por @1 +Page @1 of @2=Página @1 de @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" por @2 +Blueberries=Mirtilo +Book=Livro +Book with Text=Livro com Texto +Bronze Ingot=Lingote de Bronze +Clay Brick=Tijolo de Argila +Clay Lump=Pedaço de Argila +Coal Lump=Pedaço de Carvão +Copper Ingot=Lingote de Cobre +Copper Lump=Pedaço de Cobre +Diamond=Diamante +Flint=Rocha Sílex +Gold Ingot=Lingote de Ouro +Gold Lump=Pedaço de Ouro +Iron Lump=Pedaço de Ferro +Mese Crystal=Cristal de Mese +Mese Crystal Fragment=Fragmento de Cristal de Mese +Obsidian Shard=Caco de Obsidian +Paper=Papel +Steel Ingot=Lingote de Aço +Stick=Graveto +Tin Ingot=Lingote de Estanho +Tin Lump=Pedaço de Estanho +Furnace is empty=A fornalha está vazia +100% (output full)=100% (saída cheia) +@1%=@1% +Not cookable=Não pode cozinhar +Empty=Vazio +Furnace active=Fornalha ativa +Furnace inactive=Fornalha inativa +(Item: @1; Fuel: @2)=(Item: @1; Combustível: @2) +Furnace=Fornalha +Stone=Pedra +Cobblestone=Pedregulho +Stone Brick=Tijolo de Pedra +Stone Block=Bloco de Pedra +Mossy Cobblestone=Pedregulho Musgoso +Desert Stone=Pedra do Deserto +Desert Cobblestone=Pedregulho do Deserto +Desert Stone Brick=Tijolo de Pedra do Deserto +Desert Stone Block=Bloco de Pedra do Deserto +Sandstone=Arenito +Sandstone Brick=Tijolo de Arenito +Sandstone Block=Bloco de Arenito +Desert Sandstone=Bloco de Arenito do Deserto +Desert Sandstone Brick=Tijolo de Arenito do Deserto +Desert Sandstone Block=Bloco de Arenito do Deserto +Silver Sandstone=Arenito Prateado +Silver Sandstone Brick=Tijolo de Arenito Prateado +Silver Sandstone Block=Bloco de Arenito Prateado +Obsidian=Obsidiana +Obsidian Brick=Tijolo de Obsidiana +Obsidian Block=Bloco de Obsidiana +Dirt=Terra +Dirt with Grass=Terra com Grama +Dirt with Grass and Footsteps=Terra com Grama e Pegadas +Dirt with Savanna Grass=Terra com Grama da Savana +Dirt with Snow=Terra com Neve +Dirt with Rainforest Litter=Terra com Serrapilheira Tropical +Dirt with Coniferous Litter=Terra com Serrapilheira +Savanna Dirt=Terra da Savana +Savanna Dirt with Savanna Grass=Terra da Savana com Grama da Savana +Permafrost=Terra Congelada +Permafrost with Stones=Terra Congelada com Pedras +Permafrost with Moss=Terra Congelada com Musgo +Sand=Areia +Desert Sand=Areia do Deserto +Silver Sand=Areia Prateada +Gravel=Cascalho +Clay=Argila +Snow=Neve +Snow Block=Bloco de Neve +Ice=Gelo +Cave Ice=Caverna de Gelo +Apple Tree=Macieira +Apple Wood Planks=Tábuas de Macieira +Apple Tree Sapling=Muda de Macieira +Apple Tree Leaves=Folhas de Macieira +Apple=Maçã +Apple Marker=Marcador de Maçã +Jungle Tree=Árvore da Selva +Jungle Wood Planks=Tábuas de Árvore da Selva +Jungle Tree Leaves=Folhas de Árvore da Selva +Jungle Tree Sapling=Muda de Árvore da Selva +Emergent Jungle Tree Sapling=Muda Crescida de Árvore da Selva +Pine Tree=Pinheiro +Pine Wood Planks=Tábuas de Pinheiro +Pine Needles=Agulhas de Pinheiro +Pine Tree Sapling=Muda de Pinheiro +Acacia Tree=Acácia +Acacia Wood Planks=Tábuas de Acácia +Acacia Tree Leaves=Folhas de Acácia +Acacia Tree Sapling=Mudas de Acácia +Aspen Tree=Álamo +Aspen Wood Planks=Tábuas de Álamo +Aspen Tree Leaves=Folhas de Álamo +Aspen Tree Sapling=Muda de Álamo +Coal Ore=Minério de Carvão +Coal Block=Bloco de Carvão +Iron Ore=Minério de Ferro +Steel Block=Bloco de Aço +Copper Ore=Minério de Cobre +Copper Block=Bloco de Cobre +Tin Ore=Minério de Estanho +Tin Block=Bloco de Estanho +Bronze Block=Bloco de Bronze +Mese Ore=Minério de Mese +Mese Block=Bloco de Mese +Gold Ore=Minério de Ouro +Gold Block=Bloco de Ouro +Diamond Ore=Minério de Diamante +Diamond Block=Bloco de Diamante +Cactus=Cacto +Large Cactus Seedling=Grande Muda de Cacto +Papyrus=Papiro +Dry Shrub=Arbusto Seco +Jungle Grass=Grama da Selva +Grass=Grama +Savanna Grass=Grama da Savana +Fern=Samambaia +Marram Grass=Grama de Feno +Bush Stem=Caule de Arbusto +Bush Leaves=Folhas de Arbusto +Bush Sapling=Muda de Arbusto +Blueberry Bush Leaves with Berries=Folhas de Arbusto de Mirtilo com Bagas +Blueberry Bush Leaves=Folhas de Arbusto de Mirtilo +Blueberry Bush Sapling=Muda de Arbusto de Mirtilo +Acacia Bush Stem=Caule de Arbusto de Acácia +Acacia Bush Leaves=Folhas de Arbusto de Acácia +Acacia Bush Sapling=Muda de Arbusto de Acácia +Pine Bush Stem=Caule de Arbusto de Pinheiro +Pine Bush Needles=Agulha de Arbusto de Pinheiro +Pine Bush Sapling=Muda de Arbusto de Pinheiro +Kelp=Alga +Green Coral=Coral Verde +Pink Coral=Coral Rosa +Cyan Coral=Coral Ciano +Brown Coral=Coral Marrom +Orange Coral=Coral Laranja +Coral Skeleton=Esqueleto de Coral +Water Source=Fonte de Água +Flowing Water=Água Corrente +River Water Source=Fonte de Água do Rio +Flowing River Water=Água Corrente do Rio +Lava Source=Fonte de Lava +Flowing Lava=Lava Corrente +Empty Bookshelf=Estante de Livros Vazia +Bookshelf (@1 written, @2 empty books)=Estante de Livros (@1 livros escritos, @2 livros em branco) +Bookshelf=Estante de Livros +Text too long=Texto muito longo +"@1"="@1" +Wooden Sign=Placa de Madeira +Steel Sign=Placa de Aço +Wooden Ladder=Escada de Madeira +Steel Ladder=Escada de Aço +Apple Wood Fence=Cerca de Macieira +Acacia Wood Fence=Cerca de Acácia +Jungle Wood Fence=Cerca de Madeira da Selva +Pine Wood Fence=Cerca de Pinheiro +Aspen Wood Fence=Cerca de Álamo +Apple Wood Fence Rail=Trilho de Cerca de Macieira +Acacia Wood Fence Rail=Trilho de Cerca de Acácia +Jungle Wood Fence Rail=Trilho de Cerca de Madeira da Selva +Pine Wood Fence Rail=Trilho de Cerca de Pinheiro +Aspen Wood Fence Rail=Trilho de Cerca de Álamo +Glass=Vidro +Obsidian Glass=Vidro de Obsidiana +Brick Block=Bloco de Tijolos +Mese Lamp=Lâmpada de Mese +Apple Wood Mese Post Light=Poste de Lâmpada de Mese de Macieira +Acacia Wood Mese Post Light=Poste de Lâmpada de Mese de Acácia +Jungle Wood Mese Post Light=Poste de Lâmpada de Mese de Madeira da Selva +Pine Wood Mese Post Light=Poste de Lâmpada de Mese de Pinheiro +Aspen Wood Mese Post Light=Poste de Lâmpada de Mese de Aspen +Cloud=Nuvem +Wooden Pickaxe=Picareta de Madeira +Stone Pickaxe=Picareta de Pedra +Bronze Pickaxe=Picareta de Bronze +Steel Pickaxe=Picareta de Aço +Mese Pickaxe=Picareta de Mese +Diamond Pickaxe=Picareta de Diamante +Wooden Shovel=Pá de Madeira +Stone Shovel=Pá de Pedra +Bronze Shovel=Pá de Bronze +Steel Shovel=Pá de Aço +Mese Shovel=Pá de Mese +Diamond Shovel=Pá de Diamante +Wooden Axe=Machado de Madeira +Stone Axe=Machado de Pedra +Bronze Axe=Machado de Bronze +Steel Axe=Machado de Aço +Mese Axe=Machado de Mese +Diamond Axe=Machado de Diamante +Wooden Sword=Espada de Madeira +Stone Sword=Espada de Pedra +Bronze Sword=Espada de Bronze +Steel Sword=Espada de Aço +Mese Sword=Espada de Mese +Diamond Sword=Espada de Diamante +Torch=Tocha +@1 will intersect protection on growth.=@1 cruzará a proteção no crescimento. diff --git a/data/games/garage/mods/default/locale/default.pt_BR.tr b/data/games/garage/mods/default/locale/default.pt_BR.tr new file mode 100644 index 0000000..80ad587 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.pt_BR.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Baú Trancado +Locked Chest (owned by @1)=Baú Trancado (pertence a @1) +You do not own this chest.=Você não é dono deste baú. +a locked chest=um baú trancado +Chest=Baú +Write= +Read= +Title:=Título: +Contents:=Conteúdo: +Save=Salvar +by @1=por @1 +Page @1 of @2=Página @1 de @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" por @2 +Blueberries=Mirtilo +Book=Livro +Book with Text=Livro com Texto +Bronze Ingot=Lingote de Bronze +Clay Brick=Tijolo de Argila +Clay Lump=Pedaço de Argila +Coal Lump=Pedaço de Carvão +Copper Ingot=Lingote de Cobre +Copper Lump=Pedaço de Cobre +Diamond=Diamante +Flint=Rocha Sílex +Gold Ingot=Lingote de Ouro +Gold Lump=Pedaço de Ouro +Iron Lump=Pedaço de Ferro +Mese Crystal=Cristal de Mese +Mese Crystal Fragment=Fragmento de Cristal de Mese +Obsidian Shard=Caco de Obsidian +Paper=Papel +Steel Ingot=Lingote de Aço +Stick=Graveto +Tin Ingot=Lingote de Estanho +Tin Lump=Pedaço de Estanho +Furnace is empty=A fornalha está vazia +100% (output full)=100% (saída cheia) +@1%=@1% +Not cookable=Não pode cozinhar +Empty=Vazio +Furnace active=Fornalha ativa +Furnace inactive=Fornalha inativa +(Item: @1; Fuel: @2)=(Item: @1; Combustível: @2) +Furnace=Fornalha +Stone=Pedra +Cobblestone=Pedregulho +Stone Brick=Tijolo de Pedra +Stone Block=Bloco de Pedra +Mossy Cobblestone=Pedregulho Musgoso +Desert Stone=Pedra do Deserto +Desert Cobblestone=Pedregulho do Deserto +Desert Stone Brick=Tijolo de Pedra do Deserto +Desert Stone Block=Bloco de Pedra do Deserto +Sandstone=Arenito +Sandstone Brick=Tijolo de Arenito +Sandstone Block=Bloco de Arenito +Desert Sandstone=Bloco de Arenito do Deserto +Desert Sandstone Brick=Tijolo de Arenito do Deserto +Desert Sandstone Block=Bloco de Arenito do Deserto +Silver Sandstone=Arenito Prateado +Silver Sandstone Brick=Tijolo de Arenito Prateado +Silver Sandstone Block=Bloco de Arenito Prateado +Obsidian=Obsidiana +Obsidian Brick=Tijolo de Obsidiana +Obsidian Block=Bloco de Obsidiana +Dirt=Terra +Dirt with Grass=Terra com Grama +Dirt with Grass and Footsteps=Terra com Grama e Pegadas +Dirt with Savanna Grass=Terra com Grama da Savana +Dirt with Snow=Terra com Neve +Dirt with Rainforest Litter=Terra com Serrapilheira Tropical +Dirt with Coniferous Litter=Terra com Serrapilheira +Savanna Dirt=Terra da Savana +Savanna Dirt with Savanna Grass=Terra da Savana com Grama da Savana +Permafrost=Terra Congelada +Permafrost with Stones=Terra Congelada com Pedras +Permafrost with Moss=Terra Congelada com Musgo +Sand=Areia +Desert Sand=Areia do Deserto +Silver Sand=Areia Prateada +Gravel=Cascalho +Clay=Argila +Snow=Neve +Snow Block=Bloco de Neve +Ice=Gelo +Cave Ice=Caverna de Gelo +Apple Tree=Macieira +Apple Wood Planks=Tábuas de Macieira +Apple Tree Sapling=Muda de Macieira +Apple Tree Leaves=Folhas de Macieira +Apple=Maçã +Apple Marker=Marcador de Maçã +Jungle Tree=Árvore da Selva +Jungle Wood Planks=Tábuas de Árvore da Selva +Jungle Tree Leaves=Folhas de Árvore da Selva +Jungle Tree Sapling=Muda de Árvore da Selva +Emergent Jungle Tree Sapling=Muda Crescida de Árvore da Selva +Pine Tree=Pinheiro +Pine Wood Planks=Tábuas de Pinheiro +Pine Needles=Agulhas de Pinheiro +Pine Tree Sapling=Muda de Pinheiro +Acacia Tree=Acácia +Acacia Wood Planks=Tábuas de Acácia +Acacia Tree Leaves=Folhas de Acácia +Acacia Tree Sapling=Mudas de Acácia +Aspen Tree=Álamo +Aspen Wood Planks=Tábuas de Álamo +Aspen Tree Leaves=Folhas de Álamo +Aspen Tree Sapling=Muda de Álamo +Coal Ore=Minério de Carvão +Coal Block=Bloco de Carvão +Iron Ore=Minério de Ferro +Steel Block=Bloco de Aço +Copper Ore=Minério de Cobre +Copper Block=Bloco de Cobre +Tin Ore=Minério de Estanho +Tin Block=Bloco de Estanho +Bronze Block=Bloco de Bronze +Mese Ore=Minério de Mese +Mese Block=Bloco de Mese +Gold Ore=Minério de Ouro +Gold Block=Bloco de Ouro +Diamond Ore=Minério de Diamante +Diamond Block=Bloco de Diamante +Cactus=Cacto +Large Cactus Seedling=Grande Muda de Cacto +Papyrus=Papiro +Dry Shrub=Arbusto Seco +Jungle Grass=Grama da Selva +Grass=Grama +Savanna Grass=Grama da Savana +Fern=Samambaia +Marram Grass=Grama de Feno +Bush Stem=Caule de Arbusto +Bush Leaves=Folhas de Arbusto +Bush Sapling=Muda de Arbusto +Blueberry Bush Leaves with Berries=Folhas de Arbusto de Mirtilo com Bagas +Blueberry Bush Leaves=Folhas de Arbusto de Mirtilo +Blueberry Bush Sapling=Muda de Arbusto de Mirtilo +Acacia Bush Stem=Caule de Arbusto de Acácia +Acacia Bush Leaves=Folhas de Arbusto de Acácia +Acacia Bush Sapling=Muda de Arbusto de Acácia +Pine Bush Stem=Caule de Arbusto de Pinheiro +Pine Bush Needles=Agulha de Arbusto de Pinheiro +Pine Bush Sapling=Muda de Arbusto de Pinheiro +Kelp=Alga +Green Coral=Coral Verde +Pink Coral=Coral Rosa +Cyan Coral=Coral Ciano +Brown Coral=Coral Marrom +Orange Coral=Coral Laranja +Coral Skeleton=Esqueleto de Coral +Water Source=Fonte de Água +Flowing Water=Água Corrente +River Water Source=Fonte de Água do Rio +Flowing River Water=Água Corrente do Rio +Lava Source=Fonte de Lava +Flowing Lava=Lava Corrente +Empty Bookshelf=Estante de Livros Vazia +Bookshelf (@1 written, @2 empty books)=Estante de Livros (@1 livros escritos, @2 livros em branco) +Bookshelf=Estante de Livros +Text too long=Texto muito longo +"@1"="@1" +Wooden Sign=Placa de Madeira +Steel Sign=Placa de Aço +Wooden Ladder=Escada de Madeira +Steel Ladder=Escada de Aço +Apple Wood Fence=Cerca de Macieira +Acacia Wood Fence=Cerca de Acácia +Jungle Wood Fence=Cerca de Madeira da Selva +Pine Wood Fence=Cerca de Pinheiro +Aspen Wood Fence=Cerca de Álamo +Apple Wood Fence Rail=Trilho de Cerca de Macieira +Acacia Wood Fence Rail=Trilho de Cerca de Acácia +Jungle Wood Fence Rail=Trilho de Cerca de Madeira da Selva +Pine Wood Fence Rail=Trilho de Cerca de Pinheiro +Aspen Wood Fence Rail=Trilho de Cerca de Álamo +Glass=Vidro +Obsidian Glass=Vidro de Obsidiana +Brick Block=Bloco de Tijolos +Mese Lamp=Lâmpada de Mese +Apple Wood Mese Post Light=Poste de Lâmpada de Mese de Macieira +Acacia Wood Mese Post Light=Poste de Lâmpada de Mese de Acácia +Jungle Wood Mese Post Light=Poste de Lâmpada de Mese de Madeira da Selva +Pine Wood Mese Post Light=Poste de Lâmpada de Mese de Pinheiro +Aspen Wood Mese Post Light=Poste de Lâmpada de Mese de Aspen +Cloud=Nuvem +Wooden Pickaxe=Picareta de Madeira +Stone Pickaxe=Picareta de Pedra +Bronze Pickaxe=Picareta de Bronze +Steel Pickaxe=Picareta de Aço +Mese Pickaxe=Picareta de Mese +Diamond Pickaxe=Picareta de Diamante +Wooden Shovel=Pá de Madeira +Stone Shovel=Pá de Pedra +Bronze Shovel=Pá de Bronze +Steel Shovel=Pá de Aço +Mese Shovel=Pá de Mese +Diamond Shovel=Pá de Diamante +Wooden Axe=Machado de Madeira +Stone Axe=Machado de Pedra +Bronze Axe=Machado de Bronze +Steel Axe=Machado de Aço +Mese Axe=Machado de Mese +Diamond Axe=Machado de Diamante +Wooden Sword=Espada de Madeira +Stone Sword=Espada de Pedra +Bronze Sword=Espada de Bronze +Steel Sword=Espada de Aço +Mese Sword=Espada de Mese +Diamond Sword=Espada de Diamante +Torch=Tocha +@1 will intersect protection on growth.=@1 cruzará a proteção no crescimento. diff --git a/data/games/garage/mods/default/locale/default.ru.tr b/data/games/garage/mods/default/locale/default.ru.tr new file mode 100644 index 0000000..ed99a2d --- /dev/null +++ b/data/games/garage/mods/default/locale/default.ru.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Запертый сундук +Locked Chest (owned by @1)=Запертый сундук (владелец: @1) +You do not own this chest.=Вы не владелец этого сундука. +a locked chest=запертый сундук +Chest=Сундук +Write=Написать +Read=Читать +Title:=Заголовок: +Contents:=Содержимое: +Save=Сохранить +by @1=от @1 +Page @1 of @2=Страница @1 из @2 +The book you were writing to mysteriously disappeared.=Книга, которую вы писали, загадочно исчезла. +"@1" by @2="@1" @2 +Blueberries=Черника +Book=Книга +Book with Text=Книга с текстом +Bronze Ingot=Бронзовый слиток +Clay Brick=Кирпич +Clay Lump=Глина +Coal Lump=Уголь +Copper Ingot=Медный слиток +Copper Lump=Кусок меди +Diamond=Алмаз +Flint=Кремень +Gold Ingot=Золотой слиток +Gold Lump=Кусок золота +Iron Lump=Кусок железа +Mese Crystal=Кристалл мезы +Mese Crystal Fragment=Осколок кристалла мезы +Obsidian Shard=Обсидиановый осколок +Paper=Бумага +Steel Ingot=Стальной слиток +Stick=Палка +Tin Ingot=Оловянный слиток +Tin Lump=Кусок олова +Furnace is empty=Печь пуста +100% (output full)=100% (выход заполнен) +@1%=@1% +Not cookable=Не может быть приготовлено +Empty=Пустое +Furnace active=Печь зажжена +Furnace inactive=Печь не зажжена +(Item: @1; Fuel: @2)=(Предмет: @1; Топливо: @2) +Furnace=Печь +Stone=Камень +Cobblestone=Булыжник +Stone Brick=Каменные кирпичи +Stone Block=Каменный блок +Mossy Cobblestone=Замшелый булыжник +Desert Stone=Пустынный камень +Desert Cobblestone=Пустынный булыжник +Desert Stone Brick=Пустынный каменные кирпичи +Desert Stone Block=Пустынный каменный блок +Sandstone=Песчаник +Sandstone Brick=Песчаниковые кирпичи +Sandstone Block=Песчаниковый блок +Desert Sandstone=Пустынный песчаник +Desert Sandstone Brick=Пустынные песчаниковые кирпичи +Desert Sandstone Block=Пустынный песчаниковый блок +Silver Sandstone=Серебристый песчаник +Silver Sandstone Brick=Серебристые песчаниковые кирпичи +Silver Sandstone Block=Серебристый песчаниковый блок +Obsidian=Обсидиан +Obsidian Brick=Обсидиановые кирпичи +Obsidian Block=Обсидиановый блок +Dirt=Земля +Dirt with Grass=Дёрн +Dirt with Grass and Footsteps=Дёрн со следами +Dirt with Savanna Grass=Саванный дёрн +Dirt with Snow=Земля со снегом +Dirt with Rainforest Litter=Земля с тропической подстилкой +Dirt with Coniferous Litter=Земля с сосновой подстилкой +Savanna Dirt=Саванная земля +Savanna Dirt with Savanna Grass=Саванная земля с саванной травой +Permafrost=Мёрзлая почва +Permafrost with Stones=Мёрзлая почва с камнями +Permafrost with Moss=Мёрзлая почва с мхом +Sand=Песок +Desert Sand=Пустынный песок +Silver Sand=Серебристый песок +Gravel=Гравий +Clay=Глиняный блок +Snow=Снежок +Snow Block=Снежный блок +Ice=Лёд +Cave Ice=Пещерный лёд +Apple Tree=Яблоневая древесина +Apple Wood Planks=Яблоневые доски +Apple Tree Sapling=Саженец яблони +Apple Tree Leaves=Яблоневая листва +Apple=Яблоко +Apple Marker=Яблочная метка +Jungle Tree=Древесина тропического дерева +Jungle Wood Planks=Доски из тропического дерева +Jungle Tree Leaves=Листва тропического дерева +Jungle Tree Sapling=Саженец тропического дерева +Emergent Jungle Tree Sapling=Выросший саженец тропического дерева +Pine Tree=Сосновая древесина +Pine Wood Planks=Сосновые доски +Pine Needles=Сосновая хвоя +Pine Tree Sapling=Саженец сосны +Acacia Tree=Акациевая древесина +Acacia Wood Planks=Акациевые доски +Acacia Tree Leaves=Акациевая листва +Acacia Tree Sapling=Саженец акации +Aspen Tree=Осиновая древесина +Aspen Wood Planks=Осиновые доски +Aspen Tree Leaves=Осиновая листва +Aspen Tree Sapling=Саженец осины +Coal Ore=Угольная руда +Coal Block=Угольный блок +Iron Ore=Железная руда +Steel Block=Стальной блок +Copper Ore=Медная руда +Copper Block=Медный блок +Tin Ore=Оловянная руда +Tin Block=Оловянный блок +Bronze Block=Бронзовый блок +Mese Ore=Мезовая руда +Mese Block=Мезовый блок +Gold Ore=Золотая руда +Gold Block=Золотой блок +Diamond Ore=Алмазная руда +Diamond Block=Алмазный блок +Cactus=Кактус +Large Cactus Seedling=Саженец кактуса +Papyrus=Папирус +Dry Shrub=Сухой куст +Jungle Grass=Тропическая трава +Grass=Трава +Savanna Grass=Саванная трава +Fern=Папоротник +Marram Grass=Песколюб +Bush Stem=Стебель куста +Bush Leaves=Листья куста +Bush Sapling=Саженец куста +Blueberry Bush Leaves with Berries=Черничный куст с ягодами +Blueberry Bush Leaves=Листья черничного куста +Blueberry Bush Sapling=Саженец черничного куста +Acacia Bush Stem=Стебель куста акации +Acacia Bush Leaves=Листья куста акации +Acacia Bush Sapling=Саженец куста акации +Pine Bush Stem=Стебли хвойного куста +Pine Bush Needles=Хвоя куста +Pine Bush Sapling=Саженец хвойного куста +Kelp=Ламинария +Green Coral=Зелёный коралл +Pink Coral=Розовый коралл +Cyan Coral=Бирюзовый коралл +Brown Coral=Коричневый коралл +Orange Coral=Оранжевый коралл +Coral Skeleton=Коралловый остов +Water Source=Источник воды +Flowing Water=Текущая вода +River Water Source=Источник речной воды +Flowing River Water=Текущая речная вода +Lava Source=Источник лавы +Flowing Lava=Текущая лава +Empty Bookshelf=Пустая книжная полка +Bookshelf (@1 written, @2 empty books)=Книжная полка (@1 написано, @2 чистые книги) +Bookshelf=Книжная полка +Text too long=Текст слишком длинный +"@1"="@1" +Wooden Sign=Деревянная табличка +Steel Sign=Стальная табличка +Wooden Ladder=Деревянная лестница +Steel Ladder=Стальная лестница +Apple Wood Fence=Яблоневый забор +Acacia Wood Fence=Акациевый забор +Jungle Wood Fence=Забор из тропического дерева +Pine Wood Fence=Сосновый забор +Aspen Wood Fence=Осиновый забор +Apple Wood Fence Rail=Яблоневый реечный забор +Acacia Wood Fence Rail=Акациевый реечный забор +Jungle Wood Fence Rail=Реечный забор из тропического дерева +Pine Wood Fence Rail=Сосновый реечный забор +Aspen Wood Fence Rail=Осиновый реечный забор +Glass=Стекло +Obsidian Glass=Обсидиановое стекло +Brick Block=Кирпичи +Mese Lamp=Мезовая лампа +Apple Wood Mese Post Light=Яблоневый уличный фонарь +Acacia Wood Mese Post Light=Акациевый уличный фонарь +Jungle Wood Mese Post Light=Уличный фонарь из тропического дерева +Pine Wood Mese Post Light=Сосновый уличный фонарь +Aspen Wood Mese Post Light=Осиновый уличный фонарь +Cloud=Облако +Wooden Pickaxe=Деревянная кирка +Stone Pickaxe=Каменная кирка +Bronze Pickaxe=Бронзовая кирка +Steel Pickaxe=Стальная кирка +Mese Pickaxe=Мезовая кирка +Diamond Pickaxe=Алмазная кирка +Wooden Shovel=Деревянная лопата +Stone Shovel=Каменная лопата +Bronze Shovel=Бронзовая лопата +Steel Shovel=Стальная лопата +Mese Shovel=Мезовая лопата +Diamond Shovel=Алмазная лопата +Wooden Axe=Деревянный топор +Stone Axe=Каменный топор +Bronze Axe=Бронзовый топор +Steel Axe=Стальной топор +Mese Axe=Мезовый топор +Diamond Axe=Алмазный топор +Wooden Sword=Деревянный меч +Stone Sword=Каменный меч +Bronze Sword=Бронзовый меч +Steel Sword=Стальной меч +Mese Sword=Мезовый меч +Diamond Sword=Алмазный меч +Torch=Факел +@1 will intersect protection on growth.=@1 пересечет защищённую зону при вырастании. \ No newline at end of file diff --git a/data/games/garage/mods/default/locale/default.sk.tr b/data/games/garage/mods/default/locale/default.sk.tr new file mode 100644 index 0000000..337ebcf --- /dev/null +++ b/data/games/garage/mods/default/locale/default.sk.tr @@ -0,0 +1,220 @@ +# textdomain: default +Locked Chest=Uzamknutá truhlica +Locked Chest (owned by @1)=Uzamknutá truhlica (Vlastník - @1) +You do not own this chest.=Túto truhlicu nevlastníš. +a locked chest=zamknutá truhlica +Chest=Truhlica +Write= +Read= +Title:=Názov: +Contents:=Obsah: +Save=Uložiť +by @1=od @1 +Page @1 of @2=Strana @1 z @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2=„@1“ z @2 +Blueberries=Čučoriedky +Book=Kniha +Book with Text=Kniha s textom +Bronze Ingot=Bronzový ingot +Clay Brick=Nepálená tehla +Clay Lump=Hruda ílu +Coal Lump=Hruda uhlia +Copper Ingot=Medený ingot +Copper Lump=Hruda medi +Diamond=Diamant +Flint=Kresací kamienok +Gold Ingot=Zlatý ingot +Gold Lump=Hruda zlata +Iron Lump=Hruda železa +Mese Crystal=Mese Krištáľ +Mese Crystal Fragment=Fragment Mese krištáľu +Obsidian Shard=Úlomok obsidiánu +Paper=Papier +Steel Ingot=Oceľový ingot +Stick=Palica +Tin Ingot=Cínový ingot +Tin Lump=Hruda cínu +Furnace is empty=Pec je prázdna +100% (output full)=100% (Výstup je plný) +@1%=@1% +Not cookable=Nie je variteľné +Empty=Prázdne +Furnace active=Pec je aktívna +Furnace inactive=Pec je neaktívna +(Item: @1; Fuel: @2)=(Vec: @1; Palivo: @2) +Furnace=Pec +Stone=Kameň +Cobblestone=Dlažbový kameň +Stone Brick=Tehla z kameňa +Stone Block=Blok kameňa +Mossy Cobblestone=Dlažbový kameň obrastený machom +Desert Stone=Púštny kameň +Desert Cobblestone=Púštny dlažbový kameň +Desert Stone Brick=Tehla z púštneho kameňa +Desert Stone Block=Blok púštneho kameňa +Sandstone=Pieskovec +Sandstone Brick=Tehla z pieskovca +Sandstone Block=Blok pieskovca +Desert Sandstone=Púštny pieskovec +Desert Sandstone Brick=Tehla z púštneho pieskovca +Desert Sandstone Block=Blok púštneho pieskovca +Silver Sandstone=Strieborný pieskovec +Silver Sandstone Brick=Tehla zo strieborného pieskovca +Silver Sandstone Block=Blok strieborného pieskovca +Obsidian=Obsidián +Obsidian Brick=Tehla z obsidiánu +Obsidian Block=Blok obsidiánu +Dirt=Hlina +Dirt with Grass=Hlina s trávou +Dirt with Grass and Footsteps=Hlina s trávou a stopami +Dirt with Savanna Grass=Hlina s trávou zo savany +Dirt with Snow=Hlina so snehom +Dirt with Rainforest Litter=Hlina s povrchom dažďového pralesa +Dirt with Coniferous Litter=Hlina s ihličnatým povrchom +Savanna Dirt=Hlina zo savany +Savanna Dirt with Savanna Grass=Hlina zo savany s trávou +Permafrost=Permafrost +Permafrost with Stones=Permafrost s kameňmi +Permafrost with Moss=Permafrost s machom +Sand=Piesok +Desert Sand=Púštny piesok +Silver Sand=Strieborný piesok +Gravel=Štrk +Clay=Íl +Snow=Sneh +Snow Block=Blok snehu +Ice=Ľad +Cave Ice=Jaskynný ľad +Apple Tree=Jabloň +Apple Wood Planks=Drevené dosky z jablone +Apple Tree Sapling=Stromček jablone +Apple Tree Leaves=Listy z jablone +Apple=Jablko +Apple Marker=Jablková značka +Jungle Tree=Ďungľový strom +Jungle Wood Planks=Drevené dosky z džungľového stromu +Jungle Tree Leaves=Listy z džungľového stromu +Jungle Tree Sapling=Džungľový stromček +Emergent Jungle Tree Sapling=Vznikajúci džungľový stromček +Pine Tree=Borovica +Pine Wood Planks=Drevené dosky z borovice +Pine Needles=Ihličie z borovice +Pine Tree Sapling=Borovicový stromček +Acacia Tree=Akácia +Acacia Wood Planks=Drevené dosky z akácie +Acacia Tree Leaves=Listy z akácie +Acacia Tree Sapling=Stromček akácie +Aspen Tree=Osika +Aspen Wood Planks=Drevené dosky z osiky +Aspen Tree Leaves=Listy z osiky +Aspen Tree Sapling=Stromček osiky +Coal Ore=Uhoľná ruda +Coal Block=Blok uhlia +Iron Ore=Železná ruda +Steel Block=Blok ocele +Copper Ore=Medená ruda +Copper Block=Blok medi +Tin Ore=Cínová ruda +Tin Block=Blok cínu +Bronze Block=Blok bronzu +Mese Ore=Mese Ruda +Mese Block=Blok Mese +Gold Ore=Zlatá ruda +Gold Block=Blok zlata +Diamond Ore=Diamantová ruda +Diamond Block=Blok diamantu +Cactus=Kaktus +Large Cactus Seedling=Vaľká sadenica kaktusu +Papyrus=Papyrus +Dry Shrub=Suchý ker +Jungle Grass=Džungľová tráva +Grass=Tráva +Savanna Grass=Tráva zo savany +Fern=Papraď +Marram Grass=Pobrežná tráva +Bush Stem=Stonka z kríka +Bush Leaves=Listy z kríka +Bush Sapling=Sadenica kríka +Blueberry Bush Leaves with Berries=Čučoriedkové listy s čučoriedkami +Blueberry Bush Leaves=Čučoriedkové listy +Blueberry Bush Sapling=Sadenica čučoriedky +Acacia Bush Stem=Stonka z kríka akácie +Acacia Bush Leaves=Listy z kríka akácie +Acacia Bush Sapling=Sadenica kríka akácie +Pine Bush Stem=Stonka kríka borovice +Pine Bush Needles=Ihličie kríka borovice +Pine Bush Sapling=Sadenica kríka borovice +Kelp=Riasa +Green Coral=Zelený koral +Pink Coral=Ružový koral +Cyan Coral=Tyrkysový koral +Brown Coral=Hnedý koral +Orange Coral=Oranžový koral +Coral Skeleton=Koralová kostra +Water Source=Zdroj vody +Flowing Water=Tečúca voda +River Water Source=Zdroj riečnej voda +Flowing River Water=Tečúca riečna voda +Lava Source=Zdroj lávy +Flowing Lava=Tečúca láva +Empty Bookshelf=Prázdna knižnica +Bookshelf (@1 written, @2 empty books)=Knižnica (@1 popísané, @2 prázdne knihy) +Bookshelf=Knižnica +Text too long=Text je príliš dlhý +"@1"=„@1“ +Wooden Sign=Drevená tabuľka +Steel Sign=Oceľová tabuľka +Wooden Ladder=Drevený rebrík +Steel Ladder=Oceľový rebrík +Apple Wood Fence=Drevený plot z jablone +Acacia Wood Fence=Drevený plot z akácie +Jungle Wood Fence=Drevený plot z džungľového dreva +Pine Wood Fence=Drevený plot z borovice +Aspen Wood Fence=Drevený plot z osiky +Apple Wood Fence Rail=Drevené zábradlie z jablone +Acacia Wood Fence Rail=Drevené zábradlie z akácie +Jungle Wood Fence Rail=Drevené zábradlie z džungľového dreva +Pine Wood Fence Rail=Drevené zábradlie z borovice +Aspen Wood Fence Rail=Drevené zábradlie z osiky +Glass=Sklo +Obsidian Glass=Obsidiánové sklo +Brick Block=Blok z tehál +Mese Lamp=Mese lampa +Apple Wood Mese Post Light= +Acacia Wood Mese Post Light= +Jungle Wood Mese Post Light= +Pine Wood Mese Post Light= +Aspen Wood Mese Post Light= +Cloud=Oblak +Wooden Pickaxe=Drevený krompáč +Stone Pickaxe=Kamenný krompáč +Bronze Pickaxe=Bronzový krompáč +Steel Pickaxe=Oceľový krompáč +Mese Pickaxe=Mese krompáč +Diamond Pickaxe=Diamantový krompáč +Wooden Shovel=Drevená lopata +Stone Shovel=Kamenná lopata +Bronze Shovel=Bronzová lopata +Steel Shovel=Oceľová lopata +Mese Shovel=Mese lopata +Diamond Shovel=Diamantová lopata +Wooden Axe=Drevená sekera +Stone Axe=Kamenná sekera +Bronze Axe=Bronzová sekera +Steel Axe=Oceľová sekera +Mese Axe=Mese sekera +Diamond Axe=Diamantová sekera +Wooden Sword=Drevený meč +Stone Sword=Kamenný meč +Bronze Sword=Bronzový meč +Steel Sword=Oceľový meč +Mese Sword=Mese meč +Diamond Sword=Diamantový meč +Torch=Fakľa +@1 will intersect protection on growth.=@1 prekročí pri raste chránenú zónu. + + +##### not used anymore ##### + +Mese Post Light=Mese stĺpová lampa diff --git a/data/games/garage/mods/default/locale/default.sv.tr b/data/games/garage/mods/default/locale/default.sv.tr new file mode 100644 index 0000000..90df6c3 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.sv.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Låst kista +Locked Chest (owned by @1)=Låst kista (Ägd av @1) +You do not own this chest.=Du äger inte denna kista. +a locked chest=en låst kista +Chest=Kista +Write=Skriva +Read=Läs +Title:=Titel: +Contents:=Innehåll: +Save=Spara +by @1=av @1 +Page @1 of @2=Sida @1 av @2 +The book you were writing to mysteriously disappeared.= +"@1" by @2="@1" av @2 +Blueberries=Blåbär +Book=Bok +Book with Text=Bok med text +Bronze Ingot=Bronstacka +Clay Brick=Tegelsten +Clay Lump=Lerklump +Coal Lump=Kolklump +Copper Ingot=Koppartacka +Copper Lump=Kopparklump +Diamond=Diamant +Flint=Flinta +Gold Ingot=Guldtacka +Gold Lump=Guldklump +Iron Lump=Järnklump +Mese Crystal=Mesekristall +Mese Crystal Fragment=Mesekristallfragment +Obsidian Shard=Obsidianskärva +Paper=Papper +Steel Ingot=Ståltacka +Stick=Pinne +Tin Ingot=Tenntacka +Tin Lump=Tennklump +Furnace is empty=Ugnen är tom +100% (output full)=100% (utgången full) +@1%=@1% +Not cookable=Inte kokbar +Empty=Tom +Furnace active=Ugn aktiv +Furnace inactive=Ugn inaktiv +(Item: @1; Fuel: @2)=(Sak: @1; Bränsle: @2) +Furnace=Ugn +Stone=Sten +Cobblestone=Kullersten +Stone Brick=Stentegel +Stone Block=Stenblock +Mossy Cobblestone=Mossig kullersten +Desert Stone=Ökensten +Desert Cobblestone=Ökenkullersten +Desert Stone Brick=Ökenstenstegel +Desert Stone Block=Ökenstensblock +Sandstone=Sandsten +Sandstone Brick=Sandstenstegel +Sandstone Block=Sandstensblock +Desert Sandstone=Ökensandsten +Desert Sandstone Brick=Ökensandstenstegel +Desert Sandstone Block=Ökensandstensblock +Silver Sandstone=Silversandsten +Silver Sandstone Brick=Silversandstenstegel +Silver Sandstone Block=Silversandstensblock +Obsidian=Obsidian +Obsidian Brick=Obsidiantegel +Obsidian Block=Obsidianblock +Dirt=Jord +Dirt with Grass=Jord med gräs +Dirt with Grass and Footsteps=Jord med gräs och fotsteg +Dirt with Savanna Grass=Jord med savanngräs +Dirt with Snow=Jord med snö +Dirt with Rainforest Litter=Jord med regnskogströ +Dirt with Coniferous Litter=Jord med barrträd +Savanna Dirt=Savannjord +Savanna Dirt with Savanna Grass=Savannjord med savanngräs +Permafrost=Permafrost +Permafrost with Stones=Permafrost med sten +Permafrost with Moss=Permafrost med mossa +Sand=Sand +Desert Sand=Ökensand +Silver Sand=Silversand +Gravel=Grus +Clay=Lera +Snow=Snö +Snow Block=Snöblock +Ice=Is +Cave Ice=Grottis +Apple Tree=Äppleträd +Apple Wood Planks=Äppleträdplankor +Apple Tree Sapling=Äppleplanta +Apple Tree Leaves=Äpplelöv +Apple=Äpple +Apple Marker=Äpplemarkör +Jungle Tree=Djungelträd +Jungle Wood Planks=Djungelplankor +Jungle Tree Leaves=Djungellöv +Jungle Tree Sapling=Djungelplanta +Emergent Jungle Tree Sapling=Nybliven djungelplanta +Pine Tree=Tall +Pine Wood Planks=Tallplankor +Pine Needles=Granbarr +Pine Tree Sapling=Tallplanta +Acacia Tree=Akaciaträd +Acacia Wood Planks=Akaciaplankor +Acacia Tree Leaves=Akacialöv +Acacia Tree Sapling=Akaciaplanta +Aspen Tree=Asp +Aspen Wood Planks=Aspplankor +Aspen Tree Leaves=Asplöv +Aspen Tree Sapling=Aspplanta +Coal Ore=Kolmalm +Coal Block=Kolblock +Iron Ore=Järnmalm +Steel Block=Stålblock +Copper Ore=Kopparmalm +Copper Block=Kopparblock +Tin Ore=Tennmalm +Tin Block=Tennblock +Bronze Block=Bronsblock +Mese Ore=Mesemalm +Mese Block=Meseblock +Gold Ore=Guldmalm +Gold Block=Guldblock +Diamond Ore=Diamantmalm +Diamond Block=Diamantblock +Cactus=Kaktus +Large Cactus Seedling=Stor kaktusplanta +Papyrus=Papyrus +Dry Shrub=Torr buske +Jungle Grass=Djungelgräs +Grass=Gräs +Savanna Grass=Savanngräs +Fern=Ormbunke +Marram Grass=Marramgräs +Bush Stem=Buskstam +Bush Leaves=Busklöv +Bush Sapling=Buskplanta +Blueberry Bush Leaves with Berries=Blåbärsbuske med bär +Blueberry Bush Leaves=Blåbärsbuske +Blueberry Bush Sapling=Blåbärsbuskplanta +Acacia Bush Stem=Akaciabuskstam +Acacia Bush Leaves=Akaciabuske +Acacia Bush Sapling=Akaciabuskplanta +Pine Bush Stem=Tallbuskestam +Pine Bush Needles=Tallgranbarr +Pine Bush Sapling=Tallbuskplanta +Kelp=Brunalg +Green Coral=Grön korall +Pink Coral=Rosa korall +Cyan Coral=Cyan korall +Brown Coral=Brun korall +Orange Coral=Orange korall +Coral Skeleton=Korallskelett +Water Source=Vattenkälla +Flowing Water=Flytande vatten +River Water Source=Flodvattenkälla +Flowing River Water=Flytande flodvatten +Lava Source=Lavakälla +Flowing Lava=Flytande lava +Empty Bookshelf=Tom bokhylla +Bookshelf (@1 written, @2 empty books)=Bokhylla (@1 skriva, @2 tomma böcker) +Bookshelf=Bokhylla +Text too long=Texten är för lång +"@1"="@1" +Wooden Sign=Träskylt +Steel Sign=Stålskylt +Wooden Ladder=Trästege +Steel Ladder=Stålstege +Apple Wood Fence=Äppleträstaket +Acacia Wood Fence=Akaciastaket +Jungle Wood Fence=Djungelstaket +Pine Wood Fence=Tallstaket +Aspen Wood Fence=Aspträdstaket +Apple Wood Fence Rail=Äppleträstaketsräls +Acacia Wood Fence Rail=Akaciastaketsräls +Jungle Wood Fence Rail=Djungelstaketsräls +Pine Wood Fence Rail=Tallstaketsräls +Aspen Wood Fence Rail=Aspstaketsräls +Glass=Glas +Obsidian Glass=Obsidianglas +Brick Block=Tegelstensblock +Mese Lamp=Meselampa +Apple Wood Mese Post Light=Äppleträ-meselykta +Acacia Wood Mese Post Light=Acacia-meselykta +Jungle Wood Mese Post Light=Djungel-meselykta +Pine Wood Mese Post Light=Tall-meselykta +Aspen Wood Mese Post Light=Aspträ-meselykta +Cloud=Moln +Wooden Pickaxe=Trähacka +Stone Pickaxe=Stenhacka +Bronze Pickaxe=Bronshacka +Steel Pickaxe=Stålhacka +Mese Pickaxe=Mesehacka +Diamond Pickaxe=Diamanthacka +Wooden Shovel=Träspade +Stone Shovel=Stenspade +Bronze Shovel=Bronsspade +Steel Shovel=Stålspade +Mese Shovel=Mesespade +Diamond Shovel=Diamantspade +Wooden Axe=Träyxa +Stone Axe=Stenyxa +Bronze Axe=Bronsyxa +Steel Axe=Stålyxa +Mese Axe=Meseyxa +Diamond Axe=Diamantyxa +Wooden Sword=Träsvärd +Stone Sword=Stensvärd +Bronze Sword=Bronssvärd +Steel Sword=Stålsvärd +Mese Sword=Mesesvärd +Diamond Sword=Diamantsvärd +Torch=Fackla +@1 will intersect protection on growth.=@1 kommer korsa skyddet mot tillväxt. diff --git a/data/games/garage/mods/default/locale/default.uk.tr b/data/games/garage/mods/default/locale/default.uk.tr new file mode 100644 index 0000000..aa24bfb --- /dev/null +++ b/data/games/garage/mods/default/locale/default.uk.tr @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest=Замкнена скриня +Locked Chest (owned by @1)=Замкнена скриня (власник — @1) +You do not own this chest.=Ви — не власник цієї скрині. +a locked chest=замкнена скриня +Chest=Скриня +Write=Писати +Read=Читати +Title:=Заголовок: +Contents:=Вміст: +Save=Зберегти +by @1=Автор: @1 +Page @1 of @2=Сторінка @1 з @2 +The book you were writing to mysteriously disappeared.=Книга, в яку ви писали, загадковим чином зникла. +"@1" by @2=@2 — "@1" +Blueberries=Чорниці +Book=Книга +Book with Text=Книга з текстом +Bronze Ingot=Бронзовий злиток +Clay Brick=Глиняна цегла +Clay Lump=Шматок глини +Coal Lump=Шматок вугілля +Copper Ingot=Мідний злиток +Copper Lump=Шматок міді +Diamond=Діамант +Flint=Кремінь +Gold Ingot=Золотий злиток +Gold Lump=Шматок золота +Iron Lump=Шматок заліза +Mese Crystal=Кристал Месе +Mese Crystal Fragment=Уламок кристалу Месе +Obsidian Shard=Обсидіановий уламок +Paper=Папір +Steel Ingot=Сталевий злиток +Stick=Палиця +Tin Ingot=Олов'яний злиток +Tin Lump=Шматок олова +Furnace is empty=Піч порожня +100% (output full)=100% (піч переповнена) +@1%=@1% +Not cookable=Не може бути приготовано +Empty=Порожньо +Furnace active=Піч запалена +Furnace inactive=Піч не запалена +(Item: @1; Fuel: @2)=(Предмет: @1; Паливо: @2) +Furnace=Піч +Stone=Камінь +Cobblestone=Кругляк +Stone Brick=Кам'яна цегла +Stone Block=Блок каменю +Mossy Cobblestone=Моховитий кругляк +Desert Stone=Пустельний камінь +Desert Cobblestone=Пустельний кругляк +Desert Stone Brick=Цегла з пустельного каменю +Desert Stone Block=Блок пустельного каменю +Sandstone=Пісковик +Sandstone Brick=Пісковикова цегла +Sandstone Block=Блок пісковику +Desert Sandstone=Пустельний пісковик +Desert Sandstone Brick=Цегла з пустельного пісковику +Desert Sandstone Block=Блок пустельного пісковику +Silver Sandstone=Срібний пісковик +Silver Sandstone Brick=Цегла зі срібного пісковику +Silver Sandstone Block=Блок срібного пісковику +Obsidian=Обсидіан +Obsidian Brick=Обсидіанова цегла +Obsidian Block=Блок обсидіану +Dirt=Земля +Dirt with Grass=Земля з травою +Dirt with Grass and Footsteps=Земля з травою та слідами +Dirt with Savanna Grass=Земля із саванною травою +Dirt with Snow=Земля зі снігом +Dirt with Rainforest Litter=Земля з тропічно-лісовою підстилкою +Dirt with Coniferous Litter=Земля з хвойно-лісовою підстилкою +Savanna Dirt=Саванна земля +Savanna Dirt with Savanna Grass=Саванна земля із саванною травою +Permafrost=Вічна мерзлота +Permafrost with Stones=Вічна мерзлота з камінням +Permafrost with Moss=Вічна мерзлота з мохом +Sand=Пісок +Desert Sand=Пустельний пісок +Silver Sand=Срібний пісок +Gravel=Гравій +Clay=Глина +Snow=Сніг +Snow Block=Блок снігу +Ice=Крига +Cave Ice=Печерова крига +Apple Tree=Стовбур яблуні +Apple Wood Planks=Яблуневі дошки +Apple Tree Sapling=Саджанець яблуні +Apple Tree Leaves=Яблуневе листя +Apple=Яблуко +Apple Marker=Мітка яблука +Jungle Tree=Стовбур тропічного дерева +Jungle Wood Planks=Дошки з тропічного дерева +Jungle Tree Leaves=Листя тропічного дерева +Jungle Tree Sapling=Саджанець тропічного дерева +Emergent Jungle Tree Sapling=Молодий саджанець тропічного дерева +Pine Tree=Сосновий стовбур +Pine Wood Planks=Соснові дошки +Pine Needles=Соснова хвоя +Pine Tree Sapling=Саджанець сосни +Acacia Tree=Акацієвий стовбур +Acacia Wood Planks=Акацієві дошки +Acacia Tree Leaves=Акацієве листя +Acacia Tree Sapling=Саджанець акації +Aspen Tree=Осиковий стовбур +Aspen Wood Planks=Осикові дошки +Aspen Tree Leaves=Осикове листя +Aspen Tree Sapling=Саджанець осики +Coal Ore=Поклади вугілля +Coal Block=Блок вугілля +Iron Ore=Поклади заліза +Steel Block=Блок сталі +Copper Ore=Поклади міді +Copper Block=Блок міді +Tin Ore=Поклади олова +Tin Block=Блок олова +Bronze Block=Блок бронзи +Mese Ore=Поклади Месе +Mese Block=Блок Месе +Gold Ore=Поклади золота +Gold Block=Блок золота +Diamond Ore=Поклади діамантів +Diamond Block=Блок діамантів +Cactus=Кактус +Large Cactus Seedling=Великий саджанець кактуса +Papyrus=Папірус +Dry Shrub=Сухий кущ +Jungle Grass=Тропічна трава +Grass=Трава +Savanna Grass=Саванна трава +Fern=Папороть +Marram Grass=Пляжна трава +Bush Stem=Стебла куща +Bush Leaves=Листя куща +Bush Sapling=Саджанець куща +Blueberry Bush Leaves with Berries=Кущ чорниці з ягодами +Blueberry Bush Leaves=Кущ чорниці +Blueberry Bush Sapling=Саджанець куща чорниці +Acacia Bush Stem=Стебла акацієвого куща +Acacia Bush Leaves=Листя акацієвого куща +Acacia Bush Sapling=Саджанець акацієвого куща +Pine Bush Stem=Стебла соснового куща +Pine Bush Needles=Хвоя соснового куща +Pine Bush Sapling=Саджанець соснового куща +Kelp=Ламінарія +Green Coral=Зелений корал +Pink Coral=Рожевий корал +Cyan Coral=Блакитний корал +Brown Coral=Коричневий корал +Orange Coral=Помаранчевий корал +Coral Skeleton=Скелет корала +Water Source=Водне джерело +Flowing Water=Проточна вода +River Water Source=Річкове водне джерело +Flowing River Water=Проточна річкова вода +Lava Source=Лавове джерело +Flowing Lava=Проточна лава +Empty Bookshelf=Порожня книжкова полиця +Bookshelf (@1 written, @2 empty books)=Книжкова полиця (книги: @1 з текстом, @2 без тексту) +Bookshelf=Книжкова полиця +Text too long=Текст занадто довгий +"@1"="@1" +Wooden Sign=Дерев'яна табличка +Steel Sign=Сталева табличка +Wooden Ladder=Дерев'яна драбина +Steel Ladder=Сталева драбина +Apple Wood Fence=Яблуневий паркан +Acacia Wood Fence=Акацієвий паркан +Jungle Wood Fence=Паркан із тропічного дерева +Pine Wood Fence=Сосновий паркан +Aspen Wood Fence=Осиковий паркан +Apple Wood Fence Rail=Яблуневий рейковий паркан +Acacia Wood Fence Rail=Акацієвий рейковий паркан +Jungle Wood Fence Rail=Рейковий паркан з тропічного дерева +Pine Wood Fence Rail=Сосновий рейковий паркан +Aspen Wood Fence Rail=Осиковий рейковий паркан +Glass=Скло +Obsidian Glass=Обсидіанове скло +Brick Block=Цегляний блок +Mese Lamp=Месе-лампа +Apple Wood Mese Post Light=Яблуневий стовповий Месе-світильник +Acacia Wood Mese Post Light=Акацієвий стовповий Месе-світильник +Jungle Wood Mese Post Light=Стовповий Месе-світильник із тропічного дерева +Pine Wood Mese Post Light=Сосновий стовповий Месе-світильник +Aspen Wood Mese Post Light=Осиковий стовповий Месе-світильник +Cloud=Хмара +Wooden Pickaxe=Дерев'яне кайло +Stone Pickaxe=Кам'яне кайло +Bronze Pickaxe=Бронзове кайло +Steel Pickaxe=Сталеве кайло +Mese Pickaxe=Месе-кайло +Diamond Pickaxe=Діамантове кайло +Wooden Shovel=Дерев'яна лопата +Stone Shovel=Кам'яна лопата +Bronze Shovel=Бронзова лопата +Steel Shovel=Сталева лопата +Mese Shovel=Месе-лопата +Diamond Shovel=Діамантова лопата +Wooden Axe=Дерев'яна сокира +Stone Axe=Кам'яна сокира +Bronze Axe=Бронзова сокира +Steel Axe=Сталева сокира +Mese Axe=Месе-сокира +Diamond Axe=Діамантова сокира +Wooden Sword=Дерев'яний меч +Stone Sword=Кам'яний меч +Bronze Sword=Бронзовий меч +Steel Sword=Сталевий меч +Mese Sword=Месе-меч +Diamond Sword=Діамантовий меч +Torch=Смолоскип +@1 will intersect protection on growth.=@1 перетне захист коли виросте. diff --git a/data/games/garage/mods/default/locale/default.zh_CN.tr b/data/games/garage/mods/default/locale/default.zh_CN.tr new file mode 100644 index 0000000..c887df8 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.zh_CN.tr @@ -0,0 +1,221 @@ +# textdomain: default +Locked Chest=已上锁的箱子 +Locked Chest (owned by @1)=已上锁的箱子(属于@1) +You do not own this chest.=这个箱子不属于你所有。 +a locked chest=一个已上锁的箱子 +Chest=箱子 +Write=写 +Read=读 +Title:=标题: +Contents:=内容: +Save=保存 +by @1=由@1 +Page @1 of @2=第@1页,共@2页。 +The book you were writing to mysteriously disappeared.=你正在写的书不知为何消失了。 +"@1" by @2="@1" by @2 +Blueberries=蓝莓 +Book=书 +Book with Text=带文字的书 +Bronze Ingot=青铜锭 +Clay Brick=粘土砖 +Clay Lump=粘土块 +Coal Lump=煤块 +Copper Ingot=铜锭 +Copper Lump=铜块 +Diamond=钻石 +Flint=燧石 +Gold Ingot=金锭 +Gold Lump=金块 +Iron Lump=铁块 +Mese Crystal=黄石晶体 +Mese Crystal Fragment=黄石晶体碎片 +Obsidian Shard=黑曜石碎片 +Paper=纸 +Steel Ingot=铁锭 +Stick=棒 +Tin Ingot=锡锭 +Tin Lump=锡块 +Furnace is empty=熔炉是空的 +100% (output full)=100%(输出已满) +@1%=@1% +Not cookable=不可烹饪 +Empty=空 +Furnace active=熔炉正在运转 +Furnace inactive=熔炉未使用 +(Item: @1; Fuel: @2)=(项目:@1;燃料:@2) +Furnace=熔炉 +Stone=石 +Cobblestone=鹅卵石 +Stone Brick=石砖 +Stone Block=石方块 +Mossy Cobblestone=苔藓覆盖的鹅卵石 +Desert Stone=沙漠石 +Desert Cobblestone=沙漠鹅卵石 +Desert Stone Brick=沙漠鹅卵石砖 +Desert Stone Block=沙漠鹅卵石方块 +Sandstone=砂岩 +Sandstone Brick=砂岩砖 +Sandstone Block=砂岩方块 +Desert Sandstone=沙漠砂岩 +Desert Sandstone Brick=沙漠砂岩砖 +Desert Sandstone Block=沙漠砂岩方块 +Silver Sandstone=银砂岩 +Silver Sandstone Brick=银砂岩砖 +Silver Sandstone Block=银砂岩方块 +Obsidian=黑曜石 +Obsidian Brick=黑曜石砖 +Obsidian Block=黑曜石方块 +Dirt=土方块 +Dirt with Grass=草方块 +Dirt with Grass and Footsteps=带有脚印的草方块 +Dirt with Savanna Grass=草原草方块 +Dirt with Snow=雪土方块 +Dirt with Rainforest Litter=雨林凋落物土 +Dirt with Coniferous Litter=针叶林凋落物土 +Savanna Dirt=草原土 +Savanna Dirt with Savanna Grass=草原草方块 +Permafrost=多年冻土 +Permafrost with Stones=带石头的多年冻土 +Permafrost with Moss=生苔的多年冻土 +Sand=沙 +Desert Sand=沙漠沙 +Silver Sand=银沙 +Gravel=沙砾 +Clay=粘土 +Snow=雪 +Snow Block=雪方块 +Ice=冰 +Cave Ice=洞穴冰 +Apple Tree=苹果树 +Apple Wood Planks=苹果树木板 +Apple Tree Sapling=苹果树苗 +Apple Tree Leaves=苹果树叶 +Apple=苹果 +Apple Marker=苹果标记 +Jungle Tree=丛林树 +Jungle Wood Planks=丛林树木板 +Jungle Tree Leaves=丛林树叶 +Jungle Tree Sapling=丛林树苗 +Emergent Jungle Tree Sapling=露生层丛林树苗 +Pine Tree=松树 +Pine Wood Planks=松树木板 +Pine Needles=松针 +Pine Tree Sapling=松树树苗 +Acacia Tree=相思树 +Acacia Wood Planks=相思树木板 +Acacia Tree Leaves=相思树叶 +Acacia Tree Sapling=相思树树苗 +Aspen Tree=白杨树 +Aspen Wood Planks=白杨树木板 +Aspen Tree Leaves=白杨树叶 +Aspen Tree Sapling=白杨树树苗 +Coal Ore=煤炭矿石 +Coal Block=煤炭方块 +Iron Ore=铁矿石 +Steel Block=钢方块 +Copper Ore=铜矿石 +Copper Block=铜方块 +Tin Ore=锡矿石 +Tin Block=锡方块 +Bronze Block=青铜方块 +Mese Ore=黄石矿石 +Mese Block=黄石方块 +Gold Ore=金矿石 +Gold Block=金方块 +Diamond Ore=钻石矿石 +Diamond Block=钻石方块 +Cactus=仙人掌 +Large Cactus Seedling=大仙人掌苗 +Papyrus=莎草纸 +Dry Shrub=干灌木 +Jungle Grass=丛林草 +Grass=草 +Savanna Grass=草原草 +Fern=蕨 +Marram Grass=滨草 +Bush Stem=灌木 +Bush Leaves=灌木叶 +Bush Sapling=灌木苗 +Blueberry Bush Leaves with Berries=长蓝莓的蓝莓灌木叶 +Blueberry Bush Leaves=蓝莓灌木叶 +Blueberry Bush Sapling=蓝莓灌木苗 +Acacia Bush Stem=相思灌木 +Acacia Bush Leaves=相思灌木叶 +Acacia Bush Sapling=相思灌木苗 +Pine Bush Stem=松树灌木 +Pine Bush Needles=松树灌木针 +Pine Bush Sapling=松树灌木苗 +Kelp=海带 +Green Coral=绿珊瑚 +Pink Coral=淡红珊瑚 +Cyan Coral=青珊瑚 +Brown Coral=棕珊瑚 +Orange Coral=橙珊瑚 +Coral Skeleton=珊瑚骨架 +Water Source=水方块 +Flowing Water=流动的水 +River Water Source=河水方块 +Flowing River Water=流动的河水 +Lava Source=岩浆方块 +Flowing Lava=流动的岩浆 +Empty Bookshelf=空书架 +Bookshelf (@1 written, @2 empty books)=书架(@1本有字的书,@2本空书) +Bookshelf=书架 +Text too long=文字太长 +"@1"="@1" +Wooden Sign=木牌 +Steel Sign=铁牌 +Wooden Ladder=木梯子 +Steel Ladder=铁梯子 +Apple Wood Fence=苹果木栅栏 +Acacia Wood Fence=相思木栅栏 +Jungle Wood Fence=丛林木栅栏 +Pine Wood Fence=松木栅栏 +Aspen Wood Fence=白杨木栅栏 +Apple Wood Fence Rail=苹果木栏杆 +Acacia Wood Fence Rail=相思木栏杆 +Jungle Wood Fence Rail=丛林木栏杆 +Pine Wood Fence Rail=松木栏杆 +Aspen Wood Fence Rail=白杨木栏杆 +Glass=玻璃 +Obsidian Glass=黑曜石玻璃 +Brick Block=砖方块 +Mese Lamp=黄石灯 +Apple Wood Mese Post Light=苹果木黄石灯柱 +Acacia Wood Mese Post Light=金合欢木黄石灯柱 +Jungle Wood Mese Post Light=丛林木黄石灯柱 +Pine Wood Mese Post Light=松木黄石灯柱 +Aspen Wood Mese Post Light=白杨木黄石灯柱 +Cloud=云 +Wooden Pickaxe=木镐 +Stone Pickaxe=石镐 +Bronze Pickaxe=青铜镐 +Steel Pickaxe=铁镐 +Mese Pickaxe=黄石镐 +Diamond Pickaxe=钻石镐 +Wooden Shovel=木铲 +Stone Shovel=石铲 +Bronze Shovel=青铜铲 +Steel Shovel=铁铲 +Mese Shovel=黄石铲 +Diamond Shovel=钻石铲 +Wooden Axe=木斧 +Stone Axe=石斧 +Bronze Axe=青铜斧 +Steel Axe=铁斧 +Mese Axe=黄石斧 +Diamond Axe=钻石斧 +Wooden Sword=木剑 +Stone Sword=石剑 +Bronze Sword=青铜剑 +Steel Sword=铁剑 +Mese Sword=黄石剑 +Diamond Sword=钻石剑 +Torch=火把 +@1 will intersect protection on growth.=@1生长时将与保护区域相交。 + + +##### not used anymore ##### + +Dirt with Dry Grass=干草土方块 +Dry Grass=干草 diff --git a/data/games/garage/mods/default/locale/default.zh_TW.tr b/data/games/garage/mods/default/locale/default.zh_TW.tr new file mode 100644 index 0000000..bd638b4 --- /dev/null +++ b/data/games/garage/mods/default/locale/default.zh_TW.tr @@ -0,0 +1,221 @@ +# textdomain: default +Locked Chest=已上鎖的箱子 +Locked Chest (owned by @1)=已上鎖的箱子(屬於@1所有) +You do not own this chest.=這個箱子不屬於你所有。 +a locked chest=一個已上鎖的箱子 +Chest=箱子 +Write=寫 +Read=讀 +Title:=標題: +Contents:=內容: +Save=保存 +by @1=由@1 +Page @1 of @2=第@1頁,共@2頁。 +The book you were writing to mysteriously disappeared.=你正在寫的書神秘消失了。 +"@1" by @2="@1" by @2 +Blueberries=藍莓 +Book=書 +Book with Text=帶文字的書 +Bronze Ingot=青銅錠 +Clay Brick=粘土磚 +Clay Lump=粘土塊 +Coal Lump=煤塊 +Copper Ingot=銅錠 +Copper Lump=銅塊 +Diamond=鑽石 +Flint=燧石 +Gold Ingot=金錠 +Gold Lump=金塊 +Iron Lump=鐵塊 +Mese Crystal=黃石晶體 +Mese Crystal Fragment=黃石晶體碎片 +Obsidian Shard=黑曜石碎片 +Paper=紙 +Steel Ingot=鐵錠 +Stick=棒 +Tin Ingot=錫錠 +Tin Lump=錫塊 +Furnace is empty=熔爐是空的 +100% (output full)=100%(輸出已滿) +@1%=@1% +Not cookable=不可烹飪 +Empty=空 +Furnace active=熔爐正在運轉 +Furnace inactive=熔爐未使用 +(Item: @1; Fuel: @2)=(項目:@1;燃料:@2) +Furnace=熔爐 +Stone=石 +Cobblestone=鵝卵石 +Stone Brick=石磚 +Stone Block=石方塊 +Mossy Cobblestone=苔蘚覆蓋的鵝卵石 +Desert Stone=沙漠石 +Desert Cobblestone=沙漠鵝卵石 +Desert Stone Brick=沙漠鵝卵石磚 +Desert Stone Block=沙漠鵝卵石方塊 +Sandstone=砂岩 +Sandstone Brick=砂岩磚 +Sandstone Block=砂岩方塊 +Desert Sandstone=沙漠砂岩 +Desert Sandstone Brick=沙漠砂岩磚 +Desert Sandstone Block=沙漠砂岩方塊 +Silver Sandstone=銀砂岩 +Silver Sandstone Brick=銀砂岩磚 +Silver Sandstone Block=銀砂岩方塊 +Obsidian=黑曜石 +Obsidian Brick=黑曜石磚 +Obsidian Block=黑曜石方塊 +Dirt=土方塊 +Dirt with Grass=草方塊 +Dirt with Grass and Footsteps=草方塊及腳印 +Dirt with Savanna Grass=草原草方塊 +Dirt with Snow=雪土方塊 +Dirt with Rainforest Litter=雨林腐土 +Dirt with Coniferous Litter=針葉林腐土 +Savanna Dirt=草原土 +Savanna Dirt with Savanna Grass=草原草方塊(草原土) +Permafrost=多年凍土 +Permafrost with Stones=帶石頭的多年凍土 +Permafrost with Moss=生苔的多年凍土 +Sand=沙 +Desert Sand=沙漠沙 +Silver Sand=銀沙 +Gravel=沙礫 +Clay=粘土 +Snow=雪 +Snow Block=雪方塊 +Ice=冰 +Cave Ice=洞穴冰 +Apple Tree=蘋果樹 +Apple Wood Planks=蘋果樹木板 +Apple Tree Sapling=蘋果樹苗 +Apple Tree Leaves=蘋果樹葉 +Apple=蘋果 +Apple Marker=蘋果標記 +Jungle Tree=叢林樹 +Jungle Wood Planks=叢林樹木板 +Jungle Tree Leaves=叢林樹葉 +Jungle Tree Sapling=叢林樹苗 +Emergent Jungle Tree Sapling=應急叢林樹苗 +Pine Tree=松樹 +Pine Wood Planks=松樹木板 +Pine Needles=松針 +Pine Tree Sapling=松樹樹苗 +Acacia Tree=相思樹 +Acacia Wood Planks=相思樹木板 +Acacia Tree Leaves=相思樹葉 +Acacia Tree Sapling=相思樹樹苗 +Aspen Tree=白楊樹 +Aspen Wood Planks=白楊樹木板 +Aspen Tree Leaves=白楊樹葉 +Aspen Tree Sapling=白楊樹樹苗 +Coal Ore=煤炭礦石 +Coal Block=煤炭方塊 +Iron Ore=鐵礦石 +Steel Block=鋼方塊 +Copper Ore=銅礦石 +Copper Block=銅方塊 +Tin Ore=錫礦石 +Tin Block=錫方塊 +Bronze Block=青銅方塊 +Mese Ore=黃石礦石 +Mese Block=黃石方塊 +Gold Ore=金礦石 +Gold Block=金方塊 +Diamond Ore=鑽石礦石 +Diamond Block=鑽石方塊 +Cactus=仙人掌 +Large Cactus Seedling=大仙人掌苗 +Papyrus=莎草紙 +Dry Shrub=幹灌木 +Jungle Grass=叢林草 +Grass=草 +Savanna Grass= +Fern=蕨 +Marram Grass=濱草 +Bush Stem=灌木 +Bush Leaves=灌木葉 +Bush Sapling=灌木苗 +Blueberry Bush Leaves with Berries=藍莓灌木葉與漿果 +Blueberry Bush Leaves=藍莓灌木葉 +Blueberry Bush Sapling=藍莓灌木苗 +Acacia Bush Stem=相思灌木 +Acacia Bush Leaves=相思灌木葉 +Acacia Bush Sapling=相思灌木苗 +Pine Bush Stem=松樹灌木 +Pine Bush Needles=松樹灌木針 +Pine Bush Sapling=松樹灌木苗 +Kelp=海帶 +Green Coral=綠珊瑚 +Pink Coral=淡紅珊瑚 +Cyan Coral=青珊瑚 +Brown Coral=棕珊瑚 +Orange Coral=橙珊瑚 +Coral Skeleton=珊瑚骨架 +Water Source=水方塊 +Flowing Water=流動的水 +River Water Source=河水方塊 +Flowing River Water=流動的河水 +Lava Source=岩漿方塊 +Flowing Lava=流動的岩漿 +Empty Bookshelf=空書架 +Bookshelf (@1 written, @2 empty books)=書架(@1本有字的書,@2本空書) +Bookshelf=書架 +Text too long=文字太長 +"@1"="@1" +Wooden Sign=木牌 +Steel Sign=鐵牌 +Wooden Ladder=木梯子 +Steel Ladder=鐵梯子 +Apple Wood Fence=蘋果木柵欄 +Acacia Wood Fence=相思木柵欄 +Jungle Wood Fence=叢林木柵欄 +Pine Wood Fence=松木柵欄 +Aspen Wood Fence=白楊木柵欄 +Apple Wood Fence Rail=蘋果木欄杆 +Acacia Wood Fence Rail=相思木欄杆 +Jungle Wood Fence Rail=叢林木欄杆 +Pine Wood Fence Rail=松木欄杆 +Aspen Wood Fence Rail=白楊木欄杆 +Glass=玻璃 +Obsidian Glass=黑曜石玻璃 +Brick Block=磚方塊 +Mese Lamp=黃石燈 +Apple Wood Mese Post Light=蘋果木黃石燈柱 +Acacia Wood Mese Post Light=金合歡木黃石燈柱 +Jungle Wood Mese Post Light=叢林木黃石燈柱 +Pine Wood Mese Post Light=松木黃石燈柱 +Aspen Wood Mese Post Light=白楊木黃石燈柱 +Cloud=雲 +Wooden Pickaxe=木鎬 +Stone Pickaxe=石鎬 +Bronze Pickaxe=青銅鎬 +Steel Pickaxe=鐵鎬 +Mese Pickaxe=黃石鎬 +Diamond Pickaxe=鑽石鎬 +Wooden Shovel=木鏟 +Stone Shovel=石鏟 +Bronze Shovel=青銅鏟 +Steel Shovel=鐵鏟 +Mese Shovel=黃石鏟 +Diamond Shovel=鑽石鏟 +Wooden Axe=木斧 +Stone Axe=石斧 +Bronze Axe=青銅斧 +Steel Axe=鐵斧 +Mese Axe=黃石斧 +Diamond Axe=鑽石斧 +Wooden Sword=木劍 +Stone Sword=石劍 +Bronze Sword=青銅劍 +Steel Sword=鐵劍 +Mese Sword=黃石劍 +Diamond Sword=鑽石劍 +Torch=火把 +@1 will intersect protection on growth.=@1將與增長的保護相交。 + + +##### not used anymore ##### + +Dirt with Dry Grass=乾草土方塊 +Dry Grass=乾草 diff --git a/data/games/garage/mods/default/locale/template.txt b/data/games/garage/mods/default/locale/template.txt new file mode 100644 index 0000000..815c29c --- /dev/null +++ b/data/games/garage/mods/default/locale/template.txt @@ -0,0 +1,215 @@ +# textdomain: default +Locked Chest= +Locked Chest (owned by @1)= +You do not own this chest.= +a locked chest= +Chest= +Write= +Read= +Title:= +Contents:= +Save= +by @1= +Page @1 of @2= +The book you were writing to mysteriously disappeared.= +"@1" by @2= +Blueberries= +Book= +Book with Text= +Bronze Ingot= +Clay Brick= +Clay Lump= +Coal Lump= +Copper Ingot= +Copper Lump= +Diamond= +Flint= +Gold Ingot= +Gold Lump= +Iron Lump= +Mese Crystal= +Mese Crystal Fragment= +Obsidian Shard= +Paper= +Steel Ingot= +Stick= +Tin Ingot= +Tin Lump= +Furnace is empty= +100% (output full)= +@1%= +Not cookable= +Empty= +Furnace active= +Furnace inactive= +(Item: @1; Fuel: @2)= +Furnace= +Stone= +Cobblestone= +Stone Brick= +Stone Block= +Mossy Cobblestone= +Desert Stone= +Desert Cobblestone= +Desert Stone Brick= +Desert Stone Block= +Sandstone= +Sandstone Brick= +Sandstone Block= +Desert Sandstone= +Desert Sandstone Brick= +Desert Sandstone Block= +Silver Sandstone= +Silver Sandstone Brick= +Silver Sandstone Block= +Obsidian= +Obsidian Brick= +Obsidian Block= +Dirt= +Dirt with Grass= +Dirt with Grass and Footsteps= +Dirt with Savanna Grass= +Dirt with Snow= +Dirt with Rainforest Litter= +Dirt with Coniferous Litter= +Savanna Dirt= +Savanna Dirt with Savanna Grass= +Permafrost= +Permafrost with Stones= +Permafrost with Moss= +Sand= +Desert Sand= +Silver Sand= +Gravel= +Clay= +Snow= +Snow Block= +Ice= +Cave Ice= +Apple Tree= +Apple Wood Planks= +Apple Tree Sapling= +Apple Tree Leaves= +Apple= +Apple Marker= +Jungle Tree= +Jungle Wood Planks= +Jungle Tree Leaves= +Jungle Tree Sapling= +Emergent Jungle Tree Sapling= +Pine Tree= +Pine Wood Planks= +Pine Needles= +Pine Tree Sapling= +Acacia Tree= +Acacia Wood Planks= +Acacia Tree Leaves= +Acacia Tree Sapling= +Aspen Tree= +Aspen Wood Planks= +Aspen Tree Leaves= +Aspen Tree Sapling= +Coal Ore= +Coal Block= +Iron Ore= +Steel Block= +Copper Ore= +Copper Block= +Tin Ore= +Tin Block= +Bronze Block= +Mese Ore= +Mese Block= +Gold Ore= +Gold Block= +Diamond Ore= +Diamond Block= +Cactus= +Large Cactus Seedling= +Papyrus= +Dry Shrub= +Jungle Grass= +Grass= +Savanna Grass= +Fern= +Marram Grass= +Bush Stem= +Bush Leaves= +Bush Sapling= +Blueberry Bush Leaves with Berries= +Blueberry Bush Leaves= +Blueberry Bush Sapling= +Acacia Bush Stem= +Acacia Bush Leaves= +Acacia Bush Sapling= +Pine Bush Stem= +Pine Bush Needles= +Pine Bush Sapling= +Kelp= +Green Coral= +Pink Coral= +Cyan Coral= +Brown Coral= +Orange Coral= +Coral Skeleton= +Water Source= +Flowing Water= +River Water Source= +Flowing River Water= +Lava Source= +Flowing Lava= +Empty Bookshelf= +Bookshelf (@1 written, @2 empty books)= +Bookshelf= +Text too long= +"@1"= +Wooden Sign= +Steel Sign= +Wooden Ladder= +Steel Ladder= +Apple Wood Fence= +Acacia Wood Fence= +Jungle Wood Fence= +Pine Wood Fence= +Aspen Wood Fence= +Apple Wood Fence Rail= +Acacia Wood Fence Rail= +Jungle Wood Fence Rail= +Pine Wood Fence Rail= +Aspen Wood Fence Rail= +Glass= +Obsidian Glass= +Brick Block= +Mese Lamp= +Apple Wood Mese Post Light= +Acacia Wood Mese Post Light= +Jungle Wood Mese Post Light= +Pine Wood Mese Post Light= +Aspen Wood Mese Post Light= +Cloud= +Wooden Pickaxe= +Stone Pickaxe= +Bronze Pickaxe= +Steel Pickaxe= +Mese Pickaxe= +Diamond Pickaxe= +Wooden Shovel= +Stone Shovel= +Bronze Shovel= +Steel Shovel= +Mese Shovel= +Diamond Shovel= +Wooden Axe= +Stone Axe= +Bronze Axe= +Steel Axe= +Mese Axe= +Diamond Axe= +Wooden Sword= +Stone Sword= +Bronze Sword= +Steel Sword= +Mese Sword= +Diamond Sword= +Torch= +@1 will intersect protection on growth.= diff --git a/data/games/garage/mods/default/mapgen.lua b/data/games/garage/mods/default/mapgen.lua new file mode 100644 index 0000000..cc5b9bf --- /dev/null +++ b/data/games/garage/mods/default/mapgen.lua @@ -0,0 +1,2489 @@ +-- +-- Aliases for map generators +-- + +-- All mapgens + +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") + +-- Additional aliases needed for mapgen v6 + +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("mapgen_snowblock", "default:snowblock") +minetest.register_alias("mapgen_snow", "default:snow") +minetest.register_alias("mapgen_ice", "default:ice") + +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_jungletree", "default:jungletree") +minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_pine_tree", "default:pine_tree") +minetest.register_alias("mapgen_pine_needles", "default:pine_needles") + +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_stair_desert_stone", "stairs:stair_desert_stone") + + +-- +-- Register ores +-- + +-- Mgv6 + +function default.register_mgv6_ores() + + -- Blob ore + -- These first to avoid other ores in blobs + + -- Clay + -- This first to avoid clay in sand blobs + + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 0, + y_min = -15, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Sand + + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone", "default:desert_stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 0, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Dirt + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + }) + + -- Gravel + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + }) + + -- Scatter ores + + -- Coal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 8, + clust_size = 3, + y_max = 64, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_max = 0, + y_min = -31000, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = 0, + y_min = -31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24 * 24 * 24, + clust_num_ores = 27, + clust_size = 6, + y_max = -64, + y_min = -31000, + }) + + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_max = -16, + y_min = -63, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = -64, + y_min = -31000, + }) + + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 4, + clust_size = 3, + y_max = -32, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Gold + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Mese crystal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Diamond + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17 * 17 * 17, + clust_num_ores = 4, + clust_size = 3, + y_max = -128, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = -256, + y_min = -31000, + }) + + -- Mese block + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = -1024, + y_min = -31000, + }) +end + + +-- All mapgens except mgv6 + +function default.register_ores() + + -- Stratum ores. + -- These obviously first. + + -- Silver sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"cold_desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:silver_sandstone", + wherein = {"default:stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"cold_desert"}, + }) + + -- Desert sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 46, + y_min = 10, + noise_params = { + offset = 28, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = {"desert"}, + }) + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:desert_sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 42, + y_min = 6, + noise_params = { + offset = 24, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Sandstone + + minetest.register_ore({ + ore_type = "stratum", + ore = "default:sandstone", + wherein = {"default:desert_stone"}, + clust_scarcity = 1, + y_max = 39, + y_min = 3, + noise_params = { + offset = 21, + scale = 16, + spread = {x = 128, y = 128, z = 128}, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = {"desert"}, + }) + + -- Blob ore. + -- These before scatter ores to avoid other ores in blobs. + + -- Clay + + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 0, + y_min = -15, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = -316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Silver sand + + minetest.register_ore({ + ore_type = "blob", + ore = "default:silver_sand", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Dirt + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + -- Only where default:dirt is present as surface material + biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", + "deciduous_forest", "deciduous_forest_shore", "rainforest", + "rainforest_swamp"} + }) + + -- Gravel + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = 31000, + y_min = -31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + }) + + -- Scatter ores + + -- Coal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 8, + clust_size = 3, + y_max = 64, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 30, + clust_size = 5, + y_max = -128, + y_min = -31000, + }) + + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 4, + clust_size = 3, + y_max = -64, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Copper + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 4, + clust_size = 3, + y_max = -64, + y_min = -127, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, + }) + + -- Iron + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -255, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 29, + clust_size = 5, + y_max = -256, + y_min = -31000, + }) + + -- Gold + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_max = -256, + y_min = -511, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = -512, + y_min = -31000, + }) + + -- Mese crystal + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 3, + clust_size = 2, + y_max = -512, + y_min = -1023, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = -1024, + y_min = -31000, + }) + + -- Diamond + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17 * 17 * 17, + clust_num_ores = 4, + clust_size = 3, + y_max = -1024, + y_min = -2047, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 4, + clust_size = 3, + y_max = -2048, + y_min = -31000, + }) + + -- Mese block + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = 31000, + y_min = 1025, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36 * 36 * 36, + clust_num_ores = 3, + clust_size = 2, + y_max = -2048, + y_min = -4095, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 28 * 28 * 28, + clust_num_ores = 5, + clust_size = 3, + y_max = -4096, + y_min = -31000, + }) +end + + +-- +-- Register biomes +-- + +-- All mapgens except mgv6 + +function default.register_biomes() + + -- Icesheet + + minetest.register_biome({ + name = "icesheet", + node_dust = "default:snowblock", + node_top = "default:snowblock", + depth_top = 1, + node_filler = "default:snowblock", + depth_filler = 3, + node_stone = "default:cave_ice", + node_water_top = "default:ice", + depth_water_top = 10, + node_river_water = "default:ice", + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:ice", + node_dungeon_stair = "stairs:stair_ice", + y_max = 31000, + y_min = -8, + heat_point = 0, + humidity_point = 73, + }) + + minetest.register_biome({ + name = "icesheet_ocean", + node_dust = "default:snowblock", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_water_top = "default:ice", + depth_water_top = 10, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -9, + y_min = -255, + heat_point = 0, + humidity_point = 73, + }) + + minetest.register_biome({ + name = "icesheet_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 0, + humidity_point = 73, + }) + + -- Tundra + + minetest.register_biome({ + name = "tundra_highland", + node_dust = "default:snow", + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 47, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra", + node_top = "default:permafrost_with_stones", + depth_top = 1, + node_filler = "default:permafrost", + depth_filler = 1, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 4, + y_max = 46, + y_min = 2, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_beach", + node_top = "default:gravel", + depth_top = 1, + node_filler = "default:gravel", + depth_filler = 2, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 1, + y_min = -3, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:gravel", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -4, + y_min = -255, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 0, + humidity_point = 40, + }) + + -- Taiga + + minetest.register_biome({ + name = "taiga", + node_dust = "default:snow", + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 25, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "taiga_ocean", + node_dust = "default:snow", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 25, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "taiga_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 25, + humidity_point = 70, + }) + + -- Snowy grassland + + minetest.register_biome({ + name = "snowy_grassland", + node_dust = "default:snow", + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 20, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "snowy_grassland_ocean", + node_dust = "default:snow", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 20, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "snowy_grassland_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 20, + humidity_point = 35, + }) + + -- Grassland + + minetest.register_biome({ + name = "grassland", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "grassland_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 50, + humidity_point = 35, + }) + + -- Coniferous forest + + minetest.register_biome({ + name = "coniferous_forest", + node_top = "default:dirt_with_coniferous_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 6, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_dunes", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 5, + y_min = 4, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 3, + y_min = -255, + heat_point = 45, + humidity_point = 70, + }) + + minetest.register_biome({ + name = "coniferous_forest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 45, + humidity_point = 70, + }) + + -- Deciduous forest + + minetest.register_biome({ + name = "deciduous_forest", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_shore", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 60, + humidity_point = 68, + }) + + minetest.register_biome({ + name = "deciduous_forest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 60, + humidity_point = 68, + }) + + -- Desert + + minetest.register_biome({ + name = "desert", + node_top = "default:desert_sand", + depth_top = 1, + node_filler = "default:desert_sand", + depth_filler = 1, + node_stone = "default:desert_stone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:desert_stone", + node_dungeon_stair = "stairs:stair_desert_stone", + y_max = 31000, + y_min = 4, + heat_point = 92, + humidity_point = 16, + }) + + minetest.register_biome({ + name = "desert_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_stone = "default:desert_stone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:desert_stone", + node_dungeon_stair = "stairs:stair_desert_stone", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 92, + humidity_point = 16, + }) + + minetest.register_biome({ + name = "desert_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 92, + humidity_point = 16, + }) + + -- Sandstone desert + + minetest.register_biome({ + name = "sandstone_desert", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 1, + node_stone = "default:sandstone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone_block", + y_max = 31000, + y_min = 4, + heat_point = 60, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "sandstone_desert_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_stone = "default:sandstone", + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:sandstonebrick", + node_dungeon_stair = "stairs:stair_sandstone_block", + y_max = 3, + y_min = -255, + heat_point = 60, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "sandstone_desert_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 60, + humidity_point = 0, + }) + + -- Cold desert + + minetest.register_biome({ + name = "cold_desert", + node_top = "default:silver_sand", + depth_top = 1, + node_filler = "default:silver_sand", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 4, + heat_point = 40, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "cold_desert_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = 3, + y_min = -255, + heat_point = 40, + humidity_point = 0, + }) + + minetest.register_biome({ + name = "cold_desert_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 40, + humidity_point = 0, + }) + + -- Savanna + + minetest.register_biome({ + name = "savanna", + node_top = "default:dry_dirt_with_dry_grass", + depth_top = 1, + node_filler = "default:dry_dirt", + depth_filler = 1, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_shore", + node_top = "default:dry_dirt", + depth_top = 1, + node_filler = "default:dry_dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 89, + humidity_point = 42, + }) + + minetest.register_biome({ + name = "savanna_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 89, + humidity_point = 42, + }) + + -- Rainforest + + minetest.register_biome({ + name = "rainforest", + node_top = "default:dirt_with_rainforest_litter", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 31000, + y_min = 1, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_swamp", + node_top = "default:dirt", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = 0, + y_min = -1, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_ocean", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + node_riverbed = "default:sand", + depth_riverbed = 2, + node_cave_liquid = "default:water_source", + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + vertical_blend = 1, + y_max = -2, + y_min = -255, + heat_point = 86, + humidity_point = 65, + }) + + minetest.register_biome({ + name = "rainforest_under", + node_cave_liquid = {"default:water_source", "default:lava_source"}, + node_dungeon = "default:cobble", + node_dungeon_alt = "default:mossycobble", + node_dungeon_stair = "stairs:stair_cobble", + y_max = -256, + y_min = -31000, + heat_point = 86, + humidity_point = 65, + }) +end + + +-- +-- Register decorations +-- + +-- Mgv6 + +function default.register_mgv6_decorations() + + -- Papyrus + + minetest.register_decoration({ + name = "default:papyrus", + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 100, y = 100, z = 100}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + y_max = 1, + y_min = 1, + decoration = "default:papyrus", + height = 2, + height_max = 4, + spawn_by = "default:water_source", + num_spawn_by = 1, + }) + + -- Cacti + + minetest.register_decoration({ + name = "default:cactus", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x = 100, y = 100, z = 100}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "default:cactus", + height = 3, + height_max = 4, + }) + + -- Long grasses + + for length = 1, 5 do + minetest.register_decoration({ + name = "default:grass_"..length, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.007, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "default:grass_"..length, + }) + end + + -- Dry shrubs + + minetest.register_decoration({ + name = "default:dry_shrub", + deco_type = "simple", + place_on = {"default:desert_sand", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "default:dry_shrub", + param2 = 4, + }) +end + + +-- All mapgens except mgv6 + +local function register_grass_decoration(offset, scale, length) + minetest.register_decoration({ + name = "default:grass_" .. length, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland", "deciduous_forest"}, + y_max = 31000, + y_min = 1, + decoration = "default:grass_" .. length, + }) +end + +local function register_dry_grass_decoration(offset, scale, length) + minetest.register_decoration({ + name = "default:dry_grass_" .. length, + deco_type = "simple", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + decoration = "default:dry_grass_" .. length, + }) +end + +local function register_fern_decoration(seed, length) + minetest.register_decoration({ + name = "default:fern_" .. length, + deco_type = "simple", + place_on = {"default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.2, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.7 + }, + biomes = {"coniferous_forest"}, + y_max = 31000, + y_min = 6, + decoration = "default:fern_" .. length, + }) +end + + +function default.register_decorations() + -- Savanna bare dirt patches. + -- Must come before all savanna decorations that are placed on dry grass. + -- Noise is similar to long dry grass noise, but scale inverted, to appear + -- where long dry grass is least dense and shortest. + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 4, + noise_params = { + offset = -1.5, + scale = -1.5, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 4, + persist = 1.0 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + decoration = "default:dry_dirt", + place_offset_y = -1, + flags = "force_placement", + }) + + -- Apple tree and log + + minetest.register_decoration({ + name = "default:apple_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.024, + scale = 0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/apple_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "default:apple_log", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0012, + scale = 0.0007, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/apple_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, + }) + + -- Emergent jungle tree + -- Due to 32 node height, altitude is limited and prescence depends on chunksize + + local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) + if chunksize >= 5 then + minetest.register_decoration({ + name = "default:emergent_jungle_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + noise_params = { + offset = 0.0, + scale = 0.0025, + spread = {x = 250, y = 250, z = 250}, + seed = 2685, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest"}, + y_max = 32, + y_min = 1, + schematic = minetest.get_modpath("default") .. + "/schematics/emergent_jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + place_offset_y = -4, + }) + end + + -- Jungle tree and log + + minetest.register_decoration({ + name = "default:jungle_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Swamp jungle trees + + minetest.register_decoration({ + name = "default:jungle_tree(swamp)", + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + -- Noise tuned to place swamp trees where papyrus is absent + noise_params = { + offset = 0.0, + scale = -0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 1, + persist = 0.5 + }, + biomes = {"rainforest_swamp"}, + y_max = 0, + y_min = -1, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "default:jungle_log", + deco_type = "schematic", + place_on = {"default:dirt_with_rainforest_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.005, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_rainforest_litter", + num_spawn_by = 8, + }) + + -- Taiga and temperate coniferous forest pine tree, small pine tree and log + + minetest.register_decoration({ + name = "default:pine_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0.010, + scale = 0.048, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + name = "default:small_pine_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0.010, + scale = -0.048, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/small_pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + name = "default:pine_log", + deco_type = "schematic", + place_on = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + place_offset_y = 1, + sidelen = 80, + fill_ratio = 0.0018, + biomes = {"taiga", "coniferous_forest"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = {"default:dirt_with_snow", "default:dirt_with_coniferous_litter"}, + num_spawn_by = 8, + }) + + -- Acacia tree and log + + minetest.register_decoration({ + name = "default:acacia_tree", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + name = "default:acacia_log", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dry_dirt_with_dry_grass", + num_spawn_by = 8, + }) + + -- Aspen tree and log + + minetest.register_decoration({ + name = "default:aspen_tree", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.015, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/aspen_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + name = "default:aspen_log", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.0008, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/aspen_log.mts", + flags = "place_center_x", + rotation = "random", + spawn_by = "default:dirt_with_grass", + num_spawn_by = 8, + }) + + -- Large cactus + + minetest.register_decoration({ + name = "default:large_cactus", + deco_type = "schematic", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = {x = 200, y = 200, z = 200}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Cactus + + minetest.register_decoration({ + name = "default:cactus", + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = {x = 200, y = 200, z = 200}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert"}, + y_max = 31000, + y_min = 4, + decoration = "default:cactus", + height = 2, + height_max = 5, + }) + + -- Papyrus + + -- Dirt version for rainforest swamp + + minetest.register_decoration({ + name = "default:papyrus_on_dirt", + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest_swamp"}, + y_max = 0, + y_min = 0, + schematic = minetest.get_modpath("default") .. "/schematics/papyrus_on_dirt.mts", + }) + + -- Dry dirt version for savanna shore + + minetest.register_decoration({ + name = "default:papyrus_on_dry_dirt", + deco_type = "schematic", + place_on = {"default:dry_dirt"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + biomes = {"savanna_shore"}, + y_max = 0, + y_min = 0, + schematic = minetest.get_modpath("default") .. + "/schematics/papyrus_on_dry_dirt.mts", + }) + + -- Bush + + minetest.register_decoration({ + name = "default:bush", + deco_type = "schematic", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland", "deciduous_forest"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Blueberry bush + + minetest.register_decoration({ + name = "default:blueberry_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_grass", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = {"grassland", "snowy_grassland"}, + y_max = 31000, + y_min = 1, + place_offset_y = 1, + schematic = minetest.get_modpath("default") .. "/schematics/blueberry_bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Acacia bush + + minetest.register_decoration({ + name = "default:acacia_bush", + deco_type = "schematic", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 90155, + octaves = 3, + persist = 0.7, + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Pine bush + + minetest.register_decoration({ + name = "default:pine_bush", + deco_type = "schematic", + place_on = {"default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = {x = 100, y = 100, z = 100}, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = {"taiga", "snowy_grassland"}, + y_max = 31000, + y_min = 4, + schematic = minetest.get_modpath("default") .. "/schematics/pine_bush.mts", + flags = "place_center_x, place_center_z", + }) + + -- Grasses + + register_grass_decoration(-0.03, 0.09, 5) + register_grass_decoration(-0.015, 0.075, 4) + register_grass_decoration(0, 0.06, 3) + register_grass_decoration(0.015, 0.045, 2) + register_grass_decoration(0.03, 0.03, 1) + + -- Dry grasses + + register_dry_grass_decoration(0.01, 0.05, 5) + register_dry_grass_decoration(0.03, 0.03, 4) + register_dry_grass_decoration(0.05, 0.01, 3) + register_dry_grass_decoration(0.07, -0.01, 2) + register_dry_grass_decoration(0.09, -0.03, 1) + + -- Ferns + + register_fern_decoration(14936, 3) + register_fern_decoration(801, 2) + register_fern_decoration(5, 1) + + -- Junglegrass + + minetest.register_decoration({ + name = "default:junglegrass", + deco_type = "simple", + place_on = {"default:dirt_with_rainforest_litter"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"rainforest"}, + y_max = 31000, + y_min = 1, + decoration = "default:junglegrass", + }) + + -- Dry shrub + + minetest.register_decoration({ + name = "default:dry_shrub", + deco_type = "simple", + place_on = {"default:desert_sand", + "default:sand", "default:silver_sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = {"desert", "sandstone_desert", "cold_desert"}, + y_max = 31000, + y_min = 2, + decoration = "default:dry_shrub", + param2 = 4, + }) + + -- Marram grass + + minetest.register_decoration({ + name = "default:marram_grass", + deco_type = "simple", + place_on = {"default:sand"}, + sidelen = 4, + noise_params = { + offset = -0.7, + scale = 4.0, + spread = {x = 16, y = 16, z = 16}, + seed = 513337, + octaves = 1, + persist = 0.0, + flags = "absvalue, eased" + }, + biomes = {"coniferous_forest_dunes", "grassland_dunes"}, + y_max = 6, + y_min = 4, + decoration = { + "default:marram_grass_1", + "default:marram_grass_2", + "default:marram_grass_3", + }, + }) + + -- Tundra moss + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:permafrost_with_stones"}, + sidelen = 4, + noise_params = { + offset = -0.8, + scale = 2.0, + spread = {x = 100, y = 100, z = 100}, + seed = 53995, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra"}, + y_max = 50, + y_min = 2, + decoration = "default:permafrost_with_moss", + place_offset_y = -1, + flags = "force_placement", + }) + + -- Tundra patchy snow + + minetest.register_decoration({ + deco_type = "simple", + place_on = { + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:stone", + "default:gravel" + }, + sidelen = 4, + noise_params = { + offset = 0, + scale = 1.0, + spread = {x = 100, y = 100, z = 100}, + seed = 172555, + octaves = 3, + persist = 1.0 + }, + biomes = {"tundra", "tundra_beach"}, + y_max = 50, + y_min = 1, + decoration = "default:snow", + }) + + -- Coral reef + + minetest.register_decoration({ + name = "default:corals", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = {x = 50, y = 50, z = 50}, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { + "desert_ocean", + "savanna_ocean", + "rainforest_ocean", + }, + y_max = -2, + y_min = -8, + flags = "force_placement", + decoration = { + "default:coral_green", "default:coral_pink", + "default:coral_cyan", "default:coral_brown", + "default:coral_orange", "default:coral_skeleton", + }, + }) + + -- Kelp + + minetest.register_decoration({ + name = "default:kelp", + deco_type = "simple", + place_on = {"default:sand"}, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = { + "taiga_ocean", + "snowy_grassland_ocean", + "grassland_ocean", + "coniferous_forest_ocean", + "deciduous_forest_ocean", + "sandstone_desert_ocean", + "cold_desert_ocean"}, + y_max = -5, + y_min = -10, + flags = "force_placement", + decoration = "default:sand_with_kelp", + param2 = 48, + param2_max = 96, + }) +end + + +-- +-- Detect mapgen to select functions +-- + + +local mg_name = minetest.get_mapgen_setting("mg_name") + +if mg_name == "v6" then + default.register_mgv6_ores() + default.register_mgv6_decorations() +else + default.register_biomes() + default.register_ores() + default.register_decorations() +end diff --git a/data/games/garage/mods/default/mod.conf b/data/games/garage/mods/default/mod.conf new file mode 100644 index 0000000..c9e7468 --- /dev/null +++ b/data/games/garage/mods/default/mod.conf @@ -0,0 +1,3 @@ +name = default +description = Minetest Game mod: default +optional_depends = player_api diff --git a/data/games/garage/mods/testformspec/models/testformspec_chest.obj b/data/games/garage/mods/default/models/chest_open.obj similarity index 100% rename from data/games/garage/mods/testformspec/models/testformspec_chest.obj rename to data/games/garage/mods/default/models/chest_open.obj diff --git a/data/games/garage/mods/default/models/torch_ceiling.obj b/data/games/garage/mods/default/models/torch_ceiling.obj new file mode 100644 index 0000000..5df8597 --- /dev/null +++ b/data/games/garage/mods/default/models/torch_ceiling.obj @@ -0,0 +1,53 @@ +# Blender v2.77 (sub 0) OBJ File: 'torch_ceiling.blend' +# www.blender.org +v -0.062469 -0.047331 0.068152 +v -0.062469 -0.559515 -0.164388 +v -0.062469 0.004344 -0.045667 +v -0.062469 -0.507839 -0.278206 +v 0.062531 -0.047331 0.068152 +v 0.062531 -0.559515 -0.164388 +v 0.062531 0.004344 -0.045667 +v 0.062531 -0.507839 -0.278206 +v 0.353584 0.040000 0.363553 +v 0.353584 -0.397500 0.363553 +v -0.353522 0.040000 -0.343553 +v -0.353522 -0.397500 -0.343553 +v 0.353584 0.040000 -0.343553 +v -0.353522 0.040000 0.363553 +v 0.353584 -0.397500 -0.343553 +v -0.353522 -0.397500 0.363553 +vt 0.5625 0.5000 +vt 0.5625 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.5000 +vt 0.4375 0.0000 +vt 0.5625 0.0000 +vt 0.5625 0.1250 +vt 0.4375 0.1250 +vt 0.5625 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.6250 +vt 0.4375 0.0000 +vt 0.5625 0.6250 +vt 0.5625 0.0000 +vt 1.0000 0.5625 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5625 +vt 0.0000 0.5625 +vt 1.0000 0.5625 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn 0.0000 0.9105 0.4134 +vn -0.0000 -0.4134 0.9105 +vn -1.0000 0.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/9/2 4/6/2 8/5/2 7/10/2 +f 1/11/3 3/9/3 4/6/3 2/12/3 +f 5/13/2 1/11/2 2/12/2 6/14/2 +f 7/10/3 8/5/3 6/14/3 5/13/3 +f 9/15/4 10/16/4 12/17/4 11/18/4 +f 13/19/5 14/20/5 16/21/5 15/22/5 diff --git a/data/games/garage/mods/default/models/torch_floor.obj b/data/games/garage/mods/default/models/torch_floor.obj new file mode 100644 index 0000000..dfd25e8 --- /dev/null +++ b/data/games/garage/mods/default/models/torch_floor.obj @@ -0,0 +1,43 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_floor.blend' +# www.blender.org +v 0.062500 0.062500 -0.062500 +v 0.062500 -0.500000 -0.062500 +v 0.062500 0.062500 0.062500 +v 0.062500 -0.500000 0.062500 +v -0.062500 0.062500 -0.062500 +v -0.062500 -0.500000 -0.062500 +v -0.062500 0.062500 0.062500 +v -0.062500 -0.500000 0.062500 +v -0.353553 -0.500000 0.353553 +v -0.353553 0.500000 0.353553 +v 0.353553 -0.500000 -0.353553 +v 0.353553 0.500000 -0.353553 +v -0.353553 -0.500000 -0.353553 +v 0.353553 -0.500000 0.353553 +v -0.353553 0.500000 -0.353553 +v 0.353553 0.500000 0.353553 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.000000 -0.707100 +vn -0.707100 -0.000000 0.707100 +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 13/12/5 14/9/5 16/10/5 15/11/5 diff --git a/data/games/garage/mods/default/models/torch_wall.obj b/data/games/garage/mods/default/models/torch_wall.obj new file mode 100644 index 0000000..6de4b13 --- /dev/null +++ b/data/games/garage/mods/default/models/torch_wall.obj @@ -0,0 +1,57 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_wall.blend' +# www.blender.org +v 0.062469 -0.195248 0.023570 +v 0.062469 -0.476498 -0.463570 +v 0.062469 -0.303502 0.086070 +v 0.062469 -0.584752 -0.401070 +v -0.062531 -0.195248 0.023570 +v -0.062531 -0.476498 -0.463570 +v -0.062531 -0.303502 0.086070 +v -0.062531 -0.584752 -0.401070 +v -0.353584 -0.613553 0.022500 +v -0.353584 -0.613553 0.460000 +v 0.353522 0.093553 0.022500 +v 0.353522 0.093553 0.460000 +v -0.353584 0.093553 0.022500 +v 0.353522 -0.613553 0.022500 +v -0.353584 0.093553 0.460000 +v 0.353522 -0.613553 0.460000 +v 0.353553 0.056811 -0.121957 +v 0.353553 -0.224439 -0.609096 +v -0.353553 -0.555561 0.231596 +v -0.353553 -0.836811 -0.255543 +v -0.353553 0.056811 -0.121957 +v -0.353553 -0.224439 -0.609096 +v 0.353553 -0.555561 0.231596 +v 0.353553 -0.836811 -0.255543 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.562500 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn -0.000000 0.500000 0.866000 +vn -0.000000 0.866000 -0.500000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.612400 -0.353600 +vn -0.707100 -0.612400 0.353600 +vn -0.707100 0.707100 -0.000000 +vn -0.707100 -0.707100 -0.000000 +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +f 17/9/4 18/10/4 20/11/4 19/12/4 +f 21/9/5 22/10/5 24/11/5 23/12/5 +f 9/12/6 10/13/6 12/14/6 11/9/6 +f 13/9/7 14/12/7 16/13/7 15/14/7 diff --git a/data/games/garage/mods/default/nodes.lua b/data/games/garage/mods/default/nodes.lua new file mode 100644 index 0000000..2bde6f8 --- /dev/null +++ b/data/games/garage/mods/default/nodes.lua @@ -0,0 +1,2957 @@ +-- mods/default/nodes.lua + +-- support for MT game translation. +local S = default.get_translator + +--[[ Node name convention: + +Although many node names are in combined-word form, the required form for new +node names is words separated by underscores. If both forms are used in written +language (for example pinewood and pine wood) the underscore form should be used. + +--]] + + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant 4. Modified forms) + +default:stone +default:cobble +default:stonebrick +default:stone_block +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick +default:desert_stone_block + +default:sandstone +default:sandstonebrick +default:sandstone_block +default:desert_sandstone +default:desert_sandstone_brick +default:desert_sandstone_block +default:silver_sandstone +default:silver_sandstone_brick +default:silver_sandstone_block + +default:obsidian +default:obsidianbrick +default:obsidian_block + +Soft / Non-Stone +---------------- +(1. Material 2. Modified forms) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_dry_grass +default:dirt_with_snow +default:dirt_with_rainforest_litter +default:dirt_with_coniferous_litter +default:dry_dirt +default:dry_dirt_with_dry_grass + +default:permafrost +default:permafrost_with_stones +default:permafrost_with_moss + +default:sand +default:desert_sand +default:silver_sand + +default:gravel + +default:clay + +default:snow +default:snowblock +default:ice +default:cave_ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling +default:emergent_jungle_sapling + +default:pine_tree +default:pine_wood +default:pine_needles +default:pine_sapling + +default:acacia_tree +default:acacia_wood +default:acacia_leaves +default:acacia_sapling + +default:aspen_tree +default:aspen_wood +default:aspen_leaves +default:aspen_sapling + +Ores +---- +(1. In stone 2. Blocks) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock + +default:stone_with_tin +default:tinblock + +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife +--------- + +default:cactus +default:large_cactus_seedling + +default:papyrus +default:dry_shrub +default:junglegrass + +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +default:dry_grass_1 +default:dry_grass_2 +default:dry_grass_3 +default:dry_grass_4 +default:dry_grass_5 + +default:fern_1 +default:fern_2 +default:fern_3 + +default:marram_grass_1 +default:marram_grass_2 +default:marram_grass_3 + +default:bush_stem +default:bush_leaves +default:bush_sapling +default:acacia_bush_stem +default:acacia_bush_leaves +default:acacia_bush_sapling +default:pine_bush_stem +default:pine_bush_needles +default:pine_bush_sapling +default:blueberry_bush_leaves_with_berries +default:blueberry_bush_leaves +default:blueberry_bush_sapling + +default:sand_with_kelp + +Corals +------ + +default:coral_green +default:coral_pink +default:coral_cyan +default:coral_brown +default:coral_orange +default:coral_skeleton + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- + +default:bookshelf + +default:sign_wall_wood +default:sign_wall_steel + +default:ladder_wood +default:ladder_steel + +default:fence_wood +default:fence_acacia_wood +default:fence_junglewood +default:fence_pine_wood +default:fence_aspen_wood + +default:fence_rail_wood +default:fence_rail_acacia_wood +default:fence_rail_junglewood +default:fence_rail_pine_wood +default:fence_rail_aspen_wood + +default:glass +default:obsidian_glass + +default:brick + +default:meselamp +default:mese_post_light +default:mese_post_light_acacia_wood +default:mese_post_light_junglewood +default:mese_post_light_pine_wood +default:mese_post_light_aspen_wood + +Misc +---- + +default:cloud + +--]] + +-- Required wrapper to allow customization of default.after_place_leaves +local function after_place_leaves(...) + return default.after_place_leaves(...) +end + +-- Required wrapper to allow customization of default.grow_sapling +local function grow_sapling(...) + return default.grow_sapling(...) +end + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = S("Stone"), + tiles = {"default_stone.png"}, + groups = {cracky = 3, stone = 1}, + drop = "default:cobble", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = S("Cobblestone"), + tiles = {"default_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = S("Stone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_stone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stone_block", { + description = S("Stone Block"), + tiles = {"default_stone_block.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = S("Mossy Cobblestone"), + tiles = {"default_mossycobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:desert_stone", { + description = S("Desert Stone"), + tiles = {"default_desert_stone.png"}, + groups = {cracky = 3, stone = 1}, + drop = "default:desert_cobble", + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = S("Desert Cobblestone"), + tiles = {"default_desert_cobble.png"}, + is_ground_content = false, + groups = {cracky = 3, stone = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = S("Desert Stone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_desert_stone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stone_block", { + description = S("Desert Stone Block"), + tiles = {"default_desert_stone_block.png"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstone", { + description = S("Sandstone"), + tiles = {"default_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = S("Sandstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstone_block", { + description = S("Sandstone Block"), + tiles = {"default_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone", { + description = S("Desert Sandstone"), + tiles = {"default_desert_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone_brick", { + description = S("Desert Sandstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_desert_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_sandstone_block", { + description = S("Desert Sandstone Block"), + tiles = {"default_desert_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone", { + description = S("Silver Sandstone"), + tiles = {"default_silver_sandstone.png"}, + groups = {crumbly = 1, cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone_brick", { + description = S("Silver Sandstone Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_silver_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:silver_sandstone_block", { + description = S("Silver Sandstone Block"), + tiles = {"default_silver_sandstone_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:obsidian", { + description = S("Obsidian"), + tiles = {"default_obsidian.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = S("Obsidian Brick"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_obsidian_brick.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +minetest.register_node("default:obsidian_block", { + description = S("Obsidian Block"), + tiles = {"default_obsidian_block.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 1, level = 2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = S("Dirt"), + tiles = {"default_dirt.png"}, + groups = {crumbly = 3, soil = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = S("Dirt with Grass"), + tiles = {"default_grass.png", "default_dirt.png", + {name = "default_dirt.png^default_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = S("Dirt with Grass and Footsteps"), + tiles = {"default_grass.png^default_footprint.png", "default_dirt.png", + {name = "default_dirt.png^default_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:dirt_with_dry_grass", { + description = S("Dirt with Savanna Grass"), + tiles = {"default_dry_grass.png", + "default_dirt.png", + {name = "default_dirt.png^default_dry_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = S("Dirt with Snow"), + tiles = {"default_snow.png", "default_dirt.png", + {name = "default_dirt.png^default_snow_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.2}, + }), +}) + +minetest.register_node("default:dirt_with_rainforest_litter", { + description = S("Dirt with Rainforest Litter"), + tiles = { + "default_rainforest_litter.png", + "default_dirt.png", + {name = "default_dirt.png^default_rainforest_litter_side.png", + tileable_vertical = false} + }, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dirt_with_coniferous_litter", { + description = S("Dirt with Coniferous Litter"), + tiles = { + "default_coniferous_litter.png", + "default_dirt.png", + {name = "default_dirt.png^default_coniferous_litter_side.png", + tileable_vertical = false} + }, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dry_dirt", { + description = S("Savanna Dirt"), + tiles = {"default_dry_dirt.png"}, + groups = {crumbly = 3, soil = 1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dry_dirt_with_dry_grass", { + description = S("Savanna Dirt with Savanna Grass"), + tiles = {"default_dry_grass.png", "default_dry_dirt.png", + {name = "default_dry_dirt.png^default_dry_grass_side.png", + tileable_vertical = false}}, + groups = {crumbly = 3, soil = 1}, + drop = "default:dry_dirt", + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:permafrost", { + description = S("Permafrost"), + tiles = {"default_permafrost.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:permafrost_with_stones", { + description = S("Permafrost with Stones"), + tiles = {"default_permafrost.png^default_stones.png", + "default_permafrost.png", + "default_permafrost.png^default_stones_side.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_gravel_defaults(), +}) + +minetest.register_node("default:permafrost_with_moss", { + description = S("Permafrost with Moss"), + tiles = {"default_moss.png", "default_permafrost.png", + {name = "default_permafrost.png^default_moss_side.png", + tileable_vertical = false}}, + groups = {cracky = 3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.25}, + }), +}) + +minetest.register_node("default:sand", { + description = S("Sand"), + tiles = {"default_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = S("Desert Sand"), + tiles = {"default_desert_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:silver_sand", { + description = S("Silver Sand"), + tiles = {"default_silver_sand.png"}, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), +}) + + +minetest.register_node("default:gravel", { + description = S("Gravel"), + tiles = {"default_gravel.png"}, + groups = {crumbly = 2, falling_node = 1}, + sounds = default.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + {items = {"default:flint"}, rarity = 16}, + {items = {"default:gravel"}} + } + } +}) + +minetest.register_node("default:clay", { + description = S("Clay"), + tiles = {"default_clay.png"}, + groups = {crumbly = 3}, + drop = "default:clay_lump 4", + sounds = default.node_sound_dirt_defaults(), +}) + + +minetest.register_node("default:snow", { + description = S("Snow"), + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + paramtype = "light", + buildable_to = true, + floodable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1, snowy = 1}, + sounds = default.node_sound_snow_defaults(), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + end + end, +}) + +minetest.register_node("default:snowblock", { + description = S("Snow Block"), + tiles = {"default_snow.png"}, + groups = {crumbly = 3, cools_lava = 1, snowy = 1}, + sounds = default.node_sound_snow_defaults(), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + end + end, +}) + +-- 'is ground content = false' to avoid tunnels in sea ice or ice rivers +minetest.register_node("default:ice", { + description = S("Ice"), + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_ice_defaults(), +}) + +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +minetest.register_node("default:cave_ice", { + description = S("Cave Ice"), + tiles = {"default_ice.png"}, + paramtype = "light", + groups = {cracky = 3, cools_lava = 1, slippery = 3, + not_in_creative_inventory = 1}, + drop = "default:ice", + sounds = default.node_sound_ice_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = S("Apple Tree"), + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = S("Apple Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = S("Apple Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:leaves", { + description = S("Apple Tree Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_leaves.png"}, + special_tiles = {"default_leaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:leaves"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = S("Apple"), + drawtype = "plantlike", + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} + }, + groups = {fleshy = 3, dig_immediate = 3, flammable = 2, + leafdecay = 3, leafdecay_drop = 1, food_apple = 1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + minetest.set_node(pos, {name = "default:apple", param2 = 1}) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + minetest.set_node(pos, {name = "default:apple_mark"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +minetest.register_node("default:apple_mark", { + description = S("Apple Marker"), + inventory_image = "default_apple.png^default_invisible_node_overlay.png", + wield_image = "default_apple.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + if not minetest.find_node_near(pos, 1, "default:leaves") then + minetest.remove_node(pos) + elseif minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:apple"}) + end + end +}) + + +minetest.register_node("default:jungletree", { + description = S("Jungle Tree"), + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", + "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = S("Jungle Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_junglewood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = S("Jungle Tree Leaves"), + drawtype = "allfaces_optional", + waving = 1, + tiles = {"default_jungleleaves.png"}, + special_tiles = {"default_jungleleaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:junglesapling"}, rarity = 20}, + {items = {"default:jungleleaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = S("Jungle Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:junglesapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 15, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:emergent_jungle_sapling", { + description = S("Emergent Jungle Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_emergent_jungle_sapling.png"}, + inventory_image = "default_emergent_jungle_sapling.png", + wield_image = "default_emergent_jungle_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:emergent_jungle_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -3, y = -5, z = -3}, + {x = 3, y = 31, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + + +minetest.register_node("default:pine_tree", { + description = S("Pine Tree"), + tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", + "default_pine_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pine_wood", { + description = S("Pine Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_pine_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = S("Pine Needles"), + drawtype = "allfaces_optional", + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_sapling"}, rarity = 20}, + {items = {"default:pine_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = S("Pine Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:pine_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 14, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + + +minetest.register_node("default:acacia_tree", { + description = S("Acacia Tree"), + tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png", + "default_acacia_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:acacia_wood", { + description = S("Acacia Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_acacia_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:acacia_leaves", { + description = S("Acacia Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_acacia_leaves.png"}, + special_tiles = {"default_acacia_leaves_simple.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_sapling"}, rarity = 20}, + {items = {"default:acacia_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:acacia_sapling", { + description = S("Acacia Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_acacia_sapling.png"}, + inventory_image = "default_acacia_sapling.png", + wield_image = "default_acacia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:acacia_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -4, y = 1, z = -4}, + {x = 4, y = 7, z = 4}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +minetest.register_node("default:aspen_tree", { + description = S("Aspen Tree"), + tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png", + "default_aspen_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:aspen_wood", { + description = S("Aspen Wood Planks"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_aspen_wood.png"}, + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:aspen_leaves", { + description = S("Aspen Tree Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_aspen_leaves.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:aspen_sapling"}, rarity = 20}, + {items = {"default:aspen_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:aspen_sapling", { + description = S("Aspen Tree Sapling"), + drawtype = "plantlike", + tiles = {"default_aspen_sapling.png"}, + inventory_image = "default_aspen_sapling.png", + wield_image = "default_aspen_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 3, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:aspen_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -2, y = 1, z = -2}, + {x = 2, y = 12, z = 2}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = S("Coal Ore"), + tiles = {"default_stone.png^default_mineral_coal.png"}, + groups = {cracky = 3}, + drop = "default:coal_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = S("Coal Block"), + tiles = {"default_coal_block.png"}, + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:stone_with_iron", { + description = S("Iron Ore"), + tiles = {"default_stone.png^default_mineral_iron.png"}, + groups = {cracky = 2}, + drop = "default:iron_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = S("Steel Block"), + tiles = {"default_steel_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_copper", { + description = S("Copper Ore"), + tiles = {"default_stone.png^default_mineral_copper.png"}, + groups = {cracky = 2}, + drop = "default:copper_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = S("Copper Block"), + tiles = {"default_copper_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_tin", { + description = S("Tin Ore"), + tiles = {"default_stone.png^default_mineral_tin.png"}, + groups = {cracky = 2}, + drop = "default:tin_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:tinblock", { + description = S("Tin Block"), + tiles = {"default_tin_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:bronzeblock", { + description = S("Bronze Block"), + tiles = {"default_bronze_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_mese", { + description = S("Mese Ore"), + tiles = {"default_stone.png^default_mineral_mese.png"}, + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mese", { + description = S("Mese Block"), + tiles = {"default_mese_block.png"}, + paramtype = "light", + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 3, +}) + + +minetest.register_node("default:stone_with_gold", { + description = S("Gold Ore"), + tiles = {"default_stone.png^default_mineral_gold.png"}, + groups = {cracky = 2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = S("Gold Block"), + tiles = {"default_gold_block.png"}, + is_ground_content = false, + groups = {cracky = 1}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("default:stone_with_diamond", { + description = S("Diamond Ore"), + tiles = {"default_stone.png^default_mineral_diamond.png"}, + groups = {cracky = 1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = S("Diamond Block"), + tiles = {"default_diamond_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = S("Cactus"), + tiles = {"default_cactus_top.png", "default_cactus_top.png", + "default_cactus_side.png"}, + paramtype2 = "facedir", + groups = {choppy = 3}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +minetest.register_node("default:large_cactus_seedling", { + description = S("Large Cactus Seedling"), + drawtype = "plantlike", + tiles = {"default_large_cactus_seedling.png"}, + inventory_image = "default_large_cactus_seedling.png", + wield_image = "default_large_cactus_seedling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { + -5 / 16, -0.5, -5 / 16, + 5 / 16, 0.5, 5 / 16 + } + }, + groups = {choppy = 3, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_wood_defaults(), + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:large_cactus_seedling", + {x = -2, y = -1, z = -2}, + {x = 2, y = 5, z = 2}, + 4) + + return itemstack + end, + + on_construct = function(pos) + -- Normal cactus farming adds 1 cactus node by ABM, + -- interval 12s, chance 83. + -- Consider starting with 5 cactus nodes. We make sure that growing a + -- large cactus is not a faster way to produce new cactus nodes. + -- Confirmed by experiment, when farming 5 cacti, on average 1 new + -- cactus node is added on average every + -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s. + -- Large cactus contains on average 14 cactus nodes. + -- 14 * 199.2 = 2788.8s. + -- Set random range to average to 2789s. + minetest.get_node_timer(pos):start(math.random(1859, 3719)) + end, + + on_timer = function(pos) + local node_under = minetest.get_node_or_nil( + {x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + -- Node under not yet loaded, try later + minetest.get_node_timer(pos):start(300) + return + end + + if minetest.get_item_group(node_under.name, "sand") == 0 then + -- Seedling dies + minetest.remove_node(pos) + return + end + + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + -- Too dark for growth, try later in case it's night + minetest.get_node_timer(pos):start(300) + return + end + + minetest.log("action", "A large cactus seedling grows into a large" .. + "cactus at ".. minetest.pos_to_string(pos)) + default.grow_large_cactus(pos) + end, +}) + +minetest.register_node("default:papyrus", { + description = S("Papyrus"), + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, + groups = {snappy = 3, flammable = 2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = S("Dry Shrub"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + paramtype2 = "meshoptions", + place_param2 = 4, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = S("Jungle Grass"), + drawtype = "plantlike", + waving = 1, + visual_scale = 1.69, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, junglegrass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, +}) + + +minetest.register_node("default:grass_1", { + description = S("Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_" .. math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 5 do + minetest.register_node("default:grass_" .. i, { + description = S("Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_" .. i .. ".png"}, + inventory_image = "default_grass_" .. i .. ".png", + wield_image = "default_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "default:grass_1", + groups = {snappy = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:dry_grass_1", { + description = S("Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_1.png"}, + inventory_image = "default_dry_grass_3.png", + wield_image = "default_dry_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, + attached_node = 1, grass = 1, dry_grass = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random dry grass node + local stack = ItemStack("default:dry_grass_" .. math.random(1, 5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:dry_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 5 do + minetest.register_node("default:dry_grass_" .. i, { + description = S("Savanna Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_" .. i .. ".png"}, + inventory_image = "default_dry_grass_" .. i .. ".png", + wield_image = "default_dry_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + not_in_creative_inventory = 1, grass = 1, dry_grass = 1}, + drop = "default:dry_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:fern_1", { + description = S("Fern"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_fern_1.png"}, + inventory_image = "default_fern_1.png", + wield_image = "default_fern_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, + fern = 1, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random fern node + local stack = ItemStack("default:fern_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:fern_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:fern_" .. i, { + description = S("Fern"), + drawtype = "plantlike", + waving = 1, + visual_scale = 2, + tiles = {"default_fern_" .. i .. ".png"}, + inventory_image = "default_fern_" .. i .. ".png", + wield_image = "default_fern_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + grass = 1, fern = 1, not_in_creative_inventory = 1}, + drop = "default:fern_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:marram_grass_1", { + description = S("Marram Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_1.png"}, + inventory_image = "default_marram_grass_1.png", + wield_image = "default_marram_grass_1.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, marram_grass = 1, + attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random marram grass node + local stack = ItemStack("default:marram_grass_" .. math.random(1, 3)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:marram_grass_1 " .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + minetest.register_node("default:marram_grass_" .. i, { + description = S("Marram Grass"), + drawtype = "plantlike", + waving = 1, + tiles = {"default_marram_grass_" .. i .. ".png"}, + inventory_image = "default_marram_grass_" .. i .. ".png", + wield_image = "default_marram_grass_" .. i .. ".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + grass = 1, marram_grass = 1, not_in_creative_inventory = 1}, + drop = "default:marram_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, + }, + }) +end + + +minetest.register_node("default:bush_stem", { + description = S("Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_bush_stem.png"}, + inventory_image = "default_bush_stem.png", + wield_image = "default_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:bush_leaves", { + description = S("Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_leaves_simple.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:bush_sapling"}, rarity = 5}, + {items = {"default:bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:bush_sapling", { + description = S("Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_bush_sapling.png"}, + inventory_image = "default_bush_sapling.png", + wield_image = "default_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:blueberry_bush_leaves_with_berries", { + description = S("Blueberry Bush Leaves with Berries"), + drawtype = "allfaces_optional", + tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, + drop = "default:blueberries", + sounds = default.node_sound_leaves_defaults(), + node_dig_prediction = "default:blueberry_bush_leaves", + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:blueberry_bush_leaves"}) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, +}) + +minetest.register_node("default:blueberry_bush_leaves", { + description = S("Blueberry Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_blueberry_bush_leaves.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:blueberry_bush_sapling"}, rarity = 5}, + {items = {"default:blueberry_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) < 11 then + minetest.get_node_timer(pos):start(200) + else + minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"}) + end + end, + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:blueberry_bush_sapling", { + description = S("Blueberry Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_blueberry_bush_sapling.png"}, + inventory_image = "default_blueberry_bush_sapling.png", + wield_image = "default_blueberry_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:blueberry_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:acacia_bush_stem", { + description = S("Acacia Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_acacia_bush_stem.png"}, + inventory_image = "default_acacia_bush_stem.png", + wield_image = "default_acacia_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:acacia_bush_leaves", { + description = S("Acacia Bush Leaves"), + drawtype = "allfaces_optional", + tiles = {"default_acacia_leaves_simple.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_bush_sapling"}, rarity = 5}, + {items = {"default:acacia_bush_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:acacia_bush_sapling", { + description = S("Acacia Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_acacia_bush_sapling.png"}, + inventory_image = "default_acacia_bush_sapling.png", + wield_image = "default_acacia_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:acacia_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + +minetest.register_node("default:pine_bush_stem", { + description = S("Pine Bush Stem"), + drawtype = "plantlike", + visual_scale = 1.41, + tiles = {"default_pine_bush_stem.png"}, + inventory_image = "default_pine_bush_stem.png", + wield_image = "default_pine_bush_stem.png", + paramtype = "light", + sunlight_propagates = true, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, + }, +}) + +minetest.register_node("default:pine_bush_needles", { + description = S("Pine Bush Needles"), + drawtype = "allfaces_optional", + tiles = {"default_pine_needles.png"}, + paramtype = "light", + groups = {snappy = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_bush_sapling"}, rarity = 5}, + {items = {"default:pine_bush_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = after_place_leaves, +}) + +minetest.register_node("default:pine_bush_sapling", { + description = S("Pine Bush Sapling"), + drawtype = "plantlike", + tiles = {"default_pine_bush_sapling.png"}, + inventory_image = "default_pine_bush_sapling.png", + wield_image = "default_pine_bush_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + on_timer = grow_sapling, + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} + }, + groups = {snappy = 2, dig_immediate = 3, flammable = 2, + attached_node = 1, sapling = 1}, + sounds = default.node_sound_leaves_defaults(), + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "default:pine_bush_sapling", + -- minp, maxp to be checked, relative to sapling pos + {x = -1, y = 0, z = -1}, + {x = 1, y = 1, z = 1}, + -- maximum interval of interior volume check + 2) + + return itemstack + end, +}) + + +minetest.register_node("default:sand_with_kelp", { + description = S("Kelp"), + drawtype = "plantlike_rooted", + waving = 1, + tiles = {"default_sand.png"}, + special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, + inventory_image = "default_kelp.png", + wield_image = "default_kelp.png", + paramtype = "light", + paramtype2 = "leveled", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, + }, + }, + node_dig_prediction = "default:sand", + node_placement_prediction = "", + sounds = default.node_sound_sand_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == "node" and not (placer and placer:is_player() + and placer:get_player_control().sneak) then + local node_ptu = minetest.get_node(pointed_thing.under) + local def_ptu = minetest.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if minetest.get_node(pos).name ~= "default:sand" then + return itemstack + end + + local height = math.random(4, 6) + local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} + local node_top = minetest.get_node(pos_top) + local def_top = minetest.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == "source" and + minetest.get_item_group(node_top.name, "water") > 0 then + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pos_top, player_name) then + minetest.set_node(pos, {name = "default:sand_with_kelp", + param2 = height * 16}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:sand"}) + end +}) + + +-- +-- Corals +-- + +local function coral_on_place(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local player_name = placer and placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + local node_under = minetest.get_node(pos_under) + local def_under = minetest.registered_nodes[node_under.name] + + if def_under and def_under.on_rightclick and not ( + placer and placer:is_player() and placer:get_player_control().sneak) then + return def_under.on_rightclick(pos_under, node_under, + placer, itemstack, pointed_thing) + end + + if node_under.name ~= "default:coral_skeleton" or + minetest.get_node(pos_above).name ~= "default:water_source" then + return itemstack + end + + if minetest.is_protected(pos_under, player_name) or + minetest.is_protected(pos_above, player_name) then + minetest.record_protection_violation(pos_under, player_name) + return itemstack + end + + node_under.name = itemstack:get_name() + minetest.set_node(pos_under, node_under) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + + return itemstack +end + +minetest.register_node("default:coral_green", { + description = S("Green Coral"), + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}}, + inventory_image = "default_coral_green.png", + wield_image = "default_coral_green.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = coral_on_place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_pink", { + description = S("Pink Coral"), + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}}, + inventory_image = "default_coral_pink.png", + wield_image = "default_coral_pink.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = coral_on_place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_cyan", { + description = S("Cyan Coral"), + drawtype = "plantlike_rooted", + waving = 1, + paramtype = "light", + tiles = {"default_coral_skeleton.png"}, + special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}}, + inventory_image = "default_coral_cyan.png", + wield_image = "default_coral_cyan.png", + groups = {snappy = 3}, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, + }, + }, + node_dig_prediction = "default:coral_skeleton", + node_placement_prediction = "", + sounds = default.node_sound_stone_defaults({ + dig = {name = "default_dig_snappy", gain = 0.2}, + dug = {name = "default_grass_footstep", gain = 0.25}, + }), + + on_place = coral_on_place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + +minetest.register_node("default:coral_brown", { + description = S("Brown Coral"), + tiles = {"default_coral_brown.png"}, + groups = {cracky = 3}, + drop = "default:coral_skeleton", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coral_orange", { + description = S("Orange Coral"), + tiles = {"default_coral_orange.png"}, + groups = {cracky = 3}, + drop = "default:coral_skeleton", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coral_skeleton", { + description = S("Coral Skeleton"), + tiles = {"default_coral_skeleton.png"}, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = S("Water Source"), + drawtype = "liquid", + waving = 3, + tiles = { + { + name = "default_water_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "default_water_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_node("default:water_flowing", { + description = S("Flowing Water"), + drawtype = "flowingliquid", + waving = 3, + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + + +minetest.register_node("default:river_water_source", { + description = S("River Water Source"), + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "default_river_water_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + -- Not renewable to avoid horizontal spread of water sources in sloping + -- rivers that can cause water to overflow riverbanks and cause floods. + -- River water source is instead made renewable by the 'force renew' + -- option used in the 'bucket' mod by the river water bucket. + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + +minetest.register_node("default:river_water_flowing", { + description = S("Flowing River Water"), + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a = 103, r = 30, g = 76, b = 90}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, + cools_lava = 1}, + sounds = default.node_sound_water_defaults(), +}) + + +minetest.register_node("default:lava_source", { + description = S("Lava Source"), + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + { + name = "default_lava_source_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a = 191, r = 255, g = 64, b = 0}, + groups = {lava = 3, liquid = 2, igniter = 1}, +}) + +minetest.register_node("default:lava_flowing", { + description = S("Flowing Lava"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a = 191, r = 255, g = 64, b = 0}, + groups = {lava = 3, liquid = 2, igniter = 1, + not_in_creative_inventory = 1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +local bookshelf_formspec = + "size[8,7;]" .. + "list[context;books;0,0.3;8,2;]" .. + "list[current_player;main;0,2.85;8,1;]" .. + "list[current_player;main;0,4.08;8,3;8]" .. + "listring[context;books]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,2.85) + +local function update_bookshelf(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("books") + + local formspec = bookshelf_formspec + -- Inventory slots overlay + local bx, by = 0, 0.3 + local n_written, n_empty = 0, 0 + for i = 1, 16 do + if i == 9 then + bx = 0 + by = by + 1 + end + local stack = invlist[i] + if stack:is_empty() then + formspec = formspec .. + "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]" + else + local metatable = stack:get_meta():to_table() or {} + if metatable.fields and metatable.fields.text then + n_written = n_written + stack:get_count() + else + n_empty = n_empty + stack:get_count() + end + end + bx = bx + 1 + end + meta:set_string("formspec", formspec) + if n_written + n_empty == 0 then + meta:set_string("infotext", S("Empty Bookshelf")) + else + meta:set_string("infotext", S("Bookshelf (@1 written, @2 empty books)", n_written, n_empty)) + end +end + +local default_bookshelf_def = { + description = S("Bookshelf"), + tiles = {"default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("books", 8 * 2) + update_bookshelf(pos) + end, + can_dig = function(pos,player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("books") + end, + allow_metadata_inventory_put = function(pos, listname, index, stack) + if minetest.get_item_group(stack:get_name(), "book") ~= 0 then + return stack:get_count() + end + return 0 + end, + on_metadata_inventory_put = function(pos) + update_bookshelf(pos) + end, + on_metadata_inventory_take = function(pos) + update_bookshelf(pos) + end, + on_metadata_inventory_move = function(pos) + update_bookshelf(pos) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "books", drops) + drops[#drops+1] = "default:bookshelf" + minetest.remove_node(pos) + return drops + end, +} +default.set_inventory_action_loggers(default_bookshelf_def, "bookshelf") +minetest.register_node("default:bookshelf", default_bookshelf_def) + +local function register_sign(material, desc, def) + minetest.register_node("default:sign_wall_" .. material, { + description = desc, + drawtype = "nodebox", + tiles = {"default_sign_wall_" .. material .. ".png"}, + inventory_image = "default_sign_" .. material .. ".png", + wield_image = "default_sign_" .. material .. ".png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + use_texture_alpha = "opaque", + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = def.groups, + legacy_wallmounted = true, + sounds = def.sounds, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + end, + on_receive_fields = function(pos, formname, fields, sender) + local player_name = sender:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + local text = fields.text + if not text then + return + end + if #text > 512 then + minetest.chat_send_player(player_name, S("Text too long")) + return + end + text = text:gsub("[%z-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + default.log_player_action(sender, ("wrote %q to the sign at"):format(text), pos) + local meta = minetest.get_meta(pos) + meta:set_string("text", text) + + if #text > 0 then + meta:set_string("infotext", S('"@1"', text)) + else + meta:set_string("infotext", '') + end + end, + }) +end + +register_sign("wood", S("Wooden Sign"), { + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3} +}) + +register_sign("steel", S("Steel Sign"), { + sounds = default.node_sound_metal_defaults(), + groups = {cracky = 2, attached_node = 1} +}) + +minetest.register_node("default:ladder_wood", { + description = S("Wooden Ladder"), + drawtype = "signlike", + tiles = {"default_ladder_wood.png"}, + inventory_image = "default_ladder_wood.png", + wield_image = "default_ladder_wood.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:ladder_steel", { + description = S("Steel Ladder"), + drawtype = "signlike", + tiles = {"default_ladder_steel.png"}, + inventory_image = "default_ladder_steel.png", + wield_image = "default_ladder_steel.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +default.register_fence("default:fence_wood", { + description = S("Apple Wood Fence"), + texture = "default_fence_wood.png", + inventory_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_acacia_wood", { + description = S("Acacia Wood Fence"), + texture = "default_fence_acacia_wood.png", + inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_acacia_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_junglewood", { + description = S("Jungle Wood Fence"), + texture = "default_fence_junglewood.png", + inventory_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_junglewood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_pine_wood", { + description = S("Pine Wood Fence"), + texture = "default_fence_pine_wood.png", + inventory_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_pine_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence("default:fence_aspen_wood", { + description = S("Aspen Wood Fence"), + texture = "default_fence_aspen_wood.png", + inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_aspen_wood.png^" .. + "default_fence_overlay.png^[makealpha:255,126,126", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_wood", { + description = S("Apple Wood Fence Rail"), + texture = "default_fence_rail_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_acacia_wood", { + description = S("Acacia Wood Fence Rail"), + texture = "default_fence_rail_acacia_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_junglewood", { + description = S("Jungle Wood Fence Rail"), + texture = "default_fence_rail_junglewood.png", + inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_pine_wood", { + description = S("Pine Wood Fence Rail"), + texture = "default_fence_rail_pine_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults() +}) + +default.register_fence_rail("default:fence_rail_aspen_wood", { + description = S("Aspen Wood Fence Rail"), + texture = "default_fence_rail_aspen_wood.png", + inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() +}) + +minetest.register_node("default:glass", { + description = S("Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + use_texture_alpha = "clip", -- only needed for stairs API + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = S("Obsidian Glass"), + drawtype = "glasslike_framed_optional", + tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, + use_texture_alpha = "clip", -- only needed for stairs API + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky = 3}, +}) + + +minetest.register_node("default:brick", { + description = S("Brick Block"), + paramtype2 = "facedir", + place_param2 = 0, + tiles = { + "default_brick.png^[transformFX", + "default_brick.png", + }, + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = S("Mese Lamp"), + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +default.register_mesepost("default:mese_post_light", { + description = S("Apple Wood Mese Post Light"), + texture = "default_fence_wood.png", + material = "default:wood", +}) + +default.register_mesepost("default:mese_post_light_acacia_wood", { + description = S("Acacia Wood Mese Post Light"), + texture = "default_fence_acacia_wood.png", + material = "default:acacia_wood", +}) + +default.register_mesepost("default:mese_post_light_junglewood", { + description = S("Jungle Wood Mese Post Light"), + texture = "default_fence_junglewood.png", + material = "default:junglewood", +}) + +default.register_mesepost("default:mese_post_light_pine_wood", { + description = S("Pine Wood Mese Post Light"), + texture = "default_fence_pine_wood.png", + material = "default:pine_wood", +}) + +default.register_mesepost("default:mese_post_light_aspen_wood", { + description = S("Aspen Wood Mese Post Light"), + texture = "default_fence_aspen_wood.png", + material = "default:aspen_wood", +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = S("Cloud"), + tiles = {"default_cloud.png"}, + is_ground_content = false, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory = 1}, +}) + +-- +-- register trees for leafdecay +-- + +if minetest.get_mapgen_setting("mg_name") == "v6" then + default.register_leafdecay({ + trunks = {"default:tree"}, + leaves = {"default:apple", "default:leaves"}, + radius = 2, + }) + + default.register_leafdecay({ + trunks = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + radius = 3, + }) +else + default.register_leafdecay({ + trunks = {"default:tree"}, + leaves = {"default:apple", "default:leaves"}, + radius = 3, + }) + + default.register_leafdecay({ + trunks = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + radius = 2, + }) +end + +default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"default:acacia_tree"}, + leaves = {"default:acacia_leaves"}, + radius = 2, +}) + +default.register_leafdecay({ + trunks = {"default:aspen_tree"}, + leaves = {"default:aspen_leaves"}, + radius = 3, +}) + +default.register_leafdecay({ + trunks = {"default:bush_stem"}, + leaves = {"default:bush_leaves"}, + radius = 1, +}) + +default.register_leafdecay({ + trunks = {"default:acacia_bush_stem"}, + leaves = {"default:acacia_bush_leaves"}, + radius = 1, +}) + +default.register_leafdecay({ + trunks = {"default:pine_bush_stem"}, + leaves = {"default:pine_bush_needles"}, + radius = 1, +}) diff --git a/data/games/garage/mods/default/schematics/acacia_bush.mts b/data/games/garage/mods/default/schematics/acacia_bush.mts new file mode 100644 index 0000000..3322e3b Binary files /dev/null and b/data/games/garage/mods/default/schematics/acacia_bush.mts differ diff --git a/data/games/garage/mods/default/schematics/acacia_log.mts b/data/games/garage/mods/default/schematics/acacia_log.mts new file mode 100644 index 0000000..aff3bd6 Binary files /dev/null and b/data/games/garage/mods/default/schematics/acacia_log.mts differ diff --git a/data/games/garage/mods/default/schematics/acacia_tree.mts b/data/games/garage/mods/default/schematics/acacia_tree.mts new file mode 100644 index 0000000..9b23498 Binary files /dev/null and b/data/games/garage/mods/default/schematics/acacia_tree.mts differ diff --git a/data/games/garage/mods/default/schematics/acacia_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/acacia_tree_from_sapling.mts new file mode 100644 index 0000000..c32a995 Binary files /dev/null and b/data/games/garage/mods/default/schematics/acacia_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/apple_log.mts b/data/games/garage/mods/default/schematics/apple_log.mts new file mode 100644 index 0000000..92fb900 Binary files /dev/null and b/data/games/garage/mods/default/schematics/apple_log.mts differ diff --git a/data/games/garage/mods/default/schematics/apple_tree.mts b/data/games/garage/mods/default/schematics/apple_tree.mts new file mode 100644 index 0000000..d56cd54 Binary files /dev/null and b/data/games/garage/mods/default/schematics/apple_tree.mts differ diff --git a/data/games/garage/mods/default/schematics/apple_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/apple_tree_from_sapling.mts new file mode 100644 index 0000000..2325100 Binary files /dev/null and b/data/games/garage/mods/default/schematics/apple_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/aspen_log.mts b/data/games/garage/mods/default/schematics/aspen_log.mts new file mode 100644 index 0000000..d0c723d Binary files /dev/null and b/data/games/garage/mods/default/schematics/aspen_log.mts differ diff --git a/data/games/garage/mods/default/schematics/aspen_tree.mts b/data/games/garage/mods/default/schematics/aspen_tree.mts new file mode 100644 index 0000000..429a831 Binary files /dev/null and b/data/games/garage/mods/default/schematics/aspen_tree.mts differ diff --git a/data/games/garage/mods/default/schematics/aspen_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/aspen_tree_from_sapling.mts new file mode 100644 index 0000000..b7ab3ee Binary files /dev/null and b/data/games/garage/mods/default/schematics/aspen_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/blueberry_bush.mts b/data/games/garage/mods/default/schematics/blueberry_bush.mts new file mode 100644 index 0000000..cf4d8ef Binary files /dev/null and b/data/games/garage/mods/default/schematics/blueberry_bush.mts differ diff --git a/data/games/garage/mods/default/schematics/bush.mts b/data/games/garage/mods/default/schematics/bush.mts new file mode 100644 index 0000000..d08cf5f Binary files /dev/null and b/data/games/garage/mods/default/schematics/bush.mts differ diff --git a/data/games/garage/mods/default/schematics/emergent_jungle_tree.mts b/data/games/garage/mods/default/schematics/emergent_jungle_tree.mts new file mode 100644 index 0000000..b526430 Binary files /dev/null and b/data/games/garage/mods/default/schematics/emergent_jungle_tree.mts differ diff --git a/data/games/garage/mods/default/schematics/emergent_jungle_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/emergent_jungle_tree_from_sapling.mts new file mode 100644 index 0000000..cb4e4e9 Binary files /dev/null and b/data/games/garage/mods/default/schematics/emergent_jungle_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/jungle_log.mts b/data/games/garage/mods/default/schematics/jungle_log.mts new file mode 100644 index 0000000..34dca43 Binary files /dev/null and b/data/games/garage/mods/default/schematics/jungle_log.mts differ diff --git a/data/games/garage/mods/default/schematics/jungle_tree.mts b/data/games/garage/mods/default/schematics/jungle_tree.mts new file mode 100644 index 0000000..fe93c8c Binary files /dev/null and b/data/games/garage/mods/default/schematics/jungle_tree.mts differ diff --git a/data/games/garage/mods/default/schematics/jungle_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/jungle_tree_from_sapling.mts new file mode 100644 index 0000000..f32d312 Binary files /dev/null and b/data/games/garage/mods/default/schematics/jungle_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/large_cactus.mts b/data/games/garage/mods/default/schematics/large_cactus.mts new file mode 100644 index 0000000..755e2d8 Binary files /dev/null and b/data/games/garage/mods/default/schematics/large_cactus.mts differ diff --git a/data/games/garage/mods/default/schematics/papyrus_on_dirt.mts b/data/games/garage/mods/default/schematics/papyrus_on_dirt.mts new file mode 100644 index 0000000..1333a7c Binary files /dev/null and b/data/games/garage/mods/default/schematics/papyrus_on_dirt.mts differ diff --git a/data/games/garage/mods/default/schematics/papyrus_on_dry_dirt.mts b/data/games/garage/mods/default/schematics/papyrus_on_dry_dirt.mts new file mode 100644 index 0000000..3626580 Binary files /dev/null and b/data/games/garage/mods/default/schematics/papyrus_on_dry_dirt.mts differ diff --git a/data/games/garage/mods/default/schematics/pine_bush.mts b/data/games/garage/mods/default/schematics/pine_bush.mts new file mode 100644 index 0000000..ca572a7 Binary files /dev/null and b/data/games/garage/mods/default/schematics/pine_bush.mts differ diff --git a/data/games/garage/mods/default/schematics/pine_log.mts b/data/games/garage/mods/default/schematics/pine_log.mts new file mode 100644 index 0000000..d51a489 Binary files /dev/null and b/data/games/garage/mods/default/schematics/pine_log.mts differ diff --git a/data/games/garage/mods/default/schematics/pine_tree.mts b/data/games/garage/mods/default/schematics/pine_tree.mts new file mode 100644 index 0000000..c80532a Binary files /dev/null and b/data/games/garage/mods/default/schematics/pine_tree.mts differ diff --git a/data/games/garage/mods/default/schematics/pine_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/pine_tree_from_sapling.mts new file mode 100644 index 0000000..0800387 Binary files /dev/null and b/data/games/garage/mods/default/schematics/pine_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/small_pine_tree.mts b/data/games/garage/mods/default/schematics/small_pine_tree.mts new file mode 100644 index 0000000..b283226 Binary files /dev/null and b/data/games/garage/mods/default/schematics/small_pine_tree.mts differ diff --git a/data/games/garage/mods/default/schematics/small_pine_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/small_pine_tree_from_sapling.mts new file mode 100644 index 0000000..a1b1170 Binary files /dev/null and b/data/games/garage/mods/default/schematics/small_pine_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/snowy_pine_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/snowy_pine_tree_from_sapling.mts new file mode 100644 index 0000000..3d502a3 Binary files /dev/null and b/data/games/garage/mods/default/schematics/snowy_pine_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/schematics/snowy_small_pine_tree_from_sapling.mts b/data/games/garage/mods/default/schematics/snowy_small_pine_tree_from_sapling.mts new file mode 100644 index 0000000..d017c9e Binary files /dev/null and b/data/games/garage/mods/default/schematics/snowy_small_pine_tree_from_sapling.mts differ diff --git a/data/games/garage/mods/default/sounds/default_break_glass.1.ogg b/data/games/garage/mods/default/sounds/default_break_glass.1.ogg new file mode 100644 index 0000000..b1ccc5f Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_break_glass.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_break_glass.2.ogg b/data/games/garage/mods/default/sounds/default_break_glass.2.ogg new file mode 100644 index 0000000..b6cc9e8 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_break_glass.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_break_glass.3.ogg b/data/games/garage/mods/default/sounds/default_break_glass.3.ogg new file mode 100644 index 0000000..ae6a6bf Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_break_glass.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_chest_close.ogg b/data/games/garage/mods/default/sounds/default_chest_close.ogg new file mode 100644 index 0000000..068d900 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_chest_close.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_chest_open.ogg b/data/games/garage/mods/default/sounds/default_chest_open.ogg new file mode 100644 index 0000000..40b0b93 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_chest_open.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_cool_lava.1.ogg b/data/games/garage/mods/default/sounds/default_cool_lava.1.ogg new file mode 100644 index 0000000..42506dd Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_cool_lava.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_cool_lava.2.ogg b/data/games/garage/mods/default/sounds/default_cool_lava.2.ogg new file mode 100644 index 0000000..2747ab8 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_cool_lava.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_cool_lava.3.ogg b/data/games/garage/mods/default/sounds/default_cool_lava.3.ogg new file mode 100644 index 0000000..8baeac3 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_cool_lava.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_choppy.1.ogg b/data/games/garage/mods/default/sounds/default_dig_choppy.1.ogg new file mode 100644 index 0000000..95fa6d4 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_choppy.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_choppy.2.ogg b/data/games/garage/mods/default/sounds/default_dig_choppy.2.ogg new file mode 100644 index 0000000..5d3a044 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_choppy.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_choppy.3.ogg b/data/games/garage/mods/default/sounds/default_dig_choppy.3.ogg new file mode 100644 index 0000000..2bb0ace Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_choppy.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_cracky.1.ogg b/data/games/garage/mods/default/sounds/default_dig_cracky.1.ogg new file mode 100644 index 0000000..ffced27 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_cracky.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_cracky.2.ogg b/data/games/garage/mods/default/sounds/default_dig_cracky.2.ogg new file mode 100644 index 0000000..d9e8010 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_cracky.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_cracky.3.ogg b/data/games/garage/mods/default/sounds/default_dig_cracky.3.ogg new file mode 100644 index 0000000..7d19d40 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_cracky.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_crumbly.ogg b/data/games/garage/mods/default/sounds/default_dig_crumbly.ogg new file mode 100644 index 0000000..a0b2a1f Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_crumbly.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_dig_immediate.ogg b/data/games/garage/mods/default/sounds/default_dig_dig_immediate.ogg new file mode 100644 index 0000000..e65d766 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_dig_immediate.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_metal.ogg b/data/games/garage/mods/default/sounds/default_dig_metal.ogg new file mode 100644 index 0000000..0b58509 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_metal.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg b/data/games/garage/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg new file mode 100644 index 0000000..ef4d7b1 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dig_snappy.ogg b/data/games/garage/mods/default/sounds/default_dig_snappy.ogg new file mode 100644 index 0000000..3686fcd Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dig_snappy.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dirt_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_dirt_footstep.1.ogg new file mode 100644 index 0000000..201aa3b Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dirt_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dirt_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_dirt_footstep.2.ogg new file mode 100644 index 0000000..2667dbc Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dirt_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dug_metal.1.ogg b/data/games/garage/mods/default/sounds/default_dug_metal.1.ogg new file mode 100644 index 0000000..5d6cb5b Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dug_metal.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dug_metal.2.ogg b/data/games/garage/mods/default/sounds/default_dug_metal.2.ogg new file mode 100644 index 0000000..63567fc Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dug_metal.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dug_node.1.ogg b/data/games/garage/mods/default/sounds/default_dug_node.1.ogg new file mode 100644 index 0000000..c04975d Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dug_node.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_dug_node.2.ogg b/data/games/garage/mods/default/sounds/default_dug_node.2.ogg new file mode 100644 index 0000000..9f20926 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_dug_node.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_furnace_active.ogg b/data/games/garage/mods/default/sounds/default_furnace_active.ogg new file mode 100644 index 0000000..536edc2 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_furnace_active.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_glass_footstep.ogg b/data/games/garage/mods/default/sounds/default_glass_footstep.ogg new file mode 100644 index 0000000..191287a Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_glass_footstep.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_grass_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_grass_footstep.1.ogg new file mode 100644 index 0000000..a04cdb4 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_grass_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_grass_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_grass_footstep.2.ogg new file mode 100644 index 0000000..d193068 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_grass_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_grass_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_grass_footstep.3.ogg new file mode 100644 index 0000000..e1897ea Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_grass_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_dig.1.ogg b/data/games/garage/mods/default/sounds/default_gravel_dig.1.ogg new file mode 100644 index 0000000..baf8fca Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_dig.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_dig.2.ogg b/data/games/garage/mods/default/sounds/default_gravel_dig.2.ogg new file mode 100644 index 0000000..e0c0c50 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_dig.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_dug.1.ogg b/data/games/garage/mods/default/sounds/default_gravel_dug.1.ogg new file mode 100644 index 0000000..1303433 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_dug.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_dug.2.ogg b/data/games/garage/mods/default/sounds/default_gravel_dug.2.ogg new file mode 100644 index 0000000..ee5ed33 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_dug.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_dug.3.ogg b/data/games/garage/mods/default/sounds/default_gravel_dug.3.ogg new file mode 100644 index 0000000..add4c54 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_dug.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_gravel_footstep.1.ogg new file mode 100644 index 0000000..8d260ce Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_gravel_footstep.2.ogg new file mode 100644 index 0000000..2aba2c6 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_gravel_footstep.3.ogg new file mode 100644 index 0000000..1bcd8a1 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_gravel_footstep.4.ogg b/data/games/garage/mods/default/sounds/default_gravel_footstep.4.ogg new file mode 100644 index 0000000..696c9ff Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_gravel_footstep.4.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_hard_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_hard_footstep.1.ogg new file mode 100644 index 0000000..0a08efa Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_hard_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_hard_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_hard_footstep.2.ogg new file mode 100644 index 0000000..be52a87 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_hard_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_hard_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_hard_footstep.3.ogg new file mode 100644 index 0000000..a342787 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_hard_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_ice_dig.1.ogg b/data/games/garage/mods/default/sounds/default_ice_dig.1.ogg new file mode 100644 index 0000000..97399c8 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_ice_dig.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_ice_dig.2.ogg b/data/games/garage/mods/default/sounds/default_ice_dig.2.ogg new file mode 100644 index 0000000..8a5da11 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_ice_dig.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_ice_dig.3.ogg b/data/games/garage/mods/default/sounds/default_ice_dig.3.ogg new file mode 100644 index 0000000..765fb9b Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_ice_dig.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_ice_dug.ogg b/data/games/garage/mods/default/sounds/default_ice_dug.ogg new file mode 100644 index 0000000..ae37673 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_ice_dug.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_ice_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_ice_footstep.1.ogg new file mode 100644 index 0000000..c235f1e Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_ice_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_ice_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_ice_footstep.2.ogg new file mode 100644 index 0000000..61d2c99 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_ice_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_ice_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_ice_footstep.3.ogg new file mode 100644 index 0000000..2ecbb43 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_ice_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_item_smoke.ogg b/data/games/garage/mods/default/sounds/default_item_smoke.ogg new file mode 100644 index 0000000..038a46e Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_item_smoke.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_metal_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_metal_footstep.1.ogg new file mode 100644 index 0000000..49fe89b Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_metal_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_metal_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_metal_footstep.2.ogg new file mode 100644 index 0000000..878711d Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_metal_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_metal_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_metal_footstep.3.ogg new file mode 100644 index 0000000..2a566a8 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_metal_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_place_node.1.ogg b/data/games/garage/mods/default/sounds/default_place_node.1.ogg new file mode 100644 index 0000000..46b9756 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_place_node.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_place_node.2.ogg b/data/games/garage/mods/default/sounds/default_place_node.2.ogg new file mode 100644 index 0000000..d34c01a Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_place_node.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_place_node.3.ogg b/data/games/garage/mods/default/sounds/default_place_node.3.ogg new file mode 100644 index 0000000..fc29365 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_place_node.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_place_node_hard.1.ogg b/data/games/garage/mods/default/sounds/default_place_node_hard.1.ogg new file mode 100644 index 0000000..9f97fac Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_place_node_hard.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_place_node_hard.2.ogg b/data/games/garage/mods/default/sounds/default_place_node_hard.2.ogg new file mode 100644 index 0000000..1d3b3de Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_place_node_hard.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_place_node_metal.1.ogg b/data/games/garage/mods/default/sounds/default_place_node_metal.1.ogg new file mode 100644 index 0000000..5da085e Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_place_node_metal.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_place_node_metal.2.ogg b/data/games/garage/mods/default/sounds/default_place_node_metal.2.ogg new file mode 100644 index 0000000..5ee67fc Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_place_node_metal.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_sand_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_sand_footstep.1.ogg new file mode 100644 index 0000000..b92feab Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_sand_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_sand_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_sand_footstep.2.ogg new file mode 100644 index 0000000..6bc5da3 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_sand_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_sand_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_sand_footstep.3.ogg new file mode 100644 index 0000000..880306f Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_sand_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_snow_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_snow_footstep.1.ogg new file mode 100644 index 0000000..97cc825 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_snow_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_snow_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_snow_footstep.2.ogg new file mode 100644 index 0000000..97a6baa Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_snow_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_snow_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_snow_footstep.3.ogg new file mode 100644 index 0000000..bde1f21 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_snow_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_snow_footstep.4.ogg b/data/games/garage/mods/default/sounds/default_snow_footstep.4.ogg new file mode 100644 index 0000000..8ca6a59 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_snow_footstep.4.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_snow_footstep.5.ogg b/data/games/garage/mods/default/sounds/default_snow_footstep.5.ogg new file mode 100644 index 0000000..220d60c Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_snow_footstep.5.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_tool_breaks.1.ogg b/data/games/garage/mods/default/sounds/default_tool_breaks.1.ogg new file mode 100644 index 0000000..2a571ae Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_tool_breaks.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_tool_breaks.2.ogg b/data/games/garage/mods/default/sounds/default_tool_breaks.2.ogg new file mode 100644 index 0000000..1789352 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_tool_breaks.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_tool_breaks.3.ogg b/data/games/garage/mods/default/sounds/default_tool_breaks.3.ogg new file mode 100644 index 0000000..a99c4b7 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_tool_breaks.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_water_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_water_footstep.1.ogg new file mode 100644 index 0000000..63b9744 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_water_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_water_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_water_footstep.2.ogg new file mode 100644 index 0000000..8d79c1f Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_water_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_water_footstep.3.ogg b/data/games/garage/mods/default/sounds/default_water_footstep.3.ogg new file mode 100644 index 0000000..f889150 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_water_footstep.3.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_wood_footstep.1.ogg b/data/games/garage/mods/default/sounds/default_wood_footstep.1.ogg new file mode 100644 index 0000000..34f63a1 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_wood_footstep.1.ogg differ diff --git a/data/games/garage/mods/default/sounds/default_wood_footstep.2.ogg b/data/games/garage/mods/default/sounds/default_wood_footstep.2.ogg new file mode 100644 index 0000000..124fc29 Binary files /dev/null and b/data/games/garage/mods/default/sounds/default_wood_footstep.2.ogg differ diff --git a/data/games/garage/mods/default/sounds/player_damage.ogg b/data/games/garage/mods/default/sounds/player_damage.ogg new file mode 100644 index 0000000..7888087 Binary files /dev/null and b/data/games/garage/mods/default/sounds/player_damage.ogg differ diff --git a/data/games/garage/mods/default/textures/bubble.png b/data/games/garage/mods/default/textures/bubble.png new file mode 100644 index 0000000..30170d2 Binary files /dev/null and b/data/games/garage/mods/default/textures/bubble.png differ diff --git a/data/games/garage/mods/default/textures/crack_anylength.png b/data/games/garage/mods/default/textures/crack_anylength.png new file mode 100644 index 0000000..297eced Binary files /dev/null and b/data/games/garage/mods/default/textures/crack_anylength.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_bush_sapling.png b/data/games/garage/mods/default/textures/default_acacia_bush_sapling.png new file mode 100644 index 0000000..940b3aa Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_bush_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_bush_stem.png b/data/games/garage/mods/default/textures/default_acacia_bush_stem.png new file mode 100644 index 0000000..f2ee9fa Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_bush_stem.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_leaves.png b/data/games/garage/mods/default/textures/default_acacia_leaves.png new file mode 100644 index 0000000..9620c40 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_leaves.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_leaves_simple.png b/data/games/garage/mods/default/textures/default_acacia_leaves_simple.png new file mode 100644 index 0000000..ab464ba Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_leaves_simple.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_sapling.png b/data/games/garage/mods/default/textures/default_acacia_sapling.png new file mode 100644 index 0000000..e34aec5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_tree.png b/data/games/garage/mods/default/textures/default_acacia_tree.png new file mode 100644 index 0000000..86ab6b1 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_tree.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_tree_top.png b/data/games/garage/mods/default/textures/default_acacia_tree_top.png new file mode 100644 index 0000000..5dbe97b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_tree_top.png differ diff --git a/data/games/garage/mods/default/textures/default_acacia_wood.png b/data/games/garage/mods/default/textures/default_acacia_wood.png new file mode 100644 index 0000000..f2f8337 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_acacia_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_apple.png b/data/games/garage/mods/default/textures/default_apple.png new file mode 100644 index 0000000..7549bfd Binary files /dev/null and b/data/games/garage/mods/default/textures/default_apple.png differ diff --git a/data/games/garage/mods/default/textures/default_aspen_leaves.png b/data/games/garage/mods/default/textures/default_aspen_leaves.png new file mode 100644 index 0000000..2d6a7ef Binary files /dev/null and b/data/games/garage/mods/default/textures/default_aspen_leaves.png differ diff --git a/data/games/garage/mods/default/textures/default_aspen_sapling.png b/data/games/garage/mods/default/textures/default_aspen_sapling.png new file mode 100644 index 0000000..f4c772c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_aspen_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_aspen_tree.png b/data/games/garage/mods/default/textures/default_aspen_tree.png new file mode 100644 index 0000000..db2285e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_aspen_tree.png differ diff --git a/data/games/garage/mods/default/textures/default_aspen_tree_top.png b/data/games/garage/mods/default/textures/default_aspen_tree_top.png new file mode 100644 index 0000000..61ac009 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_aspen_tree_top.png differ diff --git a/data/games/garage/mods/default/textures/default_aspen_wood.png b/data/games/garage/mods/default/textures/default_aspen_wood.png new file mode 100644 index 0000000..f31ac30 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_aspen_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_blueberries.png b/data/games/garage/mods/default/textures/default_blueberries.png new file mode 100644 index 0000000..1dbb0d6 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_blueberries.png differ diff --git a/data/games/garage/mods/default/textures/default_blueberry_bush_leaves.png b/data/games/garage/mods/default/textures/default_blueberry_bush_leaves.png new file mode 100644 index 0000000..d6736ca Binary files /dev/null and b/data/games/garage/mods/default/textures/default_blueberry_bush_leaves.png differ diff --git a/data/games/garage/mods/default/textures/default_blueberry_bush_sapling.png b/data/games/garage/mods/default/textures/default_blueberry_bush_sapling.png new file mode 100644 index 0000000..c22a374 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_blueberry_bush_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_blueberry_overlay.png b/data/games/garage/mods/default/textures/default_blueberry_overlay.png new file mode 100644 index 0000000..a7f8ab0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_blueberry_overlay.png differ diff --git a/data/games/garage/mods/default/textures/default_book.png b/data/games/garage/mods/default/textures/default_book.png new file mode 100644 index 0000000..bcf1e6a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_book.png differ diff --git a/data/games/garage/mods/default/textures/default_book_written.png b/data/games/garage/mods/default/textures/default_book_written.png new file mode 100644 index 0000000..f23d122 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_book_written.png differ diff --git a/data/games/garage/mods/default/textures/default_bookshelf.png b/data/games/garage/mods/default/textures/default_bookshelf.png new file mode 100644 index 0000000..3407f75 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_bookshelf.png differ diff --git a/data/games/garage/mods/default/textures/default_bookshelf_slot.png b/data/games/garage/mods/default/textures/default_bookshelf_slot.png new file mode 100644 index 0000000..ea4fdba Binary files /dev/null and b/data/games/garage/mods/default/textures/default_bookshelf_slot.png differ diff --git a/data/games/garage/mods/default/textures/default_brick.png b/data/games/garage/mods/default/textures/default_brick.png new file mode 100644 index 0000000..de98961 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_bronze_block.png b/data/games/garage/mods/default/textures/default_bronze_block.png new file mode 100644 index 0000000..491fc78 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_bronze_block.png differ diff --git a/data/games/garage/mods/default/textures/default_bronze_ingot.png b/data/games/garage/mods/default/textures/default_bronze_ingot.png new file mode 100644 index 0000000..6cccdf6 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_bronze_ingot.png differ diff --git a/data/games/garage/mods/default/textures/default_bush_sapling.png b/data/games/garage/mods/default/textures/default_bush_sapling.png new file mode 100644 index 0000000..905ba4b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_bush_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_bush_stem.png b/data/games/garage/mods/default/textures/default_bush_stem.png new file mode 100644 index 0000000..6ad8888 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_bush_stem.png differ diff --git a/data/games/garage/mods/default/textures/default_cactus_side.png b/data/games/garage/mods/default/textures/default_cactus_side.png new file mode 100644 index 0000000..e5c10c3 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_cactus_side.png differ diff --git a/data/games/garage/mods/default/textures/default_cactus_top.png b/data/games/garage/mods/default/textures/default_cactus_top.png new file mode 100644 index 0000000..cf46aa2 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_cactus_top.png differ diff --git a/data/games/garage/mods/testformspec/textures/default_chest_front.png b/data/games/garage/mods/default/textures/default_chest_front.png similarity index 100% rename from data/games/garage/mods/testformspec/textures/default_chest_front.png rename to data/games/garage/mods/default/textures/default_chest_front.png diff --git a/data/games/garage/mods/testformspec/textures/default_chest_inside.png b/data/games/garage/mods/default/textures/default_chest_inside.png similarity index 100% rename from data/games/garage/mods/testformspec/textures/default_chest_inside.png rename to data/games/garage/mods/default/textures/default_chest_inside.png diff --git a/data/games/garage/mods/default/textures/default_chest_lock.png b/data/games/garage/mods/default/textures/default_chest_lock.png new file mode 100644 index 0000000..b1885ea Binary files /dev/null and b/data/games/garage/mods/default/textures/default_chest_lock.png differ diff --git a/data/games/garage/mods/testformspec/textures/default_chest_side.png b/data/games/garage/mods/default/textures/default_chest_side.png similarity index 100% rename from data/games/garage/mods/testformspec/textures/default_chest_side.png rename to data/games/garage/mods/default/textures/default_chest_side.png diff --git a/data/games/garage/mods/testformspec/textures/default_chest_top.png b/data/games/garage/mods/default/textures/default_chest_top.png similarity index 100% rename from data/games/garage/mods/testformspec/textures/default_chest_top.png rename to data/games/garage/mods/default/textures/default_chest_top.png diff --git a/data/games/garage/mods/default/textures/default_clay.png b/data/games/garage/mods/default/textures/default_clay.png new file mode 100644 index 0000000..76e5a40 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_clay.png differ diff --git a/data/games/garage/mods/default/textures/default_clay_brick.png b/data/games/garage/mods/default/textures/default_clay_brick.png new file mode 100644 index 0000000..b288ef0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_clay_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_clay_lump.png b/data/games/garage/mods/default/textures/default_clay_lump.png new file mode 100644 index 0000000..c1d0220 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_clay_lump.png differ diff --git a/data/games/garage/mods/default/textures/default_cloud.png b/data/games/garage/mods/default/textures/default_cloud.png new file mode 100644 index 0000000..faf0ec1 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_cloud.png differ diff --git a/data/games/garage/mods/default/textures/default_coal_block.png b/data/games/garage/mods/default/textures/default_coal_block.png new file mode 100644 index 0000000..e92c532 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coal_block.png differ diff --git a/data/games/garage/mods/default/textures/default_coal_lump.png b/data/games/garage/mods/default/textures/default_coal_lump.png new file mode 100644 index 0000000..792961d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coal_lump.png differ diff --git a/data/games/garage/mods/default/textures/default_cobble.png b/data/games/garage/mods/default/textures/default_cobble.png new file mode 100644 index 0000000..d379840 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_cobble.png differ diff --git a/data/games/garage/mods/default/textures/default_coniferous_litter.png b/data/games/garage/mods/default/textures/default_coniferous_litter.png new file mode 100644 index 0000000..9d9651a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coniferous_litter.png differ diff --git a/data/games/garage/mods/default/textures/default_coniferous_litter_side.png b/data/games/garage/mods/default/textures/default_coniferous_litter_side.png new file mode 100644 index 0000000..9a39058 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coniferous_litter_side.png differ diff --git a/data/games/garage/mods/default/textures/default_copper_block.png b/data/games/garage/mods/default/textures/default_copper_block.png new file mode 100644 index 0000000..e1b60f0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_copper_block.png differ diff --git a/data/games/garage/mods/default/textures/default_copper_ingot.png b/data/games/garage/mods/default/textures/default_copper_ingot.png new file mode 100644 index 0000000..bcad9c0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_copper_ingot.png differ diff --git a/data/games/garage/mods/default/textures/default_copper_lump.png b/data/games/garage/mods/default/textures/default_copper_lump.png new file mode 100644 index 0000000..998c592 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_copper_lump.png differ diff --git a/data/games/garage/mods/default/textures/default_coral_brown.png b/data/games/garage/mods/default/textures/default_coral_brown.png new file mode 100644 index 0000000..7a18bd7 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coral_brown.png differ diff --git a/data/games/garage/mods/default/textures/default_coral_cyan.png b/data/games/garage/mods/default/textures/default_coral_cyan.png new file mode 100644 index 0000000..890347f Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coral_cyan.png differ diff --git a/data/games/garage/mods/default/textures/default_coral_green.png b/data/games/garage/mods/default/textures/default_coral_green.png new file mode 100644 index 0000000..78f3f33 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coral_green.png differ diff --git a/data/games/garage/mods/default/textures/default_coral_orange.png b/data/games/garage/mods/default/textures/default_coral_orange.png new file mode 100644 index 0000000..d7432ab Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coral_orange.png differ diff --git a/data/games/garage/mods/default/textures/default_coral_pink.png b/data/games/garage/mods/default/textures/default_coral_pink.png new file mode 100644 index 0000000..3708ba5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coral_pink.png differ diff --git a/data/games/garage/mods/default/textures/default_coral_skeleton.png b/data/games/garage/mods/default/textures/default_coral_skeleton.png new file mode 100644 index 0000000..d00c6fe Binary files /dev/null and b/data/games/garage/mods/default/textures/default_coral_skeleton.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_cobble.png b/data/games/garage/mods/default/textures/default_desert_cobble.png new file mode 100644 index 0000000..fa1af5d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_cobble.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_sand.png b/data/games/garage/mods/default/textures/default_desert_sand.png new file mode 100644 index 0000000..75ade0b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_sand.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_sandstone.png b/data/games/garage/mods/default/textures/default_desert_sandstone.png new file mode 100644 index 0000000..e0b22d0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_sandstone.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_sandstone_block.png b/data/games/garage/mods/default/textures/default_desert_sandstone_block.png new file mode 100644 index 0000000..6f6c8ff Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_sandstone_block.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_sandstone_brick.png b/data/games/garage/mods/default/textures/default_desert_sandstone_brick.png new file mode 100644 index 0000000..d2b70dd Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_sandstone_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_stone.png b/data/games/garage/mods/default/textures/default_desert_stone.png new file mode 100644 index 0000000..5d3aded Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_stone.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_stone_block.png b/data/games/garage/mods/default/textures/default_desert_stone_block.png new file mode 100644 index 0000000..e8e842b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_stone_block.png differ diff --git a/data/games/garage/mods/default/textures/default_desert_stone_brick.png b/data/games/garage/mods/default/textures/default_desert_stone_brick.png new file mode 100644 index 0000000..8e7208d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_desert_stone_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_diamond.png b/data/games/garage/mods/default/textures/default_diamond.png new file mode 100644 index 0000000..a8dac74 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_diamond.png differ diff --git a/data/games/garage/mods/default/textures/default_diamond_block.png b/data/games/garage/mods/default/textures/default_diamond_block.png new file mode 100644 index 0000000..20c33ed Binary files /dev/null and b/data/games/garage/mods/default/textures/default_diamond_block.png differ diff --git a/data/games/garage/mods/default/textures/default_dirt.png b/data/games/garage/mods/default/textures/default_dirt.png new file mode 100644 index 0000000..4ed965a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dirt.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_dirt.png b/data/games/garage/mods/default/textures/default_dry_dirt.png new file mode 100644 index 0000000..8ee5398 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_dirt.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_grass.png b/data/games/garage/mods/default/textures/default_dry_grass.png new file mode 100644 index 0000000..11def9c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_grass.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_grass_1.png b/data/games/garage/mods/default/textures/default_dry_grass_1.png new file mode 100644 index 0000000..d91174c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_grass_1.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_grass_2.png b/data/games/garage/mods/default/textures/default_dry_grass_2.png new file mode 100644 index 0000000..b12bf54 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_grass_2.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_grass_3.png b/data/games/garage/mods/default/textures/default_dry_grass_3.png new file mode 100644 index 0000000..c37a8eb Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_grass_3.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_grass_4.png b/data/games/garage/mods/default/textures/default_dry_grass_4.png new file mode 100644 index 0000000..c00c702 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_grass_4.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_grass_5.png b/data/games/garage/mods/default/textures/default_dry_grass_5.png new file mode 100644 index 0000000..10a0931 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_grass_5.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_grass_side.png b/data/games/garage/mods/default/textures/default_dry_grass_side.png new file mode 100644 index 0000000..3ccbe41 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_grass_side.png differ diff --git a/data/games/garage/mods/default/textures/default_dry_shrub.png b/data/games/garage/mods/default/textures/default_dry_shrub.png new file mode 100644 index 0000000..82c9cc5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_dry_shrub.png differ diff --git a/data/games/garage/mods/default/textures/default_emergent_jungle_sapling.png b/data/games/garage/mods/default/textures/default_emergent_jungle_sapling.png new file mode 100644 index 0000000..b363b3c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_emergent_jungle_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_acacia_wood.png b/data/games/garage/mods/default/textures/default_fence_acacia_wood.png new file mode 100644 index 0000000..0fb97cc Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_acacia_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_aspen_wood.png b/data/games/garage/mods/default/textures/default_fence_aspen_wood.png new file mode 100644 index 0000000..fec9755 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_aspen_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_junglewood.png b/data/games/garage/mods/default/textures/default_fence_junglewood.png new file mode 100644 index 0000000..b3b8549 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_junglewood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_overlay.png b/data/games/garage/mods/default/textures/default_fence_overlay.png new file mode 100644 index 0000000..718184c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_overlay.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_pine_wood.png b/data/games/garage/mods/default/textures/default_fence_pine_wood.png new file mode 100644 index 0000000..5045d19 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_pine_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_rail_acacia_wood.png b/data/games/garage/mods/default/textures/default_fence_rail_acacia_wood.png new file mode 100644 index 0000000..7081cdb Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_rail_acacia_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_rail_aspen_wood.png b/data/games/garage/mods/default/textures/default_fence_rail_aspen_wood.png new file mode 100644 index 0000000..0d35302 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_rail_aspen_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_rail_junglewood.png b/data/games/garage/mods/default/textures/default_fence_rail_junglewood.png new file mode 100644 index 0000000..6616059 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_rail_junglewood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_rail_overlay.png b/data/games/garage/mods/default/textures/default_fence_rail_overlay.png new file mode 100644 index 0000000..4da47ae Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_rail_overlay.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_rail_pine_wood.png b/data/games/garage/mods/default/textures/default_fence_rail_pine_wood.png new file mode 100644 index 0000000..b2f74a3 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_rail_pine_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_rail_wood.png b/data/games/garage/mods/default/textures/default_fence_rail_wood.png new file mode 100644 index 0000000..e41143c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_rail_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fence_wood.png b/data/games/garage/mods/default/textures/default_fence_wood.png new file mode 100644 index 0000000..7d161dc Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fence_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_fern_1.png b/data/games/garage/mods/default/textures/default_fern_1.png new file mode 100644 index 0000000..b307986 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fern_1.png differ diff --git a/data/games/garage/mods/default/textures/default_fern_2.png b/data/games/garage/mods/default/textures/default_fern_2.png new file mode 100644 index 0000000..6c5f7d5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fern_2.png differ diff --git a/data/games/garage/mods/default/textures/default_fern_3.png b/data/games/garage/mods/default/textures/default_fern_3.png new file mode 100644 index 0000000..2c1f605 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_fern_3.png differ diff --git a/data/games/garage/mods/default/textures/default_flint.png b/data/games/garage/mods/default/textures/default_flint.png new file mode 100644 index 0000000..9763f4b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_flint.png differ diff --git a/data/games/garage/mods/default/textures/default_footprint.png b/data/games/garage/mods/default/textures/default_footprint.png new file mode 100644 index 0000000..24d3e94 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_footprint.png differ diff --git a/data/games/garage/mods/default/textures/default_furnace_bottom.png b/data/games/garage/mods/default/textures/default_furnace_bottom.png new file mode 100644 index 0000000..92279ba Binary files /dev/null and b/data/games/garage/mods/default/textures/default_furnace_bottom.png differ diff --git a/data/games/garage/mods/default/textures/default_furnace_fire_bg.png b/data/games/garage/mods/default/textures/default_furnace_fire_bg.png new file mode 100644 index 0000000..126204a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_furnace_fire_bg.png differ diff --git a/data/games/garage/mods/default/textures/default_furnace_fire_fg.png b/data/games/garage/mods/default/textures/default_furnace_fire_fg.png new file mode 100644 index 0000000..576f113 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_furnace_fire_fg.png differ diff --git a/data/games/garage/mods/default/textures/default_furnace_front.png b/data/games/garage/mods/default/textures/default_furnace_front.png new file mode 100644 index 0000000..f445d83 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_furnace_front.png differ diff --git a/data/games/garage/mods/default/textures/default_furnace_front_active.png b/data/games/garage/mods/default/textures/default_furnace_front_active.png new file mode 100644 index 0000000..68c03f5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_furnace_front_active.png differ diff --git a/data/games/garage/mods/default/textures/default_furnace_side.png b/data/games/garage/mods/default/textures/default_furnace_side.png new file mode 100644 index 0000000..33408cf Binary files /dev/null and b/data/games/garage/mods/default/textures/default_furnace_side.png differ diff --git a/data/games/garage/mods/default/textures/default_furnace_top.png b/data/games/garage/mods/default/textures/default_furnace_top.png new file mode 100644 index 0000000..92279ba Binary files /dev/null and b/data/games/garage/mods/default/textures/default_furnace_top.png differ diff --git a/data/games/garage/mods/default/textures/default_glass.png b/data/games/garage/mods/default/textures/default_glass.png new file mode 100644 index 0000000..74d6a02 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_glass.png differ diff --git a/data/games/garage/mods/default/textures/default_glass_detail.png b/data/games/garage/mods/default/textures/default_glass_detail.png new file mode 100644 index 0000000..7eab49e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_glass_detail.png differ diff --git a/data/games/garage/mods/default/textures/default_gold_block.png b/data/games/garage/mods/default/textures/default_gold_block.png new file mode 100644 index 0000000..170d50b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_gold_block.png differ diff --git a/data/games/garage/mods/default/textures/default_gold_ingot.png b/data/games/garage/mods/default/textures/default_gold_ingot.png new file mode 100644 index 0000000..ba66471 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_gold_ingot.png differ diff --git a/data/games/garage/mods/default/textures/default_gold_lump.png b/data/games/garage/mods/default/textures/default_gold_lump.png new file mode 100644 index 0000000..d5a1be7 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_gold_lump.png differ diff --git a/data/games/garage/mods/default/textures/default_grass.png b/data/games/garage/mods/default/textures/default_grass.png new file mode 100644 index 0000000..5778caa Binary files /dev/null and b/data/games/garage/mods/default/textures/default_grass.png differ diff --git a/data/games/garage/mods/default/textures/default_grass_1.png b/data/games/garage/mods/default/textures/default_grass_1.png new file mode 100644 index 0000000..d16b307 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_grass_1.png differ diff --git a/data/games/garage/mods/default/textures/default_grass_2.png b/data/games/garage/mods/default/textures/default_grass_2.png new file mode 100644 index 0000000..6a1dac2 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_grass_2.png differ diff --git a/data/games/garage/mods/default/textures/default_grass_3.png b/data/games/garage/mods/default/textures/default_grass_3.png new file mode 100644 index 0000000..e67727a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_grass_3.png differ diff --git a/data/games/garage/mods/default/textures/default_grass_4.png b/data/games/garage/mods/default/textures/default_grass_4.png new file mode 100644 index 0000000..80269d7 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_grass_4.png differ diff --git a/data/games/garage/mods/default/textures/default_grass_5.png b/data/games/garage/mods/default/textures/default_grass_5.png new file mode 100644 index 0000000..df45760 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_grass_5.png differ diff --git a/data/games/garage/mods/default/textures/default_grass_side.png b/data/games/garage/mods/default/textures/default_grass_side.png new file mode 100644 index 0000000..77aa655 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_grass_side.png differ diff --git a/data/games/garage/mods/default/textures/default_gravel.png b/data/games/garage/mods/default/textures/default_gravel.png new file mode 100644 index 0000000..37bf286 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_gravel.png differ diff --git a/data/games/garage/mods/default/textures/default_ice.png b/data/games/garage/mods/default/textures/default_ice.png new file mode 100644 index 0000000..09b53f2 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_ice.png differ diff --git a/data/games/garage/mods/default/textures/default_invisible_node_overlay.png b/data/games/garage/mods/default/textures/default_invisible_node_overlay.png new file mode 100644 index 0000000..7fc8806 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_invisible_node_overlay.png differ diff --git a/data/games/garage/mods/default/textures/default_iron_lump.png b/data/games/garage/mods/default/textures/default_iron_lump.png new file mode 100644 index 0000000..db61a94 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_iron_lump.png differ diff --git a/data/games/garage/mods/default/textures/default_item_smoke.png b/data/games/garage/mods/default/textures/default_item_smoke.png new file mode 100644 index 0000000..ae95c16 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_item_smoke.png differ diff --git a/data/games/garage/mods/default/textures/default_junglegrass.png b/data/games/garage/mods/default/textures/default_junglegrass.png new file mode 100644 index 0000000..25abb71 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_junglegrass.png differ diff --git a/data/games/garage/mods/default/textures/default_jungleleaves.png b/data/games/garage/mods/default/textures/default_jungleleaves.png new file mode 100644 index 0000000..9a8d5f9 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_jungleleaves.png differ diff --git a/data/games/garage/mods/default/textures/default_jungleleaves_simple.png b/data/games/garage/mods/default/textures/default_jungleleaves_simple.png new file mode 100644 index 0000000..d0c3f7e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_jungleleaves_simple.png differ diff --git a/data/games/garage/mods/default/textures/default_junglesapling.png b/data/games/garage/mods/default/textures/default_junglesapling.png new file mode 100644 index 0000000..05e1e50 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_junglesapling.png differ diff --git a/data/games/garage/mods/default/textures/default_jungletree.png b/data/games/garage/mods/default/textures/default_jungletree.png new file mode 100644 index 0000000..671b24d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_jungletree.png differ diff --git a/data/games/garage/mods/default/textures/default_jungletree_top.png b/data/games/garage/mods/default/textures/default_jungletree_top.png new file mode 100644 index 0000000..4027d9e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_jungletree_top.png differ diff --git a/data/games/garage/mods/default/textures/default_junglewood.png b/data/games/garage/mods/default/textures/default_junglewood.png new file mode 100644 index 0000000..68d9e48 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_junglewood.png differ diff --git a/data/games/garage/mods/default/textures/default_kelp.png b/data/games/garage/mods/default/textures/default_kelp.png new file mode 100644 index 0000000..4b95b84 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_kelp.png differ diff --git a/data/games/garage/mods/default/textures/default_ladder_steel.png b/data/games/garage/mods/default/textures/default_ladder_steel.png new file mode 100644 index 0000000..8704126 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_ladder_steel.png differ diff --git a/data/games/garage/mods/default/textures/default_ladder_wood.png b/data/games/garage/mods/default/textures/default_ladder_wood.png new file mode 100644 index 0000000..6e18e54 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_ladder_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_large_cactus_seedling.png b/data/games/garage/mods/default/textures/default_large_cactus_seedling.png new file mode 100644 index 0000000..c8ebf3c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_large_cactus_seedling.png differ diff --git a/data/games/garage/mods/default/textures/default_lava.png b/data/games/garage/mods/default/textures/default_lava.png new file mode 100644 index 0000000..1d7039f Binary files /dev/null and b/data/games/garage/mods/default/textures/default_lava.png differ diff --git a/data/games/garage/mods/default/textures/default_lava_flowing_animated.png b/data/games/garage/mods/default/textures/default_lava_flowing_animated.png new file mode 100644 index 0000000..ebb0ec1 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_lava_flowing_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_lava_source_animated.png b/data/games/garage/mods/default/textures/default_lava_source_animated.png new file mode 100644 index 0000000..326af64 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_lava_source_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_leaves.png b/data/games/garage/mods/default/textures/default_leaves.png new file mode 100644 index 0000000..55ba1e6 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_leaves.png differ diff --git a/data/games/garage/mods/default/textures/default_leaves_simple.png b/data/games/garage/mods/default/textures/default_leaves_simple.png new file mode 100644 index 0000000..c71def7 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_leaves_simple.png differ diff --git a/data/games/garage/mods/default/textures/default_marram_grass_1.png b/data/games/garage/mods/default/textures/default_marram_grass_1.png new file mode 100644 index 0000000..107a259 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_marram_grass_1.png differ diff --git a/data/games/garage/mods/default/textures/default_marram_grass_2.png b/data/games/garage/mods/default/textures/default_marram_grass_2.png new file mode 100644 index 0000000..a6d05c5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_marram_grass_2.png differ diff --git a/data/games/garage/mods/default/textures/default_marram_grass_3.png b/data/games/garage/mods/default/textures/default_marram_grass_3.png new file mode 100644 index 0000000..2a9668c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_marram_grass_3.png differ diff --git a/data/games/garage/mods/default/textures/default_mese_block.png b/data/games/garage/mods/default/textures/default_mese_block.png new file mode 100644 index 0000000..77524fa Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mese_block.png differ diff --git a/data/games/garage/mods/default/textures/default_mese_crystal.png b/data/games/garage/mods/default/textures/default_mese_crystal.png new file mode 100644 index 0000000..f1d71f1 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mese_crystal.png differ diff --git a/data/games/garage/mods/default/textures/default_mese_crystal_fragment.png b/data/games/garage/mods/default/textures/default_mese_crystal_fragment.png new file mode 100644 index 0000000..d5416ab Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mese_crystal_fragment.png differ diff --git a/data/games/garage/mods/default/textures/default_mese_post_light_side.png b/data/games/garage/mods/default/textures/default_mese_post_light_side.png new file mode 100644 index 0000000..80a0999 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mese_post_light_side.png differ diff --git a/data/games/garage/mods/default/textures/default_mese_post_light_side_dark.png b/data/games/garage/mods/default/textures/default_mese_post_light_side_dark.png new file mode 100644 index 0000000..4243e48 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mese_post_light_side_dark.png differ diff --git a/data/games/garage/mods/default/textures/default_meselamp.png b/data/games/garage/mods/default/textures/default_meselamp.png new file mode 100644 index 0000000..d15c8b9 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_meselamp.png differ diff --git a/data/games/garage/mods/default/textures/default_mineral_coal.png b/data/games/garage/mods/default/textures/default_mineral_coal.png new file mode 100644 index 0000000..6d1386b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mineral_coal.png differ diff --git a/data/games/garage/mods/default/textures/default_mineral_copper.png b/data/games/garage/mods/default/textures/default_mineral_copper.png new file mode 100644 index 0000000..c4c518e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mineral_copper.png differ diff --git a/data/games/garage/mods/default/textures/default_mineral_diamond.png b/data/games/garage/mods/default/textures/default_mineral_diamond.png new file mode 100644 index 0000000..b817bd1 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mineral_diamond.png differ diff --git a/data/games/garage/mods/default/textures/default_mineral_gold.png b/data/games/garage/mods/default/textures/default_mineral_gold.png new file mode 100644 index 0000000..2220add Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mineral_gold.png differ diff --git a/data/games/garage/mods/default/textures/default_mineral_iron.png b/data/games/garage/mods/default/textures/default_mineral_iron.png new file mode 100644 index 0000000..5d63062 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mineral_iron.png differ diff --git a/data/games/garage/mods/default/textures/default_mineral_mese.png b/data/games/garage/mods/default/textures/default_mineral_mese.png new file mode 100644 index 0000000..56a447d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mineral_mese.png differ diff --git a/data/games/garage/mods/default/textures/default_mineral_tin.png b/data/games/garage/mods/default/textures/default_mineral_tin.png new file mode 100644 index 0000000..232d4b5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mineral_tin.png differ diff --git a/data/games/garage/mods/default/textures/default_moss.png b/data/games/garage/mods/default/textures/default_moss.png new file mode 100644 index 0000000..bb98d7f Binary files /dev/null and b/data/games/garage/mods/default/textures/default_moss.png differ diff --git a/data/games/garage/mods/default/textures/default_moss_side.png b/data/games/garage/mods/default/textures/default_moss_side.png new file mode 100644 index 0000000..f18322c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_moss_side.png differ diff --git a/data/games/garage/mods/default/textures/default_mossycobble.png b/data/games/garage/mods/default/textures/default_mossycobble.png new file mode 100644 index 0000000..1071cb4 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_mossycobble.png differ diff --git a/data/games/garage/mods/default/textures/default_obsidian.png b/data/games/garage/mods/default/textures/default_obsidian.png new file mode 100644 index 0000000..30e063f Binary files /dev/null and b/data/games/garage/mods/default/textures/default_obsidian.png differ diff --git a/data/games/garage/mods/default/textures/default_obsidian_block.png b/data/games/garage/mods/default/textures/default_obsidian_block.png new file mode 100644 index 0000000..dd93f8d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_obsidian_block.png differ diff --git a/data/games/garage/mods/default/textures/default_obsidian_brick.png b/data/games/garage/mods/default/textures/default_obsidian_brick.png new file mode 100644 index 0000000..e4c8fe7 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_obsidian_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_obsidian_glass.png b/data/games/garage/mods/default/textures/default_obsidian_glass.png new file mode 100644 index 0000000..d5ac83d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_obsidian_glass.png differ diff --git a/data/games/garage/mods/default/textures/default_obsidian_glass_detail.png b/data/games/garage/mods/default/textures/default_obsidian_glass_detail.png new file mode 100644 index 0000000..1397ecc Binary files /dev/null and b/data/games/garage/mods/default/textures/default_obsidian_glass_detail.png differ diff --git a/data/games/garage/mods/default/textures/default_obsidian_shard.png b/data/games/garage/mods/default/textures/default_obsidian_shard.png new file mode 100644 index 0000000..a988d8c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_obsidian_shard.png differ diff --git a/data/games/garage/mods/default/textures/default_paper.png b/data/games/garage/mods/default/textures/default_paper.png new file mode 100644 index 0000000..8f23924 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_paper.png differ diff --git a/data/games/garage/mods/default/textures/default_papyrus.png b/data/games/garage/mods/default/textures/default_papyrus.png new file mode 100644 index 0000000..982d589 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_papyrus.png differ diff --git a/data/games/garage/mods/default/textures/default_permafrost.png b/data/games/garage/mods/default/textures/default_permafrost.png new file mode 100644 index 0000000..6f2567e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_permafrost.png differ diff --git a/data/games/garage/mods/default/textures/default_pine_bush_sapling.png b/data/games/garage/mods/default/textures/default_pine_bush_sapling.png new file mode 100644 index 0000000..fadeff8 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_pine_bush_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_pine_bush_stem.png b/data/games/garage/mods/default/textures/default_pine_bush_stem.png new file mode 100644 index 0000000..7dc00f7 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_pine_bush_stem.png differ diff --git a/data/games/garage/mods/default/textures/default_pine_needles.png b/data/games/garage/mods/default/textures/default_pine_needles.png new file mode 100644 index 0000000..e0e3990 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_pine_needles.png differ diff --git a/data/games/garage/mods/default/textures/default_pine_sapling.png b/data/games/garage/mods/default/textures/default_pine_sapling.png new file mode 100644 index 0000000..c30131d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_pine_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_pine_tree.png b/data/games/garage/mods/default/textures/default_pine_tree.png new file mode 100644 index 0000000..4a5328f Binary files /dev/null and b/data/games/garage/mods/default/textures/default_pine_tree.png differ diff --git a/data/games/garage/mods/default/textures/default_pine_tree_top.png b/data/games/garage/mods/default/textures/default_pine_tree_top.png new file mode 100644 index 0000000..e26a835 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_pine_tree_top.png differ diff --git a/data/games/garage/mods/default/textures/default_pine_wood.png b/data/games/garage/mods/default/textures/default_pine_wood.png new file mode 100644 index 0000000..29f9d6d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_pine_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_rainforest_litter.png b/data/games/garage/mods/default/textures/default_rainforest_litter.png new file mode 100644 index 0000000..d762deb Binary files /dev/null and b/data/games/garage/mods/default/textures/default_rainforest_litter.png differ diff --git a/data/games/garage/mods/default/textures/default_rainforest_litter_side.png b/data/games/garage/mods/default/textures/default_rainforest_litter_side.png new file mode 100644 index 0000000..1bd0bb6 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_rainforest_litter_side.png differ diff --git a/data/games/garage/mods/default/textures/default_river_water.png b/data/games/garage/mods/default/textures/default_river_water.png new file mode 100644 index 0000000..bee757b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_river_water.png differ diff --git a/data/games/garage/mods/default/textures/default_river_water_flowing_animated.png b/data/games/garage/mods/default/textures/default_river_water_flowing_animated.png new file mode 100644 index 0000000..760d9eb Binary files /dev/null and b/data/games/garage/mods/default/textures/default_river_water_flowing_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_river_water_source_animated.png b/data/games/garage/mods/default/textures/default_river_water_source_animated.png new file mode 100644 index 0000000..e7259cc Binary files /dev/null and b/data/games/garage/mods/default/textures/default_river_water_source_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_sand.png b/data/games/garage/mods/default/textures/default_sand.png new file mode 100644 index 0000000..645a300 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sand.png differ diff --git a/data/games/garage/mods/default/textures/default_sandstone.png b/data/games/garage/mods/default/textures/default_sandstone.png new file mode 100644 index 0000000..16e3d13 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sandstone.png differ diff --git a/data/games/garage/mods/default/textures/default_sandstone_block.png b/data/games/garage/mods/default/textures/default_sandstone_block.png new file mode 100644 index 0000000..c3adfd9 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sandstone_block.png differ diff --git a/data/games/garage/mods/default/textures/default_sandstone_brick.png b/data/games/garage/mods/default/textures/default_sandstone_brick.png new file mode 100644 index 0000000..6326391 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sandstone_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_sapling.png b/data/games/garage/mods/default/textures/default_sapling.png new file mode 100644 index 0000000..3fd64f0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sapling.png differ diff --git a/data/games/garage/mods/default/textures/default_sign_steel.png b/data/games/garage/mods/default/textures/default_sign_steel.png new file mode 100644 index 0000000..1ea3ec9 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sign_steel.png differ diff --git a/data/games/garage/mods/default/textures/default_sign_wall_steel.png b/data/games/garage/mods/default/textures/default_sign_wall_steel.png new file mode 100644 index 0000000..9a9273d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sign_wall_steel.png differ diff --git a/data/games/garage/mods/default/textures/default_sign_wall_wood.png b/data/games/garage/mods/default/textures/default_sign_wall_wood.png new file mode 100644 index 0000000..eb91cf6 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sign_wall_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_sign_wood.png b/data/games/garage/mods/default/textures/default_sign_wood.png new file mode 100644 index 0000000..07eb984 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_sign_wood.png differ diff --git a/data/games/garage/mods/default/textures/default_silver_sand.png b/data/games/garage/mods/default/textures/default_silver_sand.png new file mode 100644 index 0000000..90a7044 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_silver_sand.png differ diff --git a/data/games/garage/mods/default/textures/default_silver_sandstone.png b/data/games/garage/mods/default/textures/default_silver_sandstone.png new file mode 100644 index 0000000..1ccecbf Binary files /dev/null and b/data/games/garage/mods/default/textures/default_silver_sandstone.png differ diff --git a/data/games/garage/mods/default/textures/default_silver_sandstone_block.png b/data/games/garage/mods/default/textures/default_silver_sandstone_block.png new file mode 100644 index 0000000..c8c14e4 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_silver_sandstone_block.png differ diff --git a/data/games/garage/mods/default/textures/default_silver_sandstone_brick.png b/data/games/garage/mods/default/textures/default_silver_sandstone_brick.png new file mode 100644 index 0000000..cb7be40 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_silver_sandstone_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_snow.png b/data/games/garage/mods/default/textures/default_snow.png new file mode 100644 index 0000000..6a12161 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_snow.png differ diff --git a/data/games/garage/mods/default/textures/default_snow_side.png b/data/games/garage/mods/default/textures/default_snow_side.png new file mode 100644 index 0000000..8465d80 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_snow_side.png differ diff --git a/data/games/garage/mods/default/textures/default_snowball.png b/data/games/garage/mods/default/textures/default_snowball.png new file mode 100644 index 0000000..13eb27a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_snowball.png differ diff --git a/data/games/garage/mods/default/textures/default_steel_block.png b/data/games/garage/mods/default/textures/default_steel_block.png new file mode 100644 index 0000000..5e421f0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_steel_block.png differ diff --git a/data/games/garage/mods/default/textures/default_steel_ingot.png b/data/games/garage/mods/default/textures/default_steel_ingot.png new file mode 100644 index 0000000..8100b01 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_steel_ingot.png differ diff --git a/data/games/garage/mods/default/textures/default_stick.png b/data/games/garage/mods/default/textures/default_stick.png new file mode 100644 index 0000000..0378d07 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_stick.png differ diff --git a/data/games/garage/mods/default/textures/default_stone.png b/data/games/garage/mods/default/textures/default_stone.png new file mode 100644 index 0000000..d3f0ef8 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_stone.png differ diff --git a/data/games/garage/mods/default/textures/default_stone_block.png b/data/games/garage/mods/default/textures/default_stone_block.png new file mode 100644 index 0000000..2d09878 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_stone_block.png differ diff --git a/data/games/garage/mods/default/textures/default_stone_brick.png b/data/games/garage/mods/default/textures/default_stone_brick.png new file mode 100644 index 0000000..3ae9602 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_stone_brick.png differ diff --git a/data/games/garage/mods/default/textures/default_stones.png b/data/games/garage/mods/default/textures/default_stones.png new file mode 100644 index 0000000..d09e329 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_stones.png differ diff --git a/data/games/garage/mods/default/textures/default_stones_side.png b/data/games/garage/mods/default/textures/default_stones_side.png new file mode 100644 index 0000000..7ae823a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_stones_side.png differ diff --git a/data/games/garage/mods/default/textures/default_tin_block.png b/data/games/garage/mods/default/textures/default_tin_block.png new file mode 100644 index 0000000..a834d27 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tin_block.png differ diff --git a/data/games/garage/mods/default/textures/default_tin_ingot.png b/data/games/garage/mods/default/textures/default_tin_ingot.png new file mode 100644 index 0000000..eed5361 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tin_ingot.png differ diff --git a/data/games/garage/mods/default/textures/default_tin_lump.png b/data/games/garage/mods/default/textures/default_tin_lump.png new file mode 100644 index 0000000..72bd339 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tin_lump.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_bronzeaxe.png b/data/games/garage/mods/default/textures/default_tool_bronzeaxe.png new file mode 100644 index 0000000..8ae43b5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_bronzeaxe.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_bronzepick.png b/data/games/garage/mods/default/textures/default_tool_bronzepick.png new file mode 100644 index 0000000..c88a5f0 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_bronzepick.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_bronzeshovel.png b/data/games/garage/mods/default/textures/default_tool_bronzeshovel.png new file mode 100644 index 0000000..d7d800e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_bronzeshovel.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_bronzesword.png b/data/games/garage/mods/default/textures/default_tool_bronzesword.png new file mode 100644 index 0000000..cdab898 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_bronzesword.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_diamondaxe.png b/data/games/garage/mods/default/textures/default_tool_diamondaxe.png new file mode 100644 index 0000000..e32a0bf Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_diamondaxe.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_diamondpick.png b/data/games/garage/mods/default/textures/default_tool_diamondpick.png new file mode 100644 index 0000000..5dcc998 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_diamondpick.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_diamondshovel.png b/data/games/garage/mods/default/textures/default_tool_diamondshovel.png new file mode 100644 index 0000000..d0fe24d Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_diamondshovel.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_diamondsword.png b/data/games/garage/mods/default/textures/default_tool_diamondsword.png new file mode 100644 index 0000000..dbccd0e Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_diamondsword.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_meseaxe.png b/data/games/garage/mods/default/textures/default_tool_meseaxe.png new file mode 100644 index 0000000..c01fb4f Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_meseaxe.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_mesepick.png b/data/games/garage/mods/default/textures/default_tool_mesepick.png new file mode 100644 index 0000000..1b2e25b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_mesepick.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_meseshovel.png b/data/games/garage/mods/default/textures/default_tool_meseshovel.png new file mode 100644 index 0000000..00813a2 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_meseshovel.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_mesesword.png b/data/games/garage/mods/default/textures/default_tool_mesesword.png new file mode 100644 index 0000000..d395d3a Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_mesesword.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_steelaxe.png b/data/games/garage/mods/default/textures/default_tool_steelaxe.png new file mode 100644 index 0000000..1528cad Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_steelaxe.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_steelpick.png b/data/games/garage/mods/default/textures/default_tool_steelpick.png new file mode 100644 index 0000000..a7543a1 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_steelpick.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_steelshovel.png b/data/games/garage/mods/default/textures/default_tool_steelshovel.png new file mode 100644 index 0000000..65e4045 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_steelshovel.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_steelsword.png b/data/games/garage/mods/default/textures/default_tool_steelsword.png new file mode 100644 index 0000000..630a339 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_steelsword.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_stoneaxe.png b/data/games/garage/mods/default/textures/default_tool_stoneaxe.png new file mode 100644 index 0000000..cc36054 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_stoneaxe.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_stonepick.png b/data/games/garage/mods/default/textures/default_tool_stonepick.png new file mode 100644 index 0000000..237d739 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_stonepick.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_stoneshovel.png b/data/games/garage/mods/default/textures/default_tool_stoneshovel.png new file mode 100644 index 0000000..11711bd Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_stoneshovel.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_stonesword.png b/data/games/garage/mods/default/textures/default_tool_stonesword.png new file mode 100644 index 0000000..1a493ac Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_stonesword.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_woodaxe.png b/data/games/garage/mods/default/textures/default_tool_woodaxe.png new file mode 100644 index 0000000..68f1fd8 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_woodaxe.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_woodpick.png b/data/games/garage/mods/default/textures/default_tool_woodpick.png new file mode 100644 index 0000000..0aed583 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_woodpick.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_woodshovel.png b/data/games/garage/mods/default/textures/default_tool_woodshovel.png new file mode 100644 index 0000000..dcef2b5 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_woodshovel.png differ diff --git a/data/games/garage/mods/default/textures/default_tool_woodsword.png b/data/games/garage/mods/default/textures/default_tool_woodsword.png new file mode 100644 index 0000000..c78ba50 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tool_woodsword.png differ diff --git a/data/games/garage/mods/default/textures/default_torch_animated.png b/data/games/garage/mods/default/textures/default_torch_animated.png new file mode 100644 index 0000000..cdf33ef Binary files /dev/null and b/data/games/garage/mods/default/textures/default_torch_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_torch_on_ceiling_animated.png b/data/games/garage/mods/default/textures/default_torch_on_ceiling_animated.png new file mode 100644 index 0000000..5465217 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_torch_on_ceiling_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_torch_on_floor.png b/data/games/garage/mods/default/textures/default_torch_on_floor.png new file mode 100644 index 0000000..bc4bdd6 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_torch_on_floor.png differ diff --git a/data/games/garage/mods/default/textures/default_torch_on_floor_animated.png b/data/games/garage/mods/default/textures/default_torch_on_floor_animated.png new file mode 100644 index 0000000..ad51c03 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_torch_on_floor_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_tree.png b/data/games/garage/mods/default/textures/default_tree.png new file mode 100644 index 0000000..fe89963 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tree.png differ diff --git a/data/games/garage/mods/default/textures/default_tree_top.png b/data/games/garage/mods/default/textures/default_tree_top.png new file mode 100644 index 0000000..9205ed9 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_tree_top.png differ diff --git a/data/games/garage/mods/default/textures/default_water.png b/data/games/garage/mods/default/textures/default_water.png new file mode 100644 index 0000000..ee093a9 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_water.png differ diff --git a/data/games/garage/mods/default/textures/default_water_flowing_animated.png b/data/games/garage/mods/default/textures/default_water_flowing_animated.png new file mode 100644 index 0000000..c9d9e3b Binary files /dev/null and b/data/games/garage/mods/default/textures/default_water_flowing_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_water_source_animated.png b/data/games/garage/mods/default/textures/default_water_source_animated.png new file mode 100644 index 0000000..c4fed81 Binary files /dev/null and b/data/games/garage/mods/default/textures/default_water_source_animated.png differ diff --git a/data/games/garage/mods/default/textures/default_wood.png b/data/games/garage/mods/default/textures/default_wood.png new file mode 100644 index 0000000..af56d6c Binary files /dev/null and b/data/games/garage/mods/default/textures/default_wood.png differ diff --git a/data/games/garage/mods/default/textures/gui_formbg.png b/data/games/garage/mods/default/textures/gui_formbg.png new file mode 100644 index 0000000..e259fec Binary files /dev/null and b/data/games/garage/mods/default/textures/gui_formbg.png differ diff --git a/data/games/garage/mods/default/textures/gui_furnace_arrow_bg.png b/data/games/garage/mods/default/textures/gui_furnace_arrow_bg.png new file mode 100644 index 0000000..046d8cd Binary files /dev/null and b/data/games/garage/mods/default/textures/gui_furnace_arrow_bg.png differ diff --git a/data/games/garage/mods/default/textures/gui_furnace_arrow_fg.png b/data/games/garage/mods/default/textures/gui_furnace_arrow_fg.png new file mode 100644 index 0000000..8d3c396 Binary files /dev/null and b/data/games/garage/mods/default/textures/gui_furnace_arrow_fg.png differ diff --git a/data/games/garage/mods/default/textures/gui_hb_bg.png b/data/games/garage/mods/default/textures/gui_hb_bg.png new file mode 100644 index 0000000..99248e1 Binary files /dev/null and b/data/games/garage/mods/default/textures/gui_hb_bg.png differ diff --git a/data/games/garage/mods/default/textures/gui_hotbar.png b/data/games/garage/mods/default/textures/gui_hotbar.png new file mode 100644 index 0000000..7bc7887 Binary files /dev/null and b/data/games/garage/mods/default/textures/gui_hotbar.png differ diff --git a/data/games/garage/mods/default/textures/gui_hotbar_selected.png b/data/games/garage/mods/default/textures/gui_hotbar_selected.png new file mode 100644 index 0000000..7203e9a Binary files /dev/null and b/data/games/garage/mods/default/textures/gui_hotbar_selected.png differ diff --git a/data/games/garage/mods/default/textures/heart.png b/data/games/garage/mods/default/textures/heart.png new file mode 100644 index 0000000..4412cab Binary files /dev/null and b/data/games/garage/mods/default/textures/heart.png differ diff --git a/data/games/garage/mods/default/textures/wieldhand.png b/data/games/garage/mods/default/textures/wieldhand.png new file mode 100644 index 0000000..69f4b7b Binary files /dev/null and b/data/games/garage/mods/default/textures/wieldhand.png differ diff --git a/data/games/garage/mods/default/tools.lua b/data/games/garage/mods/default/tools.lua new file mode 100644 index 0000000..1a95a50 --- /dev/null +++ b/data/games/garage/mods/default/tools.lua @@ -0,0 +1,477 @@ +-- mods/default/tools.lua + +-- support for MT game translation. +local S = default.get_translator + +-- The hand +-- Override the hand item registered in the engine in builtin/game/register.lua +minetest.override_item("", { + wield_scale = {x=1,y=1,z=2.5}, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, + snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, + oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, uses=0} + }, + damage_groups = {fleshy=1}, + } +}) + +-- +-- Picks +-- + +minetest.register_tool("default:pick_wood", { + description = S("Wooden Pickaxe"), + inventory_image = "default_tool_woodpick.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + cracky = {times={[3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1, flammable = 2} +}) + +minetest.register_tool("default:pick_stone", { + description = S("Stone Pickaxe"), + inventory_image = "default_tool_stonepick.png", + tool_capabilities = { + full_punch_interval = 1.3, + max_drop_level=0, + groupcaps={ + cracky = {times={[2]=2.0, [3]=1.00}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_bronze", { + description = S("Bronze Pickaxe"), + inventory_image = "default_tool_bronzepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.50, [2]=1.80, [3]=0.90}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_steel", { + description = S("Steel Pickaxe"), + inventory_image = "default_tool_steelpick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_mese", { + description = S("Mese Pickaxe"), + inventory_image = "default_tool_mesepick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +minetest.register_tool("default:pick_diamond", { + description = S("Diamond Pickaxe"), + inventory_image = "default_tool_diamondpick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.0, [2]=1.0, [3]=0.50}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {pickaxe = 1} +}) + +-- +-- Shovels +-- + +minetest.register_tool("default:shovel_wood", { + description = S("Wooden Shovel"), + inventory_image = "default_tool_woodshovel.png", + wield_image = "default_tool_woodshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=3.00, [2]=1.60, [3]=0.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1, flammable = 2} +}) + +minetest.register_tool("default:shovel_stone", { + description = S("Stone Shovel"), + inventory_image = "default_tool_stoneshovel.png", + wield_image = "default_tool_stoneshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.4, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=1.80, [2]=1.20, [3]=0.50}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_bronze", { + description = S("Bronze Shovel"), + inventory_image = "default_tool_bronzeshovel.png", + wield_image = "default_tool_bronzeshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.65, [2]=1.05, [3]=0.45}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_steel", { + description = S("Steel Shovel"), + inventory_image = "default_tool_steelshovel.png", + wield_image = "default_tool_steelshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_mese", { + description = S("Mese Shovel"), + inventory_image = "default_tool_meseshovel.png", + wield_image = "default_tool_meseshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + crumbly = {times={[1]=1.20, [2]=0.60, [3]=0.30}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +minetest.register_tool("default:shovel_diamond", { + description = S("Diamond Shovel"), + inventory_image = "default_tool_diamondshovel.png", + wield_image = "default_tool_diamondshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.10, [2]=0.50, [3]=0.30}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {shovel = 1} +}) + +-- +-- Axes +-- + +minetest.register_tool("default:axe_wood", { + description = S("Wooden Axe"), + inventory_image = "default_tool_woodaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + groupcaps={ + choppy = {times={[2]=3.00, [3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1, flammable = 2} +}) + +minetest.register_tool("default:axe_stone", { + description = S("Stone Axe"), + inventory_image = "default_tool_stoneaxe.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + choppy={times={[1]=3.00, [2]=2.00, [3]=1.30}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_bronze", { + description = S("Bronze Axe"), + inventory_image = "default_tool_bronzeaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.75, [2]=1.70, [3]=1.15}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_steel", { + description = S("Steel Axe"), + inventory_image = "default_tool_steelaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_mese", { + description = S("Mese Axe"), + inventory_image = "default_tool_meseaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.20, [2]=1.00, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +minetest.register_tool("default:axe_diamond", { + description = S("Diamond Axe"), + inventory_image = "default_tool_diamondaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=7}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {axe = 1} +}) + +-- +-- Swords +-- + +minetest.register_tool("default:sword_wood", { + description = S("Wooden Sword"), + inventory_image = "default_tool_woodsword.png", + tool_capabilities = { + full_punch_interval = 1, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.6, [3]=0.40}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1, flammable = 2} +}) + +minetest.register_tool("default:sword_stone", { + description = S("Stone Sword"), + inventory_image = "default_tool_stonesword.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.4, [3]=0.40}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_bronze", { + description = S("Bronze Sword"), + inventory_image = "default_tool_bronzesword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.75, [2]=1.30, [3]=0.375}, uses=25, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_steel", { + description = S("Steel Sword"), + inventory_image = "default_tool_steelsword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_mese", { + description = S("Mese Sword"), + inventory_image = "default_tool_mesesword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=7}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +minetest.register_tool("default:sword_diamond", { + description = S("Diamond Sword"), + inventory_image = "default_tool_diamondsword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=40, maxlevel=3}, + }, + damage_groups = {fleshy=8}, + }, + sound = {breaks = "default_tool_breaks"}, + groups = {sword = 1} +}) + +-- +-- Register Craft Recipies +-- + +local craft_ingreds = { + wood = "group:wood", + stone = "group:stone", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + mese = "default:mese_crystal", + diamond = "default:diamond" +} + +for name, mat in pairs(craft_ingreds) do + minetest.register_craft({ + output = "default:pick_".. name, + recipe = { + {mat, mat, mat}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + + minetest.register_craft({ + output = "default:shovel_".. name, + recipe = { + {mat}, + {"group:stick"}, + {"group:stick"} + } + }) + + minetest.register_craft({ + output = "default:axe_".. name, + recipe = { + {mat, mat}, + {mat, "group:stick"}, + {"", "group:stick"} + } + }) + + minetest.register_craft({ + output = "default:sword_".. name, + recipe = { + {mat}, + {mat}, + {"group:stick"} + } + }) +end + +minetest.register_craft({ + type = "fuel", + recipe = "default:pick_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:shovel_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:axe_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sword_wood", + burntime = 5, +}) diff --git a/data/games/garage/mods/default/torch.lua b/data/games/garage/mods/default/torch.lua new file mode 100644 index 0000000..e8f734c --- /dev/null +++ b/data/games/garage/mods/default/torch.lua @@ -0,0 +1,157 @@ +-- default/torch.lua + +-- support for MT game translation. +local S = default.get_translator + +local function on_flood(pos, oldnode, newnode) + minetest.add_item(pos, ItemStack("default:torch 1")) + -- Play flame-extinguish sound if liquid is not an 'igniter' + local nodedef = minetest.registered_items[newnode.name] + if not (nodedef and nodedef.groups and + nodedef.groups.igniter and nodedef.groups.igniter > 0) then + minetest.sound_play( + "default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.07}, + true + ) + end + -- Remove the torch node + return false +end + +minetest.register_node("default:torch", { + description = S("Torch"), + drawtype = "mesh", + mesh = "torch_floor.obj", + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_bottom = {-1/8, -1/2, -1/8, 1/8, 2/16, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + 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("default:torch_ceiling") + elseif wdir == 1 then + fakestack:set_name("default:torch") + else + fakestack:set_name("default:torch_wall") + end + + itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack:set_name("default:torch") + + return itemstack + end, + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +minetest.register_node("default:torch_wall", { + drawtype = "mesh", + mesh = "torch_wall.obj", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_side = {-1/2, -1/2, -1/8, -1/8, 1/8, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +minetest.register_node("default:torch_ceiling", { + drawtype = "mesh", + mesh = "torch_ceiling.obj", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + use_texture_alpha = "clip", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-1/8, -1/16, -5/16, 1/8, 1/2, 1/8}, + }, + sounds = default.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +minetest.register_lbm({ + name = "default:3dtorch", + nodenames = {"default:torch", "torches:floor", "torches:wall"}, + action = function(pos, node) + if node.param2 == 0 then + minetest.set_node(pos, {name = "default:torch_ceiling", + param2 = node.param2}) + elseif node.param2 == 1 then + minetest.set_node(pos, {name = "default:torch", + param2 = node.param2}) + else + minetest.set_node(pos, {name = "default:torch_wall", + param2 = node.param2}) + end + end +}) + +minetest.register_craft({ + output = "default:torch 4", + recipe = { + {"default:coal_lump"}, + {"group:stick"}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:torch", + burntime = 4, +}) diff --git a/data/games/garage/mods/default/trees.lua b/data/games/garage/mods/default/trees.lua new file mode 100644 index 0000000..9536369 --- /dev/null +++ b/data/games/garage/mods/default/trees.lua @@ -0,0 +1,605 @@ +-- default/trees.lua + +-- support for MT game translation. +local S = default.get_translator + +local random = math.random + +-- +-- Grow trees from saplings +-- + +-- 'can grow' function + +function default.can_grow(pos) + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + return false + end + if minetest.get_item_group(node_under.name, "soil") == 0 then + return false + end + local light_level = minetest.get_node_light(pos) + if not light_level or light_level < 13 then + return false + end + return true +end + +function default.on_grow_failed(pos) + minetest.get_node_timer(pos):start(300) +end + + +-- 'is snow nearby' function + +local function is_snow_nearby(pos) + return minetest.find_node_near(pos, 1, {"group:snowy"}) +end + + + +-- +-- Tree generation +-- + +-- Apple tree and jungle tree trunk and leaves function + +local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, + height, size, iters, is_apple_tree) + local x, y, z = pos.x, pos.y, pos.z + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_apple = minetest.get_content_id("default:apple") + + -- Trunk + data[a:index(x, y, z)] = tree_cid -- Force-place lowest trunk node to replace sapling + for yy = y + 1, y + height - 1 do + local vi = a:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or node_id == leaves_cid then + data[vi] = tree_cid + end + end + + -- Force leaves near the trunk + for z_dist = -1, 1 do + for y_dist = -size, 1 do + local vi = a:index(x - 1, y + height + y_dist, z + z_dist) + for x_dist = -1, 1 do + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + vi = vi + 1 + end + end + end + + -- Randomly add leaves in 2x2x2 clusters. + for i = 1, iters do + local clust_x = x + random(-size, size - 1) + local clust_y = y + height + random(-size, 0) + local clust_z = z + random(-size, size - 1) + + for xi = 0, 1 do + for yi = 0, 1 do + for zi = 0, 1 do + local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi) + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + end + end + end + end +end + + +-- Apple tree + +function default.grow_tree(pos, is_apple_tree, bad) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(4, 5) + local c_tree = minetest.get_content_id("default:tree") + local c_leaves = minetest.get_content_id("default:leaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 2, y = y, z = z - 2}, + {x = x + 2, y = y + height + 1, z = z + 2} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_tree, c_leaves, height, 2, 8, is_apple_tree) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +-- Jungle tree + +function default.grow_jungle_tree(pos, bad) + --[[ + NOTE: Jungletree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_jungle_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(8, 12) + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_jungletree = minetest.get_content_id("default:jungletree") + local c_jungleleaves = minetest.get_content_id("default:jungleleaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y - 1, z = z - 3}, + {x = x + 3, y = y + height + 1, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_jungletree, c_jungleleaves, + height, 3, 30, false) + + -- Roots + for z_dist = -1, 1 do + local vi_1 = a:index(x - 1, y - 1, z + z_dist) + local vi_2 = a:index(x - 1, y, z + z_dist) + for x_dist = -1, 1 do + if random(1, 3) >= 2 then + if data[vi_1] == c_air or data[vi_1] == c_ignore then + data[vi_1] = c_jungletree + elseif data[vi_2] == c_air or data[vi_2] == c_ignore then + data[vi_2] = c_jungletree + end + end + vi_1 = vi_1 + 1 + vi_2 = vi_2 + 1 + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + + +-- Pine tree from mg mapgen mod, design by sfan5, pointy top added by paramat + +local function add_pine_needles(data, vi, c_air, c_ignore, c_snow, c_pine_needles) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or node_id == c_snow then + data[vi] = c_pine_needles + end +end + +local function add_snow(data, vi, c_air, c_ignore, c_snow) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore then + data[vi] = c_snow + end +end + +function default.grow_pine_tree(pos, snow) + local x, y, z = pos.x, pos.y, pos.z + local maxy = y + random(9, 13) -- Trunk top + + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_pine_tree = minetest.get_content_id("default:pine_tree") + local c_pine_needles = minetest.get_content_id("default:pine_needles") + local c_snow = minetest.get_content_id("default:snow") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y, z = z - 3}, + {x = x + 3, y = maxy + 3, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + -- Upper branches layer + local dev = 3 + for yy = maxy - 1, maxy + 1 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Centre top nodes + add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore, c_snow, + c_pine_needles) + add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore, c_snow, + c_pine_needles) -- Paramat added a pointy top node + if snow then + add_snow(data, a:index(x, maxy + 3, z), c_air, c_ignore, c_snow) + end + + -- Lower branches layer + local my = 0 + for i = 1, 20 do -- Random 2x2 squares of needles + local xi = x + random(-3, 2) + local yy = maxy + random(-6, -5) + local zi = z + random(-3, 2) + if yy > my then + my = yy + end + for zz = zi, zi+1 do + local vi = a:index(xi, yy, zz) + local via = a:index(xi, yy + 1, zz) + for xx = xi, xi + 1 do + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + vi = vi + 1 + via = via + 1 + end + end + end + + dev = 2 + for yy = my + 1, my + 2 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Trunk + -- Force-place lowest trunk node to replace sapling + data[a:index(x, y, z)] = c_pine_tree + for yy = y + 1, maxy do + local vi = a:index(x, yy, z) + local node_id = data[vi] + if node_id == c_air or node_id == c_ignore or + node_id == c_pine_needles or node_id == c_snow then + data[vi] = c_pine_tree + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + + +-- New apple tree + +function default.grow_new_apple_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/apple_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, + path, "random", nil, false) +end + + +-- New jungle tree + +function default.grow_new_jungle_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/jungle_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- New emergent jungle tree + +function default.grow_new_emergent_jungle_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/emergent_jungle_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 3, y = pos.y - 5, z = pos.z - 3}, + path, "random", nil, false) +end + + +-- New pine tree + +function default.grow_new_pine_tree(pos) + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/small_pine_tree_from_sapling.mts" + end + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "0", nil, false) +end + + +-- New snowy pine tree + +function default.grow_new_snowy_pine_tree(pos) + local path + if math.random() > 0.5 then + path = minetest.get_modpath("default") .. + "/schematics/snowy_pine_tree_from_sapling.mts" + else + path = minetest.get_modpath("default") .. + "/schematics/snowy_small_pine_tree_from_sapling.mts" + end + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- New acacia tree + +function default.grow_new_acacia_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/acacia_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 4, y = pos.y - 1, z = pos.z - 4}, + path, "random", nil, false) +end + + +-- New aspen tree + +function default.grow_new_aspen_tree(pos) + local path = minetest.get_modpath("default") .. + "/schematics/aspen_tree_from_sapling.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "0", nil, false) +end + + +-- Bushes do not need 'from sapling' schematic variants because +-- only the stem node is force-placed in the schematic. + +-- Bush + +function default.grow_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + +-- Blueberry bush + +function default.grow_blueberry_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/blueberry_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Acacia bush + +function default.grow_acacia_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/acacia_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Pine bush + +function default.grow_pine_bush(pos) + local path = minetest.get_modpath("default") .. + "/schematics/pine_bush.mts" + minetest.place_schematic({x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, + path, "0", nil, false) +end + + +-- Large cactus + +function default.grow_large_cactus(pos) + local path = minetest.get_modpath("default") .. + "/schematics/large_cactus.mts" + minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, + path, "random", nil, false) +end + + +-- +-- Sapling 'on place' function to check protection of node and resulting tree volume +-- + +function default.sapling_on_place(itemstack, placer, pointed_thing, + sapling_name, minp_relative, maxp_relative, interval) + -- Position of sapling + local pos = pointed_thing.under + local node = minetest.get_node_or_nil(pos) + local pdef = node and minetest.registered_nodes[node.name] + + if pdef and pdef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + + if not pdef or not pdef.buildable_to then + pos = pointed_thing.above + node = minetest.get_node_or_nil(pos) + pdef = node and minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local player_name = placer and placer:get_player_name() or "" + -- Check sapling position for protection + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return itemstack + end + -- Check tree volume for protection + if minetest.is_area_protected( + vector.add(pos, minp_relative), + vector.add(pos, maxp_relative), + player_name, + interval) then + minetest.record_protection_violation(pos, player_name) + -- Print extra information to explain + minetest.chat_send_player(player_name, + S("@1 will intersect protection on growth.", + itemstack:get_definition().description)) + return itemstack + end + + if placer then + default.log_player_action(placer, "places node", sapling_name, "at", pos) + end + + local take_item = not minetest.is_creative_enabled(player_name) + local newnode = {name = sapling_name} + local ndef = minetest.registered_nodes[sapling_name] + minetest.set_node(pos, newnode) + + -- Run callback + if ndef and ndef.after_place_node then + -- Deepcopy place_to and pointed_thing because callback can modify it + if ndef.after_place_node(table.copy(pos), placer, + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + if callback(table.copy(pos), table.copy(newnode), + placer, table.copy(node or {}), + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + return itemstack +end + +-- Grow sapling + +default.sapling_growth_defs = {} + +function default.register_sapling_growth(name, def) + default.sapling_growth_defs[name] = { + can_grow = def.can_grow or default.can_grow, + on_grow_failed = def.on_grow_failed or default.on_grow_failed, + grow = assert(def.grow) + } +end + +function default.grow_sapling(pos) + local node = minetest.get_node(pos) + local sapling_def = default.sapling_growth_defs[node.name] + + if not sapling_def then + minetest.log("warning", "default.grow_sapling called on undefined sapling " .. node.name) + return + end + + if not sapling_def.can_grow(pos) then + sapling_def.on_grow_failed(pos) + return + end + + minetest.log("action", "Growing sapling " .. node.name .. " at " .. minetest.pos_to_string(pos)) + sapling_def.grow(pos) +end + +local function register_sapling_growth(nodename, grow) + default.register_sapling_growth("default:" .. nodename, {grow = grow}) +end + +if minetest.get_mapgen_setting("mg_name") == "v6" then + register_sapling_growth("sapling", function(pos) + default.grow_tree(pos, random(1, 4) == 1) + end) + register_sapling_growth("junglesapling", default.grow_jungle_tree) + register_sapling_growth("pine_sapling", function(pos) + local snow = is_snow_nearby(pos) + default.grow_pine_tree(pos, snow) + end) +else + register_sapling_growth("sapling", default.grow_new_apple_tree) + register_sapling_growth("junglesapling", default.grow_new_jungle_tree) + register_sapling_growth("pine_sapling", function(pos) + local snow = is_snow_nearby(pos) + if snow then + default.grow_new_snowy_pine_tree(pos) + else + default.grow_new_pine_tree(pos) + end + end) +end + +register_sapling_growth("acacia_sapling", default.grow_new_acacia_tree) +register_sapling_growth("aspen_sapling", default.grow_new_aspen_tree) +register_sapling_growth("bush_sapling", default.grow_bush) +register_sapling_growth("blueberry_bush_sapling", default.grow_blueberry_bush) +register_sapling_growth("acacia_bush_sapling", default.grow_acacia_bush) +register_sapling_growth("pine_bush_sapling", default.grow_pine_bush) +register_sapling_growth("emergent_jungle_sapling", default.grow_new_emergent_jungle_tree) + +-- Backwards compatibility for saplings that used to use ABMs; does not need to include newer saplings. +minetest.register_lbm({ + name = "default:convert_saplings_to_node_timer", + nodenames = {"default:sapling", "default:junglesapling", + "default:pine_sapling", "default:acacia_sapling", + "default:aspen_sapling"}, + action = function(pos) + minetest.get_node_timer(pos):start(math.random(300, 1500)) + end +}) diff --git a/data/games/garage/mods/dignodes/init.lua b/data/games/garage/mods/dignodes/init.lua deleted file mode 100644 index 312207e..0000000 --- a/data/games/garage/mods/dignodes/init.lua +++ /dev/null @@ -1,39 +0,0 @@ -local groups = { - "cracky", "dig_immediate" -} - --- Register dig nodes with 1 digging group, a rating between 1-3 and a level between 0-2 -for g=1, #groups do - local gr = groups[g] - for r=1, 3 do - for l=0, 2 do - if not (gr=="dig_immediate" and (l>0 or r==1)) then - local d - if l > 0 then - d = string.format("Dig Test Node: %s=%d, level=%d", gr, r, l) - else - d = string.format("Dig Test Node: %s=%d", gr, r) - end - local tile = "dignodes_"..gr..".png^dignodes_rating"..r..".png" - if l==1 then - tile = tile .. "^[colorize:#FFFF00:127" - elseif l==2 then - tile = tile .. "^[colorize:#FF0000:127" - end - core.register_node("dignodes:"..gr.."_"..r.."_"..l, { - description = d, - tiles = { tile }, - groups = { [gr] = r, level = l }, - }) - end - end - end -end - --- Node without any digging groups -core.register_node("dignodes:none", { - description = "Dig Test Node: groupless".."\n".. - "Can't be dug by normal digging tools".."\n".. - "(use the Remover tool to remove)", - tiles = {"dignodes_none.png"}, -}) diff --git a/data/games/garage/mods/dignodes/mod.conf b/data/games/garage/mods/dignodes/mod.conf deleted file mode 100644 index 52a80d6..0000000 --- a/data/games/garage/mods/dignodes/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = dignodes -description = Nodes with different digging groups diff --git a/data/games/garage/mods/dignodes/textures/dignodes_choppy.png b/data/games/garage/mods/dignodes/textures/dignodes_choppy.png deleted file mode 100644 index a73fc24..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_choppy.png and /dev/null differ diff --git a/data/games/garage/mods/dignodes/textures/dignodes_cracky.png b/data/games/garage/mods/dignodes/textures/dignodes_cracky.png deleted file mode 100644 index eb84e30..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_cracky.png and /dev/null differ diff --git a/data/games/garage/mods/dignodes/textures/dignodes_crumbly.png b/data/games/garage/mods/dignodes/textures/dignodes_crumbly.png deleted file mode 100644 index 23f2f7c..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_crumbly.png and /dev/null differ diff --git a/data/games/garage/mods/dignodes/textures/dignodes_dig_immediate.png b/data/games/garage/mods/dignodes/textures/dignodes_dig_immediate.png deleted file mode 100644 index a532ad9..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_dig_immediate.png and /dev/null differ diff --git a/data/games/garage/mods/dignodes/textures/dignodes_none.png b/data/games/garage/mods/dignodes/textures/dignodes_none.png deleted file mode 100644 index 60f1365..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_none.png and /dev/null differ diff --git a/data/games/garage/mods/dignodes/textures/dignodes_rating1.png b/data/games/garage/mods/dignodes/textures/dignodes_rating1.png deleted file mode 100644 index d2fee3a..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_rating1.png and /dev/null differ diff --git a/data/games/garage/mods/dignodes/textures/dignodes_rating2.png b/data/games/garage/mods/dignodes/textures/dignodes_rating2.png deleted file mode 100644 index 15329b9..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_rating2.png and /dev/null differ diff --git a/data/games/garage/mods/dignodes/textures/dignodes_rating3.png b/data/games/garage/mods/dignodes/textures/dignodes_rating3.png deleted file mode 100644 index 37216bf..0000000 Binary files a/data/games/garage/mods/dignodes/textures/dignodes_rating3.png and /dev/null differ diff --git a/data/games/garage/mods/doors/README.txt b/data/games/garage/mods/doors/README.txt new file mode 100644 index 0000000..b1ad3b5 --- /dev/null +++ b/data/games/garage/mods/doors/README.txt @@ -0,0 +1,87 @@ +Minetest Game mod: doors +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) + +Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor. + +Modified by sofar (sofar@foo-projects.org) (MIT): +Added Steel trapdoor. +Re-implemented most of the door algorithms, added meshes, UV wrapped texture. +Added doors API to facilitate coding mods accessing and operating doors. +Added Fence Gate model, code, and sounds. + +Various Minetest Game developers and contributors (MIT) + + +Authors of media (textures) +--------------------------- +Following textures created by Fernando Zapata (CC BY-SA 3.0): + door_wood.png + door_wood_a.png + door_wood_a_r.png + door_wood_b.png + door_wood_b_r.png + +Following textures created by BlockMen (CC BY-SA 3.0): + door_trapdoor.png + door_obsidian_glass_side.png + +Following textures created by celeron55 (CC BY-SA 3.0): + door_glass_a.png + door_glass_b.png + +Following textures created by PenguinDad (CC BY-SA 4.0): + door_glass.png + door_obsidian_glass.png + +Following textures created by sofar (CC-BY-SA-3.0): + doors_trapdoor_steel.png + +Following textures created by paramat (CC-BY-SA-3.0): + door_trapdoor_side.png + doors_trapdoor_steel_side.png + +Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): + door_obsidian_glass.png + +Glass door textures by Krock and paramat based on textures by VanessaE (CC BY-SA 3.0): + doors_door_glass.png + doors_item_glass.png + +All other textures (created by PilzAdam) (CC BY-SA 3.0): + +Door textures were converted to the new texture map by sofar, paramat and +red-001, under the same license as the originals. + + +Authors of media (models) +------------------------- +Door 3d models by sofar (CC-BY-SA-3.0) + - door_a.obj + - door_b.obj +Fence gate models by sofar (CC-BY-SA-3.0) + - fencegate_open.obj + - fencegate_closed.obj + + +Authors of media (sounds) +------------------------- +Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen + door_open.ogg +Closing-Sound created by bennstir (CC BY 3.0) + door_close.ogg +fencegate_open.ogg: + http://www.freesound.org/people/mhtaylor67/sounds/126041/ - (CC0 1.0) +fencegate_close.ogg: + http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - (CC-BY-3.0) + http://www.freesound.org/people/rivernile7/sounds/249573/ - (CC-BY-3.0) +Steel door sounds open & close (CC-BY-3.0) by HazMatt + - http://www.freesound.org/people/HazMattt/sounds/187283/ + doors_steel_door_open.ogg + doors_steel_door_close.ogg +doors_glass_door_open.ogg, doors_glass_door_close.ogg: + https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0) diff --git a/data/games/garage/mods/doors/init.lua b/data/games/garage/mods/doors/init.lua new file mode 100644 index 0000000..d198f1e --- /dev/null +++ b/data/games/garage/mods/doors/init.lua @@ -0,0 +1,937 @@ +-- doors/init.lua + +-- our API object +doors = {} + +doors.registered_doors = {} +doors.registered_trapdoors = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("doors") + + +local function replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner and owner ~= "" then + meta:set_string("owner", owner) + meta:set_string("doors_owner", "") + end +end + +local function is_doors_upper_node(pos) + return minetest.get_node(pos).name == "doors:hidden" +end + +-- returns an object to a door object or nil +function doors.get(pos) + local node_name = minetest.get_node(pos).name + if doors.registered_doors[node_name] then + -- A normal upright door + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return doors.door_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return doors.door_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return doors.door_toggle(self.pos, nil, player) + end, + state = function(self) + local state = minetest.get_meta(self.pos):get_int("state") + return state %2 == 1 + end + } + elseif doors.registered_trapdoors[node_name] then + -- A trapdoor + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return doors.trapdoor_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return doors.trapdoor_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return doors.trapdoor_toggle(self.pos, nil, player) + end, + state = function(self) + return minetest.get_node(self.pos).name:sub(-5) == "_open" + end + } + else + return nil + end +end + +-- this hidden node is placed on top of the bottom, and prevents +-- nodes from being placed in the top half of the door. +minetest.register_node("doors:hidden", { + description = S("Hidden Door Segment"), + inventory_image = "doors_hidden_segment.png^default_invisible_node_overlay.png", + wield_image = "doors_hidden_segment.png^default_invisible_node_overlay.png", + drawtype = "airlike", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + -- has to be walkable for falling nodes to stop falling. + walkable = true, + pointable = false, + diggable = false, + buildable_to = false, + floodable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_blast = function() end, + -- 1px block inside door hinge near node top + collision_box = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, +}) + +-- table used to aid door opening/closing +local transform = { + { + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, + }, + { + {v = "_c", param2 = 1}, + {v = "_c", param2 = 2}, + {v = "_c", param2 = 3}, + {v = "_c", param2 = 0}, + }, + { + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, + }, + { + {v = "_d", param2 = 3}, + {v = "_d", param2 = 0}, + {v = "_d", param2 = 1}, + {v = "_d", param2 = 2}, + }, +} + +function doors.door_toggle(pos, node, clicker) + local meta = minetest.get_meta(pos) + node = node or minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + local name = def.door.name + + local state = meta:get_string("state") + if state == "" then + -- fix up lvm-placed right-hinged doors, default closed + if node.name:sub(-2) == "_b" then + state = 2 + else + state = 0 + end + else + state = tonumber(state) + end + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + -- until Lua-5.2 we have no bitwise operators :( + if state % 2 == 1 then + state = state - 1 + else + state = state + 1 + end + + local dir = node.param2 + + -- It's possible param2 is messed up, so, validate before using + -- the input data. This indicates something may have rotated + -- the door, even though that is not supported. + if not transform[state + 1] or not transform[state + 1][dir + 1] then + return false + end + + if state % 2 == 0 then + minetest.sound_play(def.door.sounds[1], + {pos = pos, gain = def.door.gains[1], max_hear_distance = 10}, true) + else + minetest.sound_play(def.door.sounds[2], + {pos = pos, gain = def.door.gains[2], max_hear_distance = 10}, true) + end + + minetest.swap_node(pos, { + name = name .. transform[state + 1][dir+1].v, + param2 = transform[state + 1][dir+1].param2 + }) + meta:set_int("state", state) + + return true +end + + +local function on_place_node(place_to, newnode, + placer, oldnode, itemstack, pointed_thing) + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} + local newnode_copy = + {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} + local oldnode_copy = + {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} + local pointed_thing_copy = { + type = pointed_thing.type, + above = vector.new(pointed_thing.above), + under = vector.new(pointed_thing.under), + ref = pointed_thing.ref, + } + callback(place_to_copy, newnode_copy, placer, + oldnode_copy, itemstack, pointed_thing_copy) + end +end + +local function can_dig_door(pos, digger) + replace_old_owner_information(pos) + return default.can_interact_with_node(digger, pos) +end + +function doors.register(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + -- replace old doors of this type automatically + minetest.register_lbm({ + name = ":doors:replace_" .. name:gsub(":", "_"), + nodenames = {name.."_b_1", name.."_b_2"}, + action = function(pos, node) + local l = tonumber(node.name:sub(-1)) + local meta = minetest.get_meta(pos) + local h = meta:get_int("right") + 1 + local p2 = node.param2 + local replace = { + {{type = "a", state = 0}, {type = "a", state = 3}}, + {{type = "b", state = 1}, {type = "b", state = 2}} + } + local new = replace[l][h] + -- retain infotext and doors_owner fields + minetest.swap_node(pos, {name = name .. "_" .. new.type, param2 = p2}) + meta:set_int("state", new.state) + -- properly place doors:hidden at the right spot + local p3 = p2 + if new.state >= 2 then + p3 = (p3 + 3) % 4 + end + if new.state % 2 == 1 then + if new.state >= 2 then + p3 = (p3 + 1) % 4 + else + p3 = (p3 + 3) % 4 + end + end + -- wipe meta on top node as it's unused + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, + {name = "doors:hidden", param2 = p3}) + end + }) + + minetest.register_craftitem(":" .. name, { + description = def.description, + inventory_image = def.inventory_image, + groups = table.copy(def.groups), + + on_place = function(itemstack, placer, pointed_thing) + local pos + + if pointed_thing.type ~= "node" then + return itemstack + end + + local doorname = itemstack:get_name() + local node = minetest.get_node(pointed_thing.under) + local pdef = minetest.registered_nodes[node.name] + if pdef and pdef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return pdef.on_rightclick(pointed_thing.under, + node, placer, itemstack, pointed_thing) + end + + if pdef and pdef.buildable_to then + pos = pointed_thing.under + else + pos = pointed_thing.above + node = minetest.get_node(pos) + pdef = minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local top_node = minetest.get_node_or_nil(above) + local topdef = top_node and minetest.registered_nodes[top_node.name] + + if not topdef or not topdef.buildable_to then + return itemstack + end + + local pn = placer and placer:get_player_name() or "" + if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then + return itemstack + end + + local dir = placer and minetest.dir_to_facedir(placer:get_look_dir()) or 0 + + local ref = { + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + } + + local aside = { + x = pos.x + ref[dir + 1].x, + y = pos.y + ref[dir + 1].y, + z = pos.z + ref[dir + 1].z, + } + + local state = 0 + if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then + state = state + 2 + minetest.set_node(pos, {name = doorname .. "_b", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = (dir + 3) % 4}) + else + minetest.set_node(pos, {name = doorname .. "_a", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = dir}) + end + + local meta = minetest.get_meta(pos) + meta:set_int("state", state) + + if def.protected then + meta:set_string("owner", pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) + end + + if not minetest.is_creative_enabled(pn) then + itemstack:take_item() + end + + minetest.sound_play(def.sounds.place, {pos = pos}, true) + + on_place_node(pos, minetest.get_node(pos), + placer, node, itemstack, pointed_thing) + + return itemstack + end + }) + def.inventory_image = nil + + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe, + }) + end + def.recipe = nil + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + if not def.gain_open then + def.gain_open = 0.3 + end + + if not def.gain_close then + def.gain_close = 0.3 + end + + def.groups.not_in_creative_inventory = 1 + def.groups.door = 1 + def.drop = name + def.door = { + name = name, + sounds = {def.sound_close, def.sound_open}, + gains = {def.gain_close, def.gain_open}, + } + if not def.on_rightclick then + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.door_toggle(pos, node, clicker) + return itemstack + end + end + def.after_dig_node = function(pos, node, meta, digger) + local above = pos:offset(0, 1, 0) + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + minetest.check_for_falling(above) + end + def.on_rotate = function(pos, node, user, mode, new_param2) + return false + end + + if def.protected then + def.can_dig = can_dig_door + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this locked door.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked door"), owner + end + def.node_dig_prediction = "" + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + local above = pos:offset(0, 1, 0) + -- hidden node doesn't get blasted away. + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + return {name} + end + end + + def.on_destruct = function(pos) + local above = pos:offset(0, 1, 0) + if is_doors_upper_node(above) then + minetest.remove_node(above) + end + end + + def.drawtype = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.sunlight_propagates = true + def.walkable = true + def.is_ground_content = false + def.buildable_to = false + def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.use_texture_alpha = def.use_texture_alpha or "clip" + + def.mesh = "door_a.b3d" + minetest.register_node(":" .. name .. "_a", table.copy(def)) + + def.mesh = "door_b.b3d" + minetest.register_node(":" .. name .. "_b", table.copy(def)) + + def.mesh = "door_b.b3d" + minetest.register_node(":" .. name .. "_c", table.copy(def)) + + def.mesh = "door_a.b3d" + minetest.register_node(":" .. name .. "_d", table.copy(def)) + + doors.registered_doors[name .. "_a"] = true + doors.registered_doors[name .. "_b"] = true + doors.registered_doors[name .. "_c"] = true + doors.registered_doors[name .. "_d"] = true +end + +doors.register("door_wood", { + tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, + description = S("Wooden Door"), + inventory_image = "doors_item_wood.png", + groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + gain_open = 0.06, + gain_close = 0.13, + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + } +}) + +doors.register("door_steel", { + tiles = {{name = "doors_door_steel.png", backface_culling = true}}, + description = S("Steel Door"), + inventory_image = "doors_item_steel.png", + protected = true, + groups = {node = 1, cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } +}) + +doors.register("door_glass", { + tiles = {"doors_door_glass.png"}, + description = S("Glass Door"), + inventory_image = "doors_item_glass.png", + groups = {node = 1, cracky=3, oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, + recipe = { + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + } +}) + +doors.register("door_obsidian_glass", { + tiles = {"doors_door_obsidian_glass.png"}, + description = S("Obsidian Glass Door"), + inventory_image = "doors_item_obsidian_glass.png", + groups = {node = 1, cracky=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", + gain_open = 0.3, + gain_close = 0.25, + recipe = { + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + }, +}) + +-- Capture mods using the old API as best as possible. +function doors.register_door(name, def) + if def.only_placer_can_open then + def.protected = true + end + def.only_placer_can_open = nil + + local i = name:find(":") + local modname = name:sub(1, i - 1) + if not def.tiles then + if def.protected then + def.tiles = {{name = "doors_door_steel.png", backface_culling = true}} + else + def.tiles = {{name = "doors_door_wood.png", backface_culling = true}} + end + minetest.log("warning", modname .. " registered door \"" .. name .. "\" " .. + "using deprecated API method \"doors.register_door()\" but " .. + "did not provide the \"tiles\" parameter. A fallback tiledef " .. + "will be used instead.") + end + + doors.register(name, def) +end + +----trapdoor---- + +function doors.trapdoor_toggle(pos, node, clicker) + node = node or minetest.get_node(pos) + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + local def = minetest.registered_nodes[node.name] + + if string.sub(node.name, -5) == "_open" then + minetest.sound_play(def.sound_close, + {pos = pos, gain = def.gain_close, max_hear_distance = 10}, true) + minetest.swap_node(pos, {name = string.sub(node.name, 1, + string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) + else + minetest.sound_play(def.sound_open, + {pos = pos, gain = def.gain_open, max_hear_distance = 10}, true) + minetest.swap_node(pos, {name = node.name .. "_open", + param1 = node.param1, param2 = node.param2}) + end +end + +function doors.register_trapdoor(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + local name_closed = name + local name_opened = name.."_open" + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + doors.trapdoor_toggle(pos, node, clicker) + return itemstack + end + + -- Common trapdoor configuration + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.is_ground_content = false + def.use_texture_alpha = def.use_texture_alpha or "clip" + + if def.protected then + def.can_dig = can_dig_door + def.after_place_node = function(pos, placer, itemstack, pointed_thing) + local pn = placer:get_player_name() + local meta = minetest.get_meta(pos) + meta:set_string("owner", pn) + meta:set_string("infotext", def.description .. "\n" .. S("Owned by @1", pn)) + + return minetest.is_creative_enabled(pn) + end + + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, S("You do not own this trapdoor.")) + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, S("a locked trapdoor"), owner + end + def.node_dig_prediction = "" + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + return {name} + end + end + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + if not def.gain_open then + def.gain_open = 0.3 + end + + if not def.gain_close then + def.gain_close = 0.3 + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + if def.nodebox_closed and def.nodebox_opened then + def_closed.node_box = def.nodebox_closed + else + def_closed.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + end + def_closed.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + def_closed.tiles = { + def.tile_front, + def.tile_front .. '^[transformFY', + def.tile_side, + def.tile_side, + def.tile_side, + def.tile_side + } + + if def.nodebox_opened and def.nodebox_closed then + def_opened.node_box = def.nodebox_opened + else + def_opened.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + end + def_opened.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + def_opened.tiles = { + def.tile_side, + def.tile_side .. '^[transform2', + def.tile_side .. '^[transform3', + def.tile_side .. '^[transform1', + def.tile_front .. '^[transform46', + def.tile_front .. '^[transform6' + } + + def_opened.drop = name_closed + def_opened.groups.not_in_creative_inventory = 1 + + minetest.register_node(name_opened, def_opened) + minetest.register_node(name_closed, def_closed) + + doors.registered_trapdoors[name_opened] = true + doors.registered_trapdoors[name_closed] = true +end + +doors.register_trapdoor("doors:trapdoor", { + description = S("Wooden Trapdoor"), + inventory_image = "doors_trapdoor.png", + wield_image = "doors_trapdoor.png", + tile_front = "doors_trapdoor.png", + tile_side = "doors_trapdoor_side.png", + gain_open = 0.06, + gain_close = 0.13, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + +doors.register_trapdoor("doors:trapdoor_steel", { + description = S("Steel Trapdoor"), + inventory_image = "doors_trapdoor_steel.png", + wield_image = "doors_trapdoor_steel.png", + tile_front = "doors_trapdoor_steel.png", + tile_side = "doors_trapdoor_steel_side.png", + protected = true, + sounds = default.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", + gain_open = 0.2, + gain_close = 0.2, + groups = {cracky = 1, level = 2, door = 1}, +}) + +minetest.register_craft({ + output = "doors:trapdoor 2", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"", "", ""}, + } +}) + +minetest.register_craft({ + output = "doors:trapdoor_steel", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + } +}) + + +----fence gate---- +local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 + +function doors.register_fencegate(name, def) + local fence = { + description = def.description, + drawtype = "mesh", + tiles = {}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = name .. "_closed", + connect_sides = {"left", "right"}, + groups = def.groups, + sounds = def.sounds, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local node_def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, {name = node_def._gate, param2 = node.param2}) + minetest.sound_play(node_def._gate_sound, {pos = pos, gain = 0.15, + max_hear_distance = 8}, true) + return itemstack + end, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4} + }, + } + + + if type(def.texture) == "string" then + fence.tiles[1] = {name = def.texture, backface_culling = true} + elseif def.texture.backface_culling == nil then + fence.tiles[1] = table.copy(def.texture) + fence.tiles[1].backface_culling = true + else + fence.tiles[1] = def.texture + end + + if not fence.sounds then + fence.sounds = default.node_sound_wood_defaults() + end + + fence.groups.fence = 1 + + local fence_closed = table.copy(fence) + fence_closed.mesh = "doors_fencegate_closed.obj" + fence_closed._gate = name .. "_open" + fence_closed._gate_sound = "doors_fencegate_open" + fence_closed.collision_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/8, 1/2, 1/2 + fence_collision_extra, 1/8} + } + + local fence_open = table.copy(fence) + fence_open.mesh = "doors_fencegate_open.obj" + fence_open._gate = name .. "_closed" + fence_open._gate_sound = "doors_fencegate_close" + fence_open.groups.not_in_creative_inventory = 1 + fence_open.collision_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/8, -3/8, 1/2 + fence_collision_extra, 1/8}, + {-1/2, -3/8, -1/2, -3/8, 3/8, 0 }} + } + + minetest.register_node(":" .. name .. "_closed", fence_closed) + minetest.register_node(":" .. name .. "_open", fence_open) + + minetest.register_craft({ + output = name .. "_closed", + recipe = { + {"group:stick", def.material, "group:stick"}, + {"group:stick", def.material, "group:stick"} + } + }) +end + +doors.register_fencegate("doors:gate_wood", { + description = S("Apple Wood Fence Gate"), + texture = "default_wood.png", + material = "default:wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_acacia_wood", { + description = S("Acacia Wood Fence Gate"), + texture = "default_acacia_wood.png", + material = "default:acacia_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_junglewood", { + description = S("Jungle Wood Fence Gate"), + texture = "default_junglewood.png", + material = "default:junglewood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + +doors.register_fencegate("doors:gate_pine_wood", { + description = S("Pine Wood Fence Gate"), + texture = "default_pine_wood.png", + material = "default:pine_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + +doors.register_fencegate("doors:gate_aspen_wood", { + description = S("Aspen Wood Fence Gate"), + texture = "default_aspen_wood.png", + material = "default:aspen_wood", + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + + +----fuels---- + +minetest.register_craft({ + type = "fuel", + recipe = "doors:trapdoor", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:door_wood", + burntime = 14, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_wood_closed", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_acacia_wood_closed", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_junglewood_closed", + burntime = 9, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_pine_wood_closed", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_aspen_wood_closed", + burntime = 5, +}) diff --git a/data/games/garage/mods/doors/license.txt b/data/games/garage/mods/doors/license.txt new file mode 100644 index 0000000..97e60c2 --- /dev/null +++ b/data/games/garage/mods/doors/license.txt @@ -0,0 +1,164 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar (sofar@foo-projects.org) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011-2016 Fernando Zapata +Copyright (C) 2014-2016 celeron55 +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar +Copyright (C) 2016 red-001 +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 PenguinDad + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/4.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014 CGEffex +Copyright (C) 2014 bennstir +Copyright (C) 2016 BarkersPinhead +Copyright (C) 2016 rivernile7 +Copyright (C) 2016 HazMatt + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +mhtaylor67 +SkeetMasterFunk69 + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public +domain by waiving all of his or her rights to the work worldwide under copyright law, +including all related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +Other Information + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as +publicity or privacy rights. +Unless expressly stated otherwise, the person who associated a work with this deed makes +no warranties about the work, and disclaims liability for all uses of the work, to the +fullest extent permitted by applicable law. +When using or citing the work, you should not imply endorsement by the author or the +affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/data/games/garage/mods/doors/locale/doors.de.tr b/data/games/garage/mods/doors/locale/doors.de.tr new file mode 100644 index 0000000..79707ce --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.de.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Verborgenes Türsegment +Owned by @1=Eigentum von @1 +You do not own this locked door.=Diese abgeschlossene Tür gehört Ihnen nicht. +a locked door=eine abgeschlossene Tür +Wooden Door=Holztür +Steel Door=Stahltür +Glass Door=Glastür +Obsidian Glass Door=Obsidianglastür +You do not own this trapdoor.=Diese Falltür gehört Ihnen nicht. +a locked trapdoor=eine abgeschlossene Falltür +Wooden Trapdoor=Holzfalltür +Steel Trapdoor=Stahlfalltür +Apple Wood Fence Gate=Apfelholzzauntor +Acacia Wood Fence Gate=Akazienholzzauntor +Jungle Wood Fence Gate=Dschungelholzzauntor +Pine Wood Fence Gate=Kiefernholzzauntor +Aspen Wood Fence Gate=Espenholzzauntor diff --git a/data/games/garage/mods/doors/locale/doors.eo.tr b/data/games/garage/mods/doors/locale/doors.eo.tr new file mode 100644 index 0000000..e8e10dd --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.eo.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Kaŝita porda segmento +Owned by @1=Posedita de @1 +You do not own this locked door.=Vi ne posedas ĉi tiun ŝlositan pordon. +a locked door=ŝlosita pordo +Wooden Door=Ligna pordo +Steel Door=Ŝtala pordo +Glass Door=Vitra pordo +Obsidian Glass Door=Obsidiana vitra pordo +You do not own this trapdoor.=Vi ne posedas ĉi tiun plankpordon. +a locked trapdoor=ŝlosita plankpordo +Wooden Trapdoor=Ligna plankpordo +Steel Trapdoor=Ŝtala plankpordo +Apple Wood Fence Gate=Poma ligna barila pordo +Acacia Wood Fence Gate=Akacia ligna barila pordo +Jungle Wood Fence Gate=Ĝangala ligna barila pordo +Pine Wood Fence Gate=Pina ligna barila pordo +Aspen Wood Fence Gate=Tremola ligna barila pordo diff --git a/data/games/garage/mods/doors/locale/doors.es.tr b/data/games/garage/mods/doors/locale/doors.es.tr new file mode 100644 index 0000000..677f2df --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.es.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento de puerta oculta +Owned by @1=Propiedad de @1 +You do not own this locked door.=Esta puerta cerrada no te pertenece. +a locked door=una puerta cerrada +Wooden Door=Puerta de madera +Steel Door=Puerta de acero +Glass Door=Puerta de vidrio +Obsidian Glass Door=Puerta de vidrio de obsidiana +You do not own this trapdoor.=Esta trampilla no te pertenece. +a locked trapdoor=una trampilla cerrada +Wooden Trapdoor=Trampilla de madera +Steel Trapdoor=Trampilla de acero +Apple Wood Fence Gate=Puerta de cerca de manzano +Acacia Wood Fence Gate=Puerta de cerca de acacia +Jungle Wood Fence Gate=Puerta de cerca de madera tropical +Pine Wood Fence Gate=Puerta de cerca de pino +Aspen Wood Fence Gate=Puerta de cerca de álamo diff --git a/data/games/garage/mods/doors/locale/doors.fr.tr b/data/games/garage/mods/doors/locale/doors.fr.tr new file mode 100644 index 0000000..930f75c --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.fr.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segment de porte cachée +Owned by @1=Possédée par @1 +You do not own this locked door.=Cette porte vérouillée ne vous appartient pas. +a locked door=une porte verouillée +Wooden Door=Porte en bois +Steel Door=Porte en acier +Glass Door=Porte en verre +Obsidian Glass Door=Porte en verre d'obsidienne +You do not own this trapdoor.=Vous ne possédez pas cette trappe. +a locked trapdoor=une trappe verouillée +Wooden Trapdoor=Trappe en bois +Steel Trapdoor=Trappe en acier +Apple Wood Fence Gate=Porte de clôture en bois de pommier +Acacia Wood Fence Gate=Porte de clôture en bois d'acacia +Jungle Wood Fence Gate=Porte de clôture en bois de la jungle +Pine Wood Fence Gate=Porte de clôture en bois de pin +Aspen Wood Fence Gate=Porte de clôture en bois de tremble diff --git a/data/games/garage/mods/doors/locale/doors.id.tr b/data/games/garage/mods/doors/locale/doors.id.tr new file mode 100644 index 0000000..3b74904 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.id.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Bagian Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu terkunci ini. +a locked door=pintu terkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Baja +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidian +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong terkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Baja +Apple Wood Fence Gate=Gerbang Kayu Pohon Apel +Acacia Wood Fence Gate=Gerbang Kayu Akasia +Jungle Wood Fence Gate=Gerbang Kayu Pohon Rimba +Pine Wood Fence Gate=Gerbang Kayu Pinus +Aspen Wood Fence Gate=Gerbang Kayu Aspen diff --git a/data/games/garage/mods/doors/locale/doors.it.tr b/data/games/garage/mods/doors/locale/doors.it.tr new file mode 100644 index 0000000..ccd00d3 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.it.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento di porta nascosto +Owned by @1=Di proprietà di @1 +You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave. +a locked door=una porta chiusa a chiave +Wooden Door=Porta di legno +Steel Door=Porta d'acciaio +Glass Door=Porta di vetro +Obsidian Glass Door=Porta di vetro d'ossidiana +You do not own this trapdoor.=Non sei il proprietario di questa botola. +a locked trapdoor=una botola chiusa a chiave +Wooden Trapdoor=Botola di legno +Steel Trapdoor=Botola d'acciaio +Apple Wood Fence Gate=Cancello della recinzione di legno di melo +Acacia Wood Fence Gate=Cancello della recinzione di legno d'acacia +Jungle Wood Fence Gate=Cancello della recinzione di legno della giungla +Pine Wood Fence Gate=Cancello della recinzione di legno di pino +Aspen Wood Fence Gate=Cancello della recinzione di legno di pioppo diff --git a/data/games/garage/mods/doors/locale/doors.ja.tr b/data/games/garage/mods/doors/locale/doors.ja.tr new file mode 100644 index 0000000..b173504 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.ja.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=隠しドアの区切り +Owned by @1=所有者 @1 +You do not own this locked door.=あなたはこのロックされたドアの所有者ではありません。 +a locked door=ロックされたドア +Wooden Door=木製のドア +Steel Door=鉄のドア +Glass Door=ガラスのドア +Obsidian Glass Door=黒曜石ガラスのドア +You do not own this trapdoor.=あなたはこのトラップドアの所有者ではありません。 +a locked trapdoor=ロックされたトラップドア +Wooden Trapdoor=木製のトラップドア +Steel Trapdoor=鉄のトラップドア +Apple Wood Fence Gate=リンゴ材のフェンスゲート +Acacia Wood Fence Gate=アカシア材のフェンスゲート +Jungle Wood Fence Gate=ジャングル材のフェンスゲート +Pine Wood Fence Gate=マツ材のフェンスゲート +Aspen Wood Fence Gate=ポプラ材のフェンスゲート diff --git a/data/games/garage/mods/doors/locale/doors.jbo.tr b/data/games/garage/mods/doors/locale/doors.jbo.tr new file mode 100644 index 0000000..f15854e --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.jbo.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=lo se mipri pagbu be lo vrogai +Owned by @1=.i ti ponse zoi zo'i.@1.zo'i +You do not own this locked door.=.i do na ponse lo ti selstela vrogai +a locked door=lo selstela vrogai +Wooden Door=lo mudri vrogai +Steel Door=lo gasta vrogai +Glass Door=lo blaci vrogai +Obsidian Glass Door=lo je'erma'ablaci blaci vrogai +You do not own this trapdoor.=.i do na ponse lo ti selstela lolvrogai +a locked trapdoor=lo selstela lolvrogai +Wooden Trapdoor=lo mudri lolvrogai +Steel Trapdoor=lo gasta lolvrogai +Apple Wood Fence Gate=lo plisymudri garbimvrogai +Acacia Wood Fence Gate=lo atkaci,ia mudri garbimvrogai +Jungle Wood Fence Gate=lo glatimdemricfoi mudri garbimvrogai +Pine Wood Fence Gate=lo ku'urmudri garbimvrogai +Aspen Wood Fence Gate=lo mudrpopulu garbimvrogai diff --git a/data/games/garage/mods/doors/locale/doors.lv.tr b/data/games/garage/mods/doors/locale/doors.lv.tr new file mode 100644 index 0000000..624e440 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.lv.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Palsēptais durvju segments +Owned by @1=Saimnieks: @1 +You do not own this locked door.=Jums nepieder šīs aizslēgtās durvis. +a locked door=Aizslēgtas durvis +Wooden Door=Koka durvis +Steel Door=Tērauda durvis +Glass Door=Stikla durvis +Obsidian Glass Door=Obsidiānstikla durvis +You do not own this trapdoor.=Jums nepieder šī aizslēgtā lūka. +a locked trapdoor=Aizslēgta lūka +Wooden Trapdoor=Koka lūka +Steel Trapdoor=Tērauda lūka +Apple Wood Fence Gate=Ābolkoka žoga vārti +Acacia Wood Fence Gate=Akācijas žoga vārti +Jungle Wood Fence Gate=Džungļu koka žoga vārti +Pine Wood Fence Gate=Skujkoka žoga vārti +Aspen Wood Fence Gate=Apses žoga vārti diff --git a/data/games/garage/mods/doors/locale/doors.ms.tr b/data/games/garage/mods/doors/locale/doors.ms.tr new file mode 100644 index 0000000..93d6df2 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.ms.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmen Pintu Tersembunyi +Owned by @1=Milik @1 +You do not own this locked door.=Anda bukan pemilik pintu berkunci ini. +a locked door=pintu berkunci +Wooden Door=Pintu Kayu +Steel Door=Pintu Keluli +Glass Door=Pintu Kaca +Obsidian Glass Door=Pintu Kaca Obsidia +You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini. +a locked trapdoor=pintu kolong berkunci +Wooden Trapdoor=Pintu Kolong Kayu +Steel Trapdoor=Pintu Kolong Keluli +Apple Wood Fence Gate=Pintu Pagar Kayu Epal +Acacia Wood Fence Gate=Pintu Pagar Kayu Akasia +Jungle Wood Fence Gate=Pintu Pagar Kayu Hutan +Pine Wood Fence Gate=Pintu Pagar Kayu Pain +Aspen Wood Fence Gate=Pintu Pagar Kayu Aspen diff --git a/data/games/garage/mods/doors/locale/doors.pl.tr b/data/games/garage/mods/doors/locale/doors.pl.tr new file mode 100644 index 0000000..6aec285 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.pl.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Ukryty segment drzwi +Owned by @1=Właściciel: @1 +You do not own this locked door.=Nie jesteś właścicielem tych zablokowanych drzwi. +a locked door=zablokowane drzwi +Wooden Door=Drewniane drzwi +Steel Door=Stalowe drzwi +Glass Door=Szklane drzwi +Obsidian Glass Door=Drzwi z obsydianowego szkła +You do not own this trapdoor.=Nie jesteś właścicielem tego włazu. +a locked trapdoor=zablokowany właz +Wooden Trapdoor=Drewniany właz +Steel Trapdoor=Stalowy właz +Apple Wood Fence Gate=Furtka z jabłkowego drzewa +Acacia Wood Fence Gate=Furtka z akacjowego drzewa +Jungle Wood Fence Gate=Furtka z dżunglowego drzewa +Pine Wood Fence Gate=Furtka z sosnowego drzewa +Aspen Wood Fence Gate=Furtka z brzozowego drzewa diff --git a/data/games/garage/mods/doors/locale/doors.pt_BR.tr b/data/games/garage/mods/doors/locale/doors.pt_BR.tr new file mode 100644 index 0000000..8232442 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Segmento de Porta Oculto +Owned by @1=Propriedade de @1 +You do not own this locked door.=Você não é dono desta porta trancada. +a locked door=uma porta trancada +Wooden Door=Porta de Madeira +Steel Door=Porta de Aço +Glass Door=Porta de Vidro +Obsidian Glass Door=Porta de Vidro de Obsidiana +You do not own this trapdoor.=Você não é dono deste alçapão. +a locked trapdoor=um alçapão trancado +Wooden Trapdoor=Alçapão de Madeira +Steel Trapdoor=Alçapão de Aço +Apple Wood Fence Gate=Portão de Cerca de Macieira +Acacia Wood Fence Gate=Portão de Cerca de Acácia +Jungle Wood Fence Gate=Portão de Cerca de Madeira da Selva +Pine Wood Fence Gate=Portão de Cerca de Pinheiro +Aspen Wood Fence Gate=Portão de Cerca de Álamo diff --git a/data/games/garage/mods/doors/locale/doors.ru.tr b/data/games/garage/mods/doors/locale/doors.ru.tr new file mode 100644 index 0000000..7b96762 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.ru.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Спрятанная часть двери +Owned by @1=Владелец: @1 +You do not own this locked door.=Вы не владелец этой запертой двери. +a locked door=запертая дверь +Wooden Door=Деревянная дверь +Steel Door=Стальная дверь +Glass Door=Стеклянная дверь +Obsidian Glass Door=Дверь из обсидианового стекла +You do not own this trapdoor.=Вы не владелец этого люка. +a locked trapdoor=запертый люк +Wooden Trapdoor=Деревянный люк +Steel Trapdoor=Стальной люк +Apple Wood Fence Gate=Яблоневая калитка +Acacia Wood Fence Gate=Акациевая калитка +Jungle Wood Fence Gate=Калитка из тропического дерева +Pine Wood Fence Gate=Сосновая калитка +Aspen Wood Fence Gate=Осиновая калитка diff --git a/data/games/garage/mods/doors/locale/doors.sk.tr b/data/games/garage/mods/doors/locale/doors.sk.tr new file mode 100644 index 0000000..e6943ac --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.sk.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Skrytá časť dverí +Owned by @1=Vlastník - @1 +You do not own this locked door.=Nevlastníš tieto uzamknuté dvere. +a locked door=uzamknuté dvere +Wooden Door=Drevené dvere +Steel Door=Oceľové dvere +Glass Door=Sklenené dvere +Obsidian Glass Door=Obsidiánové sklenené dvere +You do not own this trapdoor.=Nevlastníš tieto padacie dvere. +a locked trapdoor=uzamknuté padacie dvere +Wooden Trapdoor=Drevené padacie dvere +Steel Trapdoor=Oceľové padacie dvere +Apple Wood Fence Gate=Drevený plot z jablone +Acacia Wood Fence Gate=Drevený plot z akácie +Jungle Wood Fence Gate=Drevený plot z džungľového dreva +Pine Wood Fence Gate=Drevený plot z borovice +Aspen Wood Fence Gate=Drevený plot z osiky diff --git a/data/games/garage/mods/doors/locale/doors.sv.tr b/data/games/garage/mods/doors/locale/doors.sv.tr new file mode 100644 index 0000000..9f31d9c --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.sv.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Dolt dörrsegment +Owned by @1=Ägd av @1 +You do not own this locked door.=Du äger inte denna låsta dörr. +a locked door=en låst dörr +Wooden Door=Trädörr +Steel Door=Ståldörr +Glass Door=Glasdörr +Obsidian Glass Door=Obsidianglasdörr +You do not own this trapdoor.=Du äger inte denna fallucka +a locked trapdoor=en låst fallucka +Wooden Trapdoor=Träfallucka +Steel Trapdoor=Stålfallucka +Apple Wood Fence Gate=Äppleträfallucka +Acacia Wood Fence Gate=Akaciaträfallucka +Jungle Wood Fence Gate=Djungelträfallucka +Pine Wood Fence Gate=Tallträfallucka +Aspen Wood Fence Gate=Aspträfallucka diff --git a/data/games/garage/mods/doors/locale/doors.uk.tr b/data/games/garage/mods/doors/locale/doors.uk.tr new file mode 100644 index 0000000..fc07f39 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.uk.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=Прихована частина дверей +Owned by @1=Власник: @1 +You do not own this locked door.=Ви — не власник цих замкнених дверей. +a locked door=замкнені двері +Wooden Door=Дерев'яні двері +Steel Door=Сталеві двері +Glass Door=Скляні двері +Obsidian Glass Door=Двері з обсидіанового скла +You do not own this trapdoor.=Ви — не власник цього люка. +a locked trapdoor=замкнений люк +Wooden Trapdoor=Дерев'яний люк +Steel Trapdoor=Сталевий люк +Apple Wood Fence Gate=Яблунева хвіртка +Acacia Wood Fence Gate=Акацієва хвіртка +Jungle Wood Fence Gate=Хвіртка з тропічного дерева +Pine Wood Fence Gate=Соснова хвіртка +Aspen Wood Fence Gate=Осикова хвіртка diff --git a/data/games/garage/mods/doors/locale/doors.zh_CN.tr b/data/games/garage/mods/doors/locale/doors.zh_CN.tr new file mode 100644 index 0000000..cf32996 --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.zh_CN.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=隐藏门段 +Owned by @1=由@1所有 +You do not own this locked door.=这个门不属于你。 +a locked door=一扇已上锁的门 +Wooden Door=木门 +Steel Door=铁门 +Glass Door=玻璃门 +Obsidian Glass Door=黑曜石玻璃门 +You do not own this trapdoor.=这个活板门不属于你。 +a locked trapdoor=一扇已上锁的活板门 +Wooden Trapdoor=木活板门 +Steel Trapdoor=铁活板门 +Apple Wood Fence Gate=苹果木栅栏门 +Acacia Wood Fence Gate=相思木栅栏门 +Jungle Wood Fence Gate=丛林木栅栏门 +Pine Wood Fence Gate=松木栅栏门 +Aspen Wood Fence Gate=白杨木栅栏门 diff --git a/data/games/garage/mods/doors/locale/doors.zh_TW.tr b/data/games/garage/mods/doors/locale/doors.zh_TW.tr new file mode 100644 index 0000000..81e06fc --- /dev/null +++ b/data/games/garage/mods/doors/locale/doors.zh_TW.tr @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment=隱藏門段 +Owned by @1=由@1擁有 +You do not own this locked door.=這個門不屬於你所有。 +a locked door=一扇已上鎖的門 +Wooden Door=木門 +Steel Door=鐵門 +Glass Door=玻璃門 +Obsidian Glass Door=黑曜石玻璃門 +You do not own this trapdoor.=這個活板門不屬於你所有。 +a locked trapdoor=一扇已上鎖的活板門 +Wooden Trapdoor=木活板門 +Steel Trapdoor=鐵活板門 +Apple Wood Fence Gate=蘋果木柵欄門 +Acacia Wood Fence Gate=相思木柵欄門 +Jungle Wood Fence Gate=叢林木柵欄門 +Pine Wood Fence Gate=松木柵欄門 +Aspen Wood Fence Gate=白楊木柵欄門 diff --git a/data/games/garage/mods/doors/locale/template.txt b/data/games/garage/mods/doors/locale/template.txt new file mode 100644 index 0000000..8b5c349 --- /dev/null +++ b/data/games/garage/mods/doors/locale/template.txt @@ -0,0 +1,18 @@ +# textdomain: doors +Hidden Door Segment= +Owned by @1= +You do not own this locked door.= +a locked door= +Wooden Door= +Steel Door= +Glass Door= +Obsidian Glass Door= +You do not own this trapdoor.= +a locked trapdoor= +Wooden Trapdoor= +Steel Trapdoor= +Apple Wood Fence Gate= +Acacia Wood Fence Gate= +Jungle Wood Fence Gate= +Pine Wood Fence Gate= +Aspen Wood Fence Gate= diff --git a/data/games/garage/mods/doors/mod.conf b/data/games/garage/mods/doors/mod.conf new file mode 100644 index 0000000..de053c2 --- /dev/null +++ b/data/games/garage/mods/doors/mod.conf @@ -0,0 +1,4 @@ +name = doors +description = Minetest Game mod: doors +depends = default +optional_depends = screwdriver diff --git a/data/games/garage/mods/doors/models/door.blend b/data/games/garage/mods/doors/models/door.blend new file mode 100644 index 0000000..56047b1 Binary files /dev/null and b/data/games/garage/mods/doors/models/door.blend differ diff --git a/data/games/garage/mods/doors/models/door_a.b3d b/data/games/garage/mods/doors/models/door_a.b3d new file mode 100644 index 0000000..7f9249f Binary files /dev/null and b/data/games/garage/mods/doors/models/door_a.b3d differ diff --git a/data/games/garage/mods/doors/models/door_b.b3d b/data/games/garage/mods/doors/models/door_b.b3d new file mode 100644 index 0000000..77a1a16 Binary files /dev/null and b/data/games/garage/mods/doors/models/door_b.b3d differ diff --git a/data/games/garage/mods/doors/models/doors_fencegate_closed.obj b/data/games/garage/mods/doors/models/doors_fencegate_closed.obj new file mode 100644 index 0000000..0050f70 --- /dev/null +++ b/data/games/garage/mods/doors/models/doors_fencegate_closed.obj @@ -0,0 +1,106 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_closed.blend' +# www.blender.org +mtllib gate_closed.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -0.125000 +v -0.375000 0.187500 0.062500 +v -0.375000 0.312500 0.062500 +v -0.375000 0.187500 -0.062500 +v -0.375000 0.312500 -0.062500 +v 0.375000 0.187500 0.062500 +v 0.375000 0.312500 0.062500 +v 0.375000 0.187500 -0.062500 +v 0.375000 0.312500 -0.062500 +v -0.374831 0.187348 0.062500 +v -0.156342 0.187363 0.062500 +v -0.374831 0.187348 -0.062500 +v -0.156342 0.187363 -0.062500 +v 0.374981 -0.343683 0.062500 +v 0.375065 -0.187304 0.062500 +v 0.374981 -0.343683 -0.062500 +v 0.375065 -0.187304 -0.062500 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.578000 -0.816100 0.000000 +vn 0.576200 0.817300 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/2 24/3/2 23/19/2 19/20/2 +f 22/1/4 18/4/4 17/21/4 21/22/4 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/2 32/28/2 31/29/2 27/30/2 +f 30/31/4 26/32/4 25/33/4 29/34/4 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 diff --git a/data/games/garage/mods/doors/models/doors_fencegate_open.obj b/data/games/garage/mods/doors/models/doors_fencegate_open.obj new file mode 100644 index 0000000..3fb727f --- /dev/null +++ b/data/games/garage/mods/doors/models/doors_fencegate_open.obj @@ -0,0 +1,112 @@ +# Blender v2.76 (sub 0) OBJ File: 'gate_open.blend' +# www.blender.org +mtllib gate_open.mtl +o Cube_Cube.001 +v -0.625000 -0.500000 0.125000 +v -0.625000 0.500100 0.125000 +v -0.625000 -0.500000 -0.125000 +v -0.625000 0.500100 -0.125000 +v -0.375000 -0.500000 0.125000 +v -0.375000 0.500100 0.125000 +v -0.375000 -0.500000 -0.125000 +v -0.375000 0.500100 -0.125000 +v 0.375000 -0.500000 0.125000 +v 0.375000 0.500100 0.125000 +v 0.375000 -0.500000 -0.125000 +v 0.375000 0.500100 -0.125000 +v 0.625000 -0.500000 0.125000 +v 0.625000 0.500100 0.125000 +v 0.625000 -0.500000 -0.125000 +v 0.625000 0.500100 -0.125000 +v 0.434859 0.187500 -0.872359 +v 0.434859 0.312500 -0.872359 +v 0.559859 0.187500 -0.872359 +v 0.559859 0.312500 -0.872359 +v 0.434859 0.187500 -0.122359 +v 0.434859 0.312500 -0.122359 +v 0.559859 0.187500 -0.122359 +v 0.559859 0.312500 -0.122359 +v 0.434859 0.187348 -0.872190 +v 0.434859 0.187363 -0.653701 +v 0.559859 0.187348 -0.872190 +v 0.559859 0.187363 -0.653701 +v 0.434859 -0.343683 -0.122379 +v 0.434859 -0.187304 -0.122294 +v 0.559859 -0.343683 -0.122379 +v 0.559859 -0.187304 -0.122294 +v 0.499560 -0.442900 0.005495 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt -0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt -0.000000 0.687500 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 1.000000 0.687500 +vt 0.813740 0.249033 +vt 0.201557 0.249293 +vt 0.120995 0.125498 +vt 0.987404 0.125469 +vt 0.125000 0.375000 +vt 0.812500 0.375000 +vt 0.937500 0.500000 +vt 0.062500 0.500000 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 0.312500 0.437500 +vt 0.312500 0.312500 +vt 1.000000 0.312500 +vt 1.000000 0.437500 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.625000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.816100 -0.578000 +vn 0.000000 0.817300 0.576200 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/4/2 8/5/2 7/6/2 3/1/2 +f 8/7/3 6/8/3 5/9/3 7/10/3 +f 6/2/4 2/9/4 1/8/4 5/3/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/6/6 8/1/6 4/13/6 2/14/6 +f 10/1/1 12/2/1 11/3/1 9/4/1 +f 12/2/2 16/9/2 15/8/2 11/3/2 +f 16/7/3 14/8/3 13/9/3 15/10/3 +f 14/4/4 10/5/4 9/6/4 13/1/4 +f 9/12/5 11/11/5 15/15/5 13/16/5 +f 14/14/6 16/13/6 12/17/6 10/18/6 +f 20/2/3 24/3/3 23/19/3 19/20/3 +f 22/1/1 18/4/1 17/21/1 21/22/1 +f 17/23/5 19/24/5 23/25/5 21/26/5 +f 22/21/6 24/5/6 20/6/6 18/22/6 +f 28/27/3 32/28/3 31/29/3 27/30/3 +f 30/31/1 26/32/1 25/33/1 29/34/1 +f 25/35/7 27/10/7 31/7/7 29/36/7 +f 30/37/8 32/38/8 28/39/8 26/40/8 +f 17/41/2 18/42/2 20/43/2 19/44/2 diff --git a/data/games/garage/mods/doors/sounds/doors_door_close.ogg b/data/games/garage/mods/doors/sounds/doors_door_close.ogg new file mode 100644 index 0000000..fede4af Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_door_close.ogg differ diff --git a/data/games/garage/mods/doors/sounds/doors_door_open.ogg b/data/games/garage/mods/doors/sounds/doors_door_open.ogg new file mode 100644 index 0000000..9a4c4f1 Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_door_open.ogg differ diff --git a/data/games/garage/mods/doors/sounds/doors_fencegate_close.ogg b/data/games/garage/mods/doors/sounds/doors_fencegate_close.ogg new file mode 100644 index 0000000..d42590f Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_fencegate_close.ogg differ diff --git a/data/games/garage/mods/doors/sounds/doors_fencegate_open.ogg b/data/games/garage/mods/doors/sounds/doors_fencegate_open.ogg new file mode 100644 index 0000000..f6dfd1d Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_fencegate_open.ogg differ diff --git a/data/games/garage/mods/doors/sounds/doors_glass_door_close.ogg b/data/games/garage/mods/doors/sounds/doors_glass_door_close.ogg new file mode 100644 index 0000000..b3c1355 Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_glass_door_close.ogg differ diff --git a/data/games/garage/mods/doors/sounds/doors_glass_door_open.ogg b/data/games/garage/mods/doors/sounds/doors_glass_door_open.ogg new file mode 100644 index 0000000..66e6812 Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_glass_door_open.ogg differ diff --git a/data/games/garage/mods/doors/sounds/doors_steel_door_close.ogg b/data/games/garage/mods/doors/sounds/doors_steel_door_close.ogg new file mode 100644 index 0000000..aea7be6 Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_steel_door_close.ogg differ diff --git a/data/games/garage/mods/doors/sounds/doors_steel_door_open.ogg b/data/games/garage/mods/doors/sounds/doors_steel_door_open.ogg new file mode 100644 index 0000000..de87477 Binary files /dev/null and b/data/games/garage/mods/doors/sounds/doors_steel_door_open.ogg differ diff --git a/data/games/garage/mods/doors/textures/doors_door_glass.png b/data/games/garage/mods/doors/textures/doors_door_glass.png new file mode 100644 index 0000000..ea6fdc1 Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_door_glass.png differ diff --git a/data/games/garage/mods/doors/textures/doors_door_obsidian_glass.png b/data/games/garage/mods/doors/textures/doors_door_obsidian_glass.png new file mode 100644 index 0000000..fab25b3 Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_door_obsidian_glass.png differ diff --git a/data/games/garage/mods/doors/textures/doors_door_steel.png b/data/games/garage/mods/doors/textures/doors_door_steel.png new file mode 100644 index 0000000..9e33ff1 Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_door_steel.png differ diff --git a/data/games/garage/mods/doors/textures/doors_door_wood.png b/data/games/garage/mods/doors/textures/doors_door_wood.png new file mode 100644 index 0000000..c073faf Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_door_wood.png differ diff --git a/data/games/garage/mods/doors/textures/doors_hidden_segment.png b/data/games/garage/mods/doors/textures/doors_hidden_segment.png new file mode 100644 index 0000000..b3b6f34 Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_hidden_segment.png differ diff --git a/data/games/garage/mods/doors/textures/doors_item_glass.png b/data/games/garage/mods/doors/textures/doors_item_glass.png new file mode 100644 index 0000000..d883f6e Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_item_glass.png differ diff --git a/data/games/garage/mods/doors/textures/doors_item_obsidian_glass.png b/data/games/garage/mods/doors/textures/doors_item_obsidian_glass.png new file mode 100644 index 0000000..8c7920c Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_item_obsidian_glass.png differ diff --git a/data/games/garage/mods/doors/textures/doors_item_steel.png b/data/games/garage/mods/doors/textures/doors_item_steel.png new file mode 100644 index 0000000..dd99e13 Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_item_steel.png differ diff --git a/data/games/garage/mods/doors/textures/doors_item_wood.png b/data/games/garage/mods/doors/textures/doors_item_wood.png new file mode 100644 index 0000000..d3a62ab Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_item_wood.png differ diff --git a/data/games/garage/mods/doors/textures/doors_trapdoor.png b/data/games/garage/mods/doors/textures/doors_trapdoor.png new file mode 100644 index 0000000..e92c8b2 Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_trapdoor.png differ diff --git a/data/games/garage/mods/doors/textures/doors_trapdoor_side.png b/data/games/garage/mods/doors/textures/doors_trapdoor_side.png new file mode 100644 index 0000000..55981ea Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_trapdoor_side.png differ diff --git a/data/games/garage/mods/doors/textures/doors_trapdoor_steel.png b/data/games/garage/mods/doors/textures/doors_trapdoor_steel.png new file mode 100644 index 0000000..4ba507d Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_trapdoor_steel.png differ diff --git a/data/games/garage/mods/doors/textures/doors_trapdoor_steel_side.png b/data/games/garage/mods/doors/textures/doors_trapdoor_steel_side.png new file mode 100644 index 0000000..e29c59e Binary files /dev/null and b/data/games/garage/mods/doors/textures/doors_trapdoor_steel_side.png differ diff --git a/data/games/garage/mods/dungeon_loot/README.txt b/data/games/garage/mods/dungeon_loot/README.txt new file mode 100644 index 0000000..c500d25 --- /dev/null +++ b/data/games/garage/mods/dungeon_loot/README.txt @@ -0,0 +1,11 @@ +Minetest Game mod: dungeon_loot +=============================== +Adds randomly generated chests with some "loot" to generated dungeons, +an API to register additional loot is provided. +Only works if dungeons are actually enabled in mapgen flags. + +License information can be found in license.txt + +Authors of source code +---------------------- +Originally by sfan5 (MIT) diff --git a/data/games/garage/mods/dungeon_loot/init.lua b/data/games/garage/mods/dungeon_loot/init.lua new file mode 100644 index 0000000..9d8ac52 --- /dev/null +++ b/data/games/garage/mods/dungeon_loot/init.lua @@ -0,0 +1,8 @@ +dungeon_loot = {} + +dungeon_loot.CHESTS_MIN = 0 -- not necessarily in a single dungeon +dungeon_loot.CHESTS_MAX = 2 +dungeon_loot.STACKS_PER_CHEST_MAX = 8 + +dofile(minetest.get_modpath("dungeon_loot") .. "/loot.lua") +dofile(minetest.get_modpath("dungeon_loot") .. "/mapgen.lua") diff --git a/data/games/garage/mods/dungeon_loot/license.txt b/data/games/garage/mods/dungeon_loot/license.txt new file mode 100644 index 0000000..0af30a0 --- /dev/null +++ b/data/games/garage/mods/dungeon_loot/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 sfan5 + +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. + +For more details: +https://opensource.org/licenses/MIT diff --git a/data/games/garage/mods/dungeon_loot/loot.lua b/data/games/garage/mods/dungeon_loot/loot.lua new file mode 100644 index 0000000..a5a4097 --- /dev/null +++ b/data/games/garage/mods/dungeon_loot/loot.lua @@ -0,0 +1,60 @@ +-- Loot from the `default` mod is registered here, +-- with the rest being registered in the respective mods + +dungeon_loot.registered_loot = { + -- various items + {name = "default:stick", chance = 0.6, count = {3, 6}}, + {name = "default:flint", chance = 0.4, count = {1, 3}}, + + -- farming / consumable + {name = "default:apple", chance = 0.4, count = {1, 4}}, + {name = "default:cactus", chance = 0.4, count = {1, 4}, + types = {"sandstone", "desert"}}, + + -- minerals + {name = "default:coal_lump", chance = 0.9, count = {1, 12}}, + {name = "default:gold_ingot", chance = 0.5}, + {name = "default:steel_ingot", chance = 0.4, count = {1, 6}}, + {name = "default:mese_crystal", chance = 0.1, count = {2, 3}}, + + -- tools + {name = "default:sword_wood", chance = 0.6}, + {name = "default:pick_stone", chance = 0.3}, + {name = "default:axe_diamond", chance = 0.05}, + + -- natural materials + {name = "default:sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, + types = {"normal"}}, + {name = "default:desert_sand", chance = 0.8, count = {4, 32}, y = {-64, 32768}, + types = {"sandstone"}}, + {name = "default:desert_cobble", chance = 0.8, count = {4, 32}, + types = {"desert"}}, + {name = "default:snow", chance = 0.8, count = {8, 64}, y = {-64, 32768}, + types = {"ice"}}, + {name = "default:dirt", chance = 0.6, count = {2, 16}, y = {-64, 32768}, + types = {"normal", "sandstone", "desert"}}, + {name = "default:obsidian", chance = 0.25, count = {1, 3}, y = {-32768, -512}}, + {name = "default:mese", chance = 0.15, y = {-32768, -512}}, +} + +function dungeon_loot.register(t) + if t.name ~= nil then + t = {t} -- single entry + end + for _, loot in ipairs(t) do + table.insert(dungeon_loot.registered_loot, loot) + end +end + +function dungeon_loot._internal_get_loot(pos_y, dungeontype) + -- filter by y pos and type + local ret = {} + for _, l in ipairs(dungeon_loot.registered_loot) do + if l.y == nil or (pos_y >= l.y[1] and pos_y <= l.y[2]) then + if l.types == nil or table.indexof(l.types, dungeontype) ~= -1 then + table.insert(ret, l) + end + end + end + return ret +end diff --git a/data/games/garage/mods/dungeon_loot/mapgen.lua b/data/games/garage/mods/dungeon_loot/mapgen.lua new file mode 100644 index 0000000..3b597f2 --- /dev/null +++ b/data/games/garage/mods/dungeon_loot/mapgen.lua @@ -0,0 +1,173 @@ +minetest.set_gen_notify({dungeon = true, temple = true}) + +local function noise3d_integer(noise, pos) + return math.abs(math.floor(noise:get_3d(pos) * 0x7fffffff)) +end + +local function random_sample(rand, list, count) + local ret = {} + for n = 1, count do + local idx = rand:next(1, #list) + table.insert(ret, list[idx]) + table.remove(list, idx) + end + return ret +end + +local function find_walls(cpos, is_temple) + local is_wall = function(node) + return node.name ~= "air" and node.name ~= "ignore" + end + + local dirs = {{x=1, z=0}, {x=-1, z=0}, {x=0, z=1}, {x=0, z=-1}} + local get_node = minetest.get_node + + local ret = {} + local mindist = {x=0, z=0} + local min = function(a, b) return a ~= 0 and math.min(a, b) or b end + for _, dir in ipairs(dirs) do + for i = 1, 9 do -- 9 = max room size / 2 + local pos = vector.add(cpos, {x=dir.x*i, y=0, z=dir.z*i}) + + -- continue in that direction until we find a wall-like node + local node = get_node(pos) + if is_wall(node) then + local front_below = vector.subtract(pos, {x=dir.x, y=1, z=dir.z}) + local above = vector.add(pos, {x=0, y=1, z=0}) + + -- check that it: + --- is at least 2 nodes high (not a staircase) + --- has a floor + if is_wall(get_node(front_below)) and is_wall(get_node(above)) then + table.insert(ret, {pos = pos, facing = {x=-dir.x, y=0, z=-dir.z}}) + if dir.z == 0 then + mindist.x = min(mindist.x, i-1) + else + mindist.z = min(mindist.z, i-1) + end + end + -- abort even if it wasn't a wall cause something is in the way + break + end + end + end + + local biome = minetest.get_biome_data(cpos) + biome = biome and minetest.get_biome_name(biome.biome) or "" + local type = "normal" + if is_temple or biome:find("desert") == 1 then + type = "desert" + elseif biome:find("sandstone_desert") == 1 then + type = "sandstone" + elseif biome:find("icesheet") == 1 then + type = "ice" + end + + return { + walls = ret, + size = {x=mindist.x*2, z=mindist.z*2}, + type = type, + } +end + +local function populate_chest(pos, rand, dungeontype) + --minetest.chat_send_all("chest placed at " .. minetest.pos_to_string(pos) .. " [" .. dungeontype .. "]") + --minetest.add_node(vector.add(pos, {x=0, y=1, z=0}), {name="default:torch", param2=1}) + + local item_list = dungeon_loot._internal_get_loot(pos.y, dungeontype) + -- take random (partial) sample of all possible items + local sample_n = math.min(#item_list, dungeon_loot.STACKS_PER_CHEST_MAX) + item_list = random_sample(rand, item_list, sample_n) + + -- apply chances / randomized amounts and collect resulting items + local items = {} + for _, loot in ipairs(item_list) do + if rand:next(0, 1000) / 1000 <= loot.chance then + local itemdef = minetest.registered_items[loot.name] + local amount = 1 + if loot.count ~= nil then + amount = rand:next(loot.count[1], loot.count[2]) + end + + if not itemdef then + minetest.log("warning", "Registered loot item " .. loot.name .. " does not exist") + elseif itemdef.tool_capabilities then + for n = 1, amount do + local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear + table.insert(items, ItemStack({name = loot.name, wear = wear})) + end + elseif itemdef.stack_max == 1 then + -- not stackable, add separately + for n = 1, amount do + table.insert(items, loot.name) + end + else + table.insert(items, ItemStack({name = loot.name, count = amount})) + end + end + end + + -- place items at random places in chest + local inv = minetest.get_meta(pos):get_inventory() + local listsz = inv:get_size("main") + assert(listsz >= #items) + for _, item in ipairs(items) do + local index = rand:next(1, listsz) + if inv:get_stack("main", index):is_empty() then + inv:set_stack("main", index, item) + else + inv:add_item("main", item) -- space occupied, just put it anywhere + end + end +end + + +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = gennotify["dungeon"] or {} + local n_dungeons = #poslist + -- Add MGv6 desert temples to the list too + for _, entry in ipairs(gennotify["temple"] or {}) do + table.insert(poslist, entry) + end + if #poslist == 0 then return end + + local noise = minetest.get_perlin(10115, 4, 0.5, 1) + local rand = PcgRandom(noise3d_integer(noise, poslist[1])) + + local candidates = {} + -- process at most 8 rooms to keep runtime of this predictable + local num_process = math.min(#poslist, 8) + for i = 1, num_process do + local room = find_walls(poslist[i], i > n_dungeons) + -- skip small rooms and everything that doesn't at least have 3 walls + if math.min(room.size.x, room.size.z) >= 4 and #room.walls >= 3 then + table.insert(candidates, room) + end + end + + local num_chests = rand:next(dungeon_loot.CHESTS_MIN, dungeon_loot.CHESTS_MAX) + num_chests = math.min(#candidates, num_chests) + local rooms = random_sample(rand, candidates, num_chests) + + for _, room in ipairs(rooms) do + -- choose place somewhere in front of any of the walls + local wall = room.walls[rand:next(1, #room.walls)] + local v, vi -- vector / axis that runs alongside the wall + if wall.facing.x ~= 0 then + v, vi = {x=0, y=0, z=1}, "z" + else + v, vi = {x=1, y=0, z=0}, "x" + end + local chestpos = vector.add(wall.pos, wall.facing) + local off = rand:next(-room.size[vi]/2 + 1, room.size[vi]/2 - 1) + chestpos = vector.add(chestpos, vector.multiply(v, off)) + + if minetest.get_node(chestpos).name == "air" then + -- make it face inwards to the room + local facedir = minetest.dir_to_facedir(vector.multiply(wall.facing, -1)) + minetest.add_node(chestpos, {name = "default:chest", param2 = facedir}) + populate_chest(chestpos, PcgRandom(noise3d_integer(noise, chestpos)), room.type) + end + end +end) diff --git a/data/games/garage/mods/dungeon_loot/mod.conf b/data/games/garage/mods/dungeon_loot/mod.conf new file mode 100644 index 0000000..79d8089 --- /dev/null +++ b/data/games/garage/mods/dungeon_loot/mod.conf @@ -0,0 +1,3 @@ +name = dungeon_loot +description = Minetest Game mod: dungeon_loot +depends = default diff --git a/data/games/garage/mods/dye/README.txt b/data/games/garage/mods/dye/README.txt new file mode 100644 index 0000000..4b922fa --- /dev/null +++ b/data/games/garage/mods/dye/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: dye +====================== +See license.txt for license information. +See init.lua for documentation. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Perttu Ahola (celeron55) (CC BY-SA 3.0) diff --git a/data/games/garage/mods/dye/init.lua b/data/games/garage/mods/dye/init.lua new file mode 100644 index 0000000..f0affe8 --- /dev/null +++ b/data/games/garage/mods/dye/init.lua @@ -0,0 +1,127 @@ +-- dye/init.lua + +dye = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("dye") + +-- Make dye names and descriptions available globally + +dye.dyes = { + {"white", "White"}, + {"grey", "Grey"}, + {"dark_grey", "Dark Grey"}, + {"black", "Black"}, + {"violet", "Violet"}, + {"blue", "Blue"}, + {"cyan", "Cyan"}, + {"dark_green", "Dark Green"}, + {"green", "Green"}, + {"yellow", "Yellow"}, + {"brown", "Brown"}, + {"orange", "Orange"}, + {"red", "Red"}, + {"magenta", "Magenta"}, + {"pink", "Pink"}, +} + +-- Define items + +for _, row in ipairs(dye.dyes) do + local name = row[1] + local description = row[2] + local groups = {dye = 1} + groups["color_" .. name] = 1 + + minetest.register_craftitem("dye:" .. name, { + inventory_image = "dye_" .. name .. ".png", + description = S(description .. " Dye"), + groups = groups + }) + + minetest.register_craft({ + output = "dye:" .. name .. " 4", + recipe = { + {"group:flower,color_" .. name} + }, + }) +end + +-- Manually add coal -> black dye + +minetest.register_craft({ + output = "dye:black 4", + recipe = { + {"group:coal"} + }, +}) + +-- Manually add blueberries->violet dye + +minetest.register_craft({ + output = "dye:violet 2", + recipe = { + {"default:blueberries"} + }, +}) + +-- Mix recipes + +local dye_recipes = { + -- src1, src2, dst + -- RYB mixes + {"red", "blue", "violet"}, -- "purple" + {"yellow", "red", "orange"}, + {"yellow", "blue", "green"}, + -- RYB complementary mixes + {"yellow", "violet", "dark_grey"}, + {"blue", "orange", "dark_grey"}, + -- CMY mixes - approximation + {"cyan", "yellow", "green"}, + {"cyan", "magenta", "blue"}, + {"yellow", "magenta", "red"}, + -- other mixes that result in a color we have + {"red", "green", "brown"}, + {"magenta", "blue", "violet"}, + {"green", "blue", "cyan"}, + {"pink", "violet", "magenta"}, + -- mixes with black + {"white", "black", "grey"}, + {"grey", "black", "dark_grey"}, + {"green", "black", "dark_green"}, + {"orange", "black", "brown"}, + -- mixes with white + {"white", "red", "pink"}, + {"white", "dark_grey", "grey"}, + {"white", "dark_green", "green"}, +} + +for _, mix in pairs(dye_recipes) do + minetest.register_craft({ + type = "shapeless", + output = "dye:" .. mix[3] .. " 2", + recipe = {"dye:" .. mix[1], "dye:" .. mix[2]}, + }) +end + +-- Dummy calls to S() to allow translation scripts to detect the strings. +-- To update this run: +-- for _,e in ipairs(dye.dyes) do print(("S(%q)"):format(e[2].." Dye")) end + +--[[ +S("White Dye") +S("Grey Dye") +S("Dark Grey Dye") +S("Black Dye") +S("Violet Dye") +S("Blue Dye") +S("Cyan Dye") +S("Dark Green Dye") +S("Green Dye") +S("Yellow Dye") +S("Brown Dye") +S("Orange Dye") +S("Red Dye") +S("Magenta Dye") +S("Pink Dye") +--]] diff --git a/data/games/garage/mods/dye/license.txt b/data/games/garage/mods/dye/license.txt new file mode 100644 index 0000000..340820c --- /dev/null +++ b/data/games/garage/mods/dye/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/dye/locale/dye.de.tr b/data/games/garage/mods/dye/locale/dye.de.tr new file mode 100644 index 0000000..f73fb57 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.de.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Weißer Farbstoff +Grey Dye=Grauer Farbstoff +Dark Grey Dye=Dunkelgrauer Farbstoff +Black Dye=Schwarzer Farbstoff +Violet Dye=Violetter Farbstoff +Blue Dye=Blauer Farbstoff +Cyan Dye=Türkiser Farbstoff +Dark Green Dye=Dunkelgrüner Farbstoff +Green Dye=Grüner Farbstoff +Yellow Dye=Gelber Farbstoff +Brown Dye=Brauner Farbstoff +Orange Dye=Orange Farbstoff +Red Dye=Roter Farbstoff +Magenta Dye=Magenta Farbstoff +Pink Dye=Rosa Farbstoff diff --git a/data/games/garage/mods/dye/locale/dye.eo.tr b/data/games/garage/mods/dye/locale/dye.eo.tr new file mode 100644 index 0000000..ee37abb --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.eo.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Blanka tinkturo +Grey Dye=Griza tinkturo +Dark Grey Dye=Malhela griza tinkturo +Black Dye=Nigra tinkturo +Violet Dye=Violkolora tinkturo +Blue Dye=Blua tinkturo +Cyan Dye=Bluverda tinkturo +Dark Green Dye=Malhela verda tinkturo +Green Dye=Verda tinkturo +Yellow Dye=Flava tinkturo +Brown Dye=Bruna tinkturo +Orange Dye=Oranĝkolora tinkturo +Red Dye=Ruĝa tinkturo +Magenta Dye=Fiksina tinkturo +Pink Dye=Rozkolora tinkturo diff --git a/data/games/garage/mods/dye/locale/dye.es.tr b/data/games/garage/mods/dye/locale/dye.es.tr new file mode 100644 index 0000000..bd04ef4 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.es.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Tinte blanco +Grey Dye=Tinte gris +Dark Grey Dye=Tinte gris oscuro +Black Dye=Tinte negro +Violet Dye=Tinte violeta +Blue Dye=Tinte azul +Cyan Dye=Tinte cián +Dark Green Dye=Tinte verde oscuro +Green Dye=Tinte verde +Yellow Dye=Tinte amarillo +Brown Dye=Tinte marrón +Orange Dye=Tinte naranja +Red Dye=Tinte rojo +Magenta Dye=Tinte magenta +Pink Dye=Tinte rosa diff --git a/data/games/garage/mods/dye/locale/dye.fr.tr b/data/games/garage/mods/dye/locale/dye.fr.tr new file mode 100644 index 0000000..390fa07 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.fr.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Colorant blanc +Grey Dye=Colorant gris +Dark Grey Dye=Colorant gris foncé +Black Dye=Colorant noir +Violet Dye=Colorant violet +Blue Dye=Colorant bleu +Cyan Dye=Colorant cyan +Dark Green Dye=Colorant vert foncé +Green Dye=Colorant vert +Yellow Dye=Colorant jaune +Brown Dye=Colorant marron +Orange Dye=Colorant orange +Red Dye=Colorant rouge +Magenta Dye=Colorant magenta +Pink Dye=Colorant rose diff --git a/data/games/garage/mods/dye/locale/dye.id.tr b/data/games/garage/mods/dye/locale/dye.id.tr new file mode 100644 index 0000000..d587107 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.id.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Pewarna Putih +Grey Dye=Pewarna Abu +Dark Grey Dye=Pewarna Abu Tua +Black Dye=Pewarna Hitam +Violet Dye=Pewarna Ungu +Blue Dye=Pewarna Biru +Cyan Dye=Pewarna Sian +Dark Green Dye=Pewarna Hijau Tua +Green Dye=Pewarna Hijau +Yellow Dye=Pewarna Kuning +Brown Dye=Pewarna Cokelat +Orange Dye=Pewarna Oranye +Red Dye=Pewarna Merah +Magenta Dye=Pewarna Magenta +Pink Dye=Pewarna Merah Muda diff --git a/data/games/garage/mods/dye/locale/dye.it.tr b/data/games/garage/mods/dye/locale/dye.it.tr new file mode 100644 index 0000000..9deb385 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.it.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Tintura bianca +Grey Dye=Tintura grigia +Dark Grey Dye=Tintura grigia scura +Black Dye=Tintura nera +Violet Dye=Tintura viola +Blue Dye=Tintura blu +Cyan Dye=Tintura ciano +Dark Green Dye=Tintura verde scura +Green Dye=Tintura verde +Yellow Dye=Tintura gialla +Brown Dye=Tintura marrone +Orange Dye=Tintura arancione +Red Dye=Tintura rossa +Magenta Dye=Tintura magenta +Pink Dye=Tintura rosa diff --git a/data/games/garage/mods/dye/locale/dye.ja.tr b/data/games/garage/mods/dye/locale/dye.ja.tr new file mode 100644 index 0000000..d7ae306 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.ja.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=白色の染料 +Grey Dye=灰色の染料 +Dark Grey Dye=濃灰色の染料 +Black Dye=黒色の染料 +Violet Dye=紫色の染料 +Blue Dye=青色の染料 +Cyan Dye=青緑色の染料 +Dark Green Dye=濃緑色の染料 +Green Dye=緑色の染料 +Yellow Dye=黄色の染料 +Brown Dye=茶色の染料 +Orange Dye=橙色の染料 +Red Dye=赤色の染料 +Magenta Dye=赤紫色の染料 +Pink Dye=桃色の染料 diff --git a/data/games/garage/mods/dye/locale/dye.jbo.tr b/data/games/garage/mods/dye/locale/dye.jbo.tr new file mode 100644 index 0000000..39ec7ab --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.jbo.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=lo blabi xinmo +Grey Dye=lo grusi xinmo +Dark Grey Dye=lo xekri grusi xinmo +Black Dye=lo xekri xinmo +Violet Dye=lo zirpu xinmo +Blue Dye=lo blanu xinmo +Cyan Dye=lo cicna xinmo +Dark Green Dye=lo xekri crino xinmo +Green Dye=lo crino xinmo +Yellow Dye=lo pelxu xinmo +Brown Dye=lo bunre xinmo +Orange Dye=lo narju xinmo +Red Dye=lo xunre xinmo +Magenta Dye=lo nukni xinmo +Pink Dye=lo xunblabi xinmo diff --git a/data/games/garage/mods/dye/locale/dye.lv.tr b/data/games/garage/mods/dye/locale/dye.lv.tr new file mode 100644 index 0000000..048a087 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.lv.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Baltā krāsa +Grey Dye=Pelēkā krāsa +Dark Grey Dye=Tumšpelēkā krāsa +Black Dye=Melnā krāsa +Violet Dye=Violetā krāsa +Blue Dye=Zilā krāsa +Cyan Dye=Ciāna krāsa +Dark Green Dye=Tumšzaļā krāsa +Green Dye=Zaļā krāsa +Yellow Dye=Dzeltenā krāsa +Brown Dye=Brūnā krāsa +Orange Dye=Oranžā krāsa +Red Dye=Sarkanā krāsa +Magenta Dye=Fuksīna krāsa +Pink Dye=Rozā krāsa diff --git a/data/games/garage/mods/dye/locale/dye.ms.tr b/data/games/garage/mods/dye/locale/dye.ms.tr new file mode 100644 index 0000000..a4256c7 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.ms.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Pewarna Putih +Grey Dye=Pewarna Kelabu +Dark Grey Dye=Pewarna Kelabu Tua +Black Dye=Pewarna Hitam +Violet Dye=Pewarna Ungu +Blue Dye=Pewarna Biru +Cyan Dye=Pewarna Biru Kehijauan +Dark Green Dye=Pewarna Hijau Tua +Green Dye=Pewarna Hijau +Yellow Dye=Pewarna Kuning +Brown Dye=Pewarna Perang +Orange Dye=Pewarna Jingga +Red Dye=Pewarna Merah +Magenta Dye=Pewarna Magenta +Pink Dye=Pewarna Merah Jambu diff --git a/data/games/garage/mods/dye/locale/dye.pl.tr b/data/games/garage/mods/dye/locale/dye.pl.tr new file mode 100644 index 0000000..a4bfa64 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.pl.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Biały barwnik +Grey Dye=Szary barwnik +Dark Grey Dye=Ciemnoszary barwnik +Black Dye=Czarny barwnik +Violet Dye=Fioletowy barwnik +Blue Dye=Niebieski barwnik +Cyan Dye=Cyjanowy barwnik +Dark Green Dye=Ciemnozielony barwnik +Green Dye=Zielony barwnik +Yellow Dye=Żółty barwnik +Brown Dye=Brązowy barwnik +Orange Dye=Pomarańczowy barwnik +Red Dye=Czerwony barwnik +Magenta Dye=Karmazynowy barwnik +Pink Dye=Różowy barwnik diff --git a/data/games/garage/mods/dye/locale/dye.pt_BR.tr b/data/games/garage/mods/dye/locale/dye.pt_BR.tr new file mode 100644 index 0000000..29e98da --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.pt_BR.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Tinta Branca +Grey Dye=Tinta Cinza +Dark Grey Dye=Tinta Cinza-escuro +Black Dye=Tinta Preta +Violet Dye=Tinta Violeta +Blue Dye=Tinta Azul +Cyan Dye=Tinta Ciano +Dark Green Dye=Tinta Verde-escuro +Green Dye=Tinta Verde +Yellow Dye=Tinta Amarela +Brown Dye=Tinta Marrom +Orange Dye=Tinta Laranja +Red Dye=Tinta Vermelha +Magenta Dye=Tinta Magenta +Pink Dye=Tinta Rosa diff --git a/data/games/garage/mods/dye/locale/dye.ru.tr b/data/games/garage/mods/dye/locale/dye.ru.tr new file mode 100644 index 0000000..eff51f9 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.ru.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Белый краситель +Grey Dye=Серый краситель +Dark Grey Dye=Тёмно-серый краситель +Black Dye=Черный краситель +Violet Dye=Фиолетовый краситель +Blue Dye=Синий краситель +Cyan Dye=Бирюзовый краситель +Dark Green Dye=Тёмно-зелёный краситель +Green Dye=Зелёный краситель +Yellow Dye=Жёлтый краситель +Brown Dye=Коричневый краситель +Orange Dye=Оранжевый краситель +Red Dye=Красный краситель +Magenta Dye=Сиреневый краситель +Pink Dye=Розовый краситель diff --git a/data/games/garage/mods/dye/locale/dye.sk.tr b/data/games/garage/mods/dye/locale/dye.sk.tr new file mode 100644 index 0000000..625804c --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.sk.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Biele farbivo +Grey Dye=Šedé farbivo +Dark Grey Dye=Tmavo šedé farbivo +Black Dye=Čierne farbivo +Violet Dye=Fialové farbivo +Blue Dye=Modré farbivo +Cyan Dye=Tyrkysové farbivo +Dark Green Dye=Tmavozelené farbivo +Green Dye=Zelené farbivo +Yellow Dye=Žlté farbivo +Brown Dye=Hnedé farbivo +Orange Dye=Oranžové farbivo +Red Dye=Červené farbivo +Magenta Dye=Purpurové farbivo +Pink Dye=Ružové farbivo diff --git a/data/games/garage/mods/dye/locale/dye.sv.tr b/data/games/garage/mods/dye/locale/dye.sv.tr new file mode 100644 index 0000000..ecde443 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.sv.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Vit färg +Grey Dye=Grå färg +Dark Grey Dye=Mörkgrå färg +Black Dye=Svart färg +Violet Dye=Violett färg +Blue Dye=Blå färg +Cyan Dye=Cyan färg +Dark Green Dye=Mörkgrön färg +Green Dye=Grön färg +Yellow Dye=Gul färg +Brown Dye=Brun färg +Orange Dye=Orange färg +Red Dye=Röd färg +Magenta Dye=Magenta färg +Pink Dye=Rosa färg diff --git a/data/games/garage/mods/dye/locale/dye.uk.tr b/data/games/garage/mods/dye/locale/dye.uk.tr new file mode 100644 index 0000000..7bf0f45 --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.uk.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=Білий барвник +Grey Dye=Сірий барвник +Dark Grey Dye=Темно-сірий барвник +Black Dye=Чорний барвник +Violet Dye=Фіолетовий барвник +Blue Dye=Синій барвник +Cyan Dye=Синьо-зелений барвник +Dark Green Dye=Темно-зелений барвник +Green Dye=Зелений барвник +Yellow Dye=Жовтий барвник +Brown Dye=Коричневий барвник +Orange Dye=Помаранчевий барвник +Red Dye=Червоний барвник +Magenta Dye=Пурпурний барвник +Pink Dye=Рожевий барвник diff --git a/data/games/garage/mods/dye/locale/dye.zh_CN.tr b/data/games/garage/mods/dye/locale/dye.zh_CN.tr new file mode 100644 index 0000000..11bf9cb --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.zh_CN.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=白色染料 +Grey Dye=灰色染料 +Dark Grey Dye=暗灰染料 +Black Dye=黑色染料 +Violet Dye=紫色染料 +Blue Dye=蓝色染料 +Cyan Dye=青色染料 +Dark Green Dye=暗绿染料 +Green Dye=绿色染料 +Yellow Dye=黄色染料 +Brown Dye=棕色染料 +Orange Dye=橙色染料 +Red Dye=红色染料 +Magenta Dye=品红染料 +Pink Dye=粉红染料 diff --git a/data/games/garage/mods/dye/locale/dye.zh_TW.tr b/data/games/garage/mods/dye/locale/dye.zh_TW.tr new file mode 100644 index 0000000..b84d07e --- /dev/null +++ b/data/games/garage/mods/dye/locale/dye.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye=白色染料 +Grey Dye=灰色染料 +Dark Grey Dye=暗灰染料 +Black Dye=黑色染料 +Violet Dye=紫色染料 +Blue Dye=藍色染料 +Cyan Dye=青色染料 +Dark Green Dye=暗綠染料 +Green Dye=綠色染料 +Yellow Dye=黃色染料 +Brown Dye=棕色染料 +Orange Dye=橙色染料 +Red Dye=紅色染料 +Magenta Dye=品紅染料 +Pink Dye=粉紅染料 diff --git a/data/games/garage/mods/dye/locale/template.txt b/data/games/garage/mods/dye/locale/template.txt new file mode 100644 index 0000000..c20bab5 --- /dev/null +++ b/data/games/garage/mods/dye/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: dye +White Dye= +Grey Dye= +Dark Grey Dye= +Black Dye= +Violet Dye= +Blue Dye= +Cyan Dye= +Dark Green Dye= +Green Dye= +Yellow Dye= +Brown Dye= +Orange Dye= +Red Dye= +Magenta Dye= +Pink Dye= diff --git a/data/games/garage/mods/dye/mod.conf b/data/games/garage/mods/dye/mod.conf new file mode 100644 index 0000000..32bb816 --- /dev/null +++ b/data/games/garage/mods/dye/mod.conf @@ -0,0 +1,2 @@ +name = dye +description = Minetest Game mod: dye diff --git a/data/games/garage/mods/dye/textures/dye_black.png b/data/games/garage/mods/dye/textures/dye_black.png new file mode 100644 index 0000000..1055b6c Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_black.png differ diff --git a/data/games/garage/mods/dye/textures/dye_blue.png b/data/games/garage/mods/dye/textures/dye_blue.png new file mode 100644 index 0000000..d1377c6 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_blue.png differ diff --git a/data/games/garage/mods/dye/textures/dye_brown.png b/data/games/garage/mods/dye/textures/dye_brown.png new file mode 100644 index 0000000..77d475c Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_brown.png differ diff --git a/data/games/garage/mods/dye/textures/dye_cyan.png b/data/games/garage/mods/dye/textures/dye_cyan.png new file mode 100644 index 0000000..239d66c Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_cyan.png differ diff --git a/data/games/garage/mods/dye/textures/dye_dark_green.png b/data/games/garage/mods/dye/textures/dye_dark_green.png new file mode 100644 index 0000000..9606ccf Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_dark_green.png differ diff --git a/data/games/garage/mods/dye/textures/dye_dark_grey.png b/data/games/garage/mods/dye/textures/dye_dark_grey.png new file mode 100644 index 0000000..060737b Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_dark_grey.png differ diff --git a/data/games/garage/mods/dye/textures/dye_green.png b/data/games/garage/mods/dye/textures/dye_green.png new file mode 100644 index 0000000..0d99ee1 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_green.png differ diff --git a/data/games/garage/mods/dye/textures/dye_grey.png b/data/games/garage/mods/dye/textures/dye_grey.png new file mode 100644 index 0000000..5efb028 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_grey.png differ diff --git a/data/games/garage/mods/dye/textures/dye_magenta.png b/data/games/garage/mods/dye/textures/dye_magenta.png new file mode 100644 index 0000000..c84df62 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_magenta.png differ diff --git a/data/games/garage/mods/dye/textures/dye_orange.png b/data/games/garage/mods/dye/textures/dye_orange.png new file mode 100644 index 0000000..0844907 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_orange.png differ diff --git a/data/games/garage/mods/dye/textures/dye_pink.png b/data/games/garage/mods/dye/textures/dye_pink.png new file mode 100644 index 0000000..c3dec22 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_pink.png differ diff --git a/data/games/garage/mods/dye/textures/dye_red.png b/data/games/garage/mods/dye/textures/dye_red.png new file mode 100644 index 0000000..14eafbf Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_red.png differ diff --git a/data/games/garage/mods/dye/textures/dye_violet.png b/data/games/garage/mods/dye/textures/dye_violet.png new file mode 100644 index 0000000..600cbb4 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_violet.png differ diff --git a/data/games/garage/mods/dye/textures/dye_white.png b/data/games/garage/mods/dye/textures/dye_white.png new file mode 100644 index 0000000..2a840a4 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_white.png differ diff --git a/data/games/garage/mods/dye/textures/dye_yellow.png b/data/games/garage/mods/dye/textures/dye_yellow.png new file mode 100644 index 0000000..fe75775 Binary files /dev/null and b/data/games/garage/mods/dye/textures/dye_yellow.png differ diff --git a/data/games/garage/mods/env_sounds/README.txt b/data/games/garage/mods/env_sounds/README.txt new file mode 100644 index 0000000..3b3d275 --- /dev/null +++ b/data/games/garage/mods/env_sounds/README.txt @@ -0,0 +1,17 @@ +Minetest Game mod: env_sounds +============================= +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (sounds) +------------------------- +Yuval (CC0 1.0) +https://freesound.org/people/Yuval/sounds/197023/ + env_sounds_water.*.ogg + +Halion (CC0 1.0) +https://freesound.org/people/Halion/sounds/17785/ + env_sounds_lava.*.ogg diff --git a/data/games/garage/mods/env_sounds/init.lua b/data/games/garage/mods/env_sounds/init.lua new file mode 100644 index 0000000..31cc483 --- /dev/null +++ b/data/games/garage/mods/env_sounds/init.lua @@ -0,0 +1,112 @@ +-- Parameters + +-- Node search radius around player +local radius = 8 + +local allsounds = { + ["env_sounds_water"] = { + trigger = {"default:water_flowing", "default:river_water_flowing"}, + base_volume = 0.04, + max_volume = 0.4, + per_node = 0.004, + }, + ["env_sounds_lava"] = { + trigger = {"default:lava_source", "default:lava_flowing"}, + base_volume = 0, + max_volume = 0.6, + per_node = { + ["default:lava_source"] = 0.008, + ["default:lava_flowing"] = 0.002, + }, + }, +} + +if minetest.settings:get_bool("river_source_sounds") then + table.insert(allsounds["env_sounds_water"].trigger, + "default:river_water_source") +end + + +-- Cache the union of all trigger nodes + +local cache_triggers = {} + +for sound, def in pairs(allsounds) do + for _, name in ipairs(def.trigger) do + table.insert(cache_triggers, name) + end +end + + +-- Update sound for player + +local function update_sound(player) + local player_name = player:get_player_name() + local ppos = player:get_pos() + ppos = vector.add(ppos, player:get_properties().eye_height) + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + + local pos = minetest.find_nodes_in_area(areamin, areamax, cache_triggers, true) + if next(pos) == nil then -- If table empty + return + end + for sound, def in pairs(allsounds) do + -- Find average position + local posav = {0, 0, 0} + local count = 0 + for _, name in ipairs(def.trigger) do + if pos[name] then + for _, p in ipairs(pos[name]) do + posav[1] = posav[1] + p.x + posav[2] = posav[2] + p.y + posav[3] = posav[3] + p.z + end + count = count + #pos[name] + end + end + + if count > 0 then + posav = vector.new(posav[1] / count, posav[2] / count, + posav[3] / count) + + -- Calculate gain + local gain = def.base_volume + if type(def.per_node) == 'table' then + for name, multiplier in pairs(def.per_node) do + if pos[name] then + gain = gain + #pos[name] * multiplier + end + end + else + gain = gain + count * def.per_node + end + gain = math.min(gain, def.max_volume) + + minetest.sound_play(sound, { + pos = posav, + to_player = player_name, + gain = gain, + }, true) + end + end +end + + +-- Update sound when player joins + +minetest.register_on_joinplayer(function(player) + update_sound(player) +end) + + +-- Cyclic sound update + +local function cyclic_update() + for _, player in pairs(minetest.get_connected_players()) do + update_sound(player) + end + minetest.after(3.5, cyclic_update) +end + +minetest.after(0, cyclic_update) diff --git a/data/games/garage/mods/env_sounds/license.txt b/data/games/garage/mods/env_sounds/license.txt new file mode 100644 index 0000000..ff8867d --- /dev/null +++ b/data/games/garage/mods/env_sounds/license.txt @@ -0,0 +1,57 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2019 paramat + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (sounds) +-------------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +Yuval + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/data/games/garage/mods/env_sounds/mod.conf b/data/games/garage/mods/env_sounds/mod.conf new file mode 100644 index 0000000..ad6feb3 --- /dev/null +++ b/data/games/garage/mods/env_sounds/mod.conf @@ -0,0 +1,3 @@ +name = env_sounds +description = Minetest Game mod: env_sounds +depends = default diff --git a/data/games/garage/mods/env_sounds/sounds/env_sounds_lava.1.ogg b/data/games/garage/mods/env_sounds/sounds/env_sounds_lava.1.ogg new file mode 100644 index 0000000..3eafce2 Binary files /dev/null and b/data/games/garage/mods/env_sounds/sounds/env_sounds_lava.1.ogg differ diff --git a/data/games/garage/mods/env_sounds/sounds/env_sounds_lava.2.ogg b/data/games/garage/mods/env_sounds/sounds/env_sounds_lava.2.ogg new file mode 100644 index 0000000..8648f17 Binary files /dev/null and b/data/games/garage/mods/env_sounds/sounds/env_sounds_lava.2.ogg differ diff --git a/data/games/garage/mods/env_sounds/sounds/env_sounds_water.1.ogg b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.1.ogg new file mode 100644 index 0000000..aa80882 Binary files /dev/null and b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.1.ogg differ diff --git a/data/games/garage/mods/env_sounds/sounds/env_sounds_water.2.ogg b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.2.ogg new file mode 100644 index 0000000..b3ff114 Binary files /dev/null and b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.2.ogg differ diff --git a/data/games/garage/mods/env_sounds/sounds/env_sounds_water.3.ogg b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.3.ogg new file mode 100644 index 0000000..431a6ed Binary files /dev/null and b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.3.ogg differ diff --git a/data/games/garage/mods/env_sounds/sounds/env_sounds_water.4.ogg b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.4.ogg new file mode 100644 index 0000000..56c2ee2 Binary files /dev/null and b/data/games/garage/mods/env_sounds/sounds/env_sounds_water.4.ogg differ diff --git a/data/games/garage/mods/farming/README.txt b/data/games/garage/mods/farming/README.txt new file mode 100644 index 0000000..69cfa75 --- /dev/null +++ b/data/games/garage/mods/farming/README.txt @@ -0,0 +1,43 @@ +Minetest Game mod: farming +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +webdesigner97 (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Created by PilzAdam (CC BY 3.0): + farming_bread.png + farming_soil.png + farming_soil_wet.png + farming_soil_wet_side.png + farming_string.png + +Created by BlockMen (CC BY 3.0): + farming_tool_diamondhoe.png + farming_tool_mesehoe.png + farming_tool_bronzehoe.png + farming_tool_steelhoe.png + farming_tool_stonehoe.png + farming_tool_woodhoe.png + +Created by MasterGollum (CC BY 3.0): + farming_straw.png + +Created by Gambit (CC BY 3.0): + farming_wheat.png + farming_wheat_*.png + farming_cotton_*.png + farming_flour.png + farming_cotton_seed.png + farming_wheat_seed.png + +Created by Napiophelios (CC BY-SA 3.0): + farming_cotton.png + +Created by Extex101 (CC BY-SA 3.0): + farming_cotton_wild.png diff --git a/data/games/garage/mods/farming/api.lua b/data/games/garage/mods/farming/api.lua new file mode 100644 index 0000000..08ab0a0 --- /dev/null +++ b/data/games/garage/mods/farming/api.lua @@ -0,0 +1,406 @@ +-- farming/api.lua + +-- support for MT game translation. +local S = farming.get_translator + +-- Wear out hoes, place soil +-- TODO Ignore group:flower +farming.registered_plants = {} + +farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return + end + if pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + if not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") ~= 1 then + return + end + + -- check if (wet) soil defined + local regN = minetest.registered_nodes + if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then + return + end + + local player_name = user and user:get_player_name() or "" + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return + end + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return + end + + -- turn the node into soil and play sound + minetest.set_node(pt.under, {name = regN[under.name].soil.dry}) + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.3, + }, true) + + if not minetest.is_creative_enabled(player_name) then + -- wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear_by_uses(uses) + -- tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, {pos = pt.above, + gain = 0.5}, true) + end + end + return itemstack +end + +-- Register new hoes +farming.register_hoe = function(name, def) + -- Check for : prefix (register new hoes in your mod's namespace) + if name:sub(1,1) ~= ":" then + name = ":" .. name + end + -- Check def table + if def.description == nil then + def.description = S("Hoe") + end + if def.inventory_image == nil then + def.inventory_image = "unknown_item.png" + end + if def.max_uses == nil then + def.max_uses = 30 + end + -- Register the tool + minetest.register_tool(name, { + description = def.description, + inventory_image = def.inventory_image, + on_use = function(itemstack, user, pointed_thing) + return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses) + end, + groups = def.groups, + sound = {breaks = "default_tool_breaks"}, + }) + -- Register its recipe + if def.recipe then + minetest.register_craft({ + output = name:sub(2), + recipe = def.recipe + }) + elseif def.material then + minetest.register_craft({ + output = name:sub(2), + recipe = { + {def.material, def.material}, + {"", "group:stick"}, + {"", "group:stick"} + } + }) + end +end + +-- how often node timers for plants will tick, +/- some random value +local function tick(pos) + minetest.get_node_timer(pos):start(math.random(166, 286)) +end +-- how often a growth failure tick is retried (e.g. too dark) +local function tick_again(pos) + minetest.get_node_timer(pos):start(math.random(40, 80)) +end + +-- Seed placement +farming.place_seed = function(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + -- check if pointing at a node + if not pt then + return itemstack + end + if pt.type ~= "node" then + return itemstack + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + local player_name = placer and placer:get_player_name() or "" + + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return + end + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return itemstack + end + if not minetest.registered_nodes[above.name] then + return itemstack + end + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y+1 then + return itemstack + end + + -- check if you can replace the node above the pointed node + if not minetest.registered_nodes[above.name].buildable_to then + return itemstack + end + + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") < 2 then + return itemstack + end + + -- add the node and remove 1 item from the itemstack + if placer then + default.log_player_action(placer, "places node", plantname, "at", pt.above) + end + minetest.add_node(pt.above, {name = plantname, param2 = 1}) + tick(pt.above) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack +end + +-- check if on wet soil +farming.can_grow = function(pos) + local below = minetest.get_node(pos:offset(0, -1, 0)) + return minetest.get_item_group(below.name, "soil") >= 3 +end + +farming.grow_plant = function(pos, elapsed) + local node = minetest.get_node(pos) + local name = node.name + local def = minetest.registered_nodes[name] + + if not def.next_plant then + -- disable timer for fully grown plant + return + end + + -- grow seed + if minetest.get_item_group(node.name, "seed") and def.fertility then + local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not soil_node then + tick_again(pos) + return + end + -- omitted is a check for light, we assume seeds can germinate in the dark. + for _, v in pairs(def.fertility) do + if minetest.get_item_group(soil_node.name, v) ~= 0 then + local placenode = {name = def.next_plant} + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + if minetest.registered_nodes[def.next_plant].next_plant then + tick(pos) + return + end + end + end + + return + end + + if not (def.can_grow or farming.can_grow)(pos) then + tick_again(pos) + return + end + + -- check light + local light = minetest.get_node_light(pos) + if not light or light < def.minlight or light > def.maxlight then + tick_again(pos) + return + end + + -- grow + local placenode = {name = def.next_plant} + if def.place_param2 then + placenode.param2 = def.place_param2 + end + minetest.swap_node(pos, placenode) + + -- new timer needed? + if minetest.registered_nodes[def.next_plant].next_plant then + tick(pos) + end + return +end + +-- Register plants +farming.register_plant = function(name, def) + local mname = name:split(":")[1] + local pname = name:split(":")[2] + + -- Check def table + if not def.description then + def.description = S("Seed") + end + if not def.harvest_description then + def.harvest_description = pname:gsub("^%l", string.upper) + end + if not def.inventory_image then + def.inventory_image = "unknown_item.png" + end + if not def.steps then + return nil + end + if not def.minlight then + def.minlight = 1 + end + if not def.maxlight then + def.maxlight = 14 + end + if not def.fertility then + def.fertility = {} + end + + farming.registered_plants[pname] = def + + -- Register seed + local lbm_nodes = {mname .. ":seed_" .. pname} + local g = {seed = 1, snappy = 3, attached_node = 1, flammable = 2} + for k, v in pairs(def.fertility) do + g[v] = 1 + end + minetest.register_node(":" .. mname .. ":seed_" .. pname, { + description = def.description, + tiles = {def.inventory_image}, + inventory_image = def.inventory_image, + wield_image = def.inventory_image, + drawtype = "signlike", + groups = g, + paramtype = "light", + paramtype2 = "wallmounted", + place_param2 = def.place_param2 or nil, -- this isn't actually used for placement + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + fertility = def.fertility, + sounds = default.node_sound_dirt_defaults({ + dig = {name = "", gain = 0}, + dug = {name = "default_grass_footstep", gain = 0.2}, + place = {name = "default_place_node", gain = 0.25}, + }), + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname) + end, + next_plant = mname .. ":" .. pname .. "_1", + on_timer = farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + }) + + -- Register harvest + minetest.register_craftitem(":" .. mname .. ":" .. pname, { + description = def.harvest_description, + inventory_image = mname .. "_" .. pname .. ".png", + groups = def.groups or {flammable = 2}, + }) + + -- Register growing steps + for i = 1, def.steps do + local base_rarity = 1 + if def.steps ~= 1 then + base_rarity = 8 - (i - 1) * 7 / (def.steps - 1) + end + local drop = { + items = { + {items = {mname .. ":" .. pname}, rarity = base_rarity}, + {items = {mname .. ":" .. pname}, rarity = base_rarity * 2}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity}, + {items = {mname .. ":seed_" .. pname}, rarity = base_rarity * 2}, + } + } + local nodegroups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1} + nodegroups[pname] = i + + local next_plant = nil + + if i < def.steps then + next_plant = mname .. ":" .. pname .. "_" .. (i + 1) + lbm_nodes[#lbm_nodes + 1] = mname .. ":" .. pname .. "_" .. i + end + + minetest.register_node(":" .. mname .. ":" .. pname .. "_" .. i, { + drawtype = "plantlike", + waving = 1, + tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"}, + paramtype = "light", + paramtype2 = def.paramtype2 or nil, + place_param2 = def.place_param2 or nil, + walkable = false, + buildable_to = true, + drop = drop, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + groups = nodegroups, + sounds = default.node_sound_leaves_defaults(), + next_plant = next_plant, + on_timer = farming.grow_plant, + minlight = def.minlight, + maxlight = def.maxlight, + }) + end + + -- replacement LBM for pre-nodetimer plants + minetest.register_lbm({ + name = ":" .. mname .. ":start_nodetimer_" .. pname, + nodenames = lbm_nodes, + action = function(pos, node) + tick_again(pos) + end, + }) + + -- Return + local r = { + seed = mname .. ":seed_" .. pname, + harvest = mname .. ":" .. pname + } + return r +end diff --git a/data/games/garage/mods/farming/hoes.lua b/data/games/garage/mods/farming/hoes.lua new file mode 100644 index 0000000..d005f6d --- /dev/null +++ b/data/games/garage/mods/farming/hoes.lua @@ -0,0 +1,54 @@ +-- farming/hoes.lua + +-- support for MT game translation. +local S = farming.get_translator + +farming.register_hoe(":farming:hoe_wood", { + description = S("Wooden Hoe"), + inventory_image = "farming_tool_woodhoe.png", + max_uses = 30, + material = "group:wood", + groups = {hoe = 1, flammable = 2}, +}) + +farming.register_hoe(":farming:hoe_stone", { + description = S("Stone Hoe"), + inventory_image = "farming_tool_stonehoe.png", + max_uses = 90, + material = "group:stone", + groups = {hoe = 1} +}) + +farming.register_hoe(":farming:hoe_steel", { + description = S("Steel Hoe"), + inventory_image = "farming_tool_steelhoe.png", + max_uses = 500, + material = "default:steel_ingot", + groups = {hoe = 1} +}) + +-- The following are deprecated by removing the 'material' field to prevent +-- crafting and removing from creative inventory, to cause them to eventually +-- disappear from worlds. The registrations should be removed in a future +-- release. + +farming.register_hoe(":farming:hoe_bronze", { + description = S("Bronze Hoe"), + inventory_image = "farming_tool_bronzehoe.png", + max_uses = 220, + groups = {hoe = 1, not_in_creative_inventory = 1}, +}) + +farming.register_hoe(":farming:hoe_mese", { + description = S("Mese Hoe"), + inventory_image = "farming_tool_mesehoe.png", + max_uses = 350, + groups = {hoe = 1, not_in_creative_inventory = 1}, +}) + +farming.register_hoe(":farming:hoe_diamond", { + description = S("Diamond Hoe"), + inventory_image = "farming_tool_diamondhoe.png", + max_uses = 500, + groups = {hoe = 1, not_in_creative_inventory = 1}, +}) diff --git a/data/games/garage/mods/farming/init.lua b/data/games/garage/mods/farming/init.lua new file mode 100644 index 0000000..d328cb4 --- /dev/null +++ b/data/games/garage/mods/farming/init.lua @@ -0,0 +1,171 @@ +-- farming/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("farming") + +-- Global farming namespace + +farming = {} +farming.path = minetest.get_modpath("farming") +farming.get_translator = S + +-- Load files + +dofile(farming.path .. "/api.lua") +dofile(farming.path .. "/nodes.lua") +dofile(farming.path .. "/hoes.lua") + + +-- Wheat + +farming.register_plant("farming:wheat", { + description = S("Wheat Seed"), + harvest_description = S("Wheat"), + paramtype2 = "meshoptions", + inventory_image = "farming_wheat_seed.png", + steps = 8, + minlight = 13, + maxlight = default.LIGHT_MAX, + fertility = {"grassland"}, + groups = {food_wheat = 1, flammable = 4}, + place_param2 = 3, +}) + +minetest.register_craftitem("farming:flour", { + description = S("Flour"), + inventory_image = "farming_flour.png", + groups = {food_flour = 1, flammable = 1}, +}) + +minetest.register_craftitem("farming:bread", { + description = S("Bread"), + inventory_image = "farming_bread.png", + on_use = minetest.item_eat(5), + groups = {food_bread = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "shapeless", + output = "farming:flour", + recipe = {"farming:wheat", "farming:wheat", "farming:wheat", "farming:wheat"} +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:bread", + recipe = "farming:flour" +}) + + +-- Cotton + +farming.register_plant("farming:cotton", { + description = S("Cotton Seed"), + harvest_description = S("Cotton"), + inventory_image = "farming_cotton_seed.png", + steps = 8, + minlight = 13, + maxlight = default.LIGHT_MAX, + fertility = {"grassland", "desert"}, + groups = {flammable = 4}, +}) + +minetest.register_decoration({ + name = "farming:cotton_wild", + deco_type = "simple", + place_on = {"default:dry_dirt_with_dry_grass"}, + sidelen = 16, + noise_params = { + offset = -0.1, + scale = 0.1, + spread = {x = 50, y = 50, z = 50}, + seed = 4242, + octaves = 3, + persist = 0.7 + }, + biomes = {"savanna"}, + y_max = 31000, + y_min = 1, + decoration = "farming:cotton_wild", +}) + +minetest.register_craftitem("farming:string", { + description = S("String"), + inventory_image = "farming_string.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = "wool:white", + recipe = { + {"farming:cotton", "farming:cotton"}, + {"farming:cotton", "farming:cotton"}, + } +}) + +minetest.register_craft({ + output = "farming:string 2", + recipe = { + {"farming:cotton"}, + {"farming:cotton"}, + } +}) + + +-- Straw + +minetest.register_craft({ + output = "farming:straw 3", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + } +}) + +minetest.register_craft({ + output = "farming:wheat 3", + recipe = { + {"farming:straw"}, + } +}) + + +-- Fuels + +minetest.register_craft({ + type = "fuel", + recipe = "farming:wheat", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:cotton", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:string", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:hoe_wood", + burntime = 5, +}) + + +-- Register farming items as dungeon loot + +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + {name = "farming:string", chance = 0.5, count = {1, 8}}, + {name = "farming:wheat", chance = 0.5, count = {2, 5}}, + {name = "farming:seed_cotton", chance = 0.4, count = {1, 4}, + types = {"normal"}}, + }) +end diff --git a/data/games/garage/mods/farming/license.txt b/data/games/garage/mods/farming/license.txt new file mode 100644 index 0000000..a90d808 --- /dev/null +++ b/data/games/garage/mods/farming/license.txt @@ -0,0 +1,95 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 webdesigner97 +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +License of media (textures) +--------------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 MasterGollum +Copyright (C) 2015-2016 Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 Napiophelios +Copyright (C) 2020 Extex101 + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/farming/locale/farming.de.tr b/data/games/garage/mods/farming/locale/farming.de.tr new file mode 100644 index 0000000..b16748d --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.de.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Hacke +Seed=Samen +Wooden Hoe=Holzhacke +Stone Hoe=Steinhacke +Steel Hoe=Stahlhacke +Bronze Hoe=Bronzehacke +Mese Hoe=Mesehacke +Diamond Hoe=Diamanthacke +Wheat Seed=Weizensamen +Wheat=Weizen +Flour=Mehl +Bread=Brot +Cotton Seed=Baumwollsamen +Cotton=Baumwolle +String=Faden +Soil=Ackerboden +Wet Soil=Nasser Ackerboden +Savanna Soil=Savannenackerboden +Wet Savanna Soil=Nasser Savannenackerboden +Desert Sand Soil=Wüstensandackerboden +Wet Desert Sand Soil=Nasser Wüstensandackerboden +Straw=Stroh +Straw Stair=Strohtreppe +Inner Straw Stair=Innere Strohtreppe +Outer Straw Stair=Äußere Strohtreppe +Straw Slab=Strohplatte +Wild Cotton=Wilde Baumwolle diff --git a/data/games/garage/mods/farming/locale/farming.eo.tr b/data/games/garage/mods/farming/locale/farming.eo.tr new file mode 100644 index 0000000..887ef00 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.eo.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Sarkilo +Seed=Semo +Wooden Hoe=Ligna sarkilo +Stone Hoe=Ŝtona sarkilo +Steel Hoe=Ŝtala sarkilo +Bronze Hoe=Bronza sarkilo +Mese Hoe=Mesea sarkilo +Diamond Hoe=Diamanta sarkilo +Wheat Seed=Tritika semo +Wheat=Tritiko +Flour=Faruno +Bread=Pano +Cotton Seed=Katuna semo +Cotton=Katuno +String=Ŝnuro +Soil=Tero +Wet Soil=Malseka tero +Savanna Soil=Savana tero +Wet Savanna Soil=Malseka savana tero +Desert Sand Soil=Dezerta sablo tero +Wet Desert Sand Soil=Malseka dezerta sablo tero +Straw=Pajlo +Straw Stair=Pajla ŝtupo +Inner Straw Stair=Interna pajla ŝtupo +Outer Straw Stair=Ekstera pajla ŝtupo +Straw Slab=Pajla plato +Wild Cotton=Sovaĝa kotonujo diff --git a/data/games/garage/mods/farming/locale/farming.es.tr b/data/games/garage/mods/farming/locale/farming.es.tr new file mode 100644 index 0000000..b17a452 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.es.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe= +Seed= +Wooden Hoe=Azada de madera +Stone Hoe=Azada de piedra +Steel Hoe=Azada de acero +Bronze Hoe=Azada de bronce +Mese Hoe=Azada de mese +Diamond Hoe=Azada de diamante +Wheat Seed=Semilla de trigo +Wheat=Trigo +Flour=Harina +Bread=Pan +Cotton Seed=Semilla de algodón +Cotton=Algodón +String=Hilo +Soil=Tierra de cultivo +Wet Soil=Tierra de cultivo humeda +Savanna Soil= +Wet Savanna Soil= +Desert Sand Soil=Tierra de cultivo de arena de desierto +Wet Desert Sand Soil=Tierra de cultivo de arena de desierto humeda +Straw=Paja +Straw Stair=Escalera de paja +Inner Straw Stair=Escalera de paja interior +Outer Straw Stair=Escalera de paja exterior +Straw Slab=Losa de paja +Wild Cotton=Algodón silvestre + + +##### not used anymore ##### + +Dry Soil=Tierra de cultivo seca +Wet Dry Soil=Tierra de cultivo seca-humeda diff --git a/data/games/garage/mods/farming/locale/farming.fr.tr b/data/games/garage/mods/farming/locale/farming.fr.tr new file mode 100644 index 0000000..826949e --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.fr.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=Houe +Seed=Grain +Wooden Hoe=Houe en bois +Stone Hoe=Houe en pierre +Steel Hoe=Houe en acier +Bronze Hoe=Houe en bronze +Mese Hoe=Houe en Mese +Diamond Hoe=Houe en diamant +Wheat Seed=Grain de blé +Wheat=Blé +Flour=Farine +Bread=Pain +Cotton Seed=Graine de coton +Cotton=Coton +String=Ficelle +Soil=Sol +Wet Soil=Sol humide +Savanna Soil=Sol de la savanne +Wet Savanna Soil=Sol de la savanne humide +Desert Sand Soil=Sol de sable du désert +Wet Desert Sand Soil=Sol de sable du désert humide +Straw=Paille +Straw Stair=Escalier de paille +Inner Straw Stair=Escalier intérieur en paille +Outer Straw Stair=Escalier extérieur en paille +Straw Slab=Dalle de paille +Wild Cotton=Coton sauvage + + +##### not used anymore ##### + +Dry Soil=Sol sec +Wet Dry Soil=Sol sec et humide diff --git a/data/games/garage/mods/farming/locale/farming.id.tr b/data/games/garage/mods/farming/locale/farming.id.tr new file mode 100644 index 0000000..7b27680 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.id.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Cangkul +Seed=Benih +Wooden Hoe=Cangkul Kayu +Stone Hoe=Cangkul Batu +Steel Hoe=Cangkul Baja +Bronze Hoe=Cangkul Perunggu +Mese Hoe=Cangkul Mese +Diamond Hoe=Cangkul Berlian +Wheat Seed=Benih Gandum +Wheat=Gandum +Flour=Tepung +Bread=Roti +Cotton Seed=Benih Kapas +Cotton=Kapas +String=Benang +Soil=Tanah Tanam +Wet Soil=Tanah Tanam Basah +Savanna Soil=Tanah Tanam Sabana +Wet Savanna Soil=Tanah Tanam Sabana Basah +Desert Sand Soil=Pasir Tanam Gurun +Wet Desert Sand Soil=Pasir Tanam Gurun Basah +Straw=Jerami +Straw Stair=Tangga Jerami +Inner Straw Stair=Tangga Jerami Dalam +Outer Straw Stair=Tangga Jerami Luar +Straw Slab=Lempengan Jerami +Wild Cotton=Kapas Liar diff --git a/data/games/garage/mods/farming/locale/farming.it.tr b/data/games/garage/mods/farming/locale/farming.it.tr new file mode 100644 index 0000000..aeb9c0a --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.it.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe= +Seed= +Wooden Hoe=Zappa di legno +Stone Hoe=Zappa di pietra +Steel Hoe=Zappa d'acciaio +Bronze Hoe=Zappa di bronzo +Mese Hoe=Zappa di mese +Diamond Hoe=Zappa di diamante +Wheat Seed=Seme di grano +Wheat=Grano +Flour=Farina +Bread=Pane +Cotton Seed=Seme di cotone +Cotton=Cotone +String=Filo +Soil=Terreno +Wet Soil=Terreno bagnato +Savanna Soil= +Wet Savanna Soil= +Desert Sand Soil=Terreno di sabbia del deserto +Wet Desert Sand Soil=Terreno bagnato di sabbia del deserto +Straw=Paglia +Straw Stair=Scala di paglia +Inner Straw Stair=Scala di paglia interna +Outer Straw Stair=Scala di paglia esterna +Straw Slab=Lastra di paglia +Wild Cotton= + + +##### not used anymore ##### + +Dry Soil=Terreno asciutto +Wet Dry Soil=Terreno asciutto bagnato diff --git a/data/games/garage/mods/farming/locale/farming.ja.tr b/data/games/garage/mods/farming/locale/farming.ja.tr new file mode 100644 index 0000000..887d839 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.ja.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=クワ +Seed=種 +Wooden Hoe=木製のクワ +Stone Hoe=石のクワ +Steel Hoe=鉄のクワ +Bronze Hoe=青銅のクワ +Mese Hoe=メセのクワ +Diamond Hoe=ダイヤモンドのクワ +Wheat Seed=小麦の種 +Wheat=小麦 +Flour=小麦粉 +Bread=パン +Cotton Seed=綿の種 +Cotton=綿 +String=糸 +Soil=土壌 +Wet Soil=湿った土壌 +Savanna Soil=サバンナの土壌 +Wet Savanna Soil=湿ったサバンナの土壌 +Desert Sand Soil=砂漠の砂の土壌 +Wet Desert Sand Soil=湿った砂漠の砂の土壌 +Straw=ワラ +Straw Stair=ワラの階段 +Inner Straw Stair=ワラの凹階段 +Outer Straw Stair=ワラの凸階段 +Straw Slab=ワラの厚板 +Wild Cotton=天然綿 diff --git a/data/games/garage/mods/farming/locale/farming.jbo.tr b/data/games/garage/mods/farming/locale/farming.jbo.tr new file mode 100644 index 0000000..51bb9db --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.jbo.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=lo te plixa +Seed=lo tsiju +Wooden Hoe=lo mudri te plixa +Stone Hoe=lo rokci te plixa +Steel Hoe=lo gasta te plixa +Bronze Hoe=lo ransu te plixa +Mese Hoe=lo za'e kunrmese te plixa +Diamond Hoe=lo tabjme te plixa +Wheat Seed=lo tsiju be lo maxri +Wheat=lo maxri +Flour=lo grupu'o +Bread=lo nanba +Cotton Seed=lo tsiju be lo mapni +Cotton=lo mapni +String=lo skori +Soil=lo ferti dertu +Wet Soil=lo cilmo ke ferti dertu +Savanna Soil=lo ferti ke sudytu'a dertu +Wet Savanna Soil=lo cilmo ke ferti ke sudytu'a dertu +Desert Sand Soil=lo ferti ke cantu'a canre +Wet Desert Sand Soil=lo cilmo ke ferti ke cantu'a canre +Straw=lo sudysrasu +Straw Stair=lo sudysrasu serti +Inner Straw Stair=lo zo'i sudysrasu serti +Outer Straw Stair=lo ze'o sudysrasu serti +Straw Slab=lo sudysrasu ke xadba bliku +Wild Cotton=lo cilce ke mapni spati diff --git a/data/games/garage/mods/farming/locale/farming.lv.tr b/data/games/garage/mods/farming/locale/farming.lv.tr new file mode 100644 index 0000000..b1f9546 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.lv.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Kaplis +Seed=Sēklas +Wooden Hoe=Koka kaplis +Stone Hoe=Akmens kaplis +Steel Hoe=Tērauda kaplis +Bronze Hoe=Bronzas kaplis +Mese Hoe=Mēzes kaplis +Diamond Hoe=Dimanta kaplis +Wheat Seed=Kviešu sēkla +Wheat=Kvieši +Flour=Milti +Bread=Maize +Cotton Seed=Kokvilnas sēklas +Cotton=Kokvilna +String=Stiegra +Soil=Augsne +Wet Soil=Slapja augsne +Savanna Soil=Savannas augsne +Wet Savanna Soil=Slapja savannas augsne +Desert Sand Soil=Tuksneša smilts augsne +Wet Desert Sand Soil=Slapja tuksneša smilts augsne +Straw=Salmi +Straw Stair=Salmu pakāpiens +Inner Straw Stair=Iekšējais salmu pakāpiens +Outer Straw Stair=Ārējais salmu pakāpiens +Straw Slab=Salmu plātne +Wild Cotton=Savvaļas kokvilna diff --git a/data/games/garage/mods/farming/locale/farming.ms.tr b/data/games/garage/mods/farming/locale/farming.ms.tr new file mode 100644 index 0000000..5b8315b --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.ms.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=Cangkul +Seed=Benih +Wooden Hoe=Cangkul Kayu +Stone Hoe=Cangkul Batu +Steel Hoe=Cangkul Keluli +Bronze Hoe=Cangkul Gangsa +Mese Hoe=Cangkul Mese +Diamond Hoe=Cangkul Intan +Wheat Seed=Benih Gandum +Wheat=Gandum +Flour=Tepung +Bread=Roti +Cotton Seed=Benih Kapas +Cotton=Kapas +String=Benang +Soil=Tanih +Wet Soil=Tanih Lembap +Savanna Soil=Tanih Savana +Wet Savanna Soil=Tanih Savana Lembap +Desert Sand Soil=Tanih Pasir Gurun +Wet Desert Sand Soil=Tanih Pasir Gurun Lembap +Straw=Jerami +Straw Stair=Tangga Jerami +Inner Straw Stair=Tangga Jerami Dalaman +Outer Straw Stair=Tangga Jerami Luaran +Straw Slab=Papak Jerami +Wild Cotton=Kapuk + + +##### not used anymore ##### + +Dry Soil=Tanih Kering +Wet Dry Soil=Tanih Kering Lembap diff --git a/data/games/garage/mods/farming/locale/farming.pl.tr b/data/games/garage/mods/farming/locale/farming.pl.tr new file mode 100644 index 0000000..ffde3b7 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.pl.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Motyka +Seed=Nasiona +Wooden Hoe=Drewniana motyka +Stone Hoe=Kamienna motyka +Steel Hoe=Stalowa motyka +Bronze Hoe=Brązowa motyka +Mese Hoe=Mesowa motyka +Diamond Hoe=Diamentowa motyka +Wheat Seed=Nasiona pszenicy +Wheat=Pszenica +Flour=Mąka +Bread=Chleb +Cotton Seed=Nasiona bawełny +Cotton=Bawełna +String=Nić +Soil=Gleba +Wet Soil=Mokra gleba +Savanna Soil=Sawannowa gleba +Wet Savanna Soil=Mokra sawannowa gleba +Desert Sand Soil=Pustynno-piaszczysta gleba +Wet Desert Sand Soil=Mokra pustynno-piaszczysta gleba +Straw=Słoma +Straw Stair=Słomiane schody +Inner Straw Stair=Wewnętrzne słomiane schody +Outer Straw Stair=Zewnętrzne słomiane schody +Straw Slab=Słomiany półblok +Wild Cotton=Dzika bawełna diff --git a/data/games/garage/mods/farming/locale/farming.pt.tr b/data/games/garage/mods/farming/locale/farming.pt.tr new file mode 100644 index 0000000..fb0a83c --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.pt.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Enxada +Seed=Semente +Wooden Hoe=Enxada de Madeira +Stone Hoe=Enxada de Pedra +Steel Hoe=Enxada de Aço +Bronze Hoe=Enxada de Bronze +Mese Hoe=Enxada de Mese +Diamond Hoe=Enxada de Diamante +Wheat Seed=Semente de Trigo +Wheat=Trigo +Flour=Farinha +Bread=Pão +Cotton Seed=Semente de Algodão +Cotton=Algodão +String=Fio +Soil=Solo +Wet Soil=Solo Molhado +Savanna Soil=Solo da Savana +Wet Savanna Soil=Solo da Savana Molhado +Desert Sand Soil=Solo Arenoso do Deserto +Wet Desert Sand Soil=Solo Arenoso do Deserto Molhado +Straw=Palha +Straw Stair=Escada de Palha +Inner Straw Stair=Escada de Palha Externa +Outer Straw Stair=Escada de Palha Interna +Straw Slab=Laje de Palha +Wild Cotton=Algodão Selvagem diff --git a/data/games/garage/mods/farming/locale/farming.pt_BR.tr b/data/games/garage/mods/farming/locale/farming.pt_BR.tr new file mode 100644 index 0000000..fb0a83c --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.pt_BR.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Enxada +Seed=Semente +Wooden Hoe=Enxada de Madeira +Stone Hoe=Enxada de Pedra +Steel Hoe=Enxada de Aço +Bronze Hoe=Enxada de Bronze +Mese Hoe=Enxada de Mese +Diamond Hoe=Enxada de Diamante +Wheat Seed=Semente de Trigo +Wheat=Trigo +Flour=Farinha +Bread=Pão +Cotton Seed=Semente de Algodão +Cotton=Algodão +String=Fio +Soil=Solo +Wet Soil=Solo Molhado +Savanna Soil=Solo da Savana +Wet Savanna Soil=Solo da Savana Molhado +Desert Sand Soil=Solo Arenoso do Deserto +Wet Desert Sand Soil=Solo Arenoso do Deserto Molhado +Straw=Palha +Straw Stair=Escada de Palha +Inner Straw Stair=Escada de Palha Externa +Outer Straw Stair=Escada de Palha Interna +Straw Slab=Laje de Palha +Wild Cotton=Algodão Selvagem diff --git a/data/games/garage/mods/farming/locale/farming.ru.tr b/data/games/garage/mods/farming/locale/farming.ru.tr new file mode 100644 index 0000000..8ec25f7 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.ru.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Мотыга +Seed=Семена +Wooden Hoe=Деревянная мотыга +Stone Hoe=Каменная мотыга +Steel Hoe=Стальная мотыга +Bronze Hoe=Бронзовая мотыга +Mese Hoe=Мезовая мотыга +Diamond Hoe=Алмазная мотыга +Wheat Seed=Семена пшеницы +Wheat=Пшеница +Flour=Мука +Bread=Хлеб +Cotton Seed=Семена хлопчатника +Cotton=Хлопок +String=Нить +Soil=Почва +Wet Soil=Влажная почва +Savanna Soil=Саванная почва +Wet Savanna Soil=Влажная саванная почва +Desert Sand Soil=Пустынная песчаная почва +Wet Desert Sand Soil=Влажная пустынная песчаная почва +Straw=Солома +Straw Stair=Соломенные ступени +Inner Straw Stair=Внутренние соломенные ступени +Outer Straw Stair=Внешние соломенные ступени +Straw Slab=Соломенная плита +Wild Cotton=Дикий хлопчатник diff --git a/data/games/garage/mods/farming/locale/farming.sk.tr b/data/games/garage/mods/farming/locale/farming.sk.tr new file mode 100644 index 0000000..2caa4b5 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.sk.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Motyka +Seed=Semienko +Wooden Hoe=Drevená motyka +Stone Hoe=Kamenná motyka +Steel Hoe=Oceľová motyka +Bronze Hoe=Bronzová motyka +Mese Hoe=Mese motyka +Diamond Hoe=Diamantová motyka +Wheat Seed=Pšeničné semienko +Wheat=Pšenica +Flour=Múka +Bread=Chlieb +Cotton Seed=Bavlnené semienko +Cotton=Bavlna +String=Šňúra +Soil=Zemina +Wet Soil=Mokrá zemina +Savanna Soil=Zemina zo savany +Wet Savanna Soil=Morká zemina zo savany +Desert Sand Soil=Zemina s púšte +Wet Desert Sand Soil=Mokrá zemina s púšte +Straw=Slama +Straw Stair=Slamenné schody +Inner Straw Stair=Vnútorné slamenné schodisko +Outer Straw Stair=Vonkajšie slamenné schodisko +Straw Slab=Slamenná doska +Wild Cotton=Divoká bavlna diff --git a/data/games/garage/mods/farming/locale/farming.sv.tr b/data/games/garage/mods/farming/locale/farming.sv.tr new file mode 100644 index 0000000..e6c9e68 --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.sv.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Kratta +Seed=Frö +Wooden Hoe=Träkratta +Stone Hoe=Stenkratta +Steel Hoe=Stålkratta +Bronze Hoe=Bronskratta +Mese Hoe=Mesekratta +Diamond Hoe=Diamantkratta +Wheat Seed=Vetefrö +Wheat=Vete +Flour=Mjöl +Bread=Bröd +Cotton Seed=Bomullfrö +Cotton=Bomull +String=Snöre +Soil=Odlinngsmark +Wet Soil=Våt Odlingsmark +Savanna Soil=Savannodlingsmark +Wet Savanna Soil=Våt savannodlingsmark +Desert Sand Soil=Ökensandsodlingsmark +Wet Desert Sand Soil=Våt ökensandsodlingsmark +Straw=Halm +Straw Stair=Halmtrappa +Inner Straw Stair=Inre halmtrappa +Outer Straw Stair=Yttre halmtrappa +Straw Slab=Halmplatta +Wild Cotton= diff --git a/data/games/garage/mods/farming/locale/farming.uk.tr b/data/games/garage/mods/farming/locale/farming.uk.tr new file mode 100644 index 0000000..75e7dea --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.uk.tr @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe=Мотика +Seed=Насіння +Wooden Hoe=Дерев'яна мотика +Stone Hoe=Кам'яна мотика +Steel Hoe=Сталева мотика +Bronze Hoe=Бронзова мотика +Mese Hoe=Месе-мотика +Diamond Hoe=Діамантова мотика +Wheat Seed=Насіння пшениці +Wheat=Пшениця +Flour=Борошно +Bread=Хліб +Cotton Seed=Насіння бавовнику +Cotton=Бавовна +String=Нитка +Soil=Ґрунт +Wet Soil=Вологий ґрунт +Savanna Soil=Саванний ґрунт +Wet Savanna Soil=Вологий саванний ґрунт +Desert Sand Soil=Пустельний піщаний ґрунт +Wet Desert Sand Soil=Вологий пустельний піщаний ґрунт +Straw=Солома +Straw Stair=Солом'яна сходинка +Inner Straw Stair=Кутова солом'яна сходинка (внутрішній кут) +Outer Straw Stair=Кутова солом'яна сходинка (зовнішній кут) +Straw Slab=Солом'яна плита +Wild Cotton=Дикий бавовник diff --git a/data/games/garage/mods/farming/locale/farming.zh_CN.tr b/data/games/garage/mods/farming/locale/farming.zh_CN.tr new file mode 100644 index 0000000..33ad9be --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.zh_CN.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=锄头 +Seed=种子 +Wooden Hoe=木锄头 +Stone Hoe=石锄头 +Steel Hoe=铁锄头 +Bronze Hoe=青铜锄头 +Mese Hoe=黄石锄头 +Diamond Hoe=钻石锄头 +Wheat Seed=小麦种子 +Wheat=小麦 +Flour=面粉 +Bread=面包 +Cotton Seed=棉花种子 +Cotton=棉 +String=线 +Soil=土 +Wet Soil=湿土 +Savanna Soil=草原土 +Wet Savanna Soil=湿草原土 +Desert Sand Soil=沙漠沙土 +Wet Desert Sand Soil=湿沙漠沙土 +Straw=稻草 +Straw Stair=稻草台阶 +Inner Straw Stair=稻草内楼梯 +Outer Straw Stair=稻草外楼梯 +Straw Slab=稻草板 +Wild Cotton=野棉花 + + +##### not used anymore ##### + +Dry Soil=干土 +Wet Dry Soil=湿干土 diff --git a/data/games/garage/mods/farming/locale/farming.zh_TW.tr b/data/games/garage/mods/farming/locale/farming.zh_TW.tr new file mode 100644 index 0000000..36037af --- /dev/null +++ b/data/games/garage/mods/farming/locale/farming.zh_TW.tr @@ -0,0 +1,34 @@ +# textdomain: farming +Hoe=鋤頭 +Seed=種子 +Wooden Hoe=木鋤頭 +Stone Hoe=石鋤頭 +Steel Hoe=鐵鋤頭 +Bronze Hoe=青銅鋤頭 +Mese Hoe=黃石鋤頭 +Diamond Hoe=鑽石鋤頭 +Wheat Seed=小麥種子 +Wheat=小麥 +Flour=麵粉 +Bread=麵包 +Cotton Seed=棉花種子 +Cotton=棉 +String=線 +Soil=土 +Wet Soil=溼土 +Savanna Soil=草原土 +Wet Savanna Soil=溼草原土 +Desert Sand Soil=沙漠沙土 +Wet Desert Sand Soil=溼沙漠沙土 +Straw=稻草 +Straw Stair=稻草臺階 +Inner Straw Stair=稻草內樓梯 +Outer Straw Stair=稻草外樓梯 +Straw Slab=稻草板 +Wild Cotton=野生棉花 + + +##### not used anymore ##### + +Dry Soil=乾土 +Wet Dry Soil=溼乾土 diff --git a/data/games/garage/mods/farming/locale/template.txt b/data/games/garage/mods/farming/locale/template.txt new file mode 100644 index 0000000..af92347 --- /dev/null +++ b/data/games/garage/mods/farming/locale/template.txt @@ -0,0 +1,28 @@ +# textdomain: farming +Hoe= +Seed= +Wooden Hoe= +Stone Hoe= +Steel Hoe= +Bronze Hoe= +Mese Hoe= +Diamond Hoe= +Wheat Seed= +Wheat= +Flour= +Bread= +Cotton Seed= +Cotton= +String= +Soil= +Wet Soil= +Savanna Soil= +Wet Savanna Soil= +Desert Sand Soil= +Wet Desert Sand Soil= +Straw= +Straw Stair= +Inner Straw Stair= +Outer Straw Stair= +Straw Slab= +Wild Cotton= diff --git a/data/games/garage/mods/farming/mod.conf b/data/games/garage/mods/farming/mod.conf new file mode 100644 index 0000000..9a76a6a --- /dev/null +++ b/data/games/garage/mods/farming/mod.conf @@ -0,0 +1,4 @@ +name = farming +description = Minetest Game mod: farming +depends = default, wool, stairs +optional_depends = dungeon_loot diff --git a/data/games/garage/mods/farming/nodes.lua b/data/games/garage/mods/farming/nodes.lua new file mode 100644 index 0000000..b5f90f9 --- /dev/null +++ b/data/games/garage/mods/farming/nodes.lua @@ -0,0 +1,282 @@ +-- farming/nodes.lua + +-- support for MT game translation. +local S = farming.get_translator + +minetest.override_item("default:dirt", { + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_grass", { + soil = { + base = "default:dirt_with_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_dry_grass", { + soil = { + base = "default:dirt_with_dry_grass", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_rainforest_litter", { + soil = { + base = "default:dirt_with_rainforest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dirt_with_coniferous_litter", { + soil = { + base = "default:dirt_with_coniferous_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.override_item("default:dry_dirt", { + soil = { + base = "default:dry_dirt", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.override_item("default:dry_dirt_with_dry_grass", { + soil = { + base = "default:dry_dirt_with_dry_grass", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.register_node("farming:soil", { + description = S("Soil"), + tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("farming:soil_wet", { + description = S("Wet Soil"), + tiles = {"default_dirt.png^farming_soil_wet.png", "default_dirt.png^farming_soil_wet_side.png"}, + drop = "default:dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dirt", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + +minetest.register_node("farming:dry_soil", { + description = S("Savanna Soil"), + tiles = {"default_dry_dirt.png^farming_soil.png", "default_dry_dirt.png"}, + drop = "default:dry_dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.register_node("farming:dry_soil_wet", { + description = S("Wet Savanna Soil"), + tiles = {"default_dry_dirt.png^farming_soil_wet.png", "default_dry_dirt.png^farming_soil_wet_side.png"}, + drop = "default:dry_dirt", + groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, + sounds = default.node_sound_dirt_defaults(), + soil = { + base = "default:dry_dirt", + dry = "farming:dry_soil", + wet = "farming:dry_soil_wet" + } +}) + +minetest.override_item("default:desert_sand", { + groups = {crumbly=3, falling_node=1, sand=1, soil = 1}, + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) +minetest.register_node("farming:desert_sand_soil", { + description = S("Desert Sand Soil"), + drop = "default:desert_sand", + tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"}, + groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1, field = 1}, + sounds = default.node_sound_sand_defaults(), + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) + +minetest.register_node("farming:desert_sand_soil_wet", { + description = S("Wet Desert Sand Soil"), + drop = "default:desert_sand", + tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"}, + groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1}, + sounds = default.node_sound_sand_defaults(), + soil = { + base = "default:desert_sand", + dry = "farming:desert_sand_soil", + wet = "farming:desert_sand_soil_wet" + } +}) + +minetest.register_node("farming:straw", { + description = S("Straw"), + tiles = {"farming_straw.png"}, + is_ground_content = false, + groups = {snappy=3, flammable=4, fall_damage_add_percent=-30}, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Registered before the stairs so the stairs get fuel recipes. +minetest.register_craft({ + type = "fuel", + recipe = "farming:straw", + burntime = 3, +}) + +do + local recipe = "farming:straw" + local groups = {snappy = 3, flammable = 4} + local images = {"farming_straw.png"} + local sounds = default.node_sound_leaves_defaults() + + stairs.register_stair("straw", recipe, groups, images, S("Straw Stair"), + sounds, true) + stairs.register_stair_inner("straw", recipe, groups, images, "", + sounds, true, S("Inner Straw Stair")) + stairs.register_stair_outer("straw", recipe, groups, images, "", + sounds, true, S("Outer Straw Stair")) + stairs.register_slab("straw", recipe, groups, images, S("Straw Slab"), + sounds, true) +end + +minetest.register_abm({ + label = "Farming soil", + nodenames = {"group:field"}, + interval = 15, + chance = 4, + action = function(pos, node) + local n_def = minetest.registered_nodes[node.name] or nil + local wet = n_def.soil.wet or nil + local base = n_def.soil.base or nil + local dry = n_def.soil.dry or nil + if not n_def or not n_def.soil or not wet or not base or not dry then + return + end + + pos.y = pos.y + 1 + local nn = minetest.get_node_or_nil(pos) + if not nn or not nn.name then + return + end + local nn_def = minetest.registered_nodes[nn.name] or nil + pos.y = pos.y - 1 + + if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then + minetest.set_node(pos, {name = base}) + return + end + -- check if there is water nearby + local wet_lvl = minetest.get_item_group(node.name, "wet") + if minetest.find_node_near(pos, 3, {"group:water"}) then + -- if it is dry soil and not base node, turn it into wet soil + if wet_lvl == 0 then + minetest.set_node(pos, {name = wet}) + end + else + -- only turn back if there are no unloaded blocks (and therefore + -- possible water sources) nearby + if not minetest.find_node_near(pos, 3, {"ignore"}) then + -- turn it back into base if it is already dry + if wet_lvl == 0 then + -- only turn it back if there is no plant/seed on top of it + if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then + minetest.set_node(pos, {name = base}) + end + + -- if its wet turn it back into dry soil + elseif wet_lvl == 1 then + minetest.set_node(pos, {name = dry}) + end + end + end + end, +}) + + +-- Make default:grass_* occasionally drop wheat seed + +for i = 1, 5 do + minetest.override_item("default:grass_"..i, {drop = { + max_items = 1, + items = { + {items = {"farming:seed_wheat"}, rarity = 5}, + {items = {"default:grass_1"}}, + } + }}) +end + + +-- Make default:junglegrass occasionally drop cotton seed. + +-- This is the old source of cotton seeds that makes no sense. It is a leftover +-- from Mapgen V6 where junglegrass was the only plant available to be a source. +-- This source is kept for now to avoid disruption but should probably be +-- removed in future as players get used to the new source. + +minetest.override_item("default:junglegrass", {drop = { + max_items = 1, + items = { + {items = {"farming:seed_cotton"}, rarity = 8}, + {items = {"default:junglegrass"}}, + } +}}) + + +-- Wild cotton as a source of cotton seed + +minetest.register_node("farming:cotton_wild", { + description = S("Wild Cotton"), + drawtype = "plantlike", + waving = 1, + tiles = {"farming_cotton_wild.png"}, + inventory_image = "farming_cotton_wild.png", + wield_image = "farming_cotton_wild.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {snappy = 3, attached_node = 1, flammable = 4}, + drop = "farming:seed_cotton", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16}, + }, +}) diff --git a/data/games/garage/mods/farming/textures/farming_bread.png b/data/games/garage/mods/farming/textures/farming_bread.png new file mode 100644 index 0000000..16b25f1 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_bread.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton.png b/data/games/garage/mods/farming/textures/farming_cotton.png new file mode 100644 index 0000000..8aa50e4 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_1.png b/data/games/garage/mods/farming/textures/farming_cotton_1.png new file mode 100644 index 0000000..5fc2180 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_1.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_2.png b/data/games/garage/mods/farming/textures/farming_cotton_2.png new file mode 100644 index 0000000..db4f4a3 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_2.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_3.png b/data/games/garage/mods/farming/textures/farming_cotton_3.png new file mode 100644 index 0000000..df3d7a7 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_3.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_4.png b/data/games/garage/mods/farming/textures/farming_cotton_4.png new file mode 100644 index 0000000..f314b07 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_4.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_5.png b/data/games/garage/mods/farming/textures/farming_cotton_5.png new file mode 100644 index 0000000..520e8f6 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_5.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_6.png b/data/games/garage/mods/farming/textures/farming_cotton_6.png new file mode 100644 index 0000000..f4bd4fb Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_6.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_7.png b/data/games/garage/mods/farming/textures/farming_cotton_7.png new file mode 100644 index 0000000..11c0cf6 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_7.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_8.png b/data/games/garage/mods/farming/textures/farming_cotton_8.png new file mode 100644 index 0000000..4450a2c Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_8.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_seed.png b/data/games/garage/mods/farming/textures/farming_cotton_seed.png new file mode 100644 index 0000000..f1d5b8a Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_seed.png differ diff --git a/data/games/garage/mods/farming/textures/farming_cotton_wild.png b/data/games/garage/mods/farming/textures/farming_cotton_wild.png new file mode 100644 index 0000000..fba344c Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_cotton_wild.png differ diff --git a/data/games/garage/mods/farming/textures/farming_desert_sand_soil.png b/data/games/garage/mods/farming/textures/farming_desert_sand_soil.png new file mode 100644 index 0000000..3c09ef0 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_desert_sand_soil.png differ diff --git a/data/games/garage/mods/farming/textures/farming_desert_sand_soil_wet.png b/data/games/garage/mods/farming/textures/farming_desert_sand_soil_wet.png new file mode 100644 index 0000000..facc83e Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_desert_sand_soil_wet.png differ diff --git a/data/games/garage/mods/farming/textures/farming_desert_sand_soil_wet_side.png b/data/games/garage/mods/farming/textures/farming_desert_sand_soil_wet_side.png new file mode 100644 index 0000000..41e5a04 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_desert_sand_soil_wet_side.png differ diff --git a/data/games/garage/mods/farming/textures/farming_flour.png b/data/games/garage/mods/farming/textures/farming_flour.png new file mode 100644 index 0000000..b1a9783 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_flour.png differ diff --git a/data/games/garage/mods/farming/textures/farming_soil.png b/data/games/garage/mods/farming/textures/farming_soil.png new file mode 100644 index 0000000..3150425 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_soil.png differ diff --git a/data/games/garage/mods/farming/textures/farming_soil_wet.png b/data/games/garage/mods/farming/textures/farming_soil_wet.png new file mode 100644 index 0000000..2eb2c3c Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_soil_wet.png differ diff --git a/data/games/garage/mods/farming/textures/farming_soil_wet_side.png b/data/games/garage/mods/farming/textures/farming_soil_wet_side.png new file mode 100644 index 0000000..f0b1bd4 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_soil_wet_side.png differ diff --git a/data/games/garage/mods/farming/textures/farming_straw.png b/data/games/garage/mods/farming/textures/farming_straw.png new file mode 100644 index 0000000..f9f5fe7 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_straw.png differ diff --git a/data/games/garage/mods/farming/textures/farming_string.png b/data/games/garage/mods/farming/textures/farming_string.png new file mode 100644 index 0000000..e2bbfd7 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_string.png differ diff --git a/data/games/garage/mods/farming/textures/farming_tool_bronzehoe.png b/data/games/garage/mods/farming/textures/farming_tool_bronzehoe.png new file mode 100644 index 0000000..2802d11 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_tool_bronzehoe.png differ diff --git a/data/games/garage/mods/farming/textures/farming_tool_diamondhoe.png b/data/games/garage/mods/farming/textures/farming_tool_diamondhoe.png new file mode 100644 index 0000000..66f1042 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_tool_diamondhoe.png differ diff --git a/data/games/garage/mods/farming/textures/farming_tool_mesehoe.png b/data/games/garage/mods/farming/textures/farming_tool_mesehoe.png new file mode 100644 index 0000000..4534fba Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_tool_mesehoe.png differ diff --git a/data/games/garage/mods/farming/textures/farming_tool_steelhoe.png b/data/games/garage/mods/farming/textures/farming_tool_steelhoe.png new file mode 100644 index 0000000..d057af2 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_tool_steelhoe.png differ diff --git a/data/games/garage/mods/farming/textures/farming_tool_stonehoe.png b/data/games/garage/mods/farming/textures/farming_tool_stonehoe.png new file mode 100644 index 0000000..55d8123 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_tool_stonehoe.png differ diff --git a/data/games/garage/mods/farming/textures/farming_tool_woodhoe.png b/data/games/garage/mods/farming/textures/farming_tool_woodhoe.png new file mode 100644 index 0000000..a287152 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_tool_woodhoe.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat.png b/data/games/garage/mods/farming/textures/farming_wheat.png new file mode 100644 index 0000000..435d5df Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_1.png b/data/games/garage/mods/farming/textures/farming_wheat_1.png new file mode 100644 index 0000000..c16ad94 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_1.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_2.png b/data/games/garage/mods/farming/textures/farming_wheat_2.png new file mode 100644 index 0000000..baddb4c Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_2.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_3.png b/data/games/garage/mods/farming/textures/farming_wheat_3.png new file mode 100644 index 0000000..9d90ac1 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_3.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_4.png b/data/games/garage/mods/farming/textures/farming_wheat_4.png new file mode 100644 index 0000000..14d055f Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_4.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_5.png b/data/games/garage/mods/farming/textures/farming_wheat_5.png new file mode 100644 index 0000000..5b88c57 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_5.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_6.png b/data/games/garage/mods/farming/textures/farming_wheat_6.png new file mode 100644 index 0000000..e9c78e0 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_6.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_7.png b/data/games/garage/mods/farming/textures/farming_wheat_7.png new file mode 100644 index 0000000..6b7bb4b Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_7.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_8.png b/data/games/garage/mods/farming/textures/farming_wheat_8.png new file mode 100644 index 0000000..d050093 Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_8.png differ diff --git a/data/games/garage/mods/farming/textures/farming_wheat_seed.png b/data/games/garage/mods/farming/textures/farming_wheat_seed.png new file mode 100644 index 0000000..a9031fb Binary files /dev/null and b/data/games/garage/mods/farming/textures/farming_wheat_seed.png differ diff --git a/data/games/garage/mods/fire/README.txt b/data/games/garage/mods/fire/README.txt new file mode 100644 index 0000000..eb3e1e2 --- /dev/null +++ b/data/games/garage/mods/fire/README.txt @@ -0,0 +1,35 @@ +Minetest Game mod: fire +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures and sounds) +-------------------------------------- +Everything not listed in here: +Copyright (C) 2012 Perttu Ahola (celeron55) (CC BY-SA 3.0) + +Muadtralk (CC BY-SA 3.0) + fire_basic_flame_animated.png + +Gambit (CC BY-SA 3.0) + fire_flint_steel.png + +dobroide (CC BY 3.0) +http://www.freesound.org/people/dobroide/sounds/4211/ + fire_small.ogg + +Dynamicell (CC BY 3.0) +http://www.freesound.org/people/Dynamicell/sounds/17548/ + fire_large.ogg + fire_fire.*.ogg + +fire_small.ogg and fire_large.ogg are unused but kept temporarily to not break +other mods that may use them. + +Benboncan (CC BY 3.0) +https://www.freesound.org/people/Benboncan/sounds/66457/ + fire_flint_and_steel.ogg diff --git a/data/games/garage/mods/fire/init.lua b/data/games/garage/mods/fire/init.lua new file mode 100644 index 0000000..538cfa6 --- /dev/null +++ b/data/games/garage/mods/fire/init.lua @@ -0,0 +1,312 @@ +-- fire/init.lua + +-- Global namespace for functions +fire = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("fire") + +-- 'Enable fire' setting +local fire_enabled = minetest.settings:get_bool("enable_fire") +if fire_enabled == nil then + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.settings:get_bool("disable_fire") + if fire_disabled == nil then + -- Neither setting specified, check whether singleplayer + fire_enabled = minetest.is_singleplayer() + else + fire_enabled = not fire_disabled + end +end + +-- +-- Items +-- + +-- Flood flame function +local function flood_flame(pos, _, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if minetest.get_item_group(newnode.name, "igniter") == 0 then + minetest.sound_play("fire_extinguish_flame", + {pos = pos, max_hear_distance = 16, gain = 0.15}, true) + end + -- Remove the flame + return false +end + +-- Flame nodes +local fire_node = { + drawtype = "firelike", + tiles = {{ + name = "fire_basic_flame_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + }} + }, + inventory_image = "fire_basic_flame.png", + paramtype = "light", + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = {igniter = 2, dig_immediate = 3, fire = 1}, + drop = "", + on_flood = flood_flame +} + +-- Basic flame node +local flame_fire_node = table.copy(fire_node) +flame_fire_node.description = S("Fire") +flame_fire_node.groups.not_in_creative_inventory = 1 +flame_fire_node.on_timer = function(pos) + if not minetest.find_node_near(pos, 1, {"group:flammable"}) then + minetest.remove_node(pos) + return + end + -- Restart timer + return true +end +flame_fire_node.on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(30, 60)) +end + +minetest.register_node("fire:basic_flame", flame_fire_node) + +-- Permanent flame node +local permanent_fire_node = table.copy(fire_node) +permanent_fire_node.description = S("Permanent Fire") + +minetest.register_node("fire:permanent_flame", permanent_fire_node) + +-- Flint and Steel +minetest.register_tool("fire:flint_and_steel", { + description = S("Flint and Steel"), + inventory_image = "fire_flint_steel.png", + sound = {breaks = "default_tool_breaks"}, + + on_use = function(itemstack, user, pointed_thing) + local sound_pos = pointed_thing.above or user:get_pos() + minetest.sound_play("fire_flint_and_steel", + {pos = sound_pos, gain = 0.2, max_hear_distance = 8}, true) + local player_name = user:get_player_name() + if pointed_thing.type == "node" then + local node_under = minetest.get_node(pointed_thing.under).name + local nodedef = minetest.registered_nodes[node_under] + if not nodedef then + return + end + if minetest.is_protected(pointed_thing.under, player_name) then + minetest.record_protection_violation(pointed_thing.under, player_name) + return + end + if nodedef.on_ignite then + nodedef.on_ignite(pointed_thing.under, user) + elseif minetest.get_item_group(node_under, "flammable") >= 1 + and minetest.get_node(pointed_thing.above).name == "air" then + if minetest.is_protected(pointed_thing.above, player_name) then + minetest.record_protection_violation(pointed_thing.above, player_name) + return + end + + minetest.set_node(pointed_thing.above, {name = "fire:basic_flame"}) + end + end + if not minetest.is_creative_enabled(player_name) then + -- Wear tool + local wdef = itemstack:get_definition() + itemstack:add_wear_by_uses(66) + + -- Tool break sound + if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, + {pos = sound_pos, gain = 0.5}, true) + end + return itemstack + end + end +}) + +minetest.register_craft({ + output = "fire:flint_and_steel", + recipe = { + {"default:flint", "default:steel_ingot"} + } +}) + +-- Override coalblock to enable permanent flame above +-- Coalblock is non-flammable to avoid unwanted basic_flame nodes +minetest.override_item("default:coalblock", { + after_destruct = function(pos) + pos.y = pos.y + 1 + if minetest.get_node(pos).name == "fire:permanent_flame" then + minetest.remove_node(pos) + end + end, + on_ignite = function(pos) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.get_node(flame_pos).name == "air" then + minetest.set_node(flame_pos, {name = "fire:permanent_flame"}) + end + end +}) + + +-- +-- Sound +-- + +-- Enable if no setting present +local flame_sound = minetest.settings:get_bool("flame_sound", true) + +if flame_sound then + local handles = {} + local timer = 0 + + -- Parameters + local radius = 8 -- Flame node search radius around player + local cycle = 3 -- Cycle time for sound updates + + -- Update sound for player + function fire.update_player_sound(player) + local player_name = player:get_player_name() + -- Search for flame nodes in radius around player + local ppos = player:get_pos() + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + local fpos, num = minetest.find_nodes_in_area( + areamin, + areamax, + {"fire:basic_flame", "fire:permanent_flame"} + ) + -- Total number of flames in radius + local flames = (num["fire:basic_flame"] or 0) + + (num["fire:permanent_flame"] or 0) + -- Stop previous sound + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + -- If flames + if flames > 0 then + -- Find centre of flame positions + local fposmid = fpos[1] + -- If more than 1 flame + if #fpos > 1 then + local fposmin = areamax + local fposmax = areamin + for i = 1, #fpos do + local fposi = fpos[i] + if fposi.x > fposmax.x then + fposmax.x = fposi.x + end + if fposi.y > fposmax.y then + fposmax.y = fposi.y + end + if fposi.z > fposmax.z then + fposmax.z = fposi.z + end + if fposi.x < fposmin.x then + fposmin.x = fposi.x + end + if fposi.y < fposmin.y then + fposmin.y = fposi.y + end + if fposi.z < fposmin.z then + fposmin.z = fposi.z + end + end + fposmid = vector.divide(vector.add(fposmin, fposmax), 2) + end + -- Play sound + local handle = minetest.sound_play("fire_fire", { + pos = fposmid, + to_player = player_name, + gain = math.min(0.06 * (1 + flames * 0.125), 0.18), + max_hear_distance = 32, + loop = true -- In case of lag + }) + -- Store sound handle for this player + if handle then + handles[player_name] = handle + end + end + end + + -- Cycle for updating players sounds + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < cycle then + return + end + + timer = 0 + local players = minetest.get_connected_players() + for n = 1, #players do + fire.update_player_sound(players[n]) + end + end) + + -- Stop sound and clear handle on player leave + minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + end) +end + + +-- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it +function fire.update_sounds_around() end + +-- +-- ABMs +-- + +if fire_enabled then + -- Ignite neighboring nodes, add basic flames + minetest.register_abm({ + label = "Ignite flame", + nodenames = {"group:flammable"}, + neighbors = {"group:igniter"}, + interval = 7, + chance = 12, + catch_up = false, + action = function(pos) + local p = minetest.find_node_near(pos, 1, {"air"}) + if p then + minetest.set_node(p, {name = "fire:basic_flame"}) + end + end + }) + + -- Remove flammable nodes around basic flame + minetest.register_abm({ + label = "Remove flammable nodes", + nodenames = {"fire:basic_flame"}, + neighbors = "group:flammable", + interval = 5, + chance = 18, + catch_up = false, + action = function(pos) + local p = minetest.find_node_near(pos, 1, {"group:flammable"}) + if not p then + return + end + local flammable_node = minetest.get_node(p) + local def = minetest.registered_nodes[flammable_node.name] + if def.on_burn then + def.on_burn(p) + else + minetest.remove_node(p) + minetest.check_for_falling(p) + end + end + }) +end diff --git a/data/games/garage/mods/fire/license.txt b/data/games/garage/mods/fire/license.txt new file mode 100644 index 0000000..9f2aca9 --- /dev/null +++ b/data/games/garage/mods/fire/license.txt @@ -0,0 +1,84 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures and sounds) +--------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Muadtralk +Copyright (C) 2013-2016 Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2005 dobroide +Copyright (C) 2006 Dynamicell +Copyright (C) 2009 Benboncan + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ diff --git a/data/games/garage/mods/fire/locale/fire.de.tr b/data/games/garage/mods/fire/locale/fire.de.tr new file mode 100644 index 0000000..dad7c34 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.de.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Feuer +Permanent Fire=Permanentes Feuer +Flint and Steel=Feuerstein und Stahl diff --git a/data/games/garage/mods/fire/locale/fire.eo.tr b/data/games/garage/mods/fire/locale/fire.eo.tr new file mode 100644 index 0000000..c1e992b --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.eo.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fajro +Permanent Fire=Ĉiama fajro +Flint and Steel=Siliko kaj ŝtalo diff --git a/data/games/garage/mods/fire/locale/fire.es.tr b/data/games/garage/mods/fire/locale/fire.es.tr new file mode 100644 index 0000000..4ce3f32 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.es.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fuego +Permanent Fire=Fuego permanente +Flint and Steel=Yesca y pedernal diff --git a/data/games/garage/mods/fire/locale/fire.fr.tr b/data/games/garage/mods/fire/locale/fire.fr.tr new file mode 100644 index 0000000..6218c53 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.fr.tr @@ -0,0 +1,9 @@ +# textdomain: fire +Fire=Feu +Permanent Fire=Feu qui brûle en permanence +Flint and Steel=Briquet à silex en acier + + +##### not used anymore ##### + +Permanent Flame=Flamme permanente diff --git a/data/games/garage/mods/fire/locale/fire.id.tr b/data/games/garage/mods/fire/locale/fire.id.tr new file mode 100644 index 0000000..a6d2da5 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.id.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Api +Permanent Fire=Api Abadi +Flint and Steel=Pemantik Api diff --git a/data/games/garage/mods/fire/locale/fire.it.tr b/data/games/garage/mods/fire/locale/fire.it.tr new file mode 100644 index 0000000..14ad382 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.it.tr @@ -0,0 +1,9 @@ +# textdomain: fire +Fire= +Permanent Fire= +Flint and Steel=Acciarino + + +##### not used anymore ##### + +Permanent Flame=Fiamma permanente diff --git a/data/games/garage/mods/fire/locale/fire.ja.tr b/data/games/garage/mods/fire/locale/fire.ja.tr new file mode 100644 index 0000000..bf5fec4 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.ja.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=炎 +Permanent Fire=燃え続ける炎 +Flint and Steel=火打ち石と打ち金 diff --git a/data/games/garage/mods/fire/locale/fire.jbo.tr b/data/games/garage/mods/fire/locale/fire.jbo.tr new file mode 100644 index 0000000..b081236 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=lo fagri +Permanent Fire=lo vitno fagri +Flint and Steel=lo fakro'i jo'u gasta diff --git a/data/games/garage/mods/fire/locale/fire.lv.tr b/data/games/garage/mods/fire/locale/fire.lv.tr new file mode 100644 index 0000000..b9b50ef --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.lv.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Uguns +Permanent Fire=Mūžīgā uguns +Flint and Steel=Krams un zāģītis diff --git a/data/games/garage/mods/fire/locale/fire.ms.tr b/data/games/garage/mods/fire/locale/fire.ms.tr new file mode 100644 index 0000000..e43f26c --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.ms.tr @@ -0,0 +1,9 @@ +# textdomain: fire +Fire=Api +Permanent Fire=Api Abadi +Flint and Steel=Pemetik Api + + +##### not used anymore ##### + +Permanent Flame=Api Abadi diff --git a/data/games/garage/mods/fire/locale/fire.pl.tr b/data/games/garage/mods/fire/locale/fire.pl.tr new file mode 100644 index 0000000..a19e6af --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.pl.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Ogień +Permanent Fire=Stały ogień +Flint and Steel=Zapalniczka diff --git a/data/games/garage/mods/fire/locale/fire.pt.tr b/data/games/garage/mods/fire/locale/fire.pt.tr new file mode 100644 index 0000000..4a84b6e --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.pt.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fogo +Permanent Fire=Fogo Permanente +Flint and Steel=Pederneira Primitiva diff --git a/data/games/garage/mods/fire/locale/fire.pt_BR.tr b/data/games/garage/mods/fire/locale/fire.pt_BR.tr new file mode 100644 index 0000000..4a84b6e --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Fogo +Permanent Fire=Fogo Permanente +Flint and Steel=Pederneira Primitiva diff --git a/data/games/garage/mods/fire/locale/fire.ru.tr b/data/games/garage/mods/fire/locale/fire.ru.tr new file mode 100644 index 0000000..5b38a8c --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.ru.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Огонь +Permanent Fire=Вечный огонь +Flint and Steel=Огниво \ No newline at end of file diff --git a/data/games/garage/mods/fire/locale/fire.sk.tr b/data/games/garage/mods/fire/locale/fire.sk.tr new file mode 100644 index 0000000..125c860 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.sk.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Oheň +Permanent Fire=Stály oheň +Flint and Steel=Pazúrik a ocieľka diff --git a/data/games/garage/mods/fire/locale/fire.sv.tr b/data/games/garage/mods/fire/locale/fire.sv.tr new file mode 100644 index 0000000..28e9a4a --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.sv.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Eld +Permanent Fire=Permanent eld +Flint and Steel=Flinta och stål diff --git a/data/games/garage/mods/fire/locale/fire.uk.tr b/data/games/garage/mods/fire/locale/fire.uk.tr new file mode 100644 index 0000000..da202aa --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.uk.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=Вогонь +Permanent Fire=Вічний вогонь +Flint and Steel=Кресало diff --git a/data/games/garage/mods/fire/locale/fire.zh_CN.tr b/data/games/garage/mods/fire/locale/fire.zh_CN.tr new file mode 100644 index 0000000..7b0a472 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=火焰 +Permanent Fire=永久火焰 +Flint and Steel=火石和划片 diff --git a/data/games/garage/mods/fire/locale/fire.zh_TW.tr b/data/games/garage/mods/fire/locale/fire.zh_TW.tr new file mode 100644 index 0000000..9e3d766 --- /dev/null +++ b/data/games/garage/mods/fire/locale/fire.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: fire +Fire=火焰 +Permanent Fire=永久火焰 +Flint and Steel=火石和鋼 diff --git a/data/games/garage/mods/fire/locale/template.txt b/data/games/garage/mods/fire/locale/template.txt new file mode 100644 index 0000000..e4e44e7 --- /dev/null +++ b/data/games/garage/mods/fire/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: fire +Fire= +Permanent Fire= +Flint and Steel= diff --git a/data/games/garage/mods/fire/mod.conf b/data/games/garage/mods/fire/mod.conf new file mode 100644 index 0000000..c70f23b --- /dev/null +++ b/data/games/garage/mods/fire/mod.conf @@ -0,0 +1,3 @@ +name = fire +description = Minetest Game mod: fire +depends = default diff --git a/data/games/garage/mods/fire/sounds/fire_extinguish_flame.1.ogg b/data/games/garage/mods/fire/sounds/fire_extinguish_flame.1.ogg new file mode 100644 index 0000000..42506dd Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_extinguish_flame.1.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_extinguish_flame.2.ogg b/data/games/garage/mods/fire/sounds/fire_extinguish_flame.2.ogg new file mode 100644 index 0000000..2747ab8 Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_extinguish_flame.2.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_extinguish_flame.3.ogg b/data/games/garage/mods/fire/sounds/fire_extinguish_flame.3.ogg new file mode 100644 index 0000000..8baeac3 Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_extinguish_flame.3.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_fire.1.ogg b/data/games/garage/mods/fire/sounds/fire_fire.1.ogg new file mode 100644 index 0000000..cbfee4c Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_fire.1.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_fire.2.ogg b/data/games/garage/mods/fire/sounds/fire_fire.2.ogg new file mode 100644 index 0000000..e8d0eb1 Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_fire.2.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_fire.3.ogg b/data/games/garage/mods/fire/sounds/fire_fire.3.ogg new file mode 100644 index 0000000..5cad3d9 Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_fire.3.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_flint_and_steel.ogg b/data/games/garage/mods/fire/sounds/fire_flint_and_steel.ogg new file mode 100644 index 0000000..6996e16 Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_flint_and_steel.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_large.ogg b/data/games/garage/mods/fire/sounds/fire_large.ogg new file mode 100644 index 0000000..fe78e62 Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_large.ogg differ diff --git a/data/games/garage/mods/fire/sounds/fire_small.ogg b/data/games/garage/mods/fire/sounds/fire_small.ogg new file mode 100644 index 0000000..5aac595 Binary files /dev/null and b/data/games/garage/mods/fire/sounds/fire_small.ogg differ diff --git a/data/games/garage/mods/fire/textures/fire_basic_flame.png b/data/games/garage/mods/fire/textures/fire_basic_flame.png new file mode 100644 index 0000000..484bcb1 Binary files /dev/null and b/data/games/garage/mods/fire/textures/fire_basic_flame.png differ diff --git a/data/games/garage/mods/fire/textures/fire_basic_flame_animated.png b/data/games/garage/mods/fire/textures/fire_basic_flame_animated.png new file mode 100644 index 0000000..b01f703 Binary files /dev/null and b/data/games/garage/mods/fire/textures/fire_basic_flame_animated.png differ diff --git a/data/games/garage/mods/fire/textures/fire_flint_steel.png b/data/games/garage/mods/fire/textures/fire_flint_steel.png new file mode 100644 index 0000000..9d32d85 Binary files /dev/null and b/data/games/garage/mods/fire/textures/fire_flint_steel.png differ diff --git a/data/games/garage/mods/fireflies/README.txt b/data/games/garage/mods/fireflies/README.txt new file mode 100644 index 0000000..7382578 --- /dev/null +++ b/data/games/garage/mods/fireflies/README.txt @@ -0,0 +1,22 @@ +Minetest Game mod: fireflies +============================ +Adds fireflies to the world on mapgen, which can then be caught in a net and placed in +bottles to provide light. + +Authors of source code +---------------------- +Shara RedCat (MIT) + +Authors of media (textures) +--------------------------- +Shara RedCat (CC BY-SA 3.0): + fireflies_firefly.png + fireflies_firefly_animated.png + fireflies_bugnet.png + fireflies_bottle.png + fireflies_bottle_animated.png + +fireflies_bugnet.png is modified from a texture by tenplus1 (CC0) + +fireflies_bottle.png and fireflies_bottle_animated.png are +modified from a texture by Vanessa Ezekowitz (CC BY-SA 3.0) \ No newline at end of file diff --git a/data/games/garage/mods/fireflies/init.lua b/data/games/garage/mods/fireflies/init.lua new file mode 100644 index 0000000..827ed98 --- /dev/null +++ b/data/games/garage/mods/fireflies/init.lua @@ -0,0 +1,259 @@ +-- firefly/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("fireflies") + +-- Legacy compatibility, when pointabilities don't exist, pointable is set to true. +local pointable_compat = not minetest.features.item_specific_pointabilities + +minetest.register_node("fireflies:firefly", { + description = S("Firefly"), + drawtype = "plantlike", + tiles = {{ + name = "fireflies_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + pointable = pointable_compat, + groups = {catchable = 1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "fireflies:hidden_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("fireflies:hidden_firefly", { + description = S("Hidden Firefly"), + drawtype = "airlike", + inventory_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + wield_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1}, + floodable = true, + on_construct = function(pos) + minetest.get_node_timer(pos):start(1) + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "fireflies:firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + + +-- bug net +minetest.register_tool("fireflies:bug_net", { + description = S("Bug Net"), + inventory_image = "fireflies_bugnet.png", + pointabilities = {nodes = {["group:catchable"] = true}}, + tool_capabilities = { + groupcaps = { + catchable = { maxlevel = 1, uses = 256, times = { [1] = 0, [2] = 0, [3] = 0 } } + }, + }, +}) + +minetest.register_craft( { + output = "fireflies:bug_net", + recipe = { + {"farming:string", "farming:string"}, + {"farming:string", "farming:string"}, + {"group:stick", ""} + } +}) + + +-- firefly in a bottle +minetest.register_node("fireflies:firefly_bottle", { + description = S("Firefly in a Bottle"), + inventory_image = "fireflies_bottle.png", + wield_image = "fireflies_bottle.png", + tiles = {{ + name = "fireflies_bottle_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + light_source = 9, + walkable = false, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + sounds = default.node_sound_glass_defaults(), + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.is_protected(pos, player:get_player_name()) or + minetest.get_node(lower_pos).name ~= "air" then + return + end + + local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z} + local firefly_pos + + if not minetest.is_protected(upper_pos, player:get_player_name()) and + minetest.get_node(upper_pos).name == "air" then + firefly_pos = upper_pos + elseif not minetest.is_protected(lower_pos, player:get_player_name()) then + firefly_pos = lower_pos + end + + if firefly_pos then + minetest.set_node(pos, {name = "vessels:glass_bottle"}) + minetest.set_node(firefly_pos, {name = "fireflies:firefly"}) + minetest.get_node_timer(firefly_pos):start(1) + end + end +}) + +minetest.register_craft( { + output = "fireflies:firefly_bottle", + recipe = { + {"fireflies:firefly"}, + {"vessels:glass_bottle"} + } +}) + + +-- register fireflies as decorations + +if minetest.get_mapgen_setting("mg_name") == "v6" then + + minetest.register_decoration({ + name = "fireflies:firefly_low", + deco_type = "simple", + place_on = "default:dirt_with_grass", + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.0002, + y_max = 31000, + y_min = 1, + decoration = "fireflies:hidden_firefly", + }) + + minetest.register_decoration({ + name = "fireflies:firefly_high", + deco_type = "simple", + place_on = "default:dirt_with_grass", + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.0002, + y_max = 31000, + y_min = 1, + decoration = "fireflies:hidden_firefly", + }) + +else + + minetest.register_decoration({ + name = "fireflies:firefly_low", + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 2, + sidelen = 80, + fill_ratio = 0.0005, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:hidden_firefly", + }) + + minetest.register_decoration({ + name = "fireflies:firefly_high", + deco_type = "simple", + place_on = { + "default:dirt_with_grass", + "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", + "default:dirt" + }, + place_offset_y = 3, + sidelen = 80, + fill_ratio = 0.0005, + biomes = { + "deciduous_forest", + "coniferous_forest", + "rainforest", + "rainforest_swamp" + }, + y_max = 31000, + y_min = -1, + decoration = "fireflies:hidden_firefly", + }) + +end + + +-- get decoration IDs +local firefly_low = minetest.get_decoration_id("fireflies:firefly_low") +local firefly_high = minetest.get_decoration_id("fireflies:firefly_high") + +minetest.set_gen_notify({decoration = true}, {firefly_low, firefly_high}) + +-- start nodetimers +minetest.register_on_generated(function(minp, maxp, blockseed) + local gennotify = minetest.get_mapgen_object("gennotify") + local poslist = {} + + for _, pos in ipairs(gennotify["decoration#"..firefly_low] or {}) do + local firefly_low_pos = {x = pos.x, y = pos.y + 3, z = pos.z} + table.insert(poslist, firefly_low_pos) + end + for _, pos in ipairs(gennotify["decoration#"..firefly_high] or {}) do + local firefly_high_pos = {x = pos.x, y = pos.y + 4, z = pos.z} + table.insert(poslist, firefly_high_pos) + end + + if #poslist ~= 0 then + for i = 1, #poslist do + local pos = poslist[i] + minetest.get_node_timer(pos):start(1) + end + end +end) diff --git a/data/games/garage/mods/fireflies/license.txt b/data/games/garage/mods/fireflies/license.txt new file mode 100644 index 0000000..eebdad6 --- /dev/null +++ b/data/games/garage/mods/fireflies/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +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. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/data/games/garage/mods/fireflies/locale/fireflies.de.tr b/data/games/garage/mods/fireflies/locale/fireflies.de.tr new file mode 100644 index 0000000..c5d116a --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.de.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Glühwürmchen +Hidden Firefly=Verborgenes Glühwürmchen +Bug Net=Insektennetz +Firefly in a Bottle=Glühwürmchen in einer Flasche diff --git a/data/games/garage/mods/fireflies/locale/fireflies.eo.tr b/data/games/garage/mods/fireflies/locale/fireflies.eo.tr new file mode 100644 index 0000000..0eaa2cb --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.eo.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Lampiro +Hidden Firefly=Kaŝita lampiro +Bug Net=Insekta reto +Firefly in a Bottle=Lampiro en botelo diff --git a/data/games/garage/mods/fireflies/locale/fireflies.es.tr b/data/games/garage/mods/fireflies/locale/fireflies.es.tr new file mode 100644 index 0000000..95d053e --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.es.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Luciérnaga +Hidden Firefly=Luciérnaga oculta +Bug Net=Red de insectos +Firefly in a Bottle=Luciérnaga en botella diff --git a/data/games/garage/mods/fireflies/locale/fireflies.fr.tr b/data/games/garage/mods/fireflies/locale/fireflies.fr.tr new file mode 100644 index 0000000..3deda66 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.fr.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Luciole +Hidden Firefly=Luciole cachée +Bug Net=Filet à papillon +Firefly in a Bottle=Luciole en bouteille diff --git a/data/games/garage/mods/fireflies/locale/fireflies.id.tr b/data/games/garage/mods/fireflies/locale/fireflies.id.tr new file mode 100644 index 0000000..bc6434e --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.id.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Kunang-Kunang +Hidden Firefly=Kunang-Kunang Tersembunyi +Bug Net=Jaring Serangga +Firefly in a Bottle=Kunang-Kunang dalam Botol diff --git a/data/games/garage/mods/fireflies/locale/fireflies.it.tr b/data/games/garage/mods/fireflies/locale/fireflies.it.tr new file mode 100644 index 0000000..22ad57b --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.it.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Lucciola +Hidden Firefly=Lucciola nascosta +Bug Net=Retino +Firefly in a Bottle=Lucciola imbottigliata diff --git a/data/games/garage/mods/fireflies/locale/fireflies.ja.tr b/data/games/garage/mods/fireflies/locale/fireflies.ja.tr new file mode 100644 index 0000000..4116ca2 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.ja.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=ホタル +Hidden Firefly=隠されたホタル +Bug Net=虫取り網 +Firefly in a Bottle=ホタルの入った瓶 diff --git a/data/games/garage/mods/fireflies/locale/fireflies.jbo.tr b/data/games/garage/mods/fireflies/locale/fireflies.jbo.tr new file mode 100644 index 0000000..4e69ab4 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.jbo.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=lo gusycinki +Hidden Firefly=lo se mipri gusycinki +Bug Net=lo cinki julne +Firefly in a Bottle=lo gusycinki poi nenri lo botpi diff --git a/data/games/garage/mods/fireflies/locale/fireflies.lv.tr b/data/games/garage/mods/fireflies/locale/fireflies.lv.tr new file mode 100644 index 0000000..7bb6520 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.lv.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Jāņtārpiņš +Hidden Firefly=Paslēpts jāņtārpiņš +Bug Net=Ķeramtīkls +Firefly in a Bottle=Jāņtārpiņš pudelē diff --git a/data/games/garage/mods/fireflies/locale/fireflies.ms.tr b/data/games/garage/mods/fireflies/locale/fireflies.ms.tr new file mode 100644 index 0000000..509d03d --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.ms.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Kelip-Kelip +Hidden Firefly=Kelip-Kelip Tersembunyi +Bug Net=Jaring Pepijat +Firefly in a Bottle=Kelip-Kelip dalam Botol diff --git a/data/games/garage/mods/fireflies/locale/fireflies.pl.tr b/data/games/garage/mods/fireflies/locale/fireflies.pl.tr new file mode 100644 index 0000000..b07152b --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.pl.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Świetlik +Hidden Firefly=Ukryty świetlik +Bug Net=Siatka na owady +Firefly in a Bottle=Świetlik w butelce diff --git a/data/games/garage/mods/fireflies/locale/fireflies.pt_BR.tr b/data/games/garage/mods/fireflies/locale/fireflies.pt_BR.tr new file mode 100644 index 0000000..543c00b --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Vaga-lume +Hidden Firefly=Vaga-lume escondido +Bug Net=Rede de Insetos +Firefly in a Bottle=Vaga-lume em uma garrafa diff --git a/data/games/garage/mods/fireflies/locale/fireflies.ru.tr b/data/games/garage/mods/fireflies/locale/fireflies.ru.tr new file mode 100644 index 0000000..8c50a7d --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.ru.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Светлячок +Hidden Firefly=Притаившийся светлячок +Bug Net=Сачок +Firefly in a Bottle=Светлячок в бутылке diff --git a/data/games/garage/mods/fireflies/locale/fireflies.sk.tr b/data/games/garage/mods/fireflies/locale/fireflies.sk.tr new file mode 100644 index 0000000..b68674d --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.sk.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Svetluška +Hidden Firefly=Skrytá svetluška +Bug Net=Sieťka na hmyz +Firefly in a Bottle=Svetluška vo fľaši diff --git a/data/games/garage/mods/fireflies/locale/fireflies.sv.tr b/data/games/garage/mods/fireflies/locale/fireflies.sv.tr new file mode 100644 index 0000000..d8016f9 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.sv.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Eldfluga +Hidden Firefly=Gömd eldfluga +Bug Net=Insektshåv +Firefly in a Bottle=Eldfluga i en flaska diff --git a/data/games/garage/mods/fireflies/locale/fireflies.uk.tr b/data/games/garage/mods/fireflies/locale/fireflies.uk.tr new file mode 100644 index 0000000..f1bcb16 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.uk.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=Світляк +Hidden Firefly=Світляк, що причаївся +Bug Net=Сачок +Firefly in a Bottle=Світляк у пляшці diff --git a/data/games/garage/mods/fireflies/locale/fireflies.zh_CN.tr b/data/games/garage/mods/fireflies/locale/fireflies.zh_CN.tr new file mode 100644 index 0000000..5971785 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.zh_CN.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=萤火虫 +Hidden Firefly=隐藏的萤火虫 +Bug Net=虫网 +Firefly in a Bottle=放在瓶子里的萤火虫 diff --git a/data/games/garage/mods/fireflies/locale/fireflies.zh_TW.tr b/data/games/garage/mods/fireflies/locale/fireflies.zh_TW.tr new file mode 100644 index 0000000..af754a9 --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/fireflies.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly=螢火蟲 +Hidden Firefly=隱藏的螢火蟲 +Bug Net=蟲網 +Firefly in a Bottle=放在瓶子裡的螢火蟲 diff --git a/data/games/garage/mods/fireflies/locale/template.txt b/data/games/garage/mods/fireflies/locale/template.txt new file mode 100644 index 0000000..91aa8ff --- /dev/null +++ b/data/games/garage/mods/fireflies/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: fireflies +Firefly= +Hidden Firefly= +Bug Net= +Firefly in a Bottle= diff --git a/data/games/garage/mods/fireflies/mod.conf b/data/games/garage/mods/fireflies/mod.conf new file mode 100644 index 0000000..a533588 --- /dev/null +++ b/data/games/garage/mods/fireflies/mod.conf @@ -0,0 +1,3 @@ +name = fireflies +description = Minetest Game mod: fireflies +depends = default, vessels diff --git a/data/games/garage/mods/fireflies/textures/fireflies_bottle.png b/data/games/garage/mods/fireflies/textures/fireflies_bottle.png new file mode 100644 index 0000000..ecca036 Binary files /dev/null and b/data/games/garage/mods/fireflies/textures/fireflies_bottle.png differ diff --git a/data/games/garage/mods/fireflies/textures/fireflies_bottle_animated.png b/data/games/garage/mods/fireflies/textures/fireflies_bottle_animated.png new file mode 100644 index 0000000..294ff97 Binary files /dev/null and b/data/games/garage/mods/fireflies/textures/fireflies_bottle_animated.png differ diff --git a/data/games/garage/mods/fireflies/textures/fireflies_bugnet.png b/data/games/garage/mods/fireflies/textures/fireflies_bugnet.png new file mode 100644 index 0000000..8ec3d33 Binary files /dev/null and b/data/games/garage/mods/fireflies/textures/fireflies_bugnet.png differ diff --git a/data/games/garage/mods/fireflies/textures/fireflies_firefly.png b/data/games/garage/mods/fireflies/textures/fireflies_firefly.png new file mode 100644 index 0000000..c086689 Binary files /dev/null and b/data/games/garage/mods/fireflies/textures/fireflies_firefly.png differ diff --git a/data/games/garage/mods/fireflies/textures/fireflies_firefly_animated.png b/data/games/garage/mods/fireflies/textures/fireflies_firefly_animated.png new file mode 100644 index 0000000..e6932e3 Binary files /dev/null and b/data/games/garage/mods/fireflies/textures/fireflies_firefly_animated.png differ diff --git a/data/games/garage/mods/first_mod/init.lua b/data/games/garage/mods/first_mod/init.lua deleted file mode 100644 index 3909a39..0000000 --- a/data/games/garage/mods/first_mod/init.lua +++ /dev/null @@ -1 +0,0 @@ --- Nothing to do here, loading order is tested in C++ unittests. diff --git a/data/games/garage/mods/first_mod/mod.conf b/data/games/garage/mods/first_mod/mod.conf deleted file mode 100644 index d35fa8d..0000000 --- a/data/games/garage/mods/first_mod/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = first_mod -description = Mod which should be loaded before every other mod. diff --git a/data/games/garage/mods/flowers/README.txt b/data/games/garage/mods/flowers/README.txt new file mode 100644 index 0000000..1cb02a7 --- /dev/null +++ b/data/games/garage/mods/flowers/README.txt @@ -0,0 +1,30 @@ +Minetest Game mod: flowers +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Ironzorg (MIT) and VanessaE (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +RHRhino (CC BY-SA 3.0): + flowers_dandelion_white.png + flowers_geranium.png + flowers_rose.png + flowers_tulip.png + flowers_viola.png + +Gambit (CC BY-SA 3.0): + flowers_mushroom_brown.png + flowers_mushroom_red.png + flowers_waterlily.png + +yyt16384 (CC BY-SA 3.0): + flowers_waterlily_bottom.png -- Derived from Gambit's texture + +paramat (CC BY-SA 3.0): + flowers_dandelion_yellow.png -- Derived from RHRhino's texture + flowers_tulip_black.png -- Derived from RHRhino's texture + flowers_chrysanthemum_green.png diff --git a/data/games/garage/mods/flowers/init.lua b/data/games/garage/mods/flowers/init.lua new file mode 100644 index 0000000..6456216 --- /dev/null +++ b/data/games/garage/mods/flowers/init.lua @@ -0,0 +1,336 @@ +-- flowers/init.lua + +-- Minetest Game mod: flowers +-- See README.txt for licensing and other information. + + +-- Namespace for functions + +flowers = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("flowers") + + +-- Map Generation + +dofile(minetest.get_modpath("flowers") .. "/mapgen.lua") + + +-- +-- Flowers +-- + +-- Aliases for original flowers mod + +minetest.register_alias("flowers:flower_rose", "flowers:rose") +minetest.register_alias("flowers:flower_tulip", "flowers:tulip") +minetest.register_alias("flowers:flower_dandelion_yellow", "flowers:dandelion_yellow") +minetest.register_alias("flowers:flower_geranium", "flowers:geranium") +minetest.register_alias("flowers:flower_viola", "flowers:viola") +minetest.register_alias("flowers:flower_dandelion_white", "flowers:dandelion_white") + + +-- Flower registration + +local function add_simple_flower(name, desc, box, f_groups) + -- Common flowers' groups + f_groups.snappy = 3 + f_groups.flower = 1 + f_groups.flora = 1 + f_groups.attached_node = 1 + + minetest.register_node("flowers:" .. name, { + description = desc, + drawtype = "plantlike", + waving = 1, + tiles = {"flowers_" .. name .. ".png"}, + inventory_image = "flowers_" .. name .. ".png", + wield_image = "flowers_" .. name .. ".png", + sunlight_propagates = true, + paramtype = "light", + walkable = false, + buildable_to = true, + groups = f_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box + } + }) +end + +flowers.datas = { + { + "rose", + S("Red Rose"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, + {color_red = 1, flammable = 1} + }, + { + "tulip", + S("Orange Tulip"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + {color_orange = 1, flammable = 1} + }, + { + "dandelion_yellow", + S("Yellow Dandelion"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16}, + {color_yellow = 1, flammable = 1} + }, + { + "chrysanthemum_green", + S("Green Chrysanthemum"), + {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + {color_green = 1, flammable = 1} + }, + { + "geranium", + S("Blue Geranium"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16}, + {color_blue = 1, flammable = 1} + }, + { + "viola", + S("Viola"), + {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}, + {color_violet = 1, flammable = 1} + }, + { + "dandelion_white", + S("White Dandelion"), + {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16}, + {color_white = 1, flammable = 1} + }, + { + "tulip_black", + S("Black Tulip"), + {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, + {color_black = 1, flammable = 1} + }, +} + +for _,item in pairs(flowers.datas) do + add_simple_flower(unpack(item)) +end + + +-- Flower spread +-- Public function to enable override by mods + +function flowers.flower_spread(pos, node) + pos.y = pos.y - 1 + local under = minetest.get_node(pos) + pos.y = pos.y + 1 + -- Replace flora with dry shrub in desert sand and silver sand, + -- as this is the only way to generate them. + -- However, preserve grasses in sand dune biomes. + if minetest.get_item_group(under.name, "sand") == 1 and + under.name ~= "default:sand" then + minetest.set_node(pos, {name = "default:dry_shrub"}) + return + end + + if minetest.get_item_group(under.name, "soil") == 0 then + return + end + + local light = minetest.get_node_light(pos) + if not light or light < 13 then + return + end + + local pos0 = vector.subtract(pos, 4) + local pos1 = vector.add(pos, 4) + -- Testing shows that a threshold of 3 results in an appropriate maximum + -- density of approximately 7 flora per 9x9 area. + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then + return + end + + local soils = minetest.find_nodes_in_area_under_air( + pos0, pos1, "group:soil") + local num_soils = #soils + if num_soils >= 1 then + for si = 1, math.min(3, num_soils) do + local soil = soils[math.random(num_soils)] + local soil_name = minetest.get_node(soil).name + local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z} + light = minetest.get_node_light(soil_above) + if light and light >= 13 and + -- Only spread to same surface node + soil_name == under.name and + -- Desert sand is in the soil group + soil_name ~= "default:desert_sand" then + minetest.set_node(soil_above, {name = node.name}) + end + end + end +end + +minetest.register_abm({ + label = "Flower spread", + nodenames = {"group:flora"}, + interval = 13, + chance = 300, + action = function(...) + flowers.flower_spread(...) + end, +}) + + +-- +-- Mushrooms +-- + +minetest.register_node("flowers:mushroom_red", { + description = S("Red Mushroom"), + tiles = {"flowers_mushroom_red.png"}, + inventory_image = "flowers_mushroom_red.png", + wield_image = "flowers_mushroom_red.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(-5), + selection_box = { + type = "fixed", + fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, + } +}) + +minetest.register_node("flowers:mushroom_brown", { + description = S("Brown Mushroom"), + tiles = {"flowers_mushroom_brown.png"}, + inventory_image = "flowers_mushroom_brown.png", + wield_image = "flowers_mushroom_brown.png", + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {mushroom = 1, food_mushroom = 1, snappy = 3, attached_node = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + on_use = minetest.item_eat(1), + selection_box = { + type = "fixed", + fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16}, + } +}) + + +-- Mushroom spread and death + +function flowers.mushroom_spread(pos, node) + if minetest.get_node_light(pos, 0.5) > 3 then + if minetest.get_node_light(pos, nil) == 15 then + minetest.remove_node(pos) + end + return + end + local positions = minetest.find_nodes_in_area_under_air( + {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, + {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, + {"group:soil", "group:tree"}) + if #positions == 0 then + return + end + local pos2 = positions[math.random(#positions)] + pos2.y = pos2.y + 1 + if minetest.get_node_light(pos2, 0.5) <= 3 then + minetest.set_node(pos2, {name = node.name}) + end +end + +minetest.register_abm({ + label = "Mushroom spread", + nodenames = {"group:mushroom"}, + interval = 11, + chance = 150, + action = function(...) + flowers.mushroom_spread(...) + end, +}) + + +-- These old mushroom related nodes can be simplified now + +minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown") +minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red") +minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown") +minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red") +minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown") +minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red") + + +-- +-- Waterlily +-- + +local waterlily_def = { + description = S("Waterlily"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"flowers_waterlily.png", "flowers_waterlily_bottom.png"}, + inventory_image = "flowers_waterlily.png", + wield_image = "flowers_waterlily.png", + use_texture_alpha = "clip", + liquids_pointable = true, + walkable = false, + buildable_to = true, + floodable = true, + groups = {snappy = 3, flower = 1, flammable = 1}, + sounds = default.node_sound_leaves_defaults(), + node_placement_prediction = "", + node_box = { + type = "fixed", + fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5} + }, + selection_box = { + type = "fixed", + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16} + }, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, + pointed_thing) + end + + if def and def.liquidtype == "source" and + minetest.get_item_group(node.name, "water") > 0 then + local player_name = placer and placer:get_player_name() or "" + if not minetest.is_protected(pos, player_name) then + minetest.set_node(pos, {name = "flowers:waterlily" .. + (def.waving == 3 and "_waving" or ""), + param2 = math.random(0, 3)}) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + minetest.chat_send_player(player_name, "Node is protected") + minetest.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +} + +local waterlily_waving_def = table.copy(waterlily_def) +waterlily_waving_def.waving = 3 +waterlily_waving_def.drop = "flowers:waterlily" +waterlily_waving_def.groups.not_in_creative_inventory = 1 + +minetest.register_node("flowers:waterlily", waterlily_def) +minetest.register_node("flowers:waterlily_waving", waterlily_waving_def) + diff --git a/data/games/garage/mods/flowers/license.txt b/data/games/garage/mods/flowers/license.txt new file mode 100644 index 0000000..4cd7024 --- /dev/null +++ b/data/games/garage/mods/flowers/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Ironzorg, VanessaE +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 RHRhino +Copyright (C) 2015-2016 Gambit +Copyright (C) 2016 yyt16384 +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/flowers/locale/flowers.de.tr b/data/games/garage/mods/flowers/locale/flowers.de.tr new file mode 100644 index 0000000..18afb2a --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.de.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rote Rose +Orange Tulip=Orange Tulpe +Yellow Dandelion=Gelber Löwenzahn +Green Chrysanthemum=Grüne Chrysantheme +Blue Geranium=Blaue Geranie +Viola=Veilchen +White Dandelion=Weißer Löwenzahn +Black Tulip=Schwarze Tulpe +Red Mushroom=Roter Pilz +Brown Mushroom=Brauner Pilz +Waterlily=Wasserlilie diff --git a/data/games/garage/mods/flowers/locale/flowers.eo.tr b/data/games/garage/mods/flowers/locale/flowers.eo.tr new file mode 100644 index 0000000..076df18 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.eo.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Ruĝa rozo +Orange Tulip=Oranĝkolora tulipo +Yellow Dandelion=Flava leontodo +Green Chrysanthemum=Verda krizantemo +Blue Geranium=Blua geranio +Viola=Violo +White Dandelion=Blanka leontodo +Black Tulip=Nigra tulipo +Red Mushroom=Ruĝa fungo +Brown Mushroom=Bruna fungo +Waterlily=Nimfeo diff --git a/data/games/garage/mods/flowers/locale/flowers.es.tr b/data/games/garage/mods/flowers/locale/flowers.es.tr new file mode 100644 index 0000000..e9c345d --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.es.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rosa roja +Orange Tulip=Tulipán naranja +Yellow Dandelion=Diente de León amarillo +Green Chrysanthemum=Crisantemo verde +Blue Geranium=Geranio azul +Viola=Violeta +White Dandelion=Diente de León blanco +Black Tulip=Tulipán negro +Red Mushroom=Champiñón rojo +Brown Mushroom=Champiñón café +Waterlily=Nenúfar diff --git a/data/games/garage/mods/flowers/locale/flowers.fr.tr b/data/games/garage/mods/flowers/locale/flowers.fr.tr new file mode 100644 index 0000000..41e0d00 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.fr.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rose rouge +Orange Tulip=Tulipe orange +Yellow Dandelion=Pissenlit jaune +Green Chrysanthemum=Chrysanthème vert +Blue Geranium=Géranium bleu +Viola=Violette +White Dandelion=Pissenlit blanc +Black Tulip=Tulipe noire +Red Mushroom=Champignon rouge +Brown Mushroom=Champignon brun +Waterlily=Nénuphar diff --git a/data/games/garage/mods/flowers/locale/flowers.id.tr b/data/games/garage/mods/flowers/locale/flowers.id.tr new file mode 100644 index 0000000..730529b --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.id.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Mawar Merah +Orange Tulip=Tulip Oranye +Yellow Dandelion=Dandelion Kuning +Green Chrysanthemum=Krisan Hijau +Blue Geranium=Geranium Biru +Viola=Viola +White Dandelion=Dandelion Putih +Black Tulip=Tulip Hitam +Red Mushroom=Jamur Merah +Brown Mushroom=Jamur Cokelat +Waterlily=Teratai diff --git a/data/games/garage/mods/flowers/locale/flowers.it.tr b/data/games/garage/mods/flowers/locale/flowers.it.tr new file mode 100644 index 0000000..1ab49dd --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.it.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rosa rossa +Orange Tulip=Tulipano arancione +Yellow Dandelion=Dente di leone giallo +Green Chrysanthemum=Crisantemo verde +Blue Geranium=Geranio blu +Viola=Viola +White Dandelion=Dente di leone bianco +Black Tulip=Tulipano nero +Red Mushroom=Fungo rosso +Brown Mushroom=Fungo marrone +Waterlily=Ninfea diff --git a/data/games/garage/mods/flowers/locale/flowers.ja.tr b/data/games/garage/mods/flowers/locale/flowers.ja.tr new file mode 100644 index 0000000..bea87e2 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.ja.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=赤色のバラ +Orange Tulip=橙色のチューリップ +Yellow Dandelion=黄色のタンポポ +Green Chrysanthemum=緑色のキク +Blue Geranium=青色のゼラニウム +Viola=ビオラ +White Dandelion=白色のタンポポ +Black Tulip=黒色のチューリップ +Red Mushroom=赤色のキノコ +Brown Mushroom=茶色のキノコ +Waterlily=スイレン diff --git a/data/games/garage/mods/flowers/locale/flowers.jbo.tr b/data/games/garage/mods/flowers/locale/flowers.jbo.tr new file mode 100644 index 0000000..1df06ec --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.jbo.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=lo xunre rozgu +Orange Tulip=lo narju tujli +Yellow Dandelion=lo pelxu spatrtaraksaku +Green Chrysanthemum=lo crino xrisantemo +Blue Geranium=lo blanu plargoni +Viola=lo spatrvi'ola +White Dandelion=lo blabi spatrtaraksaku +Black Tulip=lo xekri tujli +Red Mushroom=lo xunre ledgrute +Brown Mushroom=lo bunre ledgrute +Waterlily=lo jacrulspa diff --git a/data/games/garage/mods/flowers/locale/flowers.lv.tr b/data/games/garage/mods/flowers/locale/flowers.lv.tr new file mode 100644 index 0000000..315272d --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.lv.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Sarkanā roze +Orange Tulip=Oranžā tulpe +Yellow Dandelion=Dzeltena pienene +Green Chrysanthemum=Zaļā krizantema +Blue Geranium=Zilā ģerānija +Viola=Vijolīte +White Dandelion=Balta pienene +Black Tulip=Melnā tulpe +Red Mushroom=Sarkanā sēne +Brown Mushroom=Brūnā sēne +Waterlily=Ūdensroze diff --git a/data/games/garage/mods/flowers/locale/flowers.ms.tr b/data/games/garage/mods/flowers/locale/flowers.ms.tr new file mode 100644 index 0000000..4e846eb --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.ms.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Ros Merah +Orange Tulip=Tulip Jingga +Yellow Dandelion=Dandelion Kuning +Green Chrysanthemum=Kekwa Hijau +Blue Geranium=Geranium Biru +Viola=Violet +White Dandelion=Dandelion Putih +Black Tulip=Tulip Hitam +Red Mushroom=Cendawan Merah +Brown Mushroom=Cendawan Perang +Waterlily=Teratai diff --git a/data/games/garage/mods/flowers/locale/flowers.pl.tr b/data/games/garage/mods/flowers/locale/flowers.pl.tr new file mode 100644 index 0000000..ff6a5e2 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.pl.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Czerwona róża +Orange Tulip=Pomarańczowy tulipan +Yellow Dandelion=Żółty mlecz +Green Chrysanthemum=Zielona chryzantema +Blue Geranium=Niebieska pelargonia +Viola=Fiołek +White Dandelion=Biały mlecz +Black Tulip=Czarny tulipan +Red Mushroom=Czerwony muchomor +Brown Mushroom=Brązowy grzyb +Waterlily=Lilia wodna diff --git a/data/games/garage/mods/flowers/locale/flowers.pt_BR.tr b/data/games/garage/mods/flowers/locale/flowers.pt_BR.tr new file mode 100644 index 0000000..1f5ff92 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Rosa Vermelha +Orange Tulip=Tulipa Laranja +Yellow Dandelion=Dente-de-leão Amarelo +Green Chrysanthemum=Crisântemo Verde +Blue Geranium=Gerânio Azul +Viola=Violeta +White Dandelion=Dente-de-leão Branco +Black Tulip=Tulipa Negra +Red Mushroom=Cogumelo Vermelho +Brown Mushroom=Cogumelo Marrom +Waterlily=Nenúfar diff --git a/data/games/garage/mods/flowers/locale/flowers.ru.tr b/data/games/garage/mods/flowers/locale/flowers.ru.tr new file mode 100644 index 0000000..0d129a5 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.ru.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Красная роза +Orange Tulip=Оранжевый тюльпан +Yellow Dandelion=Жёлтый одуванчик +Green Chrysanthemum=Зелёная хризантема +Blue Geranium=Синяя герань +Viola=Фиалка +White Dandelion=Белый одуванчик +Black Tulip=Чёрный тюльпан +Red Mushroom=Красный гриб +Brown Mushroom=Коричневый гриб +Waterlily=Лилия diff --git a/data/games/garage/mods/flowers/locale/flowers.sk.tr b/data/games/garage/mods/flowers/locale/flowers.sk.tr new file mode 100644 index 0000000..75d4ae1 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.sk.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Červená ruža +Orange Tulip=Oranžový tulipán +Yellow Dandelion=Žltá púpava +Green Chrysanthemum=Zelená chryzantéma +Blue Geranium=Modrý muškát +Viola=Fialka +White Dandelion=Biela púpava +Black Tulip=Čierny tulipán +Red Mushroom=Červená huba +Brown Mushroom=Hnedá huba +Waterlily=Lekno diff --git a/data/games/garage/mods/flowers/locale/flowers.sv.tr b/data/games/garage/mods/flowers/locale/flowers.sv.tr new file mode 100644 index 0000000..c8a26a3 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.sv.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Röd ros +Orange Tulip=Orange tulpan +Yellow Dandelion=Gul maskros +Green Chrysanthemum=Grön krysantemum +Blue Geranium=Blå geranium +Viola=Violett viola +White Dandelion=Vit maskros +Black Tulip=Svart tulpan +Red Mushroom=Röd svamp +Brown Mushroom=Brun svamp +Waterlily=Näckros diff --git a/data/games/garage/mods/flowers/locale/flowers.uk.tr b/data/games/garage/mods/flowers/locale/flowers.uk.tr new file mode 100644 index 0000000..5620029 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.uk.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Червона троянда +Orange Tulip=Помаранчевий тюльпан +Yellow Dandelion=Жовта кульбаба +Green Chrysanthemum=Зелена хризантема +Blue Geranium=Синій журавець +Viola=Фіалка +White Dandelion=Біла кульбаба +Black Tulip=Чорний тюльпан +Red Mushroom=Червоний гриб +Brown Mushroom=Коричневий гриб +Waterlily=Латаття diff --git a/data/games/garage/mods/flowers/locale/flowers.zh_CN.tr b/data/games/garage/mods/flowers/locale/flowers.zh_CN.tr new file mode 100644 index 0000000..3139dfb --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.zh_CN.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=红玫瑰 +Orange Tulip=橙郁金香 +Yellow Dandelion=黄蒲公英 +Green Chrysanthemum=绿菊花 +Blue Geranium=蓝天竺葵 +Viola=三色堇 +White Dandelion=白蒲公英 +Black Tulip=黑郁金香 +Red Mushroom=红蘑菇 +Brown Mushroom=棕蘑菇 +Waterlily=睡莲 diff --git a/data/games/garage/mods/flowers/locale/flowers.zh_TW.tr b/data/games/garage/mods/flowers/locale/flowers.zh_TW.tr new file mode 100644 index 0000000..a3a3ec5 --- /dev/null +++ b/data/games/garage/mods/flowers/locale/flowers.zh_TW.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=紅玫瑰 +Orange Tulip=橙鬱金香 +Yellow Dandelion=黃蒲公英 +Green Chrysanthemum=綠菊花 +Blue Geranium=藍天竺葵 +Viola=三色堇 +White Dandelion=白蒲公英 +Black Tulip=黑鬱金香 +Red Mushroom=紅蘑菇 +Brown Mushroom=棕蘑菇 +Waterlily=睡蓮 diff --git a/data/games/garage/mods/flowers/locale/template.txt b/data/games/garage/mods/flowers/locale/template.txt new file mode 100644 index 0000000..a3a687f --- /dev/null +++ b/data/games/garage/mods/flowers/locale/template.txt @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose= +Orange Tulip= +Yellow Dandelion= +Green Chrysanthemum= +Blue Geranium= +Viola= +White Dandelion= +Black Tulip= +Red Mushroom= +Brown Mushroom= +Waterlily= diff --git a/data/games/garage/mods/flowers/mapgen.lua b/data/games/garage/mods/flowers/mapgen.lua new file mode 100644 index 0000000..f282f50 --- /dev/null +++ b/data/games/garage/mods/flowers/mapgen.lua @@ -0,0 +1,181 @@ +-- +-- Mgv6 +-- + +local function register_mgv6_flower(flower_name) + minetest.register_decoration({ + name = "flowers:"..flower_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "flowers:"..flower_name, + }) +end + +local function register_mgv6_mushroom(mushroom_name) + minetest.register_decoration({ + name = "flowers:"..mushroom_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = 7133, + octaves = 3, + persist = 0.6 + }, + y_max = 30, + y_min = 1, + decoration = "flowers:"..mushroom_name, + spawn_by = "default:tree", + num_spawn_by = 1, + }) +end + +local function register_mgv6_waterlily() + minetest.register_decoration({ + name = "flowers:waterlily", + deco_type = "simple", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 100, y = 100, z = 100}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + y_max = 0, + y_min = 0, + decoration = "flowers:waterlily_waving", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) +end + +function flowers.register_mgv6_decorations() + register_mgv6_flower("rose") + register_mgv6_flower("tulip") + register_mgv6_flower("dandelion_yellow") + register_mgv6_flower("geranium") + register_mgv6_flower("viola") + register_mgv6_flower("dandelion_white") + + register_mgv6_mushroom("mushroom_brown") + register_mgv6_mushroom("mushroom_red") + + register_mgv6_waterlily() +end + + +-- +-- All other biome API mapgens +-- + +local function register_flower(seed, flower_name) + minetest.register_decoration({ + name = "flowers:"..flower_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = {x = 200, y = 200, z = 200}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + biomes = {"grassland", "deciduous_forest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:"..flower_name, + }) +end + +local function register_mushroom(mushroom_name) + minetest.register_decoration({ + name = "flowers:"..mushroom_name, + deco_type = "simple", + place_on = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest", "coniferous_forest"}, + y_max = 31000, + y_min = 1, + decoration = "flowers:"..mushroom_name, + }) +end + +local function register_waterlily() + minetest.register_decoration({ + name = "default:waterlily", + deco_type = "simple", + place_on = {"default:dirt"}, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = {x = 200, y = 200, z = 200}, + seed = 33, + octaves = 3, + persist = 0.7 + }, + biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"}, + y_max = 0, + y_min = 0, + decoration = "flowers:waterlily_waving", + param2 = 0, + param2_max = 3, + place_offset_y = 1, + }) +end + +function flowers.register_decorations() + register_flower(436, "rose") + register_flower(19822, "tulip") + register_flower(1220999, "dandelion_yellow") + register_flower(800081, "chrysanthemum_green") + register_flower(36662, "geranium") + register_flower(1133, "viola") + register_flower(73133, "dandelion_white") + register_flower(42, "tulip_black") + + register_mushroom("mushroom_brown") + register_mushroom("mushroom_red") + + register_waterlily() +end + + +-- +-- Detect mapgen to select functions +-- + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" then + flowers.register_mgv6_decorations() +else + flowers.register_decorations() +end diff --git a/data/games/garage/mods/flowers/mod.conf b/data/games/garage/mods/flowers/mod.conf new file mode 100644 index 0000000..cdafe64 --- /dev/null +++ b/data/games/garage/mods/flowers/mod.conf @@ -0,0 +1,3 @@ +name = flowers +description = Minetest Game mod: flowers +depends = default diff --git a/data/games/garage/mods/flowers/textures/flowers_chrysanthemum_green.png b/data/games/garage/mods/flowers/textures/flowers_chrysanthemum_green.png new file mode 100644 index 0000000..01d8c7e Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_chrysanthemum_green.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_dandelion_white.png b/data/games/garage/mods/flowers/textures/flowers_dandelion_white.png new file mode 100644 index 0000000..1bc02fb Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_dandelion_white.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_dandelion_yellow.png b/data/games/garage/mods/flowers/textures/flowers_dandelion_yellow.png new file mode 100644 index 0000000..544f60c Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_dandelion_yellow.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_geranium.png b/data/games/garage/mods/flowers/textures/flowers_geranium.png new file mode 100644 index 0000000..88de1d7 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_geranium.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_mushroom_brown.png b/data/games/garage/mods/flowers/textures/flowers_mushroom_brown.png new file mode 100644 index 0000000..33ffcd4 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_mushroom_brown.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_mushroom_red.png b/data/games/garage/mods/flowers/textures/flowers_mushroom_red.png new file mode 100644 index 0000000..a68f5d5 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_mushroom_red.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_rose.png b/data/games/garage/mods/flowers/textures/flowers_rose.png new file mode 100644 index 0000000..e3b841d Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_rose.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_tulip.png b/data/games/garage/mods/flowers/textures/flowers_tulip.png new file mode 100644 index 0000000..471fcd3 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_tulip.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_tulip_black.png b/data/games/garage/mods/flowers/textures/flowers_tulip_black.png new file mode 100644 index 0000000..1dd09f7 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_tulip_black.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_viola.png b/data/games/garage/mods/flowers/textures/flowers_viola.png new file mode 100644 index 0000000..ca2d750 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_viola.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_waterlily.png b/data/games/garage/mods/flowers/textures/flowers_waterlily.png new file mode 100644 index 0000000..973e511 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_waterlily.png differ diff --git a/data/games/garage/mods/flowers/textures/flowers_waterlily_bottom.png b/data/games/garage/mods/flowers/textures/flowers_waterlily_bottom.png new file mode 100644 index 0000000..3dbeaf4 Binary files /dev/null and b/data/games/garage/mods/flowers/textures/flowers_waterlily_bottom.png differ diff --git a/data/games/garage/mods/game_commands/README.txt b/data/games/garage/mods/game_commands/README.txt new file mode 100644 index 0000000..a451608 --- /dev/null +++ b/data/games/garage/mods/game_commands/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: game_commands +================================ +See license.txt for license information. + +Authors of source code +---------------------- +rubenwardy (MIT) diff --git a/data/games/garage/mods/game_commands/init.lua b/data/games/garage/mods/game_commands/init.lua new file mode 100644 index 0000000..e038be1 --- /dev/null +++ b/data/games/garage/mods/game_commands/init.lua @@ -0,0 +1,31 @@ +-- game_commands/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("game_commands") + + +minetest.register_chatcommand("killme", { + description = S("Kill yourself to respawn"), + func = function(name) + local player = minetest.get_player_by_name(name) + if player then + if minetest.settings:get_bool("enable_damage") then + player:set_hp(0) + return true + else + for _, callback in pairs(minetest.registered_on_respawnplayers) do + if callback(player) then + return true + end + end + + -- There doesn't seem to be a way to get a default spawn pos + -- from the lua API + return false, S("No static_spawnpoint defined") + end + else + -- Show error message if used when not logged in, eg: from IRC mod + return false, S("You need to be online to be killed!") + end + end +}) diff --git a/data/games/garage/mods/game_commands/license.txt b/data/games/garage/mods/game_commands/license.txt new file mode 100644 index 0000000..fa85564 --- /dev/null +++ b/data/games/garage/mods/game_commands/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017-2018 rubenwardy + +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. + +For more details: +https://opensource.org/licenses/MIT diff --git a/data/games/garage/mods/game_commands/locale/game_commands.de.tr b/data/games/garage/mods/game_commands/locale/game_commands.de.tr new file mode 100644 index 0000000..24b0e25 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.de.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Selbstmord begehen, um zu Respawnen +No static_spawnpoint defined=Kein static_spawnpoint definiert +You need to be online to be killed!=Sie müssen online sein, um getötet zu werden! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.eo.tr b/data/games/garage/mods/game_commands/locale/game_commands.eo.tr new file mode 100644 index 0000000..0ff99aa --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.eo.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Sinmortigu por renaski +No static_spawnpoint defined=Ne estas difina static_spawnpoint +You need to be online to be killed!=Vi devas esti enreta por esti mortigita! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.es.tr b/data/games/garage/mods/game_commands/locale/game_commands.es.tr new file mode 100644 index 0000000..702a2ef --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.es.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Suicídate para reaparecer +No static_spawnpoint defined=No se ha definido un punto de aparición +You need to be online to be killed!=¡Necesitas estar en línea para que te maten! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.fr.tr b/data/games/garage/mods/game_commands/locale/game_commands.fr.tr new file mode 100644 index 0000000..0e295d6 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.fr.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Se suicider pour réapparaître +No static_spawnpoint defined=Pas de point d'apparition défini +You need to be online to be killed!=Vous devez être en ligne pour être tué ! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.id.tr b/data/games/garage/mods/game_commands/locale/game_commands.id.tr new file mode 100644 index 0000000..0d586c9 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.id.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Bunuh diri untuk bangkit kembali +No static_spawnpoint defined=Tidak ada static_spawnpoint (titik bangkit statis) yang diatur +You need to be online to be killed!=Anda harus daring untuk dibunuh! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.it.tr b/data/games/garage/mods/game_commands/locale/game_commands.it.tr new file mode 100644 index 0000000..91646b0 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.it.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Ucciditi per ricomparire +No static_spawnpoint defined=Nessuno static_spawnpoint definito +You need to be online to be killed!=Devi essere in linea per essere ucciso! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.ja.tr b/data/games/garage/mods/game_commands/locale/game_commands.ja.tr new file mode 100644 index 0000000..b6c77dc --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.ja.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=リセットしてリスポーンします +No static_spawnpoint defined=static_spawnpoint が設定されていません +You need to be online to be killed!=リセットするにはオンラインである必要があります diff --git a/data/games/garage/mods/game_commands/locale/game_commands.jbo.tr b/data/games/garage/mods/game_commands/locale/game_commands.jbo.tr new file mode 100644 index 0000000..ddddcd7 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=.i ro nu do catra do cu tadji pa nu do tolcanci +No static_spawnpoint defined=.i no da ckaji lo me la'o zoi.static_spawnpoint.zoi +You need to be online to be killed!=.i lo nu samjo'e cu sarcu lo nu do se catra diff --git a/data/games/garage/mods/game_commands/locale/game_commands.lv.tr b/data/games/garage/mods/game_commands/locale/game_commands.lv.tr new file mode 100644 index 0000000..b498bcb --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.lv.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Nobeidzieties lai atdzīvotos +No static_spawnpoint defined=static_spawnpoint nav definēts +You need to be online to be killed!=Jums jābūt tiešsaistē lai nobeigtos. diff --git a/data/games/garage/mods/game_commands/locale/game_commands.ms.tr b/data/games/garage/mods/game_commands/locale/game_commands.ms.tr new file mode 100644 index 0000000..d22e0a4 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.ms.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Bunuh diri anda untuk jelma semula +No static_spawnpoint defined=Tiada titik jelma statik (tetapan static_spawnpoint) ditakrifkan +You need to be online to be killed!=Anda mesti berada dalam talian untuk dibunuh! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.pl.tr b/data/games/garage/mods/game_commands/locale/game_commands.pl.tr new file mode 100644 index 0000000..52477c6 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.pl.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Zastosować komendę kill aby się zrespawnować +No static_spawnpoint defined=Nie zdefiniowano static_spawnpoint +You need to be online to be killed!=Musisz być online aby zastosować komendę kill diff --git a/data/games/garage/mods/game_commands/locale/game_commands.pt_BR.tr b/data/games/garage/mods/game_commands/locale/game_commands.pt_BR.tr new file mode 100644 index 0000000..6c52c0b --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Mate-se para reaparecer +No static_spawnpoint defined=Nenhum ponto de reaparecer estático definido +You need to be online to be killed!=Você precisa estar online para ser morto! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.ru.tr b/data/games/garage/mods/game_commands/locale/game_commands.ru.tr new file mode 100644 index 0000000..59a5971 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.ru.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Убейте себя, чтобы возродиться +No static_spawnpoint defined=static_spawnpoint не определён +You need to be online to be killed!=Вы должны быть в сети, чтобы убить себя! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.sk.tr b/data/games/garage/mods/game_commands/locale/game_commands.sk.tr new file mode 100644 index 0000000..f7d153a --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.sk.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Samovražda pre znovuzrodenie +No static_spawnpoint defined=Nie je definované stále miesto znovuzrodenia +You need to be online to be killed!=Musíš byť online, aby si mohol byť zabitý! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.sv.tr b/data/games/garage/mods/game_commands/locale/game_commands.sv.tr new file mode 100644 index 0000000..e3110da --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.sv.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Döda dig själv för att respawna +No static_spawnpoint defined=Ingen static_spawnpoint definierad +You need to be online to be killed!=Du måsta vara online för att bli dödad! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.uk.tr b/data/games/garage/mods/game_commands/locale/game_commands.uk.tr new file mode 100644 index 0000000..03cd267 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.uk.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=Вбити себе, щоб відродитися +No static_spawnpoint defined=Немає визначеного static_spawnpoint +You need to be online to be killed!=Ви повинні бути онлайн, щоби Вас було вбито! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.zh_CN.tr b/data/games/garage/mods/game_commands/locale/game_commands.zh_CN.tr new file mode 100644 index 0000000..ba9a027 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=自杀并重生 +No static_spawnpoint defined=static_spawnpoint 未定义 +You need to be online to be killed!=您需要在线才能被杀死! diff --git a/data/games/garage/mods/game_commands/locale/game_commands.zh_TW.tr b/data/games/garage/mods/game_commands/locale/game_commands.zh_TW.tr new file mode 100644 index 0000000..34e148d --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/game_commands.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn=殺死自己並重生 +No static_spawnpoint defined=static_spawnpoint 未定義 +You need to be online to be killed!=您需要在線才能被殺死! diff --git a/data/games/garage/mods/game_commands/locale/template.txt b/data/games/garage/mods/game_commands/locale/template.txt new file mode 100644 index 0000000..903f160 --- /dev/null +++ b/data/games/garage/mods/game_commands/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: game_commands +Kill yourself to respawn= +No static_spawnpoint defined= +You need to be online to be killed!= diff --git a/data/games/garage/mods/game_commands/mod.conf b/data/games/garage/mods/game_commands/mod.conf new file mode 100644 index 0000000..5571ff5 --- /dev/null +++ b/data/games/garage/mods/game_commands/mod.conf @@ -0,0 +1,2 @@ +name = game_commands +description = Minetest Game mod: game_commands diff --git a/data/games/garage/mods/give_initial_stuff/README.txt b/data/games/garage/mods/give_initial_stuff/README.txt new file mode 100644 index 0000000..b10c360 --- /dev/null +++ b/data/games/garage/mods/give_initial_stuff/README.txt @@ -0,0 +1,8 @@ +Minetest Game mod: give_initial_stuff +===================================== +See license.txt for license information. + +Authors of source code +---------------------- +Perttu Ahola (celeron55) (MIT) +Various Minetest Game developers and contributors (MIT) diff --git a/data/games/garage/mods/give_initial_stuff/init.lua b/data/games/garage/mods/give_initial_stuff/init.lua index 4b31b52..74421dc 100644 --- a/data/games/garage/mods/give_initial_stuff/init.lua +++ b/data/games/garage/mods/give_initial_stuff/init.lua @@ -1,37 +1,46 @@ -local give_if_not_gotten_already = function(inv, list, item) - if not inv:contains_item(list, item) then - inv:add_item(list, item) - end -end +-- gave_initial_stuff/init.lua -local give_initial_stuff = function(player) +local stuff_string = minetest.settings:get("initial_stuff") or + "default:pick_steel,default:axe_steel,default:shovel_steel," .. + "default:torch 99,default:cobble 99" + +give_initial_stuff = { + items = {} +} + +function give_initial_stuff.give(player) + minetest.log("action", + "Giving initial stuff to player " .. player:get_player_name()) local inv = player:get_inventory() - give_if_not_gotten_already(inv, "main", "basetools:pick_mese") - give_if_not_gotten_already(inv, "main", "basetools:axe_steel") - give_if_not_gotten_already(inv, "main", "basetools:shovel_steel") - give_if_not_gotten_already(inv, "main", "bucket:bucket") - give_if_not_gotten_already(inv, "main", "testnodes:light14") - give_if_not_gotten_already(inv, "main", "chest_of_everything:bag") - core.log("action", "[give_initial_stuff] Giving initial stuff to "..player:get_player_name()) + for _, stack in ipairs(give_initial_stuff.items) do + inv:add_item("main", stack) + end end -core.register_on_newplayer(function(player) - if core.settings:get_bool("give_initial_stuff", true) then - give_initial_stuff(player) +function give_initial_stuff.add(stack) + give_initial_stuff.items[#give_initial_stuff.items + 1] = ItemStack(stack) +end + +function give_initial_stuff.clear() + give_initial_stuff.items = {} +end + +function give_initial_stuff.add_from_csv(str) + local items = str:split(",") + for _, itemname in ipairs(items) do + give_initial_stuff.add(itemname) end -end) +end -core.register_chatcommand("stuff", { - params = "", - privs = { give = true }, - description = "Give yourself initial items", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player or not player:is_player() then - return false, "No player." - end - give_initial_stuff(player) - return true - end, -}) +function give_initial_stuff.set_list(list) + give_initial_stuff.items = list +end +function give_initial_stuff.get_list() + return give_initial_stuff.items +end + +give_initial_stuff.add_from_csv(stuff_string) +if minetest.settings:get_bool("give_initial_stuff") then + minetest.register_on_newplayer(give_initial_stuff.give) +end diff --git a/data/games/garage/mods/give_initial_stuff/license.txt b/data/games/garage/mods/give_initial_stuff/license.txt new file mode 100644 index 0000000..45dba3f --- /dev/null +++ b/data/games/garage/mods/give_initial_stuff/license.txt @@ -0,0 +1,25 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT diff --git a/data/games/garage/mods/give_initial_stuff/mod.conf b/data/games/garage/mods/give_initial_stuff/mod.conf index 1ba49f5..51d31ae 100644 --- a/data/games/garage/mods/give_initial_stuff/mod.conf +++ b/data/games/garage/mods/give_initial_stuff/mod.conf @@ -1,3 +1,3 @@ name = give_initial_stuff -description = Gives items to players on join -depends = basetools, bucket, chest_of_everything, testnodes +description = Minetest Game mod: give_initial_stuff +depends = default diff --git a/data/games/garage/mods/gltf/LICENSE.md b/data/games/garage/mods/gltf/LICENSE.md deleted file mode 100644 index 6c3828a..0000000 --- a/data/games/garage/mods/gltf/LICENSE.md +++ /dev/null @@ -1,14 +0,0 @@ -The glTF test models (and corresponding textures) in this mod are all licensed freely: - -* Spider (`gltf_spider.gltf`, `gltf_spider.png`): - * By [archfan7411](https://github.com/archfan7411) - * Licensed under CC0, public domain "wherever public domain carries fewer rights or legal protections" -* Frog (`gltf_frog.gltf`, `gltf_frog.png`): - * By [Susybaka1234](https://sketchfab.com/3d-models/african-clawed-frog-v2-c81152c93948480c931c280d18957358) - * Licensed under CC-BY 4.0 -* Snow Man (`gltf_snow_man.gltf`, `gltf_snow_man.png`): - * By [jordan4ibanez](https://github.com/jordan4ibanez) - * Licensed under CC0 -* Minimal triangle, triangle without indices (`gltf_minimal_triangle.gltf`, `gltf_triangle_without_indices.gltf`) - * From [the glTF sample model collection](https://github.com/KhronosGroup/glTF-Sample-Models) - * Licensed under CC0 / public domain diff --git a/data/games/garage/mods/gltf/init.lua b/data/games/garage/mods/gltf/init.lua deleted file mode 100644 index fd4d13b..0000000 --- a/data/games/garage/mods/gltf/init.lua +++ /dev/null @@ -1,95 +0,0 @@ -local function register_entity(name, textures, backface_culling) - core.register_entity("gltf:" .. name, { - initial_properties = { - visual = "mesh", - mesh = "gltf_" .. name .. ".gltf", - textures = textures, - backface_culling = backface_culling, - }, - }) -end - --- These do not have texture coordinates; they simple render as black surfaces. -register_entity("minimal_triangle", {}, false) -register_entity("triangle_with_vertex_stride", {}, false) -register_entity("triangle_without_indices", {}, false) -do - local cube_textures = {"gltf_cube.png"} - register_entity("blender_cube", cube_textures) - register_entity("blender_cube_scaled", cube_textures) - register_entity("blender_cube_matrix_transform", cube_textures) - core.register_entity("gltf:blender_cube_glb", { - initial_properties = { - visual = "mesh", - mesh = "gltf_blender_cube.glb", - textures = cube_textures, - backface_culling = true, - }, - }) -end - -register_entity("snow_man", {"gltf_snow_man.png"}) -register_entity("spider", {"gltf_spider.png"}) - -core.register_entity("gltf:spider_animated", { - initial_properties = { - visual = "mesh", - mesh = "gltf_spider_animated.gltf", - textures = {"gltf_spider.png"}, - }, - on_activate = function(self) - self.object:set_animation({x = 0, y = 140}, 1) - end -}) - -core.register_entity("gltf:simple_skin", { - initial_properties = { - visual = "mesh", - visual_size = vector.new(5, 5, 5), - mesh = "gltf_simple_skin.gltf", - textures = {}, - backface_culling = false - }, - on_activate = function(self) - self.object:set_animation({x = 0, y = 5.5}, 1) - end -}) - --- The claws rendering incorrectly from one side is expected behavior: --- They use an unsupported double-sided material. -core.register_entity("gltf:frog", { - initial_properties = { - visual = "mesh", - mesh = "gltf_frog.gltf", - textures = {"gltf_frog.png"}, - backface_culling = false - }, - on_activate = function(self) - self.object:set_animation({x = 0, y = 0.75}, 1) - end -}) - - -core.register_node("gltf:frog", { - description = "glTF frog, but it's a node", - tiles = {{name = "gltf_frog.png", backface_culling = false}}, - drawtype = "mesh", - mesh = "gltf_frog.gltf", -}) - -core.register_chatcommand("show_model", { - params = " [textures]", - description = "Show a model (defaults to gltf models, for example '/show_model frog').", - func = function(name, param) - local model, textures = param:match"^(.-)%s+(.+)$" - if not model then - model = "gltf_" .. param .. ".gltf" - textures = "gltf_" .. param .. ".png" - end - core.show_formspec(name, "gltf:model", table.concat{ - "formspec_version[7]", - "size[10,10]", - "model[0,0;10,10;model;", model, ";", textures, ";0,0;true;true;0,0;0]", - }) - end, -}) diff --git a/data/games/garage/mods/gltf/invalid/invalid_bufferview_bounds.gltf b/data/games/garage/mods/gltf/invalid/invalid_bufferview_bounds.gltf deleted file mode 100644 index 2182861..0000000 --- a/data/games/garage/mods/gltf/invalid/invalid_bufferview_bounds.gltf +++ /dev/null @@ -1 +0,0 @@ -{"scene":0,"scenes":[{"nodes":[0]}],"nodes":[{"mesh":0}],"meshes":[{"primitives":[{"attributes":{"POSITION":0}}]}],"buffers":[{"uri":"data:application/octet-stream;base64,AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAA","byteLength":36}],"bufferViews":[{"buffer":0,"byteOffset":1,"byteLength":36,"target":34962}],"accessors":[{"bufferView":0,"byteOffset":0,"componentType":5126,"count":3,"type":"VEC3","max":[1,1,0],"min":[0,0,0]}],"asset":{"version":"2.0"}} diff --git a/data/games/garage/mods/gltf/invalid/json_missing_brace.gltf b/data/games/garage/mods/gltf/invalid/json_missing_brace.gltf deleted file mode 100644 index 98232c6..0000000 --- a/data/games/garage/mods/gltf/invalid/json_missing_brace.gltf +++ /dev/null @@ -1 +0,0 @@ -{ diff --git a/data/games/garage/mods/gltf/mod.conf b/data/games/garage/mods/gltf/mod.conf deleted file mode 100644 index 3ec50d2..0000000 --- a/data/games/garage/mods/gltf/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = gltf -description = Hosts gltf test models, both for the C++ unit tests and for in-game viewing diff --git a/data/games/garage/mods/gltf/models/gltf_blender_cube.glb b/data/games/garage/mods/gltf/models/gltf_blender_cube.glb deleted file mode 100644 index b1894fc..0000000 Binary files a/data/games/garage/mods/gltf/models/gltf_blender_cube.glb and /dev/null differ diff --git a/data/games/garage/mods/gltf/models/gltf_blender_cube.gltf b/data/games/garage/mods/gltf/models/gltf_blender_cube.gltf deleted file mode 100644 index 041b4a1..0000000 --- a/data/games/garage/mods/gltf/models/gltf_blender_cube.gltf +++ /dev/null @@ -1 +0,0 @@ -{"asset":{"generator":"Khronos glTF Blender I/O v1.7.33","version":"2.0"},"scene":0,"scenes":[{"name":"Scene","nodes":[0]}],"nodes":[{"mesh":0,"name":"Cube","scale":[10,10,10]}],"meshes":[{"name":"Cube.004","primitives":[{"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3}]}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"type":"SCALAR"}],"bufferViews":[{"buffer":0,"byteLength":288,"byteOffset":0},{"buffer":0,"byteLength":288,"byteOffset":288},{"buffer":0,"byteLength":192,"byteOffset":576},{"buffer":0,"byteLength":72,"byteOffset":768}],"buffers":[{"byteLength":840,"uri":"data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAA"}]} diff --git a/data/games/garage/mods/gltf/models/gltf_blender_cube_matrix_transform.gltf b/data/games/garage/mods/gltf/models/gltf_blender_cube_matrix_transform.gltf deleted file mode 100644 index 50235ce..0000000 --- a/data/games/garage/mods/gltf/models/gltf_blender_cube_matrix_transform.gltf +++ /dev/null @@ -1 +0,0 @@ -{"asset":{"generator":"Khronos glTF Blender I/O v1.7.33","version":"2.0"},"scene":0,"scenes":[{"name":"Scene","nodes":[0]}],"nodes":[{"mesh":0,"name":"Cube","matrix":[1,0,0,0,0,2,0,0,0,0,3,0,4,5,6,1]}],"meshes":[{"name":"Cube.004","primitives":[{"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3}]}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"type":"SCALAR"}],"bufferViews":[{"buffer":0,"byteLength":288,"byteOffset":0},{"buffer":0,"byteLength":288,"byteOffset":288},{"buffer":0,"byteLength":192,"byteOffset":576},{"buffer":0,"byteLength":72,"byteOffset":768}],"buffers":[{"byteLength":840,"uri":"data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAA"}]} diff --git a/data/games/garage/mods/gltf/models/gltf_blender_cube_scaled.gltf b/data/games/garage/mods/gltf/models/gltf_blender_cube_scaled.gltf deleted file mode 100644 index 3b626b3..0000000 --- a/data/games/garage/mods/gltf/models/gltf_blender_cube_scaled.gltf +++ /dev/null @@ -1 +0,0 @@ -{"asset":{"generator":"Khronos glTF Blender I/O v1.7.33","version":"2.0"},"scene":0,"scenes":[{"name":"Scene","nodes":[0]}],"nodes":[{"mesh":0,"name":"Cube","scale":[150,1,21.5]}],"meshes":[{"name":"Cube.004","primitives":[{"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3}]}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"type":"SCALAR"}],"bufferViews":[{"buffer":0,"byteLength":288,"byteOffset":0},{"buffer":0,"byteLength":288,"byteOffset":288},{"buffer":0,"byteLength":192,"byteOffset":576},{"buffer":0,"byteLength":72,"byteOffset":768}],"buffers":[{"byteLength":840,"uri":"data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAA"}]} diff --git a/data/games/garage/mods/gltf/models/gltf_frog.gltf b/data/games/garage/mods/gltf/models/gltf_frog.gltf deleted file mode 100644 index a41e9de..0000000 --- a/data/games/garage/mods/gltf/models/gltf_frog.gltf +++ /dev/null @@ -1 +0,0 @@ -{"asset":{"version":"2.0","generator":"Blockbench 4.9.4 glTF exporter"},"scenes":[{"nodes":[20],"name":"blockbench_export"}],"scene":0,"nodes":[{"name":"cube","mesh":0},{"name":"cube","mesh":1},{"name":"cube","mesh":2},{"name":"body","children":[0,1,2]},{"translation":[0,0,-0.0625],"name":"cube","mesh":3},{"translation":[0.03125,0,-0.3125],"name":"cube","mesh":4},{"rotation":[0,-0.19509032201612825,0,0.9807852804032304],"translation":[0.01812248876854733,-0.0625,-0.25194388507103505],"name":"cube","mesh":5},{"translation":[0.0625,0,0.3125],"name":"leftleg","children":[4,5,6]},{"translation":[0.0625,0,-0.3125],"name":"cube","mesh":6},{"translation":[-0.03125,0,-0.3125],"name":"cube","mesh":7},{"rotation":[0,0.19509032201612825,0,0.9807852804032304],"translation":[-0.01812248876854733,-0.0625,-0.25194388507103505],"name":"cube","mesh":8},{"translation":[-0.0625,0,0.3125],"name":"rightleg","children":[8,9,10]},{"translation":[-0.125,-0.0625,0.125],"name":"cube","mesh":9},{"rotation":[0,0.5372996083468239,0,0.8433914458128857],"translation":[0.10431178959951112,-0.0625,0.2349474087973531],"name":"cube","mesh":10},{"rotation":[0,0.5372996083468239,0,0.8433914458128857],"translation":[0.10431178959951112,-0.0625,0.2349474087973531],"name":"cube","mesh":11},{"translation":[0.125,0.0625,-0.125],"name":"leftarm","children":[12,13,14]},{"translation":[0.125,-0.0625,0.125],"name":"cube","mesh":12},{"rotation":[0,-0.5372996083468239,0,0.8433914458128857],"translation":[-0.10431178959951112,-0.0625,0.2349474087973531],"name":"cube","mesh":13},{"rotation":[0,-0.5372996083468239,0,0.8433914458128857],"translation":[-0.10431178959951112,-0.0625,0.2349474087973531],"name":"cube","mesh":14},{"translation":[-0.125,0.0625,-0.125],"name":"rightarm","children":[16,17,18]},{"children":[3,7,11,15,19]}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":840,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":1128,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":1416,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":1608,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":1680,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":1968,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":2256,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":2448,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":2520,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":2808,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":3096,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":3288,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":3360,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":3648,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":3936,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":4128,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":4200,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":4488,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":4776,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":4968,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":5040,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":5328,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":5616,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":5808,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":5880,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":6168,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":6456,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":6648,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":6720,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":7008,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":7296,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":7488,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":7560,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":7848,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":8136,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":8328,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":8400,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":8688,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":8976,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":9168,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":9240,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":9528,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":9816,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":10008,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":10080,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":10368,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":10656,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":10848,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":10920,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":11208,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":11496,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":11688,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":11760,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":12048,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":12336,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":12528,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":12600,"byteLength":12},{"buffer":0,"byteOffset":12612,"byteLength":48},{"buffer":0,"byteOffset":12660,"byteLength":12},{"buffer":0,"byteOffset":12672,"byteLength":48},{"buffer":0,"byteOffset":12720,"byteLength":12},{"buffer":0,"byteOffset":12732,"byteLength":48},{"buffer":0,"byteOffset":12780,"byteLength":12},{"buffer":0,"byteOffset":12792,"byteLength":48},{"buffer":0,"byteOffset":12840,"byteLength":12},{"buffer":0,"byteOffset":12852,"byteLength":48},{"buffer":0,"byteOffset":12900,"byteLength":12},{"buffer":0,"byteOffset":12912,"byteLength":48},{"buffer":0,"byteOffset":12960,"byteLength":12},{"buffer":0,"byteOffset":12972,"byteLength":48},{"buffer":0,"byteOffset":13020,"byteLength":12},{"buffer":0,"byteOffset":13032,"byteLength":48},{"buffer":0,"byteOffset":13080,"byteLength":12},{"buffer":0,"byteOffset":13092,"byteLength":48},{"buffer":0,"byteOffset":13140,"byteLength":4},{"buffer":0,"byteOffset":13144,"byteLength":16},{"buffer":0,"byteOffset":13160,"byteLength":4},{"buffer":0,"byteOffset":13164,"byteLength":16}],"buffers":[{"byteLength":13180,"uri":"data:application/octet-stream;base64,AAAgPgAAAD4AAIA+AAAgPgAAAD4AAIC9AAAgPgAAAAAAAIA+AAAgPgAAAAAAAIC9AAAgvgAAAD4AAIC9AAAgvgAAAD4AAIA+AAAgvgAAAAAAAIC9AAAgvgAAAAAAAIA+AAAgvgAAAD4AAIC9AAAgPgAAAD4AAIC9AAAgvgAAAD4AAIA+AAAgPgAAAD4AAIA+AAAgvgAAAAAAAIA+AAAgPgAAAAAAAIA+AAAgvgAAAAAAAIC9AAAgPgAAAAAAAIC9AAAgvgAAAD4AAIA+AAAgPgAAAD4AAIA+AAAgvgAAAAAAAIA+AAAgPgAAAAAAAIA+AAAgPgAAAD4AAIC9AAAgvgAAAD4AAIC9AAAgPgAAAAAAAIC9AAAgvgAAAAAAAIC9AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgCAID4AgB8+AIAgPgAAADoAgF8+AIAfPgCAXz4AQKA+AIAgPgDA7z4AgCA+AECgPgCAXz4AwO8+AIBfPgDAnz4AgB8+AIAgPgCAHz4AwJ8+AAAAOgCAID4AAAA6AMDvPgAAADoAQKA+AAAAOgDA7z4AgB8+AECgPgCAHz4AQPA+AIAgPgDgHz8AgCA+AEDwPgCAXz4A4B8/AIBfPgCAID4AgCA+AMCfPgCAID4AgCA+AIBfPgDAnz4AgF8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAAAAPgAAAD4AAIC9AAAAPgAAAD4AAKC+AAAAPgAAAAAAAIC9AAAAPgAAAAAAAKC+AAAAvgAAAD4AAKC+AAAAvgAAAD4AAIC9AAAAvgAAAAAAAKC+AAAAvgAAAAAAAIC9AAAAvgAAAD4AAKC+AAAAPgAAAD4AAKC+AAAAvgAAAD4AAIC9AAAAPgAAAD4AAIC9AAAAvgAAAAAAAIC9AAAAPgAAAAAAAIC9AAAAvgAAAAAAAKC+AAAAPgAAAAAAAKC+AAAAvgAAAD4AAIC9AAAAPgAAAD4AAIC9AAAAvgAAAAAAAIC9AAAAPgAAAAAAAIC9AAAAPgAAAD4AAKC+AAAAvgAAAD4AAKC+AAAAPgAAAAAAAKC+AAAAvgAAAAAAAKC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgBAsD4AAP89AECwPgAAADoAwM8+AAD/PQDAzz4AQIA+AECwPgDAvz4AQLA+AECAPgDAzz4AwL8+AMDPPgCAfz4AwK8+AIAAPgDArz4AgH8+AIBgPgCAAD4AgGA+AMC/PgCAYD4AQIA+AIBgPgDAvz4AwK8+AECAPgDArz4AQMA+AECwPgDA/z4AQLA+AEDAPgDAzz4AwP8+AMDPPgCAAD4AQLA+AIB/PgBAsD4AgAA+AMDPPgCAfz4AwM8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAAAAPQAAAD4AAKA+AAAAPQAAAD4AAIA+AAAAPQAAAAAAAKA+AAAAPQAAAAAAAIA+AAAAvQAAAD4AAIA+AAAAvQAAAD4AAKA+AAAAvQAAAAAAAIA+AAAAvQAAAAAAAKA+AAAAvQAAAD4AAIA+AAAAPQAAAD4AAIA+AAAAvQAAAD4AAKA+AAAAPQAAAD4AAKA+AAAAvQAAAAAAAKA+AAAAPQAAAAAAAKA+AAAAvQAAAAAAAIA+AAAAPQAAAAAAAIA+AAAAvQAAAD4AAKA+AAAAPQAAAD4AAKA+AAAAvQAAAAAAAKA+AAAAPQAAAAAAAKA+AAAAPQAAAD4AAIA+AAAAvQAAAD4AAIA+AAAAPQAAAAAAAIA+AAAAvQAAAAAAAIA+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AEDwPgAAAj0AwP8+AAACPQBA8D4AAL89AMD/PgAAvz0AIAg/AAACPQDgDz8AAAI9ACAIPwAAvz0A4A8/AAC/PQDgBz8AAPw8ACAAPwAA/DwA4Ac/AAAAOgAgAD8AAAA6AOAPPwAAADoAIAg/AAAAOgDgDz8AAPw8ACAIPwAA/DwAIBA/AAACPQDgFz8AAAI9ACAQPwAAvz0A4Bc/AAC/PQAgAD8AAAI9AOAHPwAAAj0AIAA/AAC/PQDgBz8AAL89AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAABgPgAAAD4AAEA+AABgPgAAAD4AAAAAAABgPgAAAAAAAEA+AABgPgAAAAAAAAAAAAAAvQAAAD4AAAAAAAAAvQAAAD4AAEA+AAAAvQAAAAAAAAAAAAAAvQAAAAAAAEA+AAAAvQAAAD4AAAAAAABgPgAAAD4AAAAAAAAAvQAAAD4AAEA+AABgPgAAAD4AAEA+AAAAvQAAAAAAAEA+AABgPgAAAAAAAEA+AAAAvQAAAAAAAAAAAABgPgAAAAAAAAAAAAAAvQAAAD4AAEA+AABgPgAAAD4AAEA+AAAAvQAAAAAAAEA+AABgPgAAAAAAAEA+AABgPgAAAD4AAAAAAAAAvQAAAD4AAAAAAABgPgAAAAAAAAAAAAAAvQAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AEDQPgBA0D4AwP8+AEDQPgBA0D4AwO8+AMD/PgDA7z4AICA/AEDQPgDgNz8AQNA+ACAgPwDA7z4A4Dc/AMDvPgDgHz8AwM8+ACAAPwDAzz4A4B8/AECgPgAgAD8AQKA+AOA/PwBAoD4AICA/AECgPgDgPz8AwM8+ACAgPwDAzz4AIDg/AEDQPgDgVz8AQNA+ACA4PwDA7z4A4Fc/AMDvPgAgAD8AQNA+AOAfPwBA0D4AIAA/AMDvPgDgHz8AwO8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAABgPgAAwD0AABA/AABgPgAAwD0AAKA+AABgPgAAAD0AABA/AABgPgAAAD0AAKA+AADAPQAAwD0AAKA+AADAPQAAwD0AABA/AADAPQAAAD0AAKA+AADAPQAAAD0AABA/AADAPQAAwD0AAKA+AABgPgAAwD0AAKA+AADAPQAAwD0AABA/AABgPgAAwD0AABA/AADAPQAAAD0AABA/AABgPgAAAD0AABA/AADAPQAAAD0AAKA+AABgPgAAAD0AAKA+AADAPQAAwD0AABA/AABgPgAAwD0AABA/AADAPQAAAD0AABA/AABgPgAAAD0AABA/AABgPgAAwD0AAKA+AADAPQAAwD0AAKA+AABgPgAAAD0AAKA+AADAPQAAAD0AAKA+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AECgPgAgGD8AwN8+ACAYPwBAoD4A4B8/AMDfPgDgHz8AIAA/ACAYPwDgHz8AIBg/ACAAPwDgHz8A4B8/AOAfPwDA/z4A4Bc/AEDgPgDgFz8AwP8+AEDwPgBA4D4AQPA+AOAPPwBA8D4AIAA/AEDwPgDgDz8A4Bc/ACAAPwDgFz8AICA/ACAYPwDgLz8AIBg/ACAgPwDgHz8A4C8/AOAfPwBA4D4AIBg/AMD/PgAgGD8AQOA+AOAfPwDA/z4A4B8/AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAMQjQPgAAQD4AAMA+MQjQPgAAQD4AAIA+MQjQPgAAgD0AAMA+MQjQPgAAgD0AAIA+AADQPgAAQD4AAIA+AADQPgAAQD4AAMA+AADQPgAAgD0AAIA+AADQPgAAgD0AAMA+AADQPgAAQD4AAIA+MQjQPgAAQD4AAIA+AADQPgAAQD4AAMA+MQjQPgAAQD4AAMA+AADQPgAAgD0AAMA+MQjQPgAAgD0AAMA+AADQPgAAgD0AAIA+MQjQPgAAgD0AAIA+AADQPgAAQD4AAMA+MQjQPgAAQD4AAMA+AADQPgAAgD0AAMA+MQjQPgAAgD0AAMA+MQjQPgAAQD4AAIA+AADQPgAAQD4AAIA+MQjQPgAAgD0AAIA+AADQPgAAgD0AAIA+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgCAYD4AAH49AIBgPgAAADoAwI8+AAB+PQDAjz4AAIE9AIBgPgAA/z0AgGA+AACBPQDAjz4AAP89AMCPPgAAgT0AgF8+AAB+PQCAXz4AAIE9AIAgPgAAfj0AgCA+AACBPQCAID4AAH49AIAgPgAAgT0AgF8+AAB+PQCAXz4AgAA+AIBgPgAA/z0AgGA+AIAAPgDAjz4AAP89AMCPPgAAgT0AgGA+AAB+PQCAYD4AAIE9AMCPPgAAfj0AwI8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAAAAvQAAAD4AAOA+AAAAvQAAAD4AAIA+AAAAvQAAAAAAAOA+AAAAvQAAAAAAAIA+AACQvgAAAD4AAIA+AACQvgAAAD4AAOA+AACQvgAAAAAAAIA+AACQvgAAAAAAAOA+AACQvgAAAD4AAIA+AAAAvQAAAD4AAIA+AACQvgAAAD4AAOA+AAAAvQAAAD4AAOA+AACQvgAAAAAAAOA+AAAAvQAAAAAAAOA+AACQvgAAAAAAAIA+AAAAvQAAAAAAAIA+AACQvgAAAD4AAOA+AAAAvQAAAD4AAOA+AACQvgAAAAAAAOA+AAAAvQAAAAAAAOA+AAAAvQAAAD4AAIA+AACQvgAAAD4AAIA+AAAAvQAAAAAAAIA+AACQvgAAAAAAAIA+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgAgAD8AAL89ACAAPwAAADoA4A8/AAC/PQDgDz8AgGA+ACAAPwDAnz4AIAA/AIBgPgDgDz8AwJ8+AOAPPwCAXz4AwP8+AADBPQDA/z4AgF8+AEDQPgAAwT0AQNA+AMCvPgBA0D4AgGA+AEDQPgDArz4AwP8+AIBgPgDA/z4AQKA+ACAAPwDA3z4AIAA/AECgPgDgDz8AwN8+AOAPPwAAwT0AIAA/AIBfPgAgAD8AAME9AOAPPwCAXz4A4A8/AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAADAvQAAwD0AABA/AADAvQAAwD0AAKA+AADAvQAAAD0AABA/AADAvQAAAD0AAKA+AABgvgAAwD0AAKA+AABgvgAAwD0AABA/AABgvgAAAD0AAKA+AABgvgAAAD0AABA/AABgvgAAwD0AAKA+AADAvQAAwD0AAKA+AABgvgAAwD0AABA/AADAvQAAwD0AABA/AABgvgAAAD0AABA/AADAvQAAAD0AABA/AABgvgAAAD0AAKA+AADAvQAAAD0AAKA+AABgvgAAwD0AABA/AADAvQAAwD0AABA/AABgvgAAAD0AABA/AADAvQAAAD0AABA/AADAvQAAwD0AAKA+AABgvgAAwD0AAKA+AADAvQAAAD0AAKA+AABgvgAAAD0AAKA+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AEDwPgCAAD4A4Bc/AIAAPgBA8D4AgB8+AOAXPwCAHz4AICg/AIAAPgDgRz8AgAA+ACAoPwCAHz4A4Ec/AIAfPgDgJz8AAP89ACAYPwAA/z0A4Cc/AAAAOgAgGD8AAAA6AOA3PwAAADoAICg/AAAAOgDgNz8AAP89ACAoPwAA/z0AIEg/AIAAPgDgVz8AgAA+ACBIPwCAHz4A4Fc/AIAfPgAgGD8AgAA+AOAnPwCAAD4AIBg/AIAfPgDgJz8AgB8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAz/fPvgAAQD4AAMA+z/fPvgAAQD4AAIA+z/fPvgAAgD0AAMA+z/fPvgAAgD0AAIA+AADQvgAAQD4AAIA+AADQvgAAQD4AAMA+AADQvgAAgD0AAIA+AADQvgAAgD0AAMA+AADQvgAAQD4AAIA+z/fPvgAAQD4AAIA+AADQvgAAQD4AAMA+z/fPvgAAQD4AAMA+AADQvgAAgD0AAMA+z/fPvgAAgD0AAMA+AADQvgAAgD0AAIA+z/fPvgAAgD0AAIA+AADQvgAAQD4AAMA+z/fPvgAAQD4AAMA+AADQvgAAgD0AAMA+z/fPvgAAgD0AAMA+z/fPvgAAQD4AAIA+AADQvgAAQD4AAIA+z/fPvgAAgD0AAIA+AADQvgAAgD0AAIA+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgAAgT0AAH49AACBPQAAADoAAP89AAB+PQAA/z0AAIE9AACBPQAA/z0AAIE9AACBPQAA/z0AAP89AAD/PQAAgT0AAH49AAB+PQAAfj0AAIE9AAAAOgAAfj0AAAA6AACBPQAAADoAAH49AAAAOgAAgT0AAH49AAB+PQAAfj0AgAA+AACBPQAA/z0AAIE9AIAAPgAA/z0AAP89AAD/PQAAgT0AAIE9AAB+PQAAgT0AAIE9AAD/PQAAfj0AAP89AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAACAPgAAwD0AAMC9AACAPgAAwD0AACC+AACAPgAAAD0AAMC9AACAPgAAAD0AACC+AAAAPgAAwD0AACC+AAAAPgAAwD0AAMC9AAAAPgAAAD0AACC+AAAAPgAAAD0AAMC9AAAAPgAAwD0AACC+AACAPgAAwD0AACC+AAAAPgAAwD0AAMC9AACAPgAAwD0AAMC9AAAAPgAAAD0AAMC9AACAPgAAAD0AAMC9AAAAPgAAAD0AACC+AACAPgAAAD0AACC+AAAAPgAAwD0AAMC9AACAPgAAwD0AAMC9AAAAPgAAAD0AAMC9AACAPgAAAD0AAMC9AACAPgAAwD0AACC+AAAAPgAAwD0AACC+AACAPgAAAD0AACC+AAAAPgAAAD0AACC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/ACAIPwBAkD4A4A8/AECQPgAgCD8AwJ8+AOAPPwDAnz4AICA/AECQPgDgJz8AQJA+ACAgPwDAnz4A4Cc/AMCfPgDgHz8AwI8+ACAQPwDAjz4A4B8/AECAPgAgED8AQIA+AOAvPwBAgD4AICA/AECAPgDgLz8AwI8+ACAgPwDAjz4AICg/AECQPgDgNz8AQJA+ACAoPwDAnz4A4Dc/AMCfPgAgED8AQJA+AOAfPwBAkD4AIBA/AMCfPgDgHz8AwJ8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAACQPgAAwD0AAMC9AACQPgAAwD0AACC+AACQPgAAAD0AAMC9AACQPgAAAD0AACC+AABgPgAAwD0AACC+AABgPgAAwD0AAMC9AABgPgAAAD0AACC+AABgPgAAAD0AAMC9AABgPgAAwD0AACC+AACQPgAAwD0AACC+AABgPgAAwD0AAMC9AACQPgAAwD0AAMC9AABgPgAAAD0AAMC9AACQPgAAAD0AAMC9AABgPgAAAD0AACC+AACQPgAAAD0AACC+AABgPgAAwD0AAMC9AACQPgAAwD0AAMC9AABgPgAAAD0AAMC9AACQPgAAAD0AAMC9AACQPgAAwD0AACC+AABgPgAAwD0AACC+AACQPgAAAD0AACC+AABgPgAAAD0AACC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgBAoD4AAPw8AECgPgAAADoAwK8+AAD8PADArz4AAIE9AECgPgAAvz0AQKA+AACBPQDArz4AAL89AMCvPgAAfj0AwJ8+AAACPQDAnz4AAH49AECQPgAAAj0AQJA+AAC/PQBAkD4AAIE9AECQPgAAvz0AwJ8+AACBPQDAnz4AAME9AECgPgAA/z0AQKA+AADBPQDArz4AAP89AMCvPgAAAj0AQKA+AAB+PQBAoD4AAAI9AMCvPgAAfj0AwK8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAACwPsUggD0AAMC9AACwPsUggD0AACC+AACwPgAAgD0AAMC9AACwPgAAgD0AACC+AACQPsUggD0AACC+AACQPsUggD0AAMC9AACQPgAAgD0AACC+AACQPgAAgD0AAMC9AACQPsUggD0AACC+AACwPsUggD0AACC+AACQPsUggD0AAMC9AACwPsUggD0AAMC9AACQPgAAgD0AAMC9AACwPgAAgD0AAMC9AACQPgAAgD0AACC+AACwPgAAgD0AACC+AACQPsUggD0AAMC9AACwPsUggD0AAMC9AACQPgAAgD0AAMC9AACwPgAAgD0AAMC9AACwPsUggD0AACC+AACQPsUggD0AACC+AACwPgAAgD0AACC+AACQPgAAgD0AACC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgCAID4AAPw8AIAgPgAAADoAgB8+AAD8PACAHz4AAIE9AIAgPgAAvz0AgCA+AACBPQCAHz4AAL89AIAfPgAAfj0AgB8+AAACPQCAHz4AAH49AIAAPgAAAj0AgAA+AAC/PQCAAD4AAIE9AIAAPgAAvz0AgB8+AACBPQCAHz4AAME9AIAgPgAA/z0AgCA+AADBPQCAHz4AAP89AIAfPgAAAj0AgCA+AAB+PQCAID4AAAI9AIAfPgAAfj0AgB8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAAAAvgAAwD0AAMC9AAAAvgAAwD0AACC+AAAAvgAAAD0AAMC9AAAAvgAAAD0AACC+AACAvgAAwD0AACC+AACAvgAAwD0AAMC9AACAvgAAAD0AACC+AACAvgAAAD0AAMC9AACAvgAAwD0AACC+AAAAvgAAwD0AACC+AACAvgAAwD0AAMC9AAAAvgAAwD0AAMC9AACAvgAAAD0AAMC9AAAAvgAAAD0AAMC9AACAvgAAAD0AACC+AAAAvgAAAD0AACC+AACAvgAAwD0AAMC9AAAAvgAAwD0AAMC9AACAvgAAAD0AAMC9AAAAvgAAAD0AAMC9AAAAvgAAwD0AACC+AACAvgAAwD0AACC+AAAAvgAAAD0AACC+AACAvgAAAD0AACC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AEDAPgBAgD4AwM8+AECAPgBAwD4AwI8+AMDPPgDAjz4AQPA+AECAPgDA/z4AQIA+AEDwPgDAjz4AwP8+AMCPPgDA7z4AgH8+AEDQPgCAfz4AwO8+AIBgPgBA0D4AgGA+AOAHPwCAYD4AQPA+AIBgPgDgBz8AgH8+AEDwPgCAfz4AIAA/AECAPgDgDz8AQIA+ACAAPwDAjz4A4A8/AMCPPgBA0D4AQIA+AMDvPgBAgD4AQNA+AMCPPgDA7z4AwI8+AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAABgvgAAwD0AAMC9AABgvgAAwD0AACC+AABgvgAAAD0AAMC9AABgvgAAAD0AACC+AACQvgAAwD0AACC+AACQvgAAwD0AAMC9AACQvgAAAD0AACC+AACQvgAAAD0AAMC9AACQvgAAwD0AACC+AABgvgAAwD0AACC+AACQvgAAwD0AAMC9AABgvgAAwD0AAMC9AACQvgAAAD0AAMC9AABgvgAAAD0AAMC9AACQvgAAAD0AACC+AABgvgAAAD0AACC+AACQvgAAwD0AAMC9AABgvgAAwD0AAMC9AACQvgAAAD0AAMC9AABgvgAAAD0AAMC9AABgvgAAwD0AACC+AACQvgAAwD0AACC+AABgvgAAAD0AACC+AACQvgAAAD0AACC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAOgAAAj0AAPw8AAACPQAAADoAAH49AAD8PAAAfj0AAIE9AAACPQAAvz0AAAI9AACBPQAAfj0AAL89AAB+PQAAfj0AAPw8AAACPQAA/DwAAH49AAAAOgAAAj0AAAA6AAC/PQAAADoAAIE9AAAAOgAAvz0AAPw8AACBPQAA/DwAAME9AAACPQAA/z0AAAI9AADBPQAAfj0AAP89AAB+PQAAAj0AAAI9AAB+PQAAAj0AAAI9AAB+PQAAfj0AAH49AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAACQvsUggD0AAMC9AACQvsUggD0AACC+AACQvgAAgD0AAMC9AACQvgAAgD0AACC+AACwvsUggD0AACC+AACwvsUggD0AAMC9AACwvgAAgD0AACC+AACwvgAAgD0AAMC9AACwvsUggD0AACC+AACQvsUggD0AACC+AACwvsUggD0AAMC9AACQvsUggD0AAMC9AACwvgAAgD0AAMC9AACQvgAAgD0AAMC9AACwvgAAgD0AACC+AACQvgAAgD0AACC+AACwvsUggD0AAMC9AACQvsUggD0AAMC9AACwvgAAgD0AAMC9AACQvgAAgD0AAMC9AACQvsUggD0AACC+AACwvsUggD0AACC+AACQvgAAgD0AACC+AACwvgAAgD0AACC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AACBPQAAAj0AAL89AAACPQAAgT0AAPw8AAC/PQAA/DwAgAA+AAACPQCAHz4AAAI9AIAAPgAA/DwAgB8+AAD8PAAA/z0AAPw8AADBPQAA/DwAAP89AAAAOgAAwT0AAAA6AIAfPgAAADoAgAA+AAAAOgCAHz4AAPw8AIAAPgAA/DwAgCA+AAACPQCAPz4AAAI9AIAgPgAA/DwAgD8+AAD8PAAAwT0AAAI9AAD/PQAAAj0AAME9AAD8PAAA/z0AAPw8AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUAAAAAAAAAwD4AAEA/AAAAAAAAAAAAAAAAAACAPxPyhT0AAAAAAAAAAK9zfz8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAwD4AAEA/AAAAAAAAAAAAAAAAAACAPwAAAADug4Q+AAAAAOpGdz8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAwD4AAEA/AAAAAAAAAAAAAAAAAACAPwAAAADug4S+AAAAAOpGdz8AAAAAIbWyvAAAAABn8H8/AAAAAAAAwD4AAEA/AAAAAAAAAAAAAAAAAACAPwAAAACoqAU+AAAAAFXPfT8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAwD4AAEA/AAAAAAAAAAAAAAAAAACAPwAAAACoqAW+AAAAAFXPfT8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAD+rqko/AAAAAAAAAAAAAAAAAACAPwAAAAAhtbI8AAAAAGfwfz8AAAAAx71QPAAAAACu+n8/AAAAAAAAAD+rqko/AAAAAAAAAAAAAAAAAACAPwAAAAAhtbK8AAAAAGfwfz8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAQD8AAMA/AAAAAAAAAAAAAAAAAACAPwAAAAC2frK9AAAAAJ4Gfz8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAQD8AAMA/AAAAAAAAAAAAAAAAAACAPwAAAAC2frI9AAAAAJ4Gfz8AAAAAAAAAAAAAAAAAAIA/AAAAAKioBb4AAAAAAAAAAFXPfT8AAIA+qKgFvgAAAAAAAAAAVc99Pw=="}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[0.15625,0.125,0.25],"min":[-0.15625,0,-0.0625],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[0.62451171875,0.21826171875],"min":[0.00048828125,0.00048828125],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":4,"componentType":5126,"count":24,"max":[0.125,0.125,-0.0625],"min":[-0.125,0,-0.3125],"type":"VEC3"},{"bufferView":5,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":6,"componentType":5126,"count":24,"max":[0.49951171875,0.40576171875],"min":[0.00048828125,0.21923828125],"type":"VEC2"},{"bufferView":7,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":8,"componentType":5126,"count":24,"max":[0.03125,0.125,0.3125],"min":[-0.03125,0,0.25],"type":"VEC3"},{"bufferView":9,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":10,"componentType":5126,"count":24,"max":[0.59326171875,0.09326171875],"min":[0.46923828125,0.00048828125],"type":"VEC2"},{"bufferView":11,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":12,"componentType":5126,"count":24,"max":[0.21875,0.125,0.1875],"min":[-0.03125,0,0],"type":"VEC3"},{"bufferView":13,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":14,"componentType":5126,"count":24,"max":[0.84326171875,0.46826171875],"min":[0.40673828125,0.31298828125],"type":"VEC2"},{"bufferView":15,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":16,"componentType":5126,"count":24,"max":[0.21875,0.09375,0.5625],"min":[0.09375,0.03125,0.3125],"type":"VEC3"},{"bufferView":17,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":18,"componentType":5126,"count":24,"max":[0.68701171875,0.62451171875],"min":[0.31298828125,0.46923828125],"type":"VEC2"},{"bufferView":19,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":20,"componentType":5126,"count":24,"max":[0.406312495470047,0.1875,0.375],"min":[0.40625,0.0625,0.25],"type":"VEC3"},{"bufferView":21,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":22,"componentType":5126,"count":24,"max":[0.12548828125,0.28076171875],"min":[0.00048828125,0.15673828125],"type":"VEC2"},{"bufferView":23,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":24,"componentType":5126,"count":24,"max":[-0.03125,0.125,0.4375],"min":[-0.28125,0,0.25],"type":"VEC3"},{"bufferView":25,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":26,"componentType":5126,"count":24,"max":[0.43701171875,0.56201171875],"min":[0.00048828125,0.40673828125],"type":"VEC2"},{"bufferView":27,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":28,"componentType":5126,"count":24,"max":[-0.09375,0.09375,0.5625],"min":[-0.21875,0.03125,0.3125],"type":"VEC3"},{"bufferView":29,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":30,"componentType":5126,"count":24,"max":[0.84326171875,0.15576171875],"min":[0.46923828125,0.00048828125],"type":"VEC2"},{"bufferView":31,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":32,"componentType":5126,"count":24,"max":[-0.406187504529953,0.1875,0.375],"min":[-0.40625,0.0625,0.25],"type":"VEC3"},{"bufferView":33,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":34,"componentType":5126,"count":24,"max":[0.12548828125,0.12451171875],"min":[0.00048828125,0.00048828125],"type":"VEC2"},{"bufferView":35,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":36,"componentType":5126,"count":24,"max":[0.25,0.09375,-0.09375],"min":[0.125,0.03125,-0.15625],"type":"VEC3"},{"bufferView":37,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":38,"componentType":5126,"count":24,"max":[0.71826171875,0.31201171875],"min":[0.53173828125,0.25048828125],"type":"VEC2"},{"bufferView":39,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":40,"componentType":5126,"count":24,"max":[0.28125,0.09375,-0.09375],"min":[0.21875,0.03125,-0.15625],"type":"VEC3"},{"bufferView":41,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":42,"componentType":5126,"count":24,"max":[0.12451171875,0.34326171875],"min":[0.00048828125,0.28173828125],"type":"VEC2"},{"bufferView":43,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":44,"componentType":5126,"count":24,"max":[0.34375,0.0625625029206276,-0.09375],"min":[0.28125,0.0625,-0.15625],"type":"VEC3"},{"bufferView":45,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":46,"componentType":5126,"count":24,"max":[0.12451171875,0.15673828125],"min":[0.00048828125,0.12548828125],"type":"VEC2"},{"bufferView":47,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":48,"componentType":5126,"count":24,"max":[-0.125,0.09375,-0.09375],"min":[-0.25,0.03125,-0.15625],"type":"VEC3"},{"bufferView":49,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":50,"componentType":5126,"count":24,"max":[0.56201171875,0.28076171875],"min":[0.37548828125,0.21923828125],"type":"VEC2"},{"bufferView":51,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":52,"componentType":5126,"count":24,"max":[-0.21875,0.09375,-0.09375],"min":[-0.28125,0.03125,-0.15625],"type":"VEC3"},{"bufferView":53,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":54,"componentType":5126,"count":24,"max":[0.12451171875,0.06201171875],"min":[0.00048828125,0.00048828125],"type":"VEC2"},{"bufferView":55,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":56,"componentType":5126,"count":24,"max":[-0.28125,0.0625625029206276,-0.09375],"min":[-0.34375,0.0625,-0.15625],"type":"VEC3"},{"bufferView":57,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":58,"componentType":5126,"count":24,"max":[0.18701171875,0.03173828125],"min":[0.06298828125,0.00048828125],"type":"VEC2"},{"bufferView":59,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":60,"componentType":5126,"count":3,"max":[0.75],"min":[0],"type":"SCALAR"},{"bufferView":61,"componentType":5126,"count":3,"max":[0.06540312618017197,0,0,1],"min":[0,0,0,0.9978589415550232],"type":"VEC4"},{"bufferView":62,"componentType":5126,"count":3,"max":[0.75],"min":[0],"type":"SCALAR"},{"bufferView":63,"componentType":5126,"count":3,"max":[0,0.258819043636322,0,1],"min":[0,0,0,0.9659258127212524],"type":"VEC4"},{"bufferView":64,"componentType":5126,"count":3,"max":[0.75],"min":[0],"type":"SCALAR"},{"bufferView":65,"componentType":5126,"count":3,"max":[0,0,0,1],"min":[0,-0.258819043636322,0,0.9659258127212524],"type":"VEC4"},{"bufferView":66,"componentType":5126,"count":3,"max":[0.75],"min":[0],"type":"SCALAR"},{"bufferView":67,"componentType":5126,"count":3,"max":[0,0.13052618503570557,0,1],"min":[0,0,0,0.9914448857307434],"type":"VEC4"},{"bufferView":68,"componentType":5126,"count":3,"max":[0.75],"min":[0],"type":"SCALAR"},{"bufferView":69,"componentType":5126,"count":3,"max":[0,0,0,1],"min":[0,-0.13052618503570557,0,0.9914448857307434],"type":"VEC4"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":1,"baseColorTexture":{"index":0}},"alphaMode":"MASK","alphaCutoff":0.05,"doubleSided":true}],"textures":[{"sampler":0}],"samplers":[{"magFilter":9728,"minFilter":9728,"wrapS":33071,"wrapT":33071}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":4,"NORMAL":5,"TEXCOORD_0":6},"indices":7,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":8,"NORMAL":9,"TEXCOORD_0":10},"indices":11,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":12,"NORMAL":13,"TEXCOORD_0":14},"indices":15,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":16,"NORMAL":17,"TEXCOORD_0":18},"indices":19,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":20,"NORMAL":21,"TEXCOORD_0":22},"indices":23,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":24,"NORMAL":25,"TEXCOORD_0":26},"indices":27,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":28,"NORMAL":29,"TEXCOORD_0":30},"indices":31,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":32,"NORMAL":33,"TEXCOORD_0":34},"indices":35,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":36,"NORMAL":37,"TEXCOORD_0":38},"indices":39,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":40,"NORMAL":41,"TEXCOORD_0":42},"indices":43,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":44,"NORMAL":45,"TEXCOORD_0":46},"indices":47,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":48,"NORMAL":49,"TEXCOORD_0":50},"indices":51,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":52,"NORMAL":53,"TEXCOORD_0":54},"indices":55,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":56,"NORMAL":57,"TEXCOORD_0":58},"indices":59,"material":0}]}],"animations":[{"name":"animation.model.walk","samplers":[{"input":60,"output":61,"interpolation":"LINEAR"},{"input":62,"output":63,"interpolation":"LINEAR"},{"input":64,"output":65,"interpolation":"LINEAR"},{"input":66,"output":67,"interpolation":"LINEAR"},{"input":68,"output":69,"interpolation":"LINEAR"}],"channels":[{"sampler":0,"target":{"node":3,"path":"rotation"}},{"sampler":1,"target":{"node":7,"path":"rotation"}},{"sampler":2,"target":{"node":11,"path":"rotation"}},{"sampler":3,"target":{"node":15,"path":"rotation"}},{"sampler":4,"target":{"node":19,"path":"rotation"}}]}]} \ No newline at end of file diff --git a/data/games/garage/mods/gltf/models/gltf_minimal_triangle.gltf b/data/games/garage/mods/gltf/models/gltf_minimal_triangle.gltf deleted file mode 100644 index 9a624f0..0000000 --- a/data/games/garage/mods/gltf/models/gltf_minimal_triangle.gltf +++ /dev/null @@ -1 +0,0 @@ -{"scene":0,"scenes":[{"nodes":[0]}],"nodes":[{"mesh":0}],"meshes":[{"primitives":[{"attributes":{"POSITION":1},"indices":0}]}],"buffers":[{"uri":"data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=","byteLength":44}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":6,"target":34963},{"buffer":0,"byteOffset":8,"byteLength":36,"target":34962}],"accessors":[{"bufferView":0,"byteOffset":0,"componentType":5123,"count":3,"type":"SCALAR","max":[2],"min":[0]},{"bufferView":1,"byteOffset":0,"componentType":5126,"count":3,"type":"VEC3","max":[1,1,0],"min":[0,0,0]}],"asset":{"version":"2.0"}} diff --git a/data/games/garage/mods/gltf/models/gltf_simple_skin.gltf b/data/games/garage/mods/gltf/models/gltf_simple_skin.gltf deleted file mode 100644 index 3d6c24a..0000000 --- a/data/games/garage/mods/gltf/models/gltf_simple_skin.gltf +++ /dev/null @@ -1 +0,0 @@ -{"scene":0,"scenes":[{"nodes":[0,1]}],"nodes":[{"skin":0,"mesh":0},{"children":[2]},{"translation":[0.0,1.0,0.0],"rotation":[0.0,0.0,0.0,1.0]}],"meshes":[{"primitives":[{"attributes":{"POSITION":1,"JOINTS_0":2,"WEIGHTS_0":3},"indices":0}]}],"skins":[{"inverseBindMatrices":4,"joints":[1,2]}],"animations":[{"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}],"samplers":[{"input":5,"interpolation":"LINEAR","output":6}]}],"buffers":[{"uri":"data:application/gltf-buffer;base64,AAABAAMAAAADAAIAAgADAAUAAgAFAAQABAAFAAcABAAHAAYABgAHAAkABgAJAAgAAAAAvwAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAvwAAAD8AAAAAAAAAPwAAAD8AAAAAAAAAvwAAgD8AAAAAAAAAPwAAgD8AAAAAAAAAvwAAwD8AAAAAAAAAPwAAwD8AAAAAAAAAvwAAAEAAAAAAAAAAPwAAAEAAAAAA","byteLength":168},{"uri":"data:application/gltf-buffer;base64,AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAABAPwAAgD4AAAAAAAAAAAAAQD8AAIA+AAAAAAAAAAAAAAA/AAAAPwAAAAAAAAAAAAAAPwAAAD8AAAAAAAAAAAAAgD4AAEA/AAAAAAAAAAAAAIA+AABAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAA=","byteLength":320},{"uri":"data:application/gltf-buffer;base64,AACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAAAAAACAPwAAgD8AAAAAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAgD8=","byteLength":128},{"uri":"data:application/gltf-buffer;base64,AAAAAAAAAD8AAIA/AADAPwAAAEAAACBAAABAQAAAYEAAAIBAAACQQAAAoEAAALBAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAPT9ND/0/TQ/AAAAAAAAAAD0/TQ/9P00PwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAPT9NL/0/TQ/AAAAAAAAAAD0/TS/9P00PwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAAAAAAAAAIA/","byteLength":240}],"bufferViews":[{"buffer":0,"byteLength":48,"target":34963},{"buffer":0,"byteOffset":48,"byteLength":120,"target":34962},{"buffer":1,"byteLength":320,"byteStride":16},{"buffer":2,"byteLength":128},{"buffer":3,"byteLength":240}],"accessors":[{"bufferView":0,"componentType":5123,"count":24,"type":"SCALAR"},{"bufferView":1,"componentType":5126,"count":10,"type":"VEC3","max":[0.5,2.0,0.0],"min":[-0.5,0.0,0.0]},{"bufferView":2,"componentType":5123,"count":10,"type":"VEC4"},{"bufferView":2,"byteOffset":160,"componentType":5126,"count":10,"type":"VEC4"},{"bufferView":3,"componentType":5126,"count":2,"type":"MAT4"},{"bufferView":4,"componentType":5126,"count":12,"type":"SCALAR","max":[5.5],"min":[0.0]},{"bufferView":4,"byteOffset":48,"componentType":5126,"count":12,"type":"VEC4","max":[0.0,0.0,0.707,1.0],"min":[0.0,0.0,-0.707,0.707]}],"asset":{"version":"2.0"}} diff --git a/data/games/garage/mods/gltf/models/gltf_simple_sparse_accessor.gltf b/data/games/garage/mods/gltf/models/gltf_simple_sparse_accessor.gltf deleted file mode 100644 index 9798968..0000000 --- a/data/games/garage/mods/gltf/models/gltf_simple_sparse_accessor.gltf +++ /dev/null @@ -1 +0,0 @@ -{"scene":0,"scenes":[{"nodes":[0]}],"nodes":[{"mesh":0}],"meshes":[{"primitives":[{"attributes":{"POSITION":1},"indices":0}]}],"buffers":[{"uri":"data:application/gltf-buffer;base64,AAAIAAcAAAABAAgAAQAJAAgAAQACAAkAAgAKAAkAAgADAAoAAwALAAoAAwAEAAsABAAMAAsABAAFAAwABQANAAwABQAGAA0AAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAQAAAAAAAAAAAAABAQAAAAAAAAAAAAACAQAAAAAAAAAAAAACgQAAAAAAAAAAAAADAQAAAAAAAAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAAAAQAAAgD8AAAAAAABAQAAAgD8AAAAAAACAQAAAgD8AAAAAAACgQAAAgD8AAAAAAADAQAAAgD8AAAAACAAKAAwAAAAAAIA/AAAAQAAAAAAAAEBAAABAQAAAAAAAAKBAAACAQAAAAAA=","byteLength":284}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":72,"byteLength":168},{"buffer":0,"byteOffset":240,"byteLength":6},{"buffer":0,"byteOffset":248,"byteLength":36}],"accessors":[{"bufferView":0,"byteOffset":0,"componentType":5123,"count":36,"type":"SCALAR","max":[13],"min":[0]},{"bufferView":1,"byteOffset":0,"componentType":5126,"count":14,"type":"VEC3","max":[6,4,0],"min":[0,0,0],"sparse":{"count":3,"indices":{"bufferView":2,"byteOffset":0,"componentType":5123},"values":{"bufferView":3,"byteOffset":0}}}],"asset":{"version":"2.0"}} diff --git a/data/games/garage/mods/gltf/models/gltf_snow_man.gltf b/data/games/garage/mods/gltf/models/gltf_snow_man.gltf deleted file mode 100644 index cd8c347..0000000 --- a/data/games/garage/mods/gltf/models/gltf_snow_man.gltf +++ /dev/null @@ -1 +0,0 @@ -{"asset":{"version":"2.0","generator":"Blockbench 4.6.0 glTF exporter"},"scenes":[{"nodes":[3],"name":"blockbench_export"}],"scene":0,"nodes":[{"name":"cube","mesh":0},{"name":"cube","mesh":1},{"name":"cube","mesh":2},{"children":[0,1,2]}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":840,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":1128,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":1416,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":1608,"byteLength":72,"target":34963},{"buffer":0,"byteOffset":1680,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":1968,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":2256,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":2448,"byteLength":72,"target":34963}],"buffers":[{"byteLength":2520,"uri":"data:application/octet-stream;base64,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"}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[3,24,3],"min":[-3,18,-3],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[0.8333333134651184,1],"min":[0,0.25],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":4,"componentType":5126,"count":24,"max":[5,10,5],"min":[-5,0,-5],"type":"VEC3"},{"bufferView":5,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":6,"componentType":5126,"count":24,"max":[0.625,1],"min":[0,0.375],"type":"VEC2"},{"bufferView":7,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"},{"bufferView":8,"componentType":5126,"count":24,"max":[4,18,4],"min":[-4,10,-4],"type":"VEC3"},{"bufferView":9,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":10,"componentType":5126,"count":24,"max":[0.7083333134651184,0.7916666865348816],"min":[0.2083333283662796,0.25],"type":"VEC2"},{"bufferView":11,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":1,"baseColorTexture":{"index":0,"texCoord":0}},"alphaMode":"MASK","alphaCutoff":0.05,"doubleSided":true}],"textures":[{}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":4,"NORMAL":5,"TEXCOORD_0":6},"indices":7,"material":0}]},{"primitives":[{"mode":4,"attributes":{"POSITION":8,"NORMAL":9,"TEXCOORD_0":10},"indices":11,"material":0}]}]} diff --git a/data/games/garage/mods/gltf/models/gltf_spider.gltf b/data/games/garage/mods/gltf/models/gltf_spider.gltf deleted file mode 100644 index 6698b6b..0000000 --- a/data/games/garage/mods/gltf/models/gltf_spider.gltf +++ /dev/null @@ -1 +0,0 @@ -{"asset":{"generator":"Khronos glTF Blender I/O v1.7.33","version":"2.0"},"scene":0,"scenes":[{"name":"Scene","nodes":[0]}],"nodes":[{"mesh":0,"name":"Spider"}],"materials":[{"doubleSided":true,"name":"Material.001","pbrMetallicRoughness":{}}],"meshes":[{"name":"Cube","primitives":[{"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]}],"accessors":[{"bufferView":0,"componentType":5126,"count":1000,"max":[2.742279291152954,1.4045029878616333,2.0192716121673584],"min":[-2.742279291152954,-0.6434623599052429,-3.534085512161255],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":1000,"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":1000,"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":1500,"type":"SCALAR"}],"bufferViews":[{"buffer":0,"byteLength":12000,"byteOffset":0},{"buffer":0,"byteLength":12000,"byteOffset":12000},{"buffer":0,"byteLength":8000,"byteOffset":24000},{"buffer":0,"byteLength":3000,"byteOffset":32000}],"buffers":[{"byteLength":35000,"uri":"data:application/octet-stream;base64,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dQCGAHUAgACIAIsAkQCIAJEAjgCQAJIAnQCQAJ0AmwCcAJ8AmQCcAJkAlgCVAJcAjACVAIwAigCPAJoAlACPAJQAiQCeAJMAjQCeAI0AmACiAKgAqwCiAKsApQCnALQAtwCnALcAqgCyAKwArwCyAK8AtQCtAKAAowCtAKMAsACmAKEArgCmAK4AswC2ALEApAC2AKQAqQC6AMAAwwC6AMMAvQC/AMwAzgC/AM4AwQDKAMQAxwDKAMcAzQDGALkAuwDGALsAyAC+ALgAxQC+AMUAywDPAMkAvADPALwAwgDSANgA2wDSANsA1QDXAOQA5gDXAOYA2QDiANwA3wDiAN8A5QDeANEA0wDeANMA4ADWANAA3QDWAN0A4wDnAOEA1ADnANQA2gDpAOsA8QDpAPEA7wDwAPIA/QDwAP0A+wD8AP4A+AD8APgA9gD1APcA7AD1AOwA6gDuAPoA9ADuAPQA6AD/APMA7QD/AO0A+QAAAQMBCQEAAQkBBgEHAQoBFQEHARUBEgEUARcBEQEUAREBDgENARABBQENAQUBAgEIARMBDAEIAQwBAQEWAQsBBAEWAQQBDwEpAR0BIwEpASMBLwEoASYBGQEoARkBGwEtASsBJQEtASUBJwEhAR8BLAEhASwBLgEYASQBKgEYASoBHgEcARoBIAEcASABIgExATMBOgExAToBOAE3ATkBRQE3AUUBQwFEAUYBPwFEAT8BPQE+AUABNAE+ATQBMgE2AUIBPAE2ATwBMAFHATsBNQFHATUBQQFJAUsBUQFJAVEBTwFQAVIBXQFQAV0BWwFcAV4BWAFcAVgBVgFVAVcBTAFVAUwBSgFOAVoBVAFOAVQBSAFfAVMBTQFfAU0BWQFgAWMBaQFgAWkBZgFoAWoBdQFoAXUBcwF0AXcBcQF0AXEBbgFtAW8BZAFtAWQBYgFnAXIBbAFnAWwBYQF2AWsBZQF2AWUBcAGJAX0BgwGJAYMBjwGIAYYBeQGIAXkBewGNAYsBhQGNAYUBhwGBAX8BjAGBAYwBjgF4AYQBigF4AYoBfgF8AXoBgAF8AYABggGRAZMBmQGRAZkBlwGYAZoBpQGYAaUBowGkAaYBoAGkAaABngGdAZ8BlAGdAZQBkgGWAaIBnAGWAZwBkAGnAZsBlQGnAZUBoQGpAasBsQGpAbEBrwGwAbIBvQGwAb0BuwG8Ab4BuAG8AbgBtgG1AbcBrAG1AawBqgGuAboBtAGuAbQBqAG/AbMBrQG/Aa0BuQHAAcMByQHAAckBxgHIAcoB1QHIAdUB0wHUAdcB0QHUAdEBzgHNAc8BxAHNAcQBwgHHAdIBzAHHAcwBwQHWAcsBxQHWAcUB0AHpAd0B4wHpAeMB7wHoAeYB2QHoAdkB2wHtAesB5QHtAeUB5wHhAd8B7AHhAewB7gHYAeQB6gHYAeoB3gHcAdoB4AHcAeAB4gHxAfMB+QHxAfkB9wH4AfoBBQL4AQUCAwIEAgYCAAIEAgAC/gH9Af8B9AH9AfQB8gH2AQIC/AH2AfwB8AEHAvsB9QEHAvUBAQIJAgsCEQIJAhECDwIQAhICHQIQAh0CGwIcAh4CGAIcAhgCFgIVAhcCDAIVAgwCCgIOAhoCFAIOAhQCCAIfAhMCDQIfAg0CGQIgAiMCKQIgAikCJgIoAisCNgIoAjYCMwI0AjcCMQI0AjECLgIsAi8CJAIsAiQCIQInAjICLQInAi0CIgI1AioCJQI1AiUCMAJJAj0CQwJJAkMCTwJIAkYCOQJIAjkCOwJNAksCRQJNAkUCRwJBAj8CTAJBAkwCTgI4AkQCSgI4AkoCPgI8AjoCQAI8AkACQgJSAlQCWQJSAlkCVwJYAloCZgJYAmYCZAJjAmUCYAJjAmACXgJdAl8CUwJdAlMCUQJWAmICXAJWAlwCUAJnAlsCVQJnAlUCYQJpAm8CcwJpAnMCbQJuAnsCfwJuAn8CcgJ6AnQCeAJ6AngCfgJ1AmgCbAJ1AmwCeQJwAmoCdgJwAnYCfAJ9AncCawJ9AmsCcQKCAogCiwKCAosChQKHApQClwKHApcCigKSAowCjwKSAo8ClQKNAoACgwKNAoMCkAKGAoECjgKGAo4CkwKWApEChAKWAoQCiQKnAq0CoQKnAqECmwKoAp0CmQKoApkCpAKvAqkCpQKvAqUCqwKjAq4CqgKjAqoCnwKaAqACrAKaAqwCpgKcAqICngKcAp4CmAKxArYCugKxAroCtQK3AsMCxwK3AscCuwLCAr0CwQLCAsECxgK8ArACtAK8ArQCwAK4ArICvgK4Ar4CxALFAr8CswLFArMCuQLJAs8C0wLJAtMCzQLOAtsC3wLOAt8C0gLaAtQC2ALaAtgC3gLVAsgCzALVAswC2QLQAsoC1gLQAtYC3ALdAtcCywLdAssC0QLiAugC6wLiAusC5QLmAvMC9wLmAvcC6gLyAuwC7wLyAu8C9QLtAuAC5ALtAuQC8QLnAuEC7gLnAu4C9AL2AvAC4wL2AuMC6QIHAw0DAQMHAwED+wIIA/0C+QIIA/kCBAMPAwkDBQMPAwUDCwMDAw4DCgMDAwoD/wL6AgADDAP6AgwDBgP8AgID/gL8Av4C+AIRAxcDGwMRAxsDFQMWAyMDJwMWAycDGgMiAxwDIAMiAyADJgMdAxADFAMdAxQDIQMYAxIDHgMYAx4DJAMlAx8DEwMlAxMDGQMpAy8DMwMpAzMDLQMuAzsDPwMuAz8DMgM6AzQDOAM6AzgDPgM1AygDLAM1AywDOQMwAyoDNgMwAzYDPAM9AzcDKwM9AysDMQNCA0gDSwNCA0sDRQNGA1MDVwNGA1cDSgNSA0wDTwNSA08DVQNNA0ADRANNA0QDUQNHA0EDTgNHA04DVANWA1ADQwNWA0MDSQNnA20DYQNnA2EDWwNoA10DWQNoA1kDZANvA2kDZQNvA2UDawNjA24DagNjA2oDXwNaA2ADbANaA2wDZgNcA2IDXgNcA14DWANxA3cDewNxA3sDdQN2A4MDhwN2A4cDegOCA3wDgAOCA4ADhgN9A3ADdAN9A3QDgQN4A3IDfgN4A34DhAOFA38DcwOFA3MDeQOJA48DkwOJA5MDjQOOA5sDnwOOA58DkgOaA5QDmAOaA5gDngOVA4gDjAOVA4wDmQOQA4oDlgOQA5YDnAOdA5cDiwOdA4sDkQOiA6gDqwOiA6sDpQOmA7MDtgOmA7YDqQOyA6wDrwOyA68DtQOuA6EDpAOuA6QDsQOnA6ADrQOnA60DtAO3A7ADowO3A6MDqgPHA80DwQPHA8EDuwPIA70DuQPIA7kDxAPPA8kDxQPPA8UDywPDA84DygPDA8oDvwO6A8ADzAO6A8wDxgO8A8IDvgO8A74DuAPQA9cD2wPQA9sD1APWA+ID5gPWA+YD2gPjA9wD4APjA+AD5wPdA9ED1QPdA9UD4QPYA9ID3gPYA94D5APlA98D0wPlA9MD2QM="}]} diff --git a/data/games/garage/mods/gltf/models/gltf_spider_animated.gltf b/data/games/garage/mods/gltf/models/gltf_spider_animated.gltf deleted file mode 100644 index 79221b0..0000000 --- a/data/games/garage/mods/gltf/models/gltf_spider_animated.gltf +++ /dev/null @@ -1 +0,0 @@ -{"asset":{"generator":"Khronos glTF Blender I/O v1.7.33","version":"2.0"},"scene":0,"scenes":[{"name":"Scene","nodes":[58]}],"nodes":[{"name":"Pincer.L","rotation":[0.03853772580623627,0.09671717882156372,0.5138389468193054,0.8515457510948181],"translation":[-2.2351741790771484e-08,0.2836739718914032,-2.2351741790771484e-08]},{"children":[0],"name":"JawBase.L","rotation":[-0.23922589421272278,-9.208349638356594e-08,-0.38811206817626953,0.8900224566459656],"scale":[1,1,0.9999999403953552],"translation":[8.097286041675034e-08,0.7702280879020691,-1.169656727029178e-07]},{"name":"Pincer.R","rotation":[0.038537755608558655,-0.09671713411808014,-0.5138388872146606,0.8515458106994629],"scale":[0.9999997615814209,0.9999999403953552,1],"translation":[2.9802322387695312e-08,0.2836737036705017,-2.9802322387695312e-08]},{"children":[2],"name":"JawBase.R","rotation":[-0.2392251342535019,1.9714243535418063e-06,0.3881126046180725,0.8900225758552551],"translation":[1.3833086898173974e-09,0.7702280282974243,-6.620245329713725e-08]},{"children":[1,3],"name":"Head","rotation":[0.4052415192127228,-3.4197712478652165e-13,-8.695541282577324e-07,0.9142096638679504],"translation":[-2.0781445141115906e-16,0.6883190274238586,-1.4901161193847656e-08]},{"children":[4],"name":"NeckBase","rotation":[-0.778048574924469,7.488795716881214e-08,1.7622618315726868e-06,0.6282041072845459],"translation":[-3.399441372928941e-14,0.3915250301361084,-2.3283064365386963e-09]},{"name":"Body.002","rotation":[0.17414046823978424,0,-4.151832513343834e-07,0.9847208261489868],"translation":[5.897654597759178e-14,1.0079095363616943,-1.2134763416327132e-08]},{"children":[6],"name":"Body.001","rotation":[0.6673352122306824,-7.632472941426077e-14,-1.5910509318928234e-06,0.7447575330734253],"scale":[1,0.9999999403953552,0.9999999403953552],"translation":[-3.962037268363458e-15,0.3915250301361084,-3.1428597502269895e-09]},{"name":"Leg4Fore.L","rotation":[-0.021953541785478592,0.030033688992261887,-0.4378480017185211,0.8982790112495422],"scale":[1,0.9999998211860657,1.0000001192092896],"translation":[1.9202238377147296e-07,0.8228543996810913,-1.749940707895803e-07]},{"children":[8],"name":"Leg4Lower.L","rotation":[-0.11090508848428726,0.11991499364376068,-0.48737218976020813,0.8577813506126404],"scale":[0.9999995231628418,0.9999997615814209,1.000000238418579],"translation":[1.9631791303709178e-07,0.8208085298538208,-4.769351491518137e-08]},{"children":[9],"name":"Leg4Mid.L","rotation":[-0.21032677590847015,0.09273893386125565,-0.42330121994018555,0.8763437271118164],"scale":[1,0.9999996423721313,0.999999463558197],"translation":[-1.720833893159579e-07,1.5146127939224243,1.4611718768264836e-07]},{"children":[10],"name":"Leg4Upper.L","rotation":[0.581340491771698,-0.03387186676263809,0.4926694631576538,0.6466628909111023],"scale":[1.0000003576278687,1.000000238418579,1.0000003576278687],"translation":[-2.6137989550534257e-09,0.8996680974960327,-2.8558396536482178e-08]},{"children":[11],"name":"Leg4Base.L","rotation":[0.4988132119178772,0.67340087890625,0.0026363276410847902,0.5456278324127197],"scale":[0.9999998807907104,0.9999998807907104,0.9999999403953552],"translation":[6.932457941033476e-10,0.3915250301361084,-7.783789612858527e-09]},{"name":"Leg3Fore.L","rotation":[-0.040254246443510056,0.0051941643469035625,-0.3734953701496124,0.9267436861991882],"scale":[1.0000001192092896,1,1.0000003576278687],"translation":[-7.186849302343035e-07,0.761729896068573,1.4940267689667053e-08]},{"children":[13],"name":"Leg3Lower.L","rotation":[-0.02293548174202442,0.03108014352619648,-0.5376279950141907,0.8422969579696655],"scale":[1,0.9999998807907104,1],"translation":[2.6879865799855907e-07,0.890315592288971,-2.3254589365251377e-08]},{"children":[14],"name":"Leg3Mid.L","rotation":[-0.10393687337636948,0.026799378916621208,-0.47722530364990234,0.8722012042999268],"scale":[1,1.0000001192092896,1],"translation":[-4.5783519908582093e-07,1.5058820247650146,6.428529530921878e-08]},{"children":[15],"name":"Leg3Upper.L","rotation":[0.22388437390327454,0.00046301534166559577,0.7424523234367371,0.6313795447349548],"scale":[0.9999996423721313,0.9999999403953552,0.9999995231628418],"translation":[8.173065424443848e-08,0.8363674879074097,-3.891337030381692e-09]},{"children":[16],"name":"Leg3Base.L","rotation":[0.48101410269737244,0.8565962910652161,-0.006458853371441364,0.18661867082118988],"scale":[0.9999999403953552,0.9999998807907104,0.9999999403953552],"translation":[1.1383551878907383e-08,0.3915250301361084,2.5693926986036786e-09]},{"name":"Leg2Fore.L","rotation":[0.04987334460020065,-0.01207074522972107,-0.4028705060482025,0.9138174653053284],"scale":[0.999999463558197,1.0000004768371582,1.0000001192092896],"translation":[2.9161077463868423e-07,0.7777483463287354,1.7455030842938868e-07]},{"children":[18],"name":"Leg2Lower.L","rotation":[0.08352424204349518,-0.04269447177648544,-0.518085777759552,0.8501694202423096],"scale":[1.0000001192092896,1.0000004768371582,1.0000004768371582],"translation":[-1.5067358560827415e-07,0.9397417306900024,-4.163759115272114e-08]},{"children":[19],"name":"Leg2Mid.L","rotation":[0.14706559479236603,-0.028868243098258972,-0.47296836972236633,0.868239164352417],"scale":[1.0000004768371582,0.9999999403953552,0.9999999403953552],"translation":[-2.2217867012841452e-07,1.5058820247650146,-6.989571943449846e-08]},{"children":[20],"name":"Leg2Upper.L","rotation":[-0.42424774169921875,-0.0005238422891125083,0.6472405791282654,0.6333192586898804],"scale":[1.000000238418579,1.0000003576278687,1.0000005960464478],"translation":[9.311328597050306e-08,0.881853461265564,-1.8038990745594674e-08]},{"children":[21],"name":"Leg2Base.L","rotation":[-0.4972459375858307,-0.7882749438285828,0.006057440303266048,0.362398236989975],"scale":[0.9999997615814209,0.9999998807907104,0.9999999403953552],"translation":[7.375939858889069e-10,0.3915250301361084,4.028271050060539e-09]},{"name":"Leg1Fore.L","rotation":[-0.01934647001326084,-0.04218549281358719,-0.4403696358203888,0.8966162800788879],"scale":[1,1,0.9999997615814209],"translation":[2.0805721590022586e-07,0.815664529800415,4.0515438115562574e-08]},{"children":[23],"name":"Leg1Lower.L","rotation":[0.15678077936172485,-0.1661715805530548,-0.47995010018348694,0.8470270037651062],"scale":[0.999999463558197,1,0.9999999403953552],"translation":[3.670676562705921e-08,0.8788074851036072,8.29251618483795e-08]},{"children":[24],"name":"Leg1Mid.L","rotation":[0.26206591725349426,-0.11672191321849823,-0.4046621024608612,0.8683006763458252],"scale":[1.0000001192092896,0.9999999403953552,0.9999995231628418],"translation":[3.601947184961318e-08,1.5125981569290161,-1.6144279868512967e-07]},{"children":[25],"name":"Leg1Upper.L","rotation":[-0.62815922498703,0.04343283176422119,0.39305803179740906,0.6701006889343262],"translation":[-1.0171092412747385e-07,1.043814778327942,1.114601104745816e-07]},{"children":[26],"name":"Leg1Base.L","rotation":[-0.536352813243866,-0.596045732498169,-0.006935927551239729,0.5975006818771362],"scale":[0.9999998211860657,0.9999998211860657,1],"translation":[7.451212979958655e-09,0.3915250301361084,-5.977072614626877e-09]},{"name":"Leg4Fore.R","rotation":[-0.0219536405056715,-0.030033595860004425,0.43784812092781067,0.8982789516448975],"scale":[1.000000238418579,0.9999998807907104,1.0000001192092896],"translation":[4.575199454848189e-07,0.82285475730896,1.3987688873839943e-07]},{"children":[28],"name":"Leg4Lower.R","rotation":[-0.11090517044067383,-0.11991491913795471,0.48737218976020813,0.8577813506126404],"scale":[1.0000001192092896,0.9999999403953552,1.0000001192092896],"translation":[5.0247152216797986e-08,0.8208085894584656,1.2523592829438712e-07]},{"children":[29],"name":"Leg4Mid.R","rotation":[-0.21032673120498657,-0.09273889660835266,0.42330119013786316,0.876343846321106],"scale":[0.9999998211860657,0.9999995231628418,1.0000001192092896],"translation":[-1.2884336797469587e-07,1.514613151550293,6.563716681284859e-08]},{"children":[30],"name":"Leg4Upper.R","rotation":[0.5813404321670532,0.03387187048792839,-0.4926694333553314,0.6466629505157471],"scale":[1,1.000000238418579,0.9999997019767761],"translation":[-3.940737158814045e-08,0.8996680974960327,1.9567494291550247e-09]},{"children":[31],"name":"Leg4Base.R","rotation":[0.4988132119178772,-0.6733996272087097,-0.0026374668814241886,0.5456294417381287],"scale":[1,1.0000001192092896,1],"translation":[-1.1682686817948706e-08,0.3915250301361084,-1.3812247345867945e-08]},{"name":"Leg3Fore.R","rotation":[-0.04025428742170334,-0.005194155499339104,0.3734953999519348,0.9267436861991882],"scale":[0.9999998211860657,1.0000001192092896,1.0000001192092896],"translation":[-7.285660217348777e-07,0.7617300748825073,-4.0205627271916455e-08]},{"children":[33],"name":"Leg3Lower.R","rotation":[-0.02293553575873375,-0.03108006715774536,0.5376282930374146,0.8422967791557312],"scale":[1.0000001192092896,0.9999996423721313,0.9999999403953552],"translation":[7.143101754536474e-08,0.8903149366378784,6.888667769544554e-08]},{"children":[34],"name":"Leg3Mid.R","rotation":[-0.10393673926591873,-0.026799339801073074,0.47722548246383667,0.872201144695282],"scale":[1.0000003576278687,0.9999998807907104,0.9999998807907104],"translation":[1.4287303429227904e-07,1.5058823823928833,9.578651827268914e-08]},{"children":[35],"name":"Leg3Upper.R","rotation":[0.2238844484090805,-0.00046323961578309536,-0.7424524426460266,0.6313793659210205],"scale":[1.0000001192092896,1.0000005960464478,0.9999997615814209],"translation":[-2.9145089897042453e-08,0.8363675475120544,-1.3412945421009681e-08]},{"children":[36],"name":"Leg3Base.R","rotation":[0.48101410269737244,-0.8565958738327026,0.006457682233303785,0.18662074208259583],"scale":[0.9999999403953552,1.0000001192092896,1],"translation":[1.187698939197901e-09,0.3915250301361084,1.396204218906405e-08]},{"name":"Leg2Fore.R","rotation":[0.04987342655658722,0.012070796452462673,0.40287071466445923,0.9138173460960388],"scale":[0.9999997615814209,0.9999998807907104,0.9999997019767761],"translation":[4.900767294202524e-07,0.7777489423751831,1.3496240569565998e-07]},{"children":[38],"name":"Leg2Lower.R","rotation":[0.08352430164813995,0.04269447922706604,0.518085777759552,0.8501694202423096],"scale":[1.000000238418579,1.0000003576278687,0.9999999403953552],"translation":[1.2208448652017978e-07,0.9397414326667786,-3.409446946989192e-08]},{"children":[39],"name":"Leg2Mid.R","rotation":[0.1470656394958496,0.028868237510323524,0.4729681611061096,0.8682392835617065],"scale":[1.0000001192092896,1.0000003576278687,1.0000001192092896],"translation":[4.8437236443987786e-08,1.5058820247650146,-2.5024842642551448e-08]},{"children":[40],"name":"Leg2Upper.R","rotation":[-0.4242475926876068,0.0005238187150098383,-0.6472404599189758,0.6333194971084595],"scale":[0.9999997019767761,1,0.9999998211860657],"translation":[3.550610472302651e-09,0.8818532824516296,4.425183419698442e-08]},{"children":[41],"name":"Leg2Base.R","rotation":[-0.4972459375858307,0.7882757782936096,-0.006056289654225111,0.36239632964134216],"scale":[0.9999998211860657,1,0.9999999403953552],"translation":[-7.2600920830723226e-09,0.3915250301361084,-5.773719280455225e-09]},{"name":"Leg1Fore.R","rotation":[-0.015208502300083637,0.04422945901751518,0.4362727701663971,0.8985980749130249],"scale":[1.000000238418579,0.9999995827674866,0.9999997615814209],"translation":[-6.20622927272052e-07,0.8156638741493225,-1.6136721114889951e-07]},{"children":[43],"name":"Leg1Lower.R","rotation":[0.15885458886623383,0.17276015877723694,0.4745163321495056,0.848382830619812],"scale":[1.000000238418579,1.0000001192092896,1.0000004768371582],"translation":[-2.3015780925561558e-07,0.8788077235221863,2.258973452740065e-08]},{"children":[44],"name":"Leg1Mid.R","rotation":[0.2600231170654297,0.12465617805719376,0.4028773903846741,0.8686419725418091],"scale":[1,0.9999997019767761,0.9999999403953552],"translation":[-2.3629894485566183e-08,1.512597680091858,-5.442473494099431e-08]},{"children":[45],"name":"Leg1Upper.R","rotation":[-0.6237055063247681,-0.03962605446577072,-0.3963613212108612,0.6725466251373291],"scale":[1,1,0.9999995827674866],"translation":[4.151442212219081e-08,1.0438144207000732,6.221015524943141e-08]},{"children":[46],"name":"Leg1Base.R","rotation":[-0.5363527536392212,0.5960471630096436,0.0069372160360217094,0.5974993705749512],"scale":[1,1.0000001192092896,1.0000001192092896],"translation":[7.877114072130098e-09,0.3915250301361084,-5.523408841412447e-09]},{"children":[5,7,12,17,22,27,32,37,42,47],"name":"Body","rotation":[-0.9999927282333374,-4.546671483751652e-09,1.1920842553081457e-06,0.003814017167314887],"translation":[-2.1589291564903364e-17,0.5146726369857788,0.22900062799453735]},{"name":"Leg4IK.L","rotation":[-2.6692541510442425e-08,-2.6692541510442425e-08,-0.7071068286895752,0.7071068286895752],"translation":[2.2291481494903564,-0.5599625110626221,-0.7613579630851746]},{"name":"Leg3IK.L","rotation":[-2.6692541510442425e-08,-2.6692541510442425e-08,-0.7071068286895752,0.7071068286895752],"translation":[2.3687760829925537,-0.5599625110626221,-0.033313095569610596]},{"name":"Leg2IK.L","rotation":[-2.6692541510442425e-08,-2.6692541510442425e-08,-0.7071068286895752,0.7071068286895752],"translation":[2.3687760829925537,-0.5599625110626221,0.6964529752731323]},{"name":"Leg1IK.L","rotation":[-2.6692541510442425e-08,-2.6692541510442425e-08,-0.7071068286895752,0.7071068286895752],"translation":[2.2556710243225098,-0.5599625110626221,1.4977319240570068]},{"name":"Leg4IK.R","rotation":[-2.6692541510442425e-08,2.6692541510442425e-08,0.7071068286895752,0.7071068286895752],"translation":[-2.2291481494903564,-0.5599625110626221,-0.7613579630851746]},{"name":"Leg3IK.R","rotation":[-2.6692541510442425e-08,2.6692541510442425e-08,0.7071068286895752,0.7071068286895752],"translation":[-2.3687760829925537,-0.5599625110626221,-0.033313095569610596]},{"name":"Leg2IK.R","rotation":[-2.6692541510442425e-08,2.6692541510442425e-08,0.7071068286895752,0.7071068286895752],"translation":[-2.3687760829925537,-0.5599625110626221,0.6964529752731323]},{"name":"Leg1IK.R","rotation":[-2.6692541510442425e-08,2.6692541510442425e-08,0.7071068286895752,0.7071068286895752],"translation":[-2.2556710243225098,-0.5599625110626221,1.5977319478988647]},{"mesh":0,"name":"Spider","skin":0},{"children":[57,48,49,50,51,52,53,54,55,56],"name":"Armature"}],"animations":[{"channels":[{"sampler":0,"target":{"node":48,"path":"translation"}},{"sampler":1,"target":{"node":48,"path":"rotation"}},{"sampler":2,"target":{"node":48,"path":"scale"}},{"sampler":3,"target":{"node":4,"path":"translation"}},{"sampler":4,"target":{"node":4,"path":"rotation"}},{"sampler":5,"target":{"node":4,"path":"scale"}},{"sampler":6,"target":{"node":0,"path":"translation"}},{"sampler":7,"target":{"node":0,"path":"rotation"}},{"sampler":8,"target":{"node":0,"path":"scale"}},{"sampler":9,"target":{"node":2,"path":"translation"}},{"sampler":10,"target":{"node":2,"path":"rotation"}},{"sampler":11,"target":{"node":2,"path":"scale"}},{"sampler":12,"target":{"node":6,"path":"translation"}},{"sampler":13,"target":{"node":6,"path":"rotation"}},{"sampler":14,"target":{"node":6,"path":"scale"}},{"sampler":15,"target":{"node":11,"path":"rotation"}},{"sampler":16,"target":{"node":10,"path":"rotation"}},{"sampler":17,"target":{"node":9,"path":"rotation"}},{"sampler":18,"target":{"node":8,"path":"rotation"}},{"sampler":19,"target":{"node":16,"path":"rotation"}},{"sampler":20,"target":{"node":15,"path":"rotation"}},{"sampler":21,"target":{"node":14,"path":"rotation"}},{"sampler":22,"target":{"node":13,"path":"rotation"}},{"sampler":23,"target":{"node":21,"path":"rotation"}},{"sampler":24,"target":{"node":20,"path":"rotation"}},{"sampler":25,"target":{"node":19,"path":"rotation"}},{"sampler":26,"target":{"node":18,"path":"rotation"}},{"sampler":27,"target":{"node":26,"path":"rotation"}},{"sampler":28,"target":{"node":25,"path":"rotation"}},{"sampler":29,"target":{"node":24,"path":"rotation"}},{"sampler":30,"target":{"node":23,"path":"translation"}},{"sampler":31,"target":{"node":23,"path":"rotation"}},{"sampler":32,"target":{"node":23,"path":"scale"}},{"sampler":33,"target":{"node":31,"path":"rotation"}},{"sampler":34,"target":{"node":30,"path":"rotation"}},{"sampler":35,"target":{"node":29,"path":"rotation"}},{"sampler":36,"target":{"node":28,"path":"rotation"}},{"sampler":37,"target":{"node":36,"path":"rotation"}},{"sampler":38,"target":{"node":35,"path":"rotation"}},{"sampler":39,"target":{"node":34,"path":"rotation"}},{"sampler":40,"target":{"node":33,"path":"rotation"}},{"sampler":41,"target":{"node":41,"path":"rotation"}},{"sampler":42,"target":{"node":40,"path":"rotation"}},{"sampler":43,"target":{"node":39,"path":"rotation"}},{"sampler":44,"target":{"node":38,"path":"rotation"}},{"sampler":45,"target":{"node":46,"path":"rotation"}},{"sampler":46,"target":{"node":45,"path":"rotation"}},{"sampler":47,"target":{"node":44,"path":"rotation"}},{"sampler":48,"target":{"node":43,"path":"rotation"}},{"sampler":49,"target":{"node":49,"path":"translation"}},{"sampler":50,"target":{"node":49,"path":"rotation"}},{"sampler":51,"target":{"node":49,"path":"scale"}},{"sampler":52,"target":{"node":50,"path":"translation"}},{"sampler":53,"target":{"node":50,"path":"rotation"}},{"sampler":54,"target":{"node":50,"path":"scale"}},{"sampler":55,"target":{"node":51,"path":"translation"}},{"sampler":56,"target":{"node":51,"path":"rotation"}},{"sampler":57,"target":{"node":51,"path":"scale"}},{"sampler":58,"target":{"node":52,"path":"translation"}},{"sampler":59,"target":{"node":52,"path":"rotation"}},{"sampler":60,"target":{"node":52,"path":"scale"}},{"sampler":61,"target":{"node":53,"path":"translation"}},{"sampler":62,"target":{"node":53,"path":"rotation"}},{"sampler":63,"target":{"node":53,"path":"scale"}},{"sampler":64,"target":{"node":54,"path":"translation"}},{"sampler":65,"target":{"node":54,"path":"rotation"}},{"sampler":66,"target":{"node":54,"path":"scale"}},{"sampler":67,"target":{"node":55,"path":"translation"}},{"sampler":68,"target":{"node":55,"path":"rotation"}},{"sampler":69,"target":{"node":55,"path":"scale"}},{"sampler":70,"target":{"node":56,"path":"translation"}},{"sampler":71,"target":{"node":56,"path":"rotation"}},{"sampler":72,"target":{"node":56,"path":"scale"}}],"name":"ArmatureAction","samplers":[{"input":7,"interpolation":"LINEAR","output":8},{"input":7,"interpolation":"LINEAR","output":9},{"input":10,"interpolation":"LINEAR","output":11},{"input":10,"interpolation":"LINEAR","output":12},{"input":7,"interpolation":"LINEAR","output":13},{"input":10,"interpolation":"LINEAR","output":14},{"input":10,"interpolation":"LINEAR","output":15},{"input":7,"interpolation":"LINEAR","output":16},{"input":10,"interpolation":"LINEAR","output":17},{"input":10,"interpolation":"LINEAR","output":18},{"input":7,"interpolation":"LINEAR","output":19},{"input":10,"interpolation":"LINEAR","output":20},{"input":10,"interpolation":"LINEAR","output":21},{"input":7,"interpolation":"LINEAR","output":22},{"input":10,"interpolation":"LINEAR","output":23},{"input":7,"interpolation":"LINEAR","output":24},{"input":7,"interpolation":"LINEAR","output":25},{"input":7,"interpolation":"LINEAR","output":26},{"input":7,"interpolation":"LINEAR","output":27},{"input":7,"interpolation":"LINEAR","output":28},{"input":7,"interpolation":"LINEAR","output":29},{"input":7,"interpolation":"LINEAR","output":30},{"input":7,"interpolation":"LINEAR","output":31},{"input":7,"interpolation":"LINEAR","output":32},{"input":7,"interpolation":"LINEAR","output":33},{"input":7,"interpolation":"LINEAR","output":34},{"input":7,"interpolation":"LINEAR","output":35},{"input":7,"interpolation":"LINEAR","output":36},{"input":7,"interpolation":"LINEAR","output":37},{"input":7,"interpolation":"LINEAR","output":38},{"input":10,"interpolation":"LINEAR","output":39},{"input":7,"interpolation":"LINEAR","output":40},{"input":10,"interpolation":"LINEAR","output":41},{"input":7,"interpolation":"LINEAR","output":42},{"input":7,"interpolation":"LINEAR","output":43},{"input":7,"interpolation":"LINEAR","output":44},{"input":7,"interpolation":"LINEAR","output":45},{"input":7,"interpolation":"LINEAR","output":46},{"input":7,"interpolation":"LINEAR","output":47},{"input":7,"interpolation":"LINEAR","output":48},{"input":7,"interpolation":"LINEAR","output":49},{"input":7,"interpolation":"LINEAR","output":50},{"input":7,"interpolation":"LINEAR","output":51},{"input":7,"interpolation":"LINEAR","output":52},{"input":7,"interpolation":"LINEAR","output":53},{"input":7,"interpolation":"LINEAR","output":54},{"input":7,"interpolation":"LINEAR","output":55},{"input":7,"interpolation":"LINEAR","output":56},{"input":7,"interpolation":"LINEAR","output":57},{"input":7,"interpolation":"LINEAR","output":58},{"input":10,"interpolation":"LINEAR","output":59},{"input":7,"interpolation":"LINEAR","output":60},{"input":7,"interpolation":"LINEAR","output":61},{"input":10,"interpolation":"LINEAR","output":62},{"input":7,"interpolation":"LINEAR","output":63},{"input":7,"interpolation":"LINEAR","output":64},{"input":10,"interpolation":"LINEAR","output":65},{"input":7,"interpolation":"LINEAR","output":66},{"input":7,"interpolation":"LINEAR","output":67},{"input":10,"interpolation":"LINEAR","output":68},{"input":7,"interpolation":"LINEAR","output":69},{"input":7,"interpolation":"LINEAR","output":70},{"input":10,"interpolation":"LINEAR","output":71},{"input":7,"interpolation":"LINEAR","output":72},{"input":7,"interpolation":"LINEAR","output":73},{"input":10,"interpolation":"LINEAR","output":74},{"input":7,"interpolation":"LINEAR","output":75},{"input":7,"interpolation":"LINEAR","output":76},{"input":10,"interpolation":"LINEAR","output":77},{"input":7,"interpolation":"LINEAR","output":78},{"input":7,"interpolation":"LINEAR","output":79},{"input":10,"interpolation":"LINEAR","output":80},{"input":7,"interpolation":"LINEAR","output":81}]}],"materials":[{"doubleSided":true,"name":"Material.001","pbrMetallicRoughness":{}}],"meshes":[{"name":"Cube","primitives":[{"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2,"JOINTS_0":3,"WEIGHTS_0":4},"indices":5,"material":0}]}],"skins":[{"inverseBindMatrices":6,"joints":[48,5,4,1,0,3,2,7,6,12,11,10,9,8,17,16,15,14,13,22,21,20,19,18,27,26,25,24,23,32,31,30,29,28,37,36,35,34,33,42,41,40,39,38,47,46,45,44,43,49,50,51,52,53,54,55,56],"name":"Armature"}],"accessors":[{"bufferView":0,"componentType":5126,"count":1000,"max":[2.742279291152954,1.4045029878616333,2.0192716121673584],"min":[-2.742279291152954,-0.6434623599052429,-3.534085512161255],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":1000,"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":1000,"type":"VEC2"},{"bufferView":3,"componentType":5121,"count":1000,"type":"VEC4"},{"bufferView":4,"componentType":5126,"count":1000,"type":"VEC4"},{"bufferView":5,"componentType":5123,"count":1500,"type":"SCALAR"},{"bufferView":6,"componentType":5126,"count":57,"type":"MAT4"},{"bufferView":7,"componentType":5126,"count":120,"max":[5],"min":[0.041666666666666664],"type":"SCALAR"},{"bufferView":8,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":9,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":10,"componentType":5126,"count":2,"max":[5],"min":[0.041666666666666664],"type":"SCALAR"},{"bufferView":11,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":12,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":13,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":14,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":15,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":16,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":17,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":18,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":19,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":20,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":21,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":22,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":23,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":24,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":25,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":26,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":27,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":28,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":29,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":30,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":31,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":32,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":33,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":34,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":35,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":36,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":37,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":38,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":39,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":40,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":41,"componentType":5126,"count":2,"type":"VEC3"},{"bufferView":42,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":43,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":44,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":45,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":46,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":47,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":48,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":49,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":50,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":51,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":52,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":53,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":54,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":55,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":56,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":57,"componentType":5126,"count":120,"type":"VEC4"},{"bufferView":58,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":59,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":60,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":61,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":62,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":63,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":64,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":65,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":66,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":67,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":68,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":69,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":70,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":71,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":72,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":73,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":74,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":75,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":76,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":77,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":78,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":79,"componentType":5126,"count":120,"type":"VEC3"},{"bufferView":80,"componentType":5126,"count":2,"type":"VEC4"},{"bufferView":81,"componentType":5126,"count":120,"type":"VEC3"}],"bufferViews":[{"buffer":0,"byteLength":12000,"byteOffset":0},{"buffer":0,"byteLength":12000,"byteOffset":12000},{"buffer":0,"byteLength":8000,"byteOffset":24000},{"buffer":0,"byteLength":4000,"byteOffset":32000},{"buffer":0,"byteLength":16000,"byteOffset":36000},{"buffer":0,"byteLength":3000,"byteOffset":52000},{"buffer":0,"byteLength":3648,"byteOffset":55000},{"buffer":0,"byteLength":480,"byteOffset":58648},{"buffer":0,"byteLength":1440,"byteOffset":59128},{"buffer":0,"byteLength":1920,"byteOffset":60568},{"buffer":0,"byteLength":8,"byteOffset":62488},{"buffer":0,"byteLength":24,"byteOffset":62496},{"buffer":0,"byteLength":24,"byteOffset":62520},{"buffer":0,"byteLength":1920,"byteOffset":62544},{"buffer":0,"byteLength":24,"byteOffset":64464},{"buffer":0,"byteLength":24,"byteOffset":64488},{"buffer":0,"byteLength":1920,"byteOffset":64512},{"buffer":0,"byteLength":24,"byteOffset":66432},{"buffer":0,"byteLength":24,"byteOffset":66456},{"buffer":0,"byteLength":1920,"byteOffset":66480},{"buffer":0,"byteLength":24,"byteOffset":68400},{"buffer":0,"byteLength":24,"byteOffset":68424},{"buffer":0,"byteLength":1920,"byteOffset":68448},{"buffer":0,"byteLength":24,"byteOffset":70368},{"buffer":0,"byteLength":1920,"byteOffset":70392},{"buffer":0,"byteLength":1920,"byteOffset":72312},{"buffer":0,"byteLength":1920,"byteOffset":74232},{"buffer":0,"byteLength":1920,"byteOffset":76152},{"buffer":0,"byteLength":1920,"byteOffset":78072},{"buffer":0,"byteLength":1920,"byteOffset":79992},{"buffer":0,"byteLength":1920,"byteOffset":81912},{"buffer":0,"byteLength":1920,"byteOffset":83832},{"buffer":0,"byteLength":1920,"byteOffset":85752},{"buffer":0,"byteLength":1920,"byteOffset":87672},{"buffer":0,"byteLength":1920,"byteOffset":89592},{"buffer":0,"byteLength":1920,"byteOffset":91512},{"buffer":0,"byteLength":1920,"byteOffset":93432},{"buffer":0,"byteLength":1920,"byteOffset":95352},{"buffer":0,"byteLength":1920,"byteOffset":97272},{"buffer":0,"byteLength":24,"byteOffset":99192},{"buffer":0,"byteLength":1920,"byteOffset":99216},{"buffer":0,"byteLength":24,"byteOffset":101136},{"buffer":0,"byteLength":1920,"byteOffset":101160},{"buffer":0,"byteLength":1920,"byteOffset":103080},{"buffer":0,"byteLength":1920,"byteOffset":105000},{"buffer":0,"byteLength":1920,"byteOffset":106920},{"buffer":0,"byteLength":1920,"byteOffset":108840},{"buffer":0,"byteLength":1920,"byteOffset":110760},{"buffer":0,"byteLength":1920,"byteOffset":112680},{"buffer":0,"byteLength":1920,"byteOffset":114600},{"buffer":0,"byteLength":1920,"byteOffset":116520},{"buffer":0,"byteLength":1920,"byteOffset":118440},{"buffer":0,"byteLength":1920,"byteOffset":120360},{"buffer":0,"byteLength":1920,"byteOffset":122280},{"buffer":0,"byteLength":1920,"byteOffset":124200},{"buffer":0,"byteLength":1920,"byteOffset":126120},{"buffer":0,"byteLength":1920,"byteOffset":128040},{"buffer":0,"byteLength":1920,"byteOffset":129960},{"buffer":0,"byteLength":1440,"byteOffset":131880},{"buffer":0,"byteLength":32,"byteOffset":133320},{"buffer":0,"byteLength":1440,"byteOffset":133352},{"buffer":0,"byteLength":1440,"byteOffset":134792},{"buffer":0,"byteLength":32,"byteOffset":136232},{"buffer":0,"byteLength":1440,"byteOffset":136264},{"buffer":0,"byteLength":1440,"byteOffset":137704},{"buffer":0,"byteLength":32,"byteOffset":139144},{"buffer":0,"byteLength":1440,"byteOffset":139176},{"buffer":0,"byteLength":1440,"byteOffset":140616},{"buffer":0,"byteLength":32,"byteOffset":142056},{"buffer":0,"byteLength":1440,"byteOffset":142088},{"buffer":0,"byteLength":1440,"byteOffset":143528},{"buffer":0,"byteLength":32,"byteOffset":144968},{"buffer":0,"byteLength":1440,"byteOffset":145000},{"buffer":0,"byteLength":1440,"byteOffset":146440},{"buffer":0,"byteLength":32,"byteOffset":147880},{"buffer":0,"byteLength":1440,"byteOffset":147912},{"buffer":0,"byteLength":1440,"byteOffset":149352},{"buffer":0,"byteLength":32,"byteOffset":150792},{"buffer":0,"byteLength":1440,"byteOffset":150824},{"buffer":0,"byteLength":1440,"byteOffset":152264},{"buffer":0,"byteLength":32,"byteOffset":153704},{"buffer":0,"byteLength":1440,"byteOffset":153736}],"buffers":[{"byteLength":155176,"uri":"data:application/octet-stream;base64,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BgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFQAAABUAAAAVAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAEADgAUAAEAFAAHAAoABgATAAoAEwAXABUAEgAMABUADAAPABAAAwAJABAACQAWAAUAAgAIAAUACAALABEADQAAABEAAAAEAEwAUgAsAEwALAAfACIAHgArACIAKwAvAEgAUAAkAEgAJAAnAEsAVQAhAEsAIQAuAFYATgAgAFYAIAAjACkAJQAYACkAGAAcADcAQgA8ADcAPAAxAD0APwA0AD0ANAAyAEYAOwA1AEYANQBAADAAMwA5ADAAOQA2AEQARwBBAEQAQQA+ADgAOgBFADgARQBDAB0AGgBPAB0ATwBXACgAGwBUACgAVABKAC0AKgBRAC0AUQBJABkAJgBTABkAUwBNAFgAWwBhAFgAYQBeAF8AYgBtAF8AbQBqAGwAbwBpAGwAaQBmAGUAaABdAGUAXQBaAGAAawBkAGAAZABZAG4AYwBcAG4AXABnAHAAcwB5AHAAeQB2AHgAegCFAHgAhQCDAIQAhwCBAIQAgQB+AH0AfwB0AH0AdAByAHcAggB8AHcAfABxAIYAewB1AIYAdQCAAIgAiwCRAIgAkQCOAJAAkgCdAJAAnQCbAJwAnwCZAJwAmQCWAJUAlwCMAJUAjACKAI8AmgCUAI8AlACJAJ4AkwCNAJ4AjQCYAKIAqACrAKIAqwClAKcAtAC3AKcAtwCqALIArACvALIArwC1AK0AoACjAK0AowCwAKYAoQCuAKYArgCzALYAsQCkALYApACpALoAwADDALoAwwC9AL8AzADOAL8AzgDBAMoAxADHAMoAxwDNAMYAuQC7AMYAuwDIAL4AuADFAL4AxQDLAM8AyQC8AM8AvADCANIA2ADbANIA2wDVANcA5ADmANcA5gDZAOIA3ADfAOIA3wDlAN4A0QDTAN4A0wDgANYA0ADdANYA3QDjAOcA4QDUAOcA1ADaAOkA6wDxAOkA8QDvAPAA8gD9APAA/QD7APwA/gD4APwA+AD2APUA9wDsAPUA7ADqAO4A+gD0AO4A9ADoAP8A8wDtAP8A7QD5AAABAwEJAQABCQEGAQcBCgEVAQcBFQESARQBFwERARQBEQEOAQ0BEAEFAQ0BBQECAQgBEwEMAQgBDAEBARYBCwEEARYBBAEPASkBHQEjASkBIwEvASgBJgEZASgBGQEbAS0BKwElAS0BJQEnASEBHwEsASEBLAEuARgBJAEqARgBKgEeARwBGgEgARwBIAEiATEBMwE6ATEBOgE4ATcBOQFFATcBRQFDAUQBRgE/AUQBPwE9AT4BQAE0AT4BNAEyATYBQgE8ATYBPAEwAUcBOwE1AUcBNQFBAUkBSwFRAUkBUQFPAVABUgFdAVABXQFbAVwBXgFYAVwBWAFWAVUBVwFMAVUBTAFKAU4BWgFUAU4BVAFIAV8BUwFNAV8BTQFZAWABYwFpAWABaQFmAWgBagF1AWgBdQFzAXQBdwFxAXQBcQFuAW0BbwFkAW0BZAFiAWcBcgFsAWcBbAFhAXYBawFlAXYBZQFwAYkBfQGDAYkBgwGPAYgBhgF5AYgBeQF7AY0BiwGFAY0BhQGHAYEBfwGMAYEBjAGOAXgBhAGKAXgBigF+AXwBegGAAXwBgAGCAZEBkwGZAZEBmQGXAZgBmgGlAZgBpQGjAaQBpgGgAaQBoAGeAZ0BnwGUAZ0BlAGSAZYBogGcAZYBnAGQAacBmwGVAacBlQGhAakBqwGxAakBsQGvAbABsgG9AbABvQG7AbwBvgG4AbwBuAG2AbUBtwGsAbUBrAGqAa4BugG0Aa4BtAGoAb8BswGtAb8BrQG5AcABwwHJAcAByQHGAcgBygHVAcgB1QHTAdQB1wHRAdQB0QHOAc0BzwHEAc0BxAHCAccB0gHMAccBzAHBAdYBywHFAdYBxQHQAekB3QHjAekB4wHvAegB5gHZAegB2QHbAe0B6wHlAe0B5QHnAeEB3wHsAeEB7AHuAdgB5AHqAdgB6gHeAdwB2gHgAdwB4AHiAfEB8wH5AfEB+QH3AfgB+gEFAvgBBQIDAgQCBgIAAgQCAAL+Af0B/wH0Af0B9AHyAfYBAgL8AfYB/AHwAQcC+wH1AQcC9QEBAgkCCwIRAgkCEQIPAhACEgIdAhACHQIbAhwCHgIYAhwCGAIWAhUCFwIMAhUCDAIKAg4CGgIUAg4CFAIIAh8CEwINAh8CDQIZAiACIwIpAiACKQImAigCKwI2AigCNgIzAjQCNwIxAjQCMQIuAiwCLwIkAiwCJAIhAicCMgItAicCLQIiAjUCKgIlAjUCJQIwAkkCPQJDAkkCQwJPAkgCRgI5AkgCOQI7Ak0CSwJFAk0CRQJHAkECPwJMAkECTAJOAjgCRAJKAjgCSgI+AjwCOgJAAjwCQAJCAlICVAJZAlICWQJXAlgCWgJmAlgCZgJkAmMCZQJgAmMCYAJeAl0CXwJTAl0CUwJRAlYCYgJcAlYCXAJQAmcCWwJVAmcCVQJhAmkCbwJzAmkCcwJtAm4CewJ/Am4CfwJyAnoCdAJ4AnoCeAJ+AnUCaAJsAnUCbAJ5AnACagJ2AnACdgJ8An0CdwJrAn0CawJxAoICiAKLAoICiwKFAocClAKXAocClwKKApICjAKPApICjwKVAo0CgAKDAo0CgwKQAoYCgQKOAoYCjgKTApYCkQKEApYChAKJAqcCrQKhAqcCoQKbAqgCnQKZAqgCmQKkAq8CqQKlAq8CpQKrAqMCrgKqAqMCqgKfApoCoAKsApoCrAKmApwCogKeApwCngKYArECtgK6ArECugK1ArcCwwLHArcCxwK7AsICvQLBAsICwQLGArwCsAK0ArwCtALAArgCsgK+ArgCvgLEAsUCvwKzAsUCswK5AskCzwLTAskC0wLNAs4C2wLfAs4C3wLSAtoC1ALYAtoC2ALeAtUCyALMAtUCzALZAtACygLWAtAC1gLcAt0C1wLLAt0CywLRAuIC6ALrAuIC6wLlAuYC8wL3AuYC9wLqAvIC7ALvAvIC7wL1Au0C4ALkAu0C5ALxAucC4QLuAucC7gL0AvYC8ALjAvYC4wLpAgcDDQMBAwcDAQP7AggD/QL5AggD+QIEAw8DCQMFAw8DBQMLAwMDDgMKAwMDCgP/AvoCAAMMA/oCDAMGA/wCAgP+AvwC/gL4AhEDFwMbAxEDGwMVAxYDIwMnAxYDJwMaAyIDHAMgAyIDIAMmAx0DEAMUAx0DFAMhAxgDEgMeAxgDHgMkAyUDHwMTAyUDEwMZAykDLwMzAykDMwMtAy4DOwM/Ay4DPwMyAzoDNAM4AzoDOAM+AzUDKAMsAzUDLAM5AzADKgM2AzADNgM8Az0DNwMrAz0DKwMxA0IDSANLA0IDSwNFA0YDUwNXA0YDVwNKA1IDTANPA1IDTwNVA00DQANEA00DRANRA0cDQQNOA0cDTgNUA1YDUANDA1YDQwNJA2cDbQNhA2cDYQNbA2gDXQNZA2gDWQNkA28DaQNlA28DZQNrA2MDbgNqA2MDagNfA1oDYANsA1oDbANmA1wDYgNeA1wDXgNYA3EDdwN7A3EDewN1A3YDgwOHA3YDhwN6A4IDfAOAA4IDgAOGA30DcAN0A30DdAOBA3gDcgN+A3gDfgOEA4UDfwNzA4UDcwN5A4kDjwOTA4kDkwONA44DmwOfA44DnwOSA5oDlAOYA5oDmAOeA5UDiAOMA5UDjAOZA5ADigOWA5ADlgOcA50DlwOLA50DiwORA6IDqAOrA6IDqwOlA6YDswO2A6YDtgOpA7IDrAOvA7IDrwO1A64DoQOkA64DpAOxA6cDoAOtA6cDrQO0A7cDsAOjA7cDowOqA8cDzQPBA8cDwQO7A8gDvQO5A8gDuQPEA88DyQPFA88DxQPLA8MDzgPKA8MD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TmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+cw9Rrv9jabWlCWo/0XvPPt5waq/JcWm1pQlqP9F7zz54BNKqTmtptaUJaj/Re88+jT7qr0Z4abWlCWo/0XvPPhnLKDCae2m1pwlqP9F7zz7t5U+vDU5ptaUJaj/Se88+goncLxOCabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4MKI+vempptaUJaj/Re88+WtPpL1ZeabWlCWo/0XvPPgDKKDCYe2m1pQlqP9F7zz5ssc+vzDBptaUJaj/Re88+NwGPsPxnabWlCWo/0XvPPuaqzi7ueWm1pQlqP9F7zz5TyIEve2hptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/0XvPPhmEwKpOa2m1pQlqP9F7zz4ZhMCqTmtptaUJaj/Re88+GYTAqk5rabWlCWo/T3bMPtJ+tDupP1i6frJqPy4mxD7/IKg88kZJu6xobD/Tnrc+fTsvPRDA0bu5tm4/KgOoPrEvjz3tYSu8ZyVxP+Welj7imss9ZLFzvJtQcz8O6YQ+5MsDPmy+nbwK+HQ/xOdoPtgBHz5xT768WQd2P5CqTT7bDzU+qLTYvE+Sdj+AKzs+Ms5DPt1Z6ry7xXY/MFw0PtovST6gyvC8DdB2PxrKOT5Qoww+YeWUvI49eT9qDkY+lkQfO92u7zuDKHs/bAZVPlBwCL54YQY9Q+x3P7h7aT65NEa+0K00PTwFdD/RA4M+3nc/vu4bND3ZinI/3NGTPpc4K75bNDE92xNxP+Nhpj5gmwu+XiQsPdBVbz8GzLk+B/3FvaQiJT2lCW0/3hLNPmqXUL33gxw9TgBqPxw93z6DrA27J8YSPYwzZj8fde8+Yuo9PbqNCD29zWE/OCH9Pqtouz1TMP08myVdP1L1Az9hlQU+21HrPBuwWD892Ac/PqskPvT03Dx07lQ/wzUKP4nXOD69b9M8Wl5SPxMFCz8ADkA+6P7PPLJuUT8TBQs/AA5APuj+zzyyblE/EwULPwAOQD7o/s88sm5RPxMFCz8ADkA+6P7PPLJuUT8TBQs/AA5APuj+zzyyblE/EwULPwAOQD7o/s88sm5RPxMFCz8ADkA+6P7PPLJuUT8TBQs/AA5APuj+zzyyblE/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AADAsrc9kT4AAMCysBG0MrI9kT4uqXGzvNkdPacTxj3zigM/5/5ZP6mBIj1r1sQ9zwcDP+dOWj8Aty89mU/BPYaOAT/7MVs/6FpEPbLEuz06av4+35JcPwpPXz21eLQ9/R/4PldaXj9Vb389L6+rPRpn8D4CcGA/wsaRPb+uoT3vauc+J7tiP4I3pT3QwpY9bVvdPosjZT8KZ7k9fTyLPYNu0j5ykmc/YK7NPRjlfj2M4MY+gvNpP0xl4T0lgWc9B/S6Pqg1bD+B5fM9OQtRPY3wrj63S24/80YCPlZEPD01IaM+xCxwP4ViCT4E7Sk9xdKXPhHUcT9H/Q4+G8IaPdRRjT6iQHM/hNMSPrJ6Dz1X6YM+YXR0P0qlFD6Cxwg9GcN3PgBzdT/VNBQ+f1MHPSP/aj6VQHY/vIcOPqOgET3otWI+X+x2P8gdAj639io9ta1fPuF1dz8D0eE9AyxPPazEYT4Bw3c/ETThPf0yaT274MA+FQNrP71n1j2AuoA9izEHP6MhVz95Q6g9U6mYPTjlBz/5FVc/+rx8PUBBrj1zbwg/le9WPxqAOD0+vr89aMcIP4PBVj9khwo9w3jLPU7oCD/yo1Y/QtvyPE3Qzz1GzQg/5a5WP8QZ8jxa4889woQIP/bcVj+1hvI8hs3PPY4eCD/6HVc/N6j1PIxczz2plAc/znVXP3cE/Tz7Xc499eAGPyzoVz/CEAU9HZ/MPSn9BT+EeFg/gkIPPdzsyT3F4gQ/7SlZP7zZHT2nE8Y984oDP+f+WT++bzQ9oAfAPZPgAD8amVs/gbRTPRZ3tz3ZfPg+9kFeP53+dz3XSq09P5DsPuV3YT/dy449g32iPWNZ3z73w2Q/imigPZ0emD2eUtI+/sJnP24Orz36TI894QvHPkIpaj+nDLk9jC2JPUEevz6Mvms/Z7+8PWvjhj20ILw+3lFsP9YkuD2IsIk94Xe/PgGuaz/B7qs9aA2RPcw9yD737Gk/+IGaPZ1kmz1fi9Q+f0hnPwdZhj1YHqc97XfiPoYGZD8tGWQ98auyPawo8D5YiGA/X45APeiUvD3e4Ps+c01dP55kJz3ge8M9ewMCP37rWj+82R09qBPGPfOKAz/n/lk/vNkdPagTxj3zigM/5/5ZP7zZHT2oE8Y984oDP+f+WT+82R09qBPGPfOKAz/n/lk/vNkdPacTxj3zigM/5/5ZPylYID2CZsU93SQDPwM9Wj+kZCc93HvDPXsDAj9+61o/AVkyPZR9wD1RPwA/hvdbP2KOQD3llLw92+D7PnRNXT9tXFE9cOu3PTJe9j6B2V4/MBlkPe+rsj2rKPA+WYhgP4wZeD3SAq09aXTpPqZHYj8HWYY9VB6nPel34j6FBmQ/IpyQPXAuoT37a9s+2bVlP/6Bmj2cZJs9XovUPn9IZz9LuKM9QfOVPUcSzj5Rs2g/xO6rPWcNkT3KPcg++OxpPyzXsj0t5ow9P0vDPoztaj/WJLg9g7CJPeF3vz4Brms/xYu7PfGehz1gAL0+YidsP2e/vD1r44Y9tCC8Pt5RbD/Fi7s98p6HPWAAvT5iJ2w/1CS4PYiwiT3hd78+Aa5rPynXsj0u5ow9P0vDPoztaj/C7qs9aA2RPco9yD747Gk/R7ijPUHzlT1HEs4+UbNoP/yBmj2eZJs9X4vUPn9IZz8cnJA9dC6hPfxr2z7ZtWU/BFmGPVcepz3td+I+hgZkP4IZeD3SAq09aXTpPqZHYj8pGWQ98quyPawo8D5YiGA/ZFxRPXLrtz0zXvY+gdleP16OQD3plLw93uD7PnNNXT/+WDI9l33APVE/AD+F91s/nWQnPd17wz17AwI/futaPyRYID2EZsU93SQDPwM9Wj+82R09qBPGPfOKAz/n/lk/vtkdPagTxj3zigM/5/5ZP7vZHT2oE8Y984oDP+f+WT++2R09qBPGPfOKAz/n/lk/u9kdPaYTxj3zigM/5/5ZP7zZHT2nE8Y984oDP+f+WT+72R09qBPGPfOKAz/n/lk/vtkdPaYTxj3zigM/5/5ZP73ZHT2oE8Y984oDP+f+WT++2R09oxPGPfOKAz/n/lk/vdkdPacTxj3zigM/5/5ZP7vZHT2rE8Y984oDP+f+WT+72R09qBPGPfOKAz/n/lk/u9kdPagTxj3zigM/5/5ZP73ZHT2oE8Y984oDP+f+WT+82R09qBPGPfOKAz/n/lk/vNkdPagTxj3zigM/5/5ZP7zZHT2oE8Y984oDP+f+WT+82R09qBPGPfOKAz/n/lk/vdkdPagTxj3zigM/5/5ZP73ZHT2rE8Y984oDP+f+WT+82R09phPGPfOKAz/n/lk/wNkdPagTxj3zigM/5/5ZP7vZHT2oE8Y984oDP+f+WT+92R09phPGPfOKAz/n/lk/wtkdPagTxj3zigM/5/5ZP7zZHT2nE8Y984oDP+f+WT+82R09pxPGPfOKAz/n/lk/vNkdPacTxj3zigM/5/5ZP7zZHT2nE8Y984oDP+f+WT+82R09pxPGPfOKAz/n/lk/vNkdPacTxj3zigM/5/5ZP7zZHT2nE8Y984oDP+f+WT+82R09pxPGPfOKAz/n/lk/AACAPwAAgD8AAIA/AQCAPwAAgD8AAIA/AAAAM649kT4AAACzghvkM7I9kT75EZeyw9kdPaITxr3zigO/6P5ZP4LdIT0dAsW94hkDv+dDWj+ZPy09bfjBvfbUAb/sB1s/LgU/PSw0vb0RoP++BTlcP4czVj028ba9ojv6vtbDXT8yzHE9wGuvvQKi8744lF8/LGWIPQLipr1M+uu+4JVhP8EQmT1flZ29tW7jvga1Yz83X6o9AcuTvYQt2r4L32U/gMS7PdvLib1JadC+GQNoP+azzD1/yH+941jGvsMSaj8Aotw9u8Vsvb42vL5UAmw/rwbrPYQvW73wP7K+IMltP7Be9z00pku9B7Oovmdhbz9AlgA+k8g+vevOn74TyHA/JvwDPk0yNb3W0Ze+JfxxP4unBT5bey+9hPiQvvT9cj91YAU+CjguvdN9i743znM/Uvn/PdY2OL2K34e+ond0PxZ85z1mMlG9s3GGvqH3dD+EEMU9iSN1vZ0rh74fNXU/4FDCPb0fh72gL9e+k2ZmP5Egtj1OCpK9OpQRv6WLUD+6Hog9QsSpvcMpEr+YZ1A/j0Y8PQNIv73jjhK/xjJQP8EU7zy3y9C9vrQSv5gHUD9v2ZE81p7cvd+QEr+gBVA/57BcPDUa4b24GBK/XkxQP6poYDzm1+C9HE0Rv3XbUD8Hs3Q8N4XfvZQuEL/npVE/Ak2NPNoO3b0Urg6/vrNSP8iWqTzJX9m9s7sMv/ELVD8av888U2HUvYdGCr/4s1U/OSUAPSD7zb2XPAe/U69XP8PZHT2iE8a984oDv+j+WT97PUA9sse8vdfD/b7xwlw/wPpkPd6fsr1difK+y+NfP5HvhD1DLqi94ETmvpcSYz/fWpY9yROevQPo2b79C2Y/lKqlPWL9lL0Ndc6+YppoP8PUsT1Pn429p/jEvi+Vaj8r2rk93K+IvcKCvr6e3Gs/br+8PWfjhr2yILy+3lFsP9kkuD2DsIm94He/vgGuaz/F7qs9ZA2Rvco9yL747Gk/A4KaPZlkm71fi9S+f0hnPwpZhj1WHqe97XfivoYGZD8yGWQ98quyva0o8L5ZiGA/Z45APeeUvL3c4Pu+dE1dP6VkJz3Ze8O9ewMCv37rWj/D2R09qBPGvfOKA7/n/lk/w9kdPagTxr3zigO/5/5ZP8PZHT2oE8a984oDv+f+WT/D2R09qBPGvfOKA7/n/lk/w9kdPaITxr3zigO/6P5ZPy9YID19ZsW92yQDvwQ9Wj+sZCc91HvDvXoDAr9/61o/D1kyPY19wL1RPwC/hvdbP2yOQD3dlLy92OD7vnVNXT94XFE9Z+u3vS9e9r6C2V4/PBlkPearsr2oKPC+WohgP5oZeD3IAq29ZXTpvqdHYj8NWYY9TB6nveV34r6GBmQ/JZyQPWkuob32a9u+2rVlPwSCmj2WZJu9XYvUvoBIZz9QuKM9PfOVvUYSzr5Rs2g/x+6rPWENkb3HPci++OxpPy/Xsj0p5oy9PkvDvoztaj/bJLg9gbCJveB3v74Brms/xou7PfOeh71fAL2+YidsP26/vD1n44a9siC8vt5RbD/Ji7s9756HvWAAvb5iJ2w/2iS4PYOwib3gd7++Aa5rPy7Xsj0q5oy9P0vDvoztaj/G7qs9Yw2Rvco9yL747Gk/TbijPUDzlb1IEs6+UbNoP/6Bmj2ZZJu9X4vUvn9IZz8jnJA9cy6hvfxr277ZtWU/ClmGPVUep73td+K+hgZkP44ZeD3RAq29a3TpvqVHYj8yGWQ98auyva0o8L5YiGA/a1xRPXDrt70zXva+gNleP2KOQD3nlLy93OD7vnRNXT8FWTI9lH3AvVI/AL+F91s/oGQnPdp7w717AwK/futaPytYID2DZsW93SQDvwM9Wj/D2R09qBPGvfOKA7/n/lk/x9kdPacTxr3zigO/5/5ZP8XZHT2oE8a984oDv+f+WT/E2R09pxPGvfOKA7/n/lk/xNkdPacTxr3zigO/5/5ZP8TZHT2nE8a984oDv+f+WT/E2R09pxPGvfOKA7/n/lk/w9kdPacTxr3zigO/5/5ZP8TZHT2nE8a984oDv+f+WT/F2R09qBPGvfOKA7/n/lk/xdkdPagTxr3zigO/5/5ZP8HZHT2nE8a984oDv+f+WT/H2R09phPGvfOKA7/n/lk/wNkdPakTxr3zigO/5/5ZP8LZHT2oE8a984oDv+f+WT/E2R09pxPGvfOKA7/n/lk/w9kdPagTxr3zigO/5/5ZP8HZHT2rE8a984oDv+f+WT/A2R09qxPGvfOKA7/n/lk/x9kdPaYTxr3zigO/5/5ZP8PZHT2oE8a984oDv+f+WT/D2R09pxPGvfOKA7/n/lk/wdkdPaYTxr3zigO/5/5ZP8TZHT2nE8a984oDv+f+WT/H2R09pxPGvfOKA7/n/lk/w9kdPacTxr3zigO/5/5ZP8rZHT2qE8a984oDv+n+WT/K2R09qhPGvfOKA7/p/lk/ytkdPaoTxr3zigO/6f5ZP8rZHT2qE8a984oDv+n+WT/K2R09qhPGvfOKA7/p/lk/ytkdPaoTxr3zigO/6f5ZP8rZHT2qE8a984oDv+n+WT/K2R09qhPGvfOKA7/p/lk//P9/P///fz8AAIA//f9/PwAAgD8BAIA/qs2EKS4DgT9BeVCyqs2EKS4DgT9BeVCy4VEyPgAAAABZ5t60qhZ8P28SND65BgKqChfhtL0CfD8dDzk+lSQCquVS57TnyHs/XuBAPjZVAqp0GPG09mp7PxQeSz4RrQaql+X9tMzpej8yX1c+vO0Cqn+bBrUTRno/pDllPjRVg6kGRA+15YB5P2BCdD7/zYOpfKkYtT6ceD/vBoI+t1aEqaqIIrVmm3c/aBiKPlsB2KmEniy1NoN2P3Egkj4OjgWqjag2tTBadT/c6pk+MIk4qpVlQLWSKHQ/zEShPhTf/Kn/lUm1J/hyP938pz5AgAepFvxRtRnUcT9L460+yBaIqR5cWbWcyHA/n8myPqO/KqoGfF+1h+JvPz+Ctj7Mv++pzyJktesubz/N37g+AAAAAMIXZ7WLum4/JLS5PpMHzqkwIWi1VJFuPw+trz6OThmqVJhbtXt1cD8BDJY+ExU4qgCPO7WTwnQ/lZ5nPjKZfqodwxC1gV15P8L6IT6cWDqqc3nKtOTGfD/yl9g9aENhqvReh7R3kH4/IfytPWA4x6one1m0FRN/Pxh2tD31f4CqoJNhtBUBfz+AYsU9YL6fqiO7drTpzn4/ZMHdPSLmmKrimIq0r35+P8aT+j38tWOqYpyctJ4Tfj+UbAw+tVqPqsCHr7TclH0/pMgaPn6skarUesG0/Q59P7/fJj7SFmeqs5fQtO6TfD81Ni8+Y7m4qsUD27SHOXw/4VEyPgAAAABZ5t60qhZ8PyVQMj69Gyc6NZYOPDUUfD+yUDI+82UKOk8t7Dv7FHw/o1EyPvC6ejnR61U7UhZ8P8JRMj49hjG5HIIXu34WfD8kUDI+Kh4nusubDrw1FHw/p0wyPujrkLqYVHe8Rg98PxVIMj6xcMa6EVWpvM8IfD/7QzI+7kjsuhKgybwDA3w/OUIyPiaj+rpE39W8jQB8P/dDMj7hSOy6EqDJvAMDfD8PSDI+p3DGugxVqbzOCHw/o0wyPg7skLqXVHe8Rg98Px9QMj48Hie6yJsOvDYUfD++UTI+SIYxuQ6CF7t+Fnw/nlEyPpm6ejnx61U7UhZ8P65QMj70ZQo6Vi3sO/sUfD8lUDI+sRsnOjiWDjw1FHw/4VEyPgAAAABZ5t60qhZ8P+FRMj4AAAAAWebetKoWfD/hUTI+AAAAAFnm3rSqFnw/4VEyPgAAAABZ5t60qhZ8Py1rMj7BNTOuWObetIwVfD+tsjI+qDwrr1nm3rRjEnw/wiEzPiHSt69V5t60dQ18P9CxMz67oBuwS+betAsHfD9BXDQ+BgFnsDvm3rRv/3s/dho1PtyQnbAh5t606PZ7P9jlNT5CjMqw/OXetMDtez/JtzY+EP34sM3l3rRB5Hs/s4k3PgC3E7GW5d60t9p7P/tUOD6YNCqxVOXetHDRez8PEzk+zzw/sRLl3rS5yHs/VL05PpoTUrHM5N6048B7PzpNOj6NAWKxjuTetD26ez8nvDo+v0lusVzk3rQatXs/iAM7PpQvdrE35N60yrF7P80cOz4tOD+qAuTptJ6wez+IAzs+cj8yLgrk6bTKsXs/J7w6Pr7uKi8x5Om0GrV7PzpNOj75ubcvZeTptD26ez9UvTk+QpkbMKXk6bTjwHs/DxM5PiPxZjDq5Om0uch7P/tUOD7riJ0wLuXptHDRez+ziTc+UYTKMG/l6bS32ns/ybc2Pnn3+DCo5em0QeR7P9jlNT74sxMx1+XptMDtez92GjU+rjAqMfvl6bTo9ns/QVw0PtM5PzET5um0b/97P9CxMz67EFIxI+bptAsHfD/CITM+iP1hMSzm6bR1DXw/rbIyPt1FbjEt5um0YxJ8Py1rMj66LHYxLObptIwVfD/hUTI+AAAAAFnm3rSqFnw/GDg1PkMUQ6gahuK0k/V7P5g7PT4oYoqpforstECXez+cVEk+292SqcGp+7TVAHs/YHlYPmANB6rbSwe12zZ6P2GeaT7l+zyq/QIStak/eT/Kt3s+55j3qd9SHbUXJXg/8d2GPlYzaKlulSi1fvV2P9dSjz6YVAUojScztezDdT92u5Y+iO+FqFJqPLWep3Q/MZycPthG66k+w0O14rpzP+J7oD5mMEqp25pItWYZcz+r4aE+zGFKqRhaSrUR3nI/q+GhPt3rhigYWkq1Ed5yP6zhoT7d64apGFpKtRHecj+r4aE+wxxsqRhaSrUR3nI/rOGhPsMc7KkYWkq1Ed5yP6vhoT4++nyqGFpKtRHecj+r4aE+wxzsqRhaSrUR3nI/rOGhPsxhSqkYWkq1Ed5yP6zhoT4O80GqF1pKtRHecj9Txp8+5qtBque3R7VLN3M/y+GZPlSi+6k/WkC1ACp0P3DTkD43c4WpTAg1tYiLdT8OO4U+9v1nqdKJJrVQLnc/FH9vPqrY9qlsrxW1V+Z4PzokUj4WOPWppFYDtS2Nej/c2zM+3kjTqdbS4LQsBXw/uCkWPuR95qkotLu0hTt9P5cq9T3YGRmpozqZtLkofj+iQcU95MgoKReSdrRPz34/X4efPcKHrqlHaUe04Dh/P/HUhj3aYK6pPoootNJxfz9G8ns9P11AqXN3HbTog38/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/utIUPye9Cr0rP/w+tIslP1rTFD9qxAq9gD78Pl6LJT981xQ/TfQKvf04/D6XiSU/gOIUP+1zC71QKfw+PYUlP8zTFT+agRa9urf5Pu6OJT8IuhY/vKQgvapk9j4X8yU/N9oXP9lWK72/WfE+drsmP8chGT8++zS9UQPtPtYTJz+aiho/d/U8vVJP6D50ZSc/VyMbP6voP71+DOY+npwnPzKIGz9ofkG9vHrkPrHGJz/qHBw/9WxEvQDS4j4/ySc/7zMcPwDYRb0SMeM+9JEnP+1lHD/xUEa99lviPt2qJz/8lxw/YLJGvb6D4T6FxCc/RN4cPy+8Sb0Y1eE+xWMnPzxMHT90k0u9irDgPsRcJz8xJB0/2dxJvU2D4D6Zkyc/qwccPxvIPb27Pd8+kxYpP0HZGD/Zqhy9+YHbPshLLT8KuQ0/UvGCvIO33z5ucTU/CLUAP0f8ezt6s+w+p/s6PwA89T42ekI7yTn5Ph0COz9qnvg+U5+AOsry/D6xoDg/HUz7PgQwJDl16P0+SGM3P2n2/j5yjFy6ip3+PhjfNT+LcQI/bpAnu90//z5fiDM/PRsGP7OHxrvY9f8++4wwP8j5CT8tWjO84yMAP+hoLT/TnA0/NNiIvED+/z6rhyo/WaAQP11HvLwBMf8+3TwoPw3jEj9tG+q8CfX9PsquJj/AUBQ/OOoEvVjE/D5I0iU/utIUPye9Cr0rP/w+tIslP920Gz+mBVy9cZEKP6P9Ez/sfRs/f7FZvQK4CD/n7xU/JNwaPzyAUr0gUgQ/4YEaP4MIGj/V20e9dfb+PnthHz8Ymhk/k71BvQVJ+j7pqSE/hkAZP33WPb3Ddfo+KfIhP0BHGD+ZxjK9ZvD6PvO5Ij8CxxY/8l4hva+W+z6X8CM/utIUPye9Cr0rP/w+tIslP+OEEj8NXuK8rb/8Pmt5Jz/sMBA/jxGzvDfv/D4AeCk/RFgOP7BNkbxI5Pw+zhErP7+XDT/ai4S8k9b8Pum4Kz/pFRA/OEyyvHeIAD+p/yc/xTEVP690Db0f7QQ/jMcfP17JGT9baEO95egIP8mhFz/dtBs/pgVcvXGRCj+j/RM/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/utIUPye9Cr0rP/w+tIslP7rSFD8nvQq9Kz/8PrSLJT+60hQ/J70KvSs//D60iyU/4Y0UP2DBB73pt/s+Uv8lPzjQEz9VQ/+8sEv6Pp03Jz9dshI/IEvnvII7+D56/ig/cE0RP9w4yrz8x/U+DR4rPxa8Dz+tp6q8Wy3zPtxjLT+4Gg4/VxmLvA6h8D63oi8/T4cMP1HEW7wUUe4+J7MxPxohCz+oNCq83GTsPpVyMz/8Bwo/dTAFvFb/6j7PwTQ/sUsJP+4p57tiUeo+/ok1P+3tCD8eONy7tyTqPlvfNT87ygg/StXcu2k36j4u9DU/DN0IPy3957v+heo+fcw1P28jCT+PCP27WQ/rPo9qNT/9mgk/xc8NvM7T6z5TzzQ/0kEKP2faIbxu1Ow+qPozP1MaCz/mdDq81ZruPjK7Mj8AGgw/w55WvPSF8T5i9DA/SxcNP6VPeLxgXPU+NtMuP+kIDj9kO4y8QLn5Pi59LD/10w4/T/SZvIVE/j6nJSo/HV0PPwompLweVQE/TQQoP1qJDz8ia6q8U1ADP1pRJj/QSA8/SC6rvKvsBD9gQCU/WZkOP8Ciobyn8wU/JwYlP19KDT9q/Za8tIQGP3iyJT87fws/gKmQvOrUBj959iY/iJsJPzqvirxE8QY/j3AoP0DbBz8BjIi8YPwGP4rSKT9OlAY/KyCJvFgGBz8Wzio//RgGP0HHibxlCwc/2iorP/0YBj9Bx4m8ZQsHP9oqKz/9GAY/QceJvGULBz/aKis/5V9XvuntvT3vuti+EFhgP6ZgV74S5r09NbvYvg5YYD9jZle+Aq+9PYy92L7fV2A/UXZXvnAZvT1DxNi+RVdgPzd1Wb6tKK09NcjZvvssYD9XyFu+y1abPXkE277f718/gNpevvVagz0coty+JJdfPwg+Yb7F4lk9iaLdvpdhXz9ShGO+lPIqPcZ23r7NMF8/lYJkvi/tFT0f096+oxhfP28rZb4R4gc9Nw7fvgsIXz9e2mW+sJDsPK0o3740AF8/M7dlvrKG7Dz9+96+pw1fP4ALZr4WcN48Zhffvv4EXz+KX2a+61fQPEEy375B/F4/hERmvpIxyTyE5d6+1BJfP7a1Zr4BcLA8Z+XevskQXz+8xGa+No60PA4S377UA18/GS9nvhZS0TyyQuC+NKpePwlbaL5hYA89YTXjvmLBXT933WO+oESuPW9f5L5h21w/vB9Tvo06GT6lPdq+tzReP4o9RL7dMTo+WBnPvnYkYD+wmkK+CP85Plzezb5ihmA/EBBDvhZgNz6SLM6+kZBgP3MuRL4E+zI+HfXOvpmLYD8YREa+zBUrPgVy0L6ueGA/YzpJvo/nHz6NKdK+8GtgP19sTL5ylxI+/+/TvlhkYD8Ank++EFYEPquP1b6pYGA/36ZSvoTq7D3839a+Ol9gP6QZVb6XANU9Qd7XviBdYD9iwla+VjvEPa6A2L7dWWA/5V9XvuntvT3vuti+EFhgP1ocSL5Jf8E97qDJvpCoZD9c80q+6AG5PcHSy77yH2Q/q+lQvgVCpj16gNC+MfRiP6JuVr6ejZM9yunUvrLOYT83yFi+GRyLPfbO1r42TWE/N7pYvszhjj1YBNe+4DdhP0GFWL4sbJk9c4fXvvj/YD86GFi+joapPZUp2L5bsWA/5V9XvuntvT3vuti+EFhgP21UVr7WydQ9FRTZvmMAYD+6KVW+ly3qPTYx2b68tV8/wS5UvoPr+T1HKNm+qYJfP47EU747BgA+Vx3Zvt1vXz+bQ1K+MJX2Pdwa175CLWA/DHZOvsRX4T0yJ9K+HOphP7gpSr7sjcs9gXXMvnjHYz9aHEi+SX/BPe6gyb6QqGQ/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/5V9XvuntvT3vuti+EFhgP+VfV77p7b0977rYvhBYYD/lX1e+6e29Pe+62L4QWGA/RmdXvi4Dvz1909i+Ak5gP5tvV75DDcI9JwvZvp41YD+bX1e+oMLGPaRC2b6hGGA/OR5XvvrTzD2kW9m+ogBgP3qYVr5w4NM9uD7ZvnD1Xz9wxVW+OXHbPXLe2L49/F8/yadUvlH74j23N9i+eBdgP6VNU74a5ek9T1DXvjBHYD/HzVG+U4/vPbsz1r7fiWA/505QvshU8z1+1tS+4+JgP5jeTr5iePU96m/TvlJDYT9Djk2+lJz2PRAj0r5en2E/SmtMvnvQ9j32/NC+PPNhP3iBS76FIvY9IgnQvpk7Yj9v20q+FZ/0PRBSz754dWI/BINKvudO8j194c6+Fp5iP4/jSr7+ffA9TTrPviOMYj8jQky+NV7wPTuy0L6bImI/4IFOvk/M8T0Q/tK+MXNhP+NtUb43zPQ9nhTWvkmAYD9h5lS+I1P5PSDb2b7fTl8/ctdYvjlP/z0LQt6+V+BdPwc8Xb7vTwM+KUTjvnkyXD92FWK+f4oHPpzh6L79QFo/sVNnvqc4DD6nBu++yQ1YP8Ikbb4GJBE++pD1vvGbVT9lWHO+jvIVPpEn/L4CCFM/aFZ5vnJMGj6RHQG/4otQP5Fzfr5R0B0+s58Dv8VqTj+v/4C+/ScgPt9QBb8g8Ew/6aaBvpwAIT4K7gW/eWRMP+mmgb6cACE+Cu4Fv3lkTD/ppoG+nAAhPgruBb95ZEw/LyLjvQmW9T3ZiPm+j5dbP6Ef471hj/U94on5vmyXWz98DeO98GD1PdWQ+b6Nlls//Nvivezi9D1vo/m+Q5RbPzxS3b0Fnuc90En7vgBsWz8d09a9/OjYPVq7/L7YV1s/z8DNvdwxxT0bJf6+lFxbP5o+xb3MkrI96jn/vkprWz/0Kry9FQafPcDx/77KkVs/TPm3vQZSlj2EDAC/Eq1bP0omtb1zf5A9NhIAv8PCWz8Eq7G9axWJPYkfAL9c2Vs/Dr6xvV34iD30LQC/ANFbP91PsL25CYY98SoAv5feWz/e4K69GhqDPXYmAL/c7Fs/Hk6uvaBkgT1OQAC/quNbP1bbq71xOHg960EAv572Wz9qMKy9yjJ6PfwzAL9z+1s/c3uuvQP5gz2xlv++CCFcP7xetL3pLJY9YeP8vtamXD97G9a92dTtPcxm8b75L14/gOP4vQGxLj69ddq+fDthP9YIAr5tDEs+pd7Lvjz2Yj87wAK+P8VKPs+Xzb4MkGI/DtACvn5jSD6Xvs++tTNiPzewAr68bkQ+qunSvpawYT9HLAK+LmU9Pr4k2L522GA/lfoAvvFRMz6e3N6+OsNfP/PK/b13fyc+6f/lvtWZXj/aBfi9Q/kaPq6l7L5lhl0/7TDxvVbdDj7uLPK+/KdcP3dg6r2imAQ+nTr2vpgMXD+BK+W92uz6PZmw+L5GtFs/LyLjvQmW9T3ZiPm+j5dbP0OJ573+IPQ95E7+vgAsWj9wZuS9cVftPXTE/r7mNFo/wcncvVq53j3iF/++dnlaPzFV1L0RlNA9xHb+vqUBWz/MQdC94U7KPXvc/b6GVVs/xrrRvRCIzT3Do/2+VFRbP8fJ1b0phdY9E+/8vmRWWz+s0tu9djnkPfGd+74kaFs/LyLjvQmW9T3ZiPm+j5dbP9TK6r1QjQQ+M6b2vh7tWz++XvG9DcENPtNs876cWlw/RMv1vR2XFD4zuvC+lbxcPyRp970ERRc+BprvvpzmXD9ozvW9E8cSPq+M8r4qUFw/EhHxvWbXCD66OPi+azZbP7fP6r28ef093bH8vk5rWj9Diee9/iD0PeRO/r4ALFo/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/LyLjvQmW9T3ZiPm+j5dbPy8i470JlvU92Yj5vo+XWz8vIuO9CZb1PdmI+b6Pl1s/viLjvc+o9j2b/fi+PbpbPzsi471PqPk9VHb3viEbXD+yHOO9dET+PZAX9b6kr1w/kgvjva0UAj7tBvK+nWxdPxjl4r1KewU+XG/uvthFXj9uneK9qR0JPjaD6r4xLl8/DCnivUu7DD5UfOa+BxhgP45/4b0pDRA+3JrivtL1YD++neC998gSPpIi3765umE/yoTfvUGOFD6BWty+M1tiP7lQ3r1rkBU+jTjavmfZYj+GIt29TB8WPtKQ2L6NPWM/FgzcvW5AFj5obde+m4VjP74e270C+RU+0djWvj6vYz/vatq9JU0VPu/d1r7Lt2M/ff/ZvVo/FD4riNe+MZxjPx9D271TRRM+77HZvpcdYz8QTN+9lMsSPvXt3b7dC2I/FKzlvaGyEj452OO+S3lgP43u7b0KHBM+0PvqvkR5Xj/tn/e9SBIUPs7q8r45IFw/9yQBvuWhFT7uO/u+6oRZP1y4Br4C1hc+78UBv0XBVj8iUwy+5rIaPlC/Bb9B8lM/hs8RvoonHj5pYAm/cTdRPx7PFr7uDiI+pH4Mvw+5Tj/OExu+3hgmPgYLD7/3kEw/aaEevinOKT6ZCBG/58tKP9I+Ib5N6Cw+u3ISv6F7ST8w2iK+kQcvPhNME7/Iqkg/0mcjvorOLz7tlRO/ZWJIP9JnI76Kzi8+7ZUTv2ViSD/SZyO+is4vPu2VE79lYkg/4tezvCgJ9jyeLeC+nfVlP1PHs7xcAPY8di7gvm71ZT/fUrO8X8P1PNQz4L5G9GU/UBayvOMd9TzkQeC+QvFlPx0RkLzUtOM8Ji3hvjLCZT9GhVO8GGDQPKOp4b51rWU/G9XXu75TtjwGtuG+crRlPw6bMLoPeJ084sXhvre2ZT+ZL7U74SmDPI9z4b70zWU/MTwIPBrfbjyZGOG+b+RlP2rMJjwrH188fMvgvgb3ZT8OO008dfFKPFmV4L55A2Y/SFZNPPaUSjy+0eC+vPRlP3u7XDydmEI8S57gvtgAZj+JJGw8NZY6PJ9n4L6kDWY/zyV0PFHONTyOw+C+6/ZlPySxhzwySCc8lpXgvu0AZj8dX4U8qw8qPLNi4L6NDWY/jZlqPBBJPTyc8d6+cWhmPy2gFjwMdW88/pfavhB0Zz8z+Im8e1DsPNj5zr5s/mk/rN5IvYImPz28Gr2+TkRtP9HWg72O6GQ9UKazvna6bj+5kIS9e7VkPRxxtr5gMW4/lIuCvSuTYT3fvbi+R8dtP7jTfb2MVlw9C+m7vvk0bT/OVHC9MgdTPcIAwb5TRWw//u1bvQKeRT2Xh8e+/QhrPzHHQr248zU9NWnOvoKuaT9P7ya9YGQlPRC11L4XZmg/4dEKvS1mFT2PyNm+5lVnP3w75Lxq5Qc9mWHdvteQZj/fH8G8Eg39PNJ6376DHGY/4tezvCgJ9jyeLeC+nfVlPwgawLzPNfI87O7uvnA1Yj+QMq286HPpPLvx7b49fmI/RDaDvJKc1jzgBuu+h0xjP9gSMrxeUMQ8rh7nvpFVZD/yzgu8yCa8PCQI5b5x32Q/J1scvBCBwDzhwOS+r+9kP1tlSrzBmMw8eOnjvn8gZT89GYi89u7ePNVs4r78dWU/4tezvCgJ9jyeLeC+nfVlP7Qu5Lwo9Ac9TindvlOeZj++XQi9YiQUPfnT2b57VWc/bIgYvfI1HT0PDde+f+tnP6zFHr1fxSA9UeXVvjYpaD+e1RW9F70aPbxf2r7fJ2c/PxcBvVhXDT0YiOO+KAVlP5N/1byZH/88/KHrvkkKYz8IGsC8zzXyPOzu7r5wNWI/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/4tezvCgJ9jyeLeC+nfVlP+LXs7woCfY8ni3gvp31ZT/i17O8KAn2PJ4t4L6d9WU/j721vH5r9zxnf9++QB9mP6sMu7yzRvs8u53dvn2RZj+jPcO8qpcAPT3F2r7YO2c/W77NvBNbBD0pM9e+gw1oP2je2bwnrwg9qCbTvtP1aD91x+a850sNPU7hzr675Gk/gX/zvFvfET3dpsq+K8tqP1nz/ry8DhY9wbzGvkabaz+iAwS9AHoZPa9ow76ASGw/y5gGvU+ZGz3a/8C+RsRsP2S5B73Uuxw9H1e/vgEZbT+ADQi99E0dPQQqvr76VG0/bqkHvdVXHT18fb2+qXdtP8ugBr374Bw9wVe9vhWAbT8FBQW9re8bPTLAvb7DbG0/zeMCvUeIGj0dv76+xzttPzQfAr0LXxk96RXBvrvDbD++UgS9+RQZPQ1Kxb6B5Gs/KugIvfVuGT0NCcu+yKhqP6vhD73Dnxo9idbRvo4jaT+1Ahm9T7QcPc5A2b4GaGc/rAgkvR7AHz390eC+5o1lP52fML1j2SM90g/ovomyYz+9aj69TwspPUh97r7k+GE/WwJNvc0wLz33svO+f4JgPyVQW72cHzY9jUv3vilzXz/sT2i9H2I9PfdE+b5e014/0TtzvWgJRD0F/vm+F45eP/2ee725pkk9qun5vneFXj/hfIC96oVNPR6J+b7jll4/Vm6BvXryTj1IVvm+n6FeP1Zugb168k49SFb5vp+hXj9WboG9evJOPUhW+b6foV4/9EFlPnTC8jlcET4/F6IhPwtFZT7mj+85ShE+P+ahIT9RWmU+1K7ZOU4QPj8soSE/ypNlPmq4njk2DT4/tp8hPxZhaz4gCyS7O0o9P5P+IT8/rnE+7XyuuwcgPD/hwyI/eS96Pls+DLxuSjo/wg4kP7dOgT62BDe84dY4P7veJD/k5YU+wF9ZvEFINz8friU/+PWHPmQ0ZrzfgjY/RxsmP+pXiT5bmG28V/g1P79pJj9KHos+KP93vCh1NT+qmSY/JieLPgKceryppjU/lWEmP+LZiz49UH28/Vs1P0yNJj9ejYw+6bl/vAMQNT/wuSY/l/eMPi8ag7wwTDU/ZmEmPyE7jj7PIoa8HvQ0P9N7Jj9h/o0+LFOEvHPSND+0rSY/2FCMPlQGb7wm4DM/xQ8oP/iThz7RoSi8JxUxP6T5Kz+bXGA+CuK2O31vLj8axjI/xQsgPnL3szwIGy8/jlI2P8V6+T0FN7U8TREzPxMvND+5lgA+pyu3PCKDNT8njDE/aD4FPhPkuDypcjY/R14wP70aDD7Vbro8ZW03P2cDLz/2nBc+k3m6PBTEOD95/iw/hgImPjxRrzz4Zzo/gGYqP7yFNT48yJc8CvY7P060Jz9dmUQ+ZiRuPJMmPT8yUCU/MbFRPnZuHzzD3z0/0X0jP/r4Wz5mW6Y75SI+Py1aIj8nxWI+fz3hOjQePj/2yiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT+TgWE+zfIUO76pPj+wQiE/MhNZPo8nzDtYvT8/CbMgPwREUD64fCI8h4NAP3t9ID9PGUw+2EI7POzFQD/AgSA/kC5QPo83HTzs4kI/2JsdP7iaWT7/aaA7qzpHPzBFFz+QZWQ+JJekumH6Sj+NLBE/dpVtPkat3Lsz30s/NvkOP5Bmcz7x/Rq8b5lIPxvtEj/FM3Y+l6UavMqQQj/9jBo/Ted2PnsaAbwyZjw/CfMhPynNdj7r0OC7iYg5P788JT9AAnQ+K0PBu+BZOj/SkyQ/gfZtPr1qZbsqAjw/rj4jP+D6Zz6PQla6C3g9P8EXIj/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/9EFlPnTC8jlcET4/F6IhP/RBZT50wvI5XBE+PxeiIT/0QWU+dMLyOVwRPj8XoiE/UeNkPlNIPTqJpT0/5CgiP1/TYz65wr06gH48Px6XIz/SHGI+n2coO8bFOj/wsiU/g8tfPrZRgzsepjg/FEEoPwT3XD7AZbk7xk02P/gEKz8GyVk+XT7yO+HuMz87wi0/kX9WPi+OFDy5vjE/Tj4wP89qUz4skCw8NvQvP6dBMj+j61A+rbc+PKDFLj/8lzM/modPPgMFSDz4Yy4/7g80P58gTz6Z9Uk8NqguPwbVMz8DPU8+QyRIPGFCLz/dPDM/xNxPPtmiQjxCIzA/qFQyPw//UD5WcTk8TzwxP58oMT93o1I+fXYsPM5/Mj8gxC8/BstUPmZ7Gzzo4DM/0DEuP/s0Vz7HjAc8t3U1PxddLD+nk1k+XNTkOwZNNz9WOCo/As9bPhD4uTsFSDk/Q+InP57JXT5quZA7PkE7P2+EJT+jY18+rANXO8kPPT/bUCM/sXtgPqM6GTsEij4/+H4hP2cDYT6NkPI6b3A/P8phID8ftGA+7lHiOk6gPz+PLyA/y1xfPngO8TrTEj8/EvYgP8zlXD5sVxI7irY9P8XFIj9BoFk+Yd8uO2jfOz8gKiU/8jlWPgqzNjtrMzo/QlInP803Uz4m7Sw71PY4P6zsKD/2HlE+A2UdO7c/OD/r3Sk/VVpQPtAoFzvT/zc/NjIqP1VaUD7QKBc70/83PzYyKj9VWlA+0CgXO9P/Nz82Mio/2dzUvWyK2zzgVvS+lEhfP67d1L2zads841b0vphIXz/o49S9ToTaPHxX9L6PSF8/EvXUvWYV2DyBWfS+WEhfPzX71r28BJY8YOn0vrcmXz/mQ9m9ao8ZPGWl9b55814/GTrcvXCgJruqjfa+xapeP+ij3r3iQF68b872voiIXj9Z4uC9/6vMvIHN9r4rb14/BM3hvSg39rzvx/a+eGJeP4Nq4r257wi988D2vtJZXj+aIuO9sDcavTuG9r7bW14/xBTjvSk9Gr32V/a+4WheP4ll471IIyG951H2vmBkXj9ztuO99wcovR1L9r7cX14/acbjvS2HK70M6/W+gndePzhL5L2Hmze96671vll8Xj+IQOS9O5k1vWjm9b7Xbl4/dgDkvUaNJ71rZfe+pBBeP4Gz471cnAG9k0L7vg8VXT8ePN69XryaPGyTAL/ekFs/Su/PvQwNsz1dBfy+By9cPyqswr0X5Ps9KUDyvlj+XT/gn8C9zI77PcGM8L46fV4/wNrAvdzC9T0Pi/C+y5ZeP+Oswb1QBuw9EujwvvGkXj+CPsO9Oo3aPWOw8b6JsF4/cA/GvSj/wT01gPK+FMlePwEtyb3i6qQ9ODXzvkXqXj+XaMy9JQ+GPdC7876FDF8/DKrPvZ29UD3HEfS+dihfP+BX0r0rHB49mz70vsU7Xz/uLdS9itj1PMlR9L66RV8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/gOdO9d4ADPUx/877ofV8/W5LPvT3uMj3tm/G+s+1fP3XWy71xuWE9q6rvvqVWYD/YG8q9KcB2PUPD7r5shGA/XlLJvRRgaz303ey+zBNhP1XUx72qGk09HYLovrFYYj9bX8e9Jz8iPdwb5L6ummM/ZtjJvRqg5TxjDeO+YfJjP62ez71HGo487tPnvgG7Yj+JI9a9BlYPPL2f777SoWA/kyXbvXgXSztBf/a+57JeP5Yi3b1wZo06Y175vlreXT9k4Nu9QK+nOwaa+L57GV4/3g/ZvZATZTwO4/a+bJhePw0w1r1l07o8NyT1vqkSXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/2dzUvWyK2zzgVvS+lEhfP9nc1L1sits84Fb0vpRIXz/Z3NS9bIrbPOBW9L6USF8/wx7VvetK3DyCyfS+AyhfPzDM1b1wz948QPz1vmjQXj/Evda9La/jPCa0976TUV4/JszXveRy6zyHtfm+rrtdP/HT2L1rSfY8Qcj7vnYeXT8zuNm9/O4BPUi7/b5CiFw/RmTavV2oCT21Zv++agVcPzTM2r1qphE93FUAvwKgWz9G7dq9ZAIZPcK5AL/+X1s/p9TavewgHj1g2AC/xkpbPx2Y2r1TEiE9OcMAv/5VWz+IStq9ZOUiPZGUAL85cVs/VvXZvStdIz0+UgC/AJlbPw2h2b3HPiI9gQEAvzzKWz/UVdm9H0wfPYlO/74CAlw/NBzZvdo/Gj1lkP6+iz1cP/BJ2b2DqhQ9N3D+vvlJXD/QG9q9Rk0QPc10/74w/ls/lHzbvQ4kDT2+vwC/M2JbP1Bh3b1ZKQs9jD8Cv9B4Wj9Ky9+9fFUKPUI5BL/ZPlk/e8rivQqeCj2ftQa/zKlXP6dD5r1a/As9OqwJv+a4VT8Zf+q9LGAOPcA6Db9ST1M/iNPvvWK/ET2IhRG//EVQP0409r0xIhY90HgWv0OYTD9/OP29j9caPby0G79afUg/ZB8CvokHHz1ItSC/p1hEP2gxBb6ydSI9YOwkv1CtQD9JVQe+wsskPWHKJ79CFT4/mx0Ivl+rJT3Z0yi/4R89P5sdCL5fqyU92dMov+EfPT+bHQi+X6slPdnTKL/hHz0/NuO7vM2b/jz9oQm/xqBXP7vUu7xZgf48K6IJv7OgVz/+bru8mMj9PEqjCb9IoFc/ZVq6vFrT+zwwpgm/Pp9XPyunnLy8Msc8oMYJvzGeVz9fuXa8TjmNPEq1Cb8bulc/OqodvLEWADz4WQm/rAJYP8hKmLsIFoS65OoIvz1OWD+Aqvk5psMmvBZECL9StFg/Pk01OxUUabwl5Ae/bexYP9t/jDtNrIq86JwHv1MVWT9dR8o7Tr+mvDhLB7+TQlk/cAnKO7Aep7yQWge/8zhZP/zC4juAOrK8MzEHvx9QWT9kavs7+Ve9vGoGB7/vZ1k/9qQDPHKww7zRDge/GGFZP1ICGTyfmNe8Sc4Gv46DWT8CnBU8GO7TvGjKBr8Ch1k/+K77Ox5wurzVpwa/MKNZP6HPdztsi228lwgGv/YSWj9+BpS8wkHcPORaBL80+Vo/jMY6vSmsqD2sKPy+OH5dP3iSbL04Z+U9J9ryvocMXz/Z5W29ggrlPXnS9L6agl4/GAlrvU/83z19sva+lRVeP7G0Zb3/jdc941T5vgyAXT8PaVu9q5bIPRuL/b46kFw/rMdLvTxTsz2ZXwG/72RbP6xxN71hk5o9r/0Dvz0yWj+MQCC9c6eAPUw9Br8AKFk/bnkIvX3tTz1u5we/vWNYP8Il5rw1fCY9HPMIvyPrVz9Xfse8u+8JPSd6Cb8KsVc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz9tvM68UaMQPTtdCb9evVc/hgv3vF7CNj2/jwi/ORhYP4GpDr0z4lw9snkHv7KXWD909Ra9wThuPRnkBr8G3Vg/nAUTvTbOYz364Ae/3kxYP9WGB72xwEg9Fd8Jv6ArVz8Tu+u8h2YjPYmkC7+jMFY/71DDvAzA9jzAqgy/3KlVP9KNnbypELI8F9UMv9SmVT9qs3u8myCAPFgZDL9LMFY/TF5PvPLdRDxe0gq/pQtXP8CqPrykKTE8bhgKv0SFVz/r4Vu8/yVlPJseCr+CfFc/8fmNvNWsqzztCwq/UHpXP3Cqrbyls+Q8D80Jv4GPVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/NuO7vM2b/jz9oQm/xqBXPzbju7zNm/48/aEJv8agVz8247u8zZv+PP2hCb/GoFc/wgq8vCiz/zwWgwm/IbRXP4ShvLwQhwE9bCsJv8rqVz/05r28w3oEPWCgCL/PQFg/oBPAvJvSCD315we/uLFYPz5Bw7xjhw49DQwHv6g2WT/iXse8JFwVPTQcBr+PxVk/ljLMvJfaHD3kLQW/PVFaP3tk0bxIWyQ9o1sEvznKWj9Ze9a8CAMrPYbDA7+kH1s/6HDavGdjLz1xhwO/Sj9bPyhC3bwgnTE9E5sDvwMxWz+Phd+8froyPcLZA7/YCVs/p/vgvL2SMj2UPwS/LsxaP+tk4bzo/jA9oMgEv0t6Wj8sfuC8QNUtPUJxBb87Flo/mv3dvJrlKD1CNga/vqFZP/bG3LwsRiM98oUHv/HVWD/Smd+8rz0ePQS1Cb+bd1c/kenlvMziGT0Dlwy/cZpVP7Al77yTURY9W/0Pv5FTUz+0uvq8DKwTPcG4E7+VulA/OgcEvZEcEj2JmRe/5OpNPw9oC73cvxE9Nngbv0/+Sj9NDhO92M0SPR0eH79NH0g/cn0avS+XFT04USK/cIFFPwhkIb1OSRo97uAkvx5WQz/cOSe9YSUgPYK/Jr+BtEE/QZErvS0SJj0nASi/9ZRAP2J3Lr2FXys9d70ov8ToPz8HHDC9DCwvPXIZKb/Nkj8/JK8wvfiSMD2KNCm/Dnk/PySvML34kjA9ijQpvw55Pz8krzC9+JIwPYo0Kb8OeT8/o+EkvcEzqjvJOr++Ez9tP5HYJL0vFao7ITu/vgg/bT/BmCS9rT+pO/g8v77YPm0/S+sjva/8pjt4Qb++bj5tP6tXEb2THlU7PS+/vsFObT/qO/m8SEWhOtaYvr4YeW0/MtLBvL7QvrqJQb2+lcptP668jrz/n4K7wQm8vu4Qbj/25TO8hubYu4Rtur5jZ24/vggFvODR/rufhbm+7pVuP4uMy7scFAy8c9y4vkS3bj9r0Hq7ykEcvHwuuL4X2W4/qs96u8uPHLzkY7i+xs5uPyc0PLux7yK8xwO4vkPhbj8cPvu6o1EpvOOgt74r9G4/RRS8utUmLbxF2Le+aOluP+v+fDm8sji8bFa3vuABbz8CVhy4iHo2vJY4t760B28/hSUBu9cSJ7ykWba+4TJvPyFY57uGx/y7TYCzvpa8bz8f7Ay917KNO0vyrb4AnHA/v4yQvZzhqDwNTKO+LeZxP5detr1s2vI8gXqdvv1mcj93Y7e9Q0jyPDlToL6C7HE/sPS0vfXo6zw/XKK+fp5xP/ePsL3xWOE80RClvp84cT/Ibqi9K7/OPExPqb6Rl3A/WFWcvbJptDyila6+7ctvP0GVjb0xNJY8veyzvsj4bj/7Anu9avNtPNeBuL45QW4/kStbvfM1Mzye2bu+h7xtP62QP734mwI8oeu9vgZtbT+CKyy92tTCOxzwvr6jSG0/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT/DCDG9pVnSOxsQv75pPm0/6WdLvdufFTxNPb6+H1JtP8krZb0jmkI8h868vs+BbT+8pnC9okNXPD32u745oG0/tYdrvXVTSjyl6b6+WA9tP0QJXb3bSSk8nRLFvoPbaz/u3ka99Pf4O4G5yr68vWo/sYwsvWM+mjuDTM2+iERqP3rjEr2RxRU7vYTLvu65aj+R8fq8KlMeOth5xr4w2ms/LsndvGtCsLnoo8C+WhZtP33+0ry1RyW6u8a9vnGsbT/Ir+W8CC+SOa01vr7zkW0/jVYHvRZQFTsL5b6+ymNtP0ixG71iSYw7hDW/vqZGbT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/o+EkvcEzqjvJOr++Ez9tP6PhJL3BM6o7yTq/vhM/bT+j4SS9wTOqO8k6v74TP20/i+8kvUC2qzvKxb6+kFZtP8s0Jb2ySLA704G9viyXbT8a5yW91y64OxGUu755+G0/JjgnvYycwzt8I7m+knFuP/ZCKb0wa9I7Gl62vnP4bj8IAiy9WPDjO2J7s77ogW8/z00vvQr19jvGu7C+5QFwP0XiMr3F4wQ8nmauvg5scD++XDa9XxsNPGTHrL4PtHA/j/g4vTdbEjwWLay+gs1wP6uwOr1G1BQ8aG2svpbAcD9y9Tu9EdwVPMMhrb4un3A/G6A8vQVIFTxdPK6+q2twP/6KPL3u7xI876+vvjEocD98jju9S6gOPCJwsb6v1m8/A385vQg+CDzCcbO+6nhvP4t5N719igA8CmW2vuzrbj8SqDa9tWvxO9LQur7MEW4/j+k2vTAJ4jvfYcC+cfVsP8QXOL2YidM7B7nGvuykaz/tBjq9TJ7GOwxrzb7+Mmo/BIQ8vewVvDt0/dO+IrloPxNsP71SarQ73A7avvBOZz96bEK9mLSwO4n93r6/HmY/OCNFvRdosjv7/eG+s2BlP3RYR71TSLo7UpLivhg6ZT+xwki96JTGO3r/4L7Rm2U/jDZJvbB41DsD/t2+LVZmPzgMSb1ExeE75HvavmssZz8BtEi9U6frOyql177p1mc/9IlIvUJI7zsMi9a+ZRhoP/SJSL1CSO87DIvWvmUYaD/0iUi9QkjvOwyL1r5lGGg//DbZvrhNCbqMsSU/OSEiP6g12b5U4Aq69LElP0IhIj8JLNm+4ZIWuki0JT8YIiI/uhHZvr7cNro1uiU/1iQiP3kR1r5oBJW7kPAlPxPrIj8ajNK+otETvFjiJT/7GiQ/cpfNvrAzc7y0lSU/yfAlP6T2yL5zQp68o5YlP4JRJz8/68O+7Bi/vEWaJT+nwig/npXBvrgRzbzqjCU/sXcpPyEAwL7vINa8Wn4lP0H2KT+KG76+SZ7fvJqSJT+DZyo/Nzq+vmMi3rwSvyU/LTQqP8tpvb4FceK8TrMlP0Z4Kj+6l7y+pavmvIamJT9zvSo/TWy8vlvi5bzy9yU/lXoqPzQXu74Gq+u8ygkmPxXFKj+uMLu+8B7svPPbJT966io/t9+7vsxs77wnlCQ/X/UrP8Sjvb7yGPq8xdwgPyPzLj/cr86+cv+1vK2rFz+OYTI/bbPpvrLhuruatQ4/f4UxP+SA+77uZU47MGINP2huLD+w6Pu+GpT9O3UOED+CCyo/3r76vtpmGjxIfxE/nj0pPyO1+L656zQ8P0UTP1BzKD9lEvW+FC5TPD79FT8qXyc/AH/wvgWWYzz6ZRk/Cu4lP1Fe677+Elo83ewcP3h3JD/HFua+5ic4POoZID93RyM/2zPhvryo/ztYoCI/hX8iP6gh3b5+CHw7gV4kP7omIj8MStq+imw5OoFdJT+sGiI//DbZvrhNCbqMsSU/OSEiP9+j377WTZs8rxUzP5eyED/KLd2+cCxnPMvgMT+0JRM//WnXvlTtYzve5C4/rssYP8Ig0b7c7N67xX4rP6u1Hj+PF86+NdU4vLzTKT+odCE/bSLPviRIKrwakCk/XmchP/TK0b6ihgK8I8ooP3JdIT+WWtW++JaRu2h+Jz+GjiE//DbZvrhNCbqMsSU/OSEiP3Xu3L6/f0E7m4kjPxkPIz+YI+C+00qwOx1cIT9oICQ/Dm7ivlzt2TuEpx8/wAAlP0RP477WGOY7+vgeP4BbJT+P2eK+W68gPJKJIj+lASI/5rrhvu/8bzwO2Sk/trUaP3Ne4L49qZI8W2EwP/i2Ez/fo9++1k2bPK8VMz+XshA//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI//DbZvrhNCbqMsSU/OSEiP/w22b64TQm6jLElPzkhIj/8Ntm+uE0JuoyxJT85ISI/lzfZvg3vWbqOPSU/NpciP5A82b4qpNu66fgjP9fcIz+QStm+c3FEu2D6IT+t0CU/bmnZvhGsnbv+UR8/J1QoPz6o2b7xx+u7aBMcPwlCKz9oH9q+feInvN5eGD9OaC4/0uLavqpPYrxeaBQ/jYoxP3Pb274Ep5G8QWwQP+B6ND9aF92+1MSzvP/DDD8e8jY/qLXevn9x07zz4wk/qJo4P11I4L6JVPC8faYHP+S/OT8g1OG+sdQGvfKuBT9vqjo/02PjvpPCFL1DIAQ/KkI7P2om5b7JEyC9gTkDP8ZROz+jfua+RJonveYIAz+SAzs/Ny/nvpQ+Kr0ypgM/8Fs6P6Ry574+MCi9hvcEP69YOT+epue+bpwivR3FBj/H/jc/4NDnvqEYGr0w8gg/mls2P8j0575+dQ+9F1oLP+WDND8mFOi+G7EDvb3SDT9mkzI/AjDovgfD77zYLxA/fKswP/5I6L7lPdq8GkYSP+bwLj8IZui+KJjIvPPyEz9rgi0/g4novqCYvLwnFBU/nYEsP+qo6L5gl7i8sHwVP4gdLD8Twui+jv24vH5+FT9bEyw/P9Hovrc5uby4fxU/Fw0sPwXZ6L4NWLm8Z4AVP9cJLD/f2+i+G2O5vKiAFT+kCCw/R9zovsdkubyxgBU/eAgsP0fc6L7HZLm8sYAVP3gILD9H3Oi+x2S5vLGAFT94CCw/X5gWPhh97LznKPK+7UReP/KXFj7iney8uijyvvVEXj8ylRY+MoPtvPMn8r4MRV4/8o0WPhfx77w3JvK+LUVeP5r5FT6Qcxi9XE7yvpgsXj9DaBU+t+k7vbKT8r6gBF4/h6AUPtyDar3/1/K++c1dPxWVEz5Vtoq9T4Lyvg6/XT/cbxI+H7WgvQfh8b7Zu10/xfMRPh9fqr3PkPG+9bldP/GdET4jxrC9S1jxvtO4XT9OEhE+YtG4vfXj8L7vw10/lfUQPo7nuL2pufC+TdBdP7THED4UE7y9R5vwvsHPXT8fmRA+cTy/vTt88L5Cz10/LkcQPn79wL15GPC+h+ddP2TVDz5clsa9z7bvvsvyXT8/BRA+U5XFvSXw777x5F0/mkwRPuSKvr2gfvG+FIRdPx5/FD6IVqu9aJz1vqV+XD+Wfxw+L6wJvfNq/r4IhFo/xXAgPmgTFz1yBf6+82paPy+yHz5fM5g9EW72vvP+Wz/KQB8+XN2WPUhp9L6vl1w/Xg4fPqoxkD1fHPS+FcFcP0vTHj78PIU9ww30vk7jXD9cbB4+YpVjPVsf9L6LDl0/el4dPnKkLT3QG/S+fUxdP0QYHD5TNd08t+fzvruRXT8goBo+QFYzPNyM87480l0/0iIZPtZhiruOG/O+rgVePxzYFz4Xtoq8eabyvrgpXj+y7xY+AwvSvEJM8r47Pl4/X5gWPhh97LznKPK+7URePw21DT7Zwvq8biDhvksLYz/mMQ4+1oQSvRs7475nc2I/21APPor8P72mfOe+VjFhP3pkED4qxmu9RCzrvo4HYD/K0xA+ohF/vYal7L53il8/SlcRPgiQc71qI+2+m3BfPzatEj7e+VS9sWruvscqXz+DhhQ+5SkpvSkv8L5Ww14/X5gWPhh97LznKPK+7UReP4ycGD6PgoW8OxX0vo+9XT89Uho+pDCsuwi29b5rQF0/6X8bPoEqKTvv0/a+X+RcP4fwGz66ErY7Ej73vs7AXD+0/xk+wjG8NWEN9L5sul0/QmEVPt3eSrxgouy+D+dfP8s6ED55CMy8XsrkvqcSYj8NtQ0+2cL6vG4g4b5LC2M/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/X5gWPhh97LznKPK+7UReP1+YFj4Yfey85yjyvu1EXj9fmBY+GH3svOco8r7tRF4/3CkXPg8o57wzK/O+m/ldP/a+GD7i+te8Gvv1vmYlXT+wKhs+i8q/vJ5K+r592Vs/m0IePj5Zn7z/0v++ZiNaPzbeIT69h2+8CSsDv9UNWD/Z1iU+soUVvITPBr9AoVU/yespPu1VU7tMwgq/IOVSP/0TLj6wfC07edoOv9ftTz8YOTI++xYDPN4HE7+/w0w/DBs2PgtPSzxRSBe/hWlJP/P+OT6WjYE8opAbv5vhRT9V9T0+jS2YPLDvH78KHEI/IOdBPonpqDysVSS/RCM+P/aNRT58TLQ8S7Iovz4HOj9FC0k+w1O3PGXALL/6BjY/pkJMPmvirzx1RzC/bmQyPywrTz7naKE87kkzv+MqLz8r1FE+TgqRPAvsNb+FPiw/DDJUPhU9fzyTKTi/Ma0pPzY8Vj7uCFw8vgE6v6iAJz+/7lc+IDY6PJV4O78TvCU/jEtZPhd1Gzymlzy/ZVokP7BaWj4OXAE80W09vzJOIz8EKFs+iD3bO3EPPr+fgSI/zMNbPr1fwzvykT6/xtshPyJCXD5cCL07EAg/v6dFIT8CoVw++9a/O1FoP78wyyA/mNpcPkyJwTuZoj+/uYAgPzH4XD7UZ8I7gsA/v21aID8YA10+u7nCO4PLP79RTCA/pgRdPnnFwjsZzT+/SUogP6YEXT55xcI7Gc0/v0lKID+mBF0+ecXCOxnNP79JSiA/wQ6rPWngLr1GoQS/s6RZPxwSqz197S69EaEEv7+kWT9iKas9B0kvvXifBL8lpVk/S2irPXtBML39mgS/UaZZP6nAsT3cakq9dvUDv8bfWT8MW7g9qShnvQYMA78POlo/xYLAPc6ahr14lgG/ItFaP8adxz0ROZi98iYAv71hWz/sZ849J1SqvUj5/L6FClw/GTzRPb9Gsr1eV/u+UV5cP5AK0z2Skbe9DjT6vuSYXD+sUNU9ZTu+vZzW+L5W3Fw/HGzVPTFJvr0X8/i+ttNcP5ZC1j2R7sC9cFf4vhfzXD+2FNc9tpPDvVy59770El0/17LXPS0Exb2Cofe+HRJdP3Av2T3ktcm9gKD2vipDXT8v19g9UOHIveuv9r4+Q10/t1zWPScaw73zDfe+WkddP5EXzz1wurO9x5D3vo9yXT+aSKg9WnlFvcul/b42CV0/vBZXPfVW+TsVI/6+e9JdPzFUFz2X9R89inX7vqaSXj+sQRo9YFUgPahm/b49A14/kcQgPXEZFj0PwP6+36JdP80XKz0AyQQ9nz8Avx0lXT+hJT09wq3LPB+NAb8bZFw/VuBVPR5haDybAgO/IIBbP1q5cj1lxfI65EAEv2aqWj+vEog9ZUA0vKgHBb90Clo/q7KVPVpFvbxXRQW/HrFZP97goD3Z/we90hkFv+2VWT+HV6g9lVkkvYzJBL/RnFk/wQ6rPWngLr1GoQS/s6RZP59erz3SvS29/pwHvyK/Vz+dRrM9vuM/vQbxBr+wDlg/ww67PReqZr2NCgW/kPtYP7OLwT34+YW99ZUCv+w2Wj/CBcQ9zDuOvdJLAb+E3Vo/wB/CPfmLib0XrAG/TLdaP7bfvD2iWHq96ZUCvzlcWj/+5LQ9aUJXvW2tA7+19Fk/wQ6rPWngLr1GoQS/s6RZP92ioD0NTga9VkAFvx2AWT8mM5c9Z3vFvDeEBb+ZhFk/m2WQPa7zkrz5iwW/UpxZP2/MjT17dn+8MYYFv7ypWT8IYZM9MtagvPFABr9iIlk/EFqfPQYN67yRVQe/eENYP/+Zqj0L3Bu9YLAHv+TPVz+fXq890r0tvf6cB78iv1c/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/wQ6rPWngLr1GoQS/s6RZP8EOqz1p4C69RqEEv7OkWT/BDqs9aeAuvUahBL+zpFk/KOaqPfDpLL3p4QS/VH9ZPw5uqj1uUye9A5cFvyIWWT8olqk9fW4eveClBr/hd1g/J0yoPVqGEr1l7we/ALZXP0aSpj0vBAS97VUJvzjhVj+ijKQ9awnnvIHCCr9MBlY/JluiPYSDxLzpKwy/rSlVP0h4oD1vDKK8iZgNvylFVD8/dJ89f2OCvBcaD7+OSlM/8bWfPQtuU7wzzxC/mSJSPxIgoT0P1i28pacSv8TXUD92GqM9ZAQQvChjFL/PmE8/IZulPejx9rtr9xW/X25OPyNiqD1dn+a7xF0Xv3FfTT87l6s9A2Dvu+GrGL+3XEw/tVyvPWCCCrwN8Rm/mFpLP3l3sz2niCa8XTsbvyxPSj8Fkrc9UyJEvISPHL/qN0k/P5u7Pa0IYrxt7B2/lxVIP7V9vz1z9X68i0wfv7bsRj+JH8M9ANyMvI2lIL8HxkU/9WLGPU+jmLzG6CG/g65EP4wnyT0NZKK8LQQjv522Qz8WSMs99sypvOriI7/V8UI/RqHMPVKYrrxgcCS/23NCP9wWzT0Nd7C815kkv2ZOQj/jD809yrWwvF2NJL8FWUI/dAvNPfvbsLyxhSS/jl9CPxwJzT2a77C8uoEkv+9iQj88CM092fawvEKAJL8vZEI/HQjNPd73sLwMgCS/XWRCPx0IzT3e97C8DIAkv11kQj8dCM093vewvAyAJL9dZEI/AUhMPVjERbwKRc6+8e9pP8tQTD1z1EW8v0TOvvnvaT/OjUw990RGvBtCzr5T8Gk/4jJNPaB2R7x2Os6+YfFpPx4DXj2bsme8juLMvrIraj8X5289Y5mFvN7qyr5ChWo/y2mDPT40nbx5yse+qhRrP8nmjT09NLO8aPXEviuRaz8PXZg9vujJvLu5wb7cHWw/QNWcPTTi07yNH8C+uWNsP9HDnz1zi9q8SgG/vlSUbD9BhaM9CPXivLG/vb7CyGw/Z6qjPRUH47zH8b2+S75sP1AYpT07YOa8cVi9vjjYbD+ng6Y9OrrpvLW8vL5/8mw/3YOnPayP67za0Ly+NOtsP1Qeqj0ZiPG88ui7vl8QbT8WjKk9OnjwvEjfu74wFG0/JoilPRQb6bx6jbu+kTFtP9mBmj0WutW8BjG6vmuYbT+XHEk9Vx5jvOkdvL5uvG0/e804PAFvXDuajru+li9uP7/OFbz4CFs8PBe7vrFCbj8k5gy8JWNcPDsXvr7Kqm0/vkPauzKPTzwGxr+++lVtP/a6Zrsxszk86NbBvrzsbD8oiQM7yqQSPKPkxL5iTWw/ZQ4gPBCQtjvJZMi+P49rPzVNmTx1GeA6AJHLvsvYaj8+hOQ8HI8Wu3rEzb5/Tmo/ZicVPZQaxrsuyc6+VQBqP9DYMT1o/BW8LdzOvmPmaT8oL0U9ZdQ4vEd+zr4R6mk/AUhMPVjERbwKRc6+8e9pP/fOWT1lmUK8tVrcvhOoZj/rEmQ9FmBZvKcM2r7tKGc/bAN5PQfthLxqMtS+2GtoP27VhT3KOZy82VrNvrHbaT8JtIk9gJOmvI/yyb6Pjmo/lM6GPaG6oLw2g8q+IXdqP0MJfj1QW5G8bdXLvrxBaj8YS2c9z2J3vDZFzb4YDGo/AUhMPVjERbwKRc6+8e9pP5tnMD1eAxS89o3Ovtb4aT/qgRc9F6zQuyI2zr4cH2o/NKIFPZFmkrsho82+C0tqP5ec/TxOS3W7L1nNvkJfaj/4Lw09K9Wiu4B40L72pWk/orMsPWiM/LvDW9a+eDloP1LaSz1/viy8J9HavnwTZz/3zlk9ZZlCvLVa3L4TqGY/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AUhMPVjERbwKRc6+8e9pPwFITD1YxEW8CkXOvvHvaT8BSEw9WMRFvApFzr7x72k/AA9LPb1oQ7wtYM6+JetpP2mURz3Esjy8Rq3OvnndaT95+EE99AMyvG0Sz75WzGk/m1A6PQWxI7wCaM++QcBpPyvQMD3ZKBK8zYTPvvrBaT/U4CU9Ehr8u6RIz74P2Gk/8EYaPeBE0rtBns6+UwZqP+fVDj0PDKi7IcPNvlw+aj/tvAQ9tICAu1/qzL4tdGo/KQ77PMV1Q7tMTcy+oZpqP3QK8Tz/tBO7dMjLvkW6aj++4Og81CLZuqe9yr4k9mo/XNjiPII0oLqlIsm+6E9rPzLM3zzWNYm6GwLHvknEaz/4+N88426TugjExL6TPGw/SIjkPGedw7pE28K+pqBsPwk97DzFQwa78HPBvlrobD/5yPQ8ZjUtu5p0wL4OGm0/B/b9PC/vVLsH7b++/DJtP2S7Az0Ys3u7XN+/vgQzbT9Ocgg9juyPuxM9wL41HW0/UOAMPZPzn7vY5cC+LvhsP/W7ED2GUa27TqnBvtfNbD8LuRM90pW3u1ZNwr5Fqmw/QoUVPVZevrtrkMK+R5tsPyzDFT2uLMG7rCrCvvuvbD8gPBU9MbnBu7CBwb7l0mw/vekUPdIOwrvQGsG+FehsP0y/FD3qOsK74eXAvvfybD+krxQ9KUvCu1zSwL759mw/ZK0UPZVNwruQz8C+jvdsP2StFD2VTcK7kM/Avo73bD9krRQ9lU3Cu5DPwL6O92w/DM8gv6DmMT3sPsk+tosrP5fOIL/N3zE97D/JPuCLKz8MyyC/fK0xPRRGyT6YjSs/LMEgv7IiMT0UVsk+uJIrP4JwH78ahCA9LU7KPoGTLD/PyB2/inQNPf3hyj69/C0/lGMbvy1+6TzYS8s+2hQwP/pIGb9T2MI8FS3MPp61MT/g/Ba/012gPFIqzT6xajM/xuMVv3FNkjwejc0+pTw0P10jFb9ZIIk80MXNPqnNND/8SxS//ct+PPNJzj6+WjU/3GoUv0PfgDzYkM4+By01P44GFL9E5Xg8sKXOPtt5NT8woRO/1ylwPPS4zj6cxzU/xKsTvyyQcTzDTc8+gZQ1P6QVE78KYmU8fq7PPp3zNT83EBO/gZdkPNhazz7mDzY/fOUSv/68XjwSBM0+7ts2P2BJEr8xc0s8MzPGPog3OT8vFRa/mMG0PO7qsT4RQjs/Hckev/LvJT1kWJg+HII5P7k0J7/HjVY9DuePPsyAMz++jii/xE9rPY5llT5u/zA/fJMov0TIcT0Dwpg+JjowP3ZMKL/3GHc9JwydPvuELz+4oCe//957Pce2oz4VnC4/08Mmv136fD2J96s+SXEtP6XHJb91RHY9BWG0Pt1ILD/8mCS/5DxpParjuz79eis/3E0jv18GWD2c3cE+SSQrP60ZIr+ci0U93QLGPtgvKz8xLSG/uGA3PURuyD6mais/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz9MlyG/z5Y7PZL9yD4B2Co/hT0jv+eMUD2SO8g+s2UpP97NJL9ormQ9ZjDHPoMVKD/NfSW/7HBtPbedxj6qhyc/Wnkmv8r5dD1NLMs+diElP3hGKL8FLYA9P9vUPpwcID/7Sim//kCAPdj43T5H4xs/20kov6aBbD3+HeI++ZsbP96eJL/R4EI9gQ/fPoDGID9ZXB+/GIQRPY911z40rSg/hGUav9Wk0Txrbs8+IccvP7cqGL9N5K887KzLPnLUMj8hBRm/vaS9PJ35yz43ADI/+BAbv7dB4TxGccw+bQswP0GFHb8O/Ag9qVrMPkzPLT8nqx+/zU4iPd7vyj4HLCw/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/DM8gv6DmMT3sPsk+tosrPwzPIL+g5jE97D7JPraLKz8MzyC/oOYxPew+yT62iys/NkcgvxriLD2MUsg+rFQsPwnUHr8GeB89WMbFPkZyLj+cpxy/OCEMPW3kwT7yiTE/Q/QZv5ua6jyb+Lw+6UA1P4/xFr9yo7o8I163Pjg8OT8K3hO/GbSMPDOFsT6VIz0/Cv4QvxdxSTxW8Ks+caVAPxqHDr9QFRA8ZFOnPhJ+Qz+8uwy/U5LVO4UcpD4xeEU/OGULv4k0qTvHdaI+IsJGP4HoCb8DNoU7/j2hPo0KSD/srQe/X49AO7uQnz7s5Ek/iOEEv2Q97Dp7hp0+7iRMP702Ar96wPU6tQydPlLyTT/MwAC/Eq90O9N6nz5bZU4/11IBvwho4zsXxKQ+sP1MP4mSBb8BGC482QKrPvXvSD/S3gy/XBp6PBYvsT5XfkI/MWoUv9HOtzw2n7g+PfY6Px4RGr/RHPc8ASG/PhyTND8LiB2/J0AVPTr0wz6vKTA/4lsfvz4MJD1JwMc+LmEtP3sjIL++8Cg9qmzLPs6QKz8tCyC/+LMlPcKTzj4DuSo/OrYev+QjGz0YndA+bWIrP1CaG7+16As9lCDRPsUbLj9Eoxa/22wAPbN50T5sWjI/HcIQv9cMAz3jXdQ+2lA2P9AZC79qNw498J3YPjdpOT/t/Aa/yFIbPYHX3D7XJzs/3nQFvzt8IT1d3N4+eaI7P950Bb87fCE9XdzePnmiOz/edAW/O3whPV3c3j55ojs/gS2GPuIL773eL8++9EheP/gshj6iE++9YC/PvgVJXj96KYY+nknvvVQsz75ZSV4/OiCGPvPb771mJM++IUpeP2NZhT5TBf+9YpfOvlZFXj80kIQ+rrEHvqMPzr5lNV4/SnuDPmlUEr5MRc2+XCFeP9kogj4wChy+ixDMvo8wXj+Iq4A+fuQlvimQyr7NTV4/AAaAPrIuKr412cm+alteP1Qrfz4ZBC2+Vl3JvqVkXj/x3H0+fpIwvp6fyL60el4/Jqx9Pn+dML7kfsi+AoVeP3g4fT4UAzK+2j/IvqOJXj/Jw3w+XmczvlsAyL5Qjl4/myd8PjMvNL7vn8e+76ReP9Inez7ZpTa+OxDHvgy3Xj/5gXs+vjM2vmNHx74zql4/7vJ9PoUSM74Uyci+zE9ePyQugj6yfyq+gdvMvq5WXT/MR4w+0wz3vVHY2L6V4Fo/zCSUPsInUr3XbuC+FXNZP+7nlD4iDEK8eQHevuxQWj/46pM+ZYVOvHPZ276QBls/ymCTPvM/hLzcGtu+qElbP0Cxkj6hkrO8clfavluPWz8vkpE+WnEDvQkx2b4M81s/XNKPPjcqPL1orde+tHJcP1K6jT4kVH29dtzVvlX5XD97hos+he6fvbHy076Ucl0/PnmJPvCdvr01JdK+bdFdP/DEhz5Qzte9taDQvvITXj+Sm4Y+jczovS2Uz75xO14/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+lTYY+ADHnvQsKz74ibl4/wpKGPuG51b3nqs6+n79eP/7Whj7EBsS9+jvOvhQQXz8S9oY+TOm7vYEEzr4cNF8/23KFPt+kwr3258u+HNNfP3HdgT7IJdS9nBbHvusuYT+rxns+u/frvVowwr6RcWI/yU93PjGjAr5TNsC+B71iP7VNeT5JAw6+N9vCvoibYT9oy34+MREXvs2px75vzF8/F/WBPswIHb4A48u+YDdePyAJgz60MR++S6fNvtCNXT8NFoM+G4ccvsyCzb7Asl0/1VWDPkN4Fb4yUc2+rwJeP3Xxgz4RYgu+ZG3NvghOXj/DIYU+00v/vfBFzr5QX14/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/gS2GPuIL773eL8++9EheP4Ethj7iC++93i/PvvRIXj+BLYY+4gvvvd4vz770SF4/FXSGPt5s8L1Hq8++iRteP2U9hz7n9fO9HwXRvlGcXT84eIg+eq74vfIV075u2Vw/chKKPman/b0vuNW+aOBbPxr8iz6ICwG+z83YvlW8Wj95K44+ALMCvlVE3L4IdFk/8aCQPr+WA77KF+C+TAhYP2mCkz4KmQO+MErkvtJwVj+nc5c+PekCvg8Q6r5nNlQ/PdycPiY8Ar5fEvK+TfxQPxCfoz5DkgG+dRv8voa0TD/H86s+LZoAvokTBL/8KUc/9gm1PkD4/r0UnAq/RaZAP83mvT7Ddv29DNcQvwHYOT8Wk8Q+ok7+vRpmFb8SZzQ/WpjGPtxpAb6rtBa/RqcyP5u2wT5qYgK+oV0Tv6KwNj+rPLc+uA0AvlM5DL807j4/2EmrPsHP+L1OuAO/d7VHP3/6oD67WPG9cyP4vlbFTj/SBZo++CDsveB27b4oRlM/mMOWPlLh673Kfei+Vz1VP5W4lj5iQfG9vK7ovt8ZVT+M9Jg+Y236vfWQ7L5kdlM/Bp+dPnk9A77DL/S+vy9QP5oYpT6hKQq+l6H/vj31Sj+zIK8+V7URvt/zBr9ux0M/bE66PgbdGb5OUQ6/Xmo7P6UsxD7YqSG+qpcUv85yMz967so+Po4nvm3WGL8Gki0/D23NPi70Kb4EYBq/2lArPw9tzT4u9Cm+BGAav9pQKz8Pbc0+LvQpvgRgGr/aUCs/JIsgPuAoKr4FvPW+w9ZYPzaMID4PLCq+0br1vubWWD+MkyA+aEIqvhuy9b7u11g/VqcgPhF/Kr49mvW+y9pYPyyKIj4k3TC+RMjyvt49WT8nWiQ+8cw3vmRW775owFk/gF4mPvzjQL4zW+q+g4RaP7z5Jz4tM0m+7Z/lvig6Wz+TRyk+4qZRvj5z4L4AAlw/C74pPopPVb5WCN6+8mBcP5MBKj4YvVe+lmHcvu2hXD9XWCo+tMZavohd2r4c7lw/kmcqPmjKWr7pdNq+XudcPwWAKj6A/1u+dpnZviQJXT8flio+GTRdvhW82L4xK10/Y74qPqfWXb5teti+Ji9dPxTsKj5i9l++5wbXvkdlXT921io+zZhfvh0u1760Yl0/3zQqPjQNXb7NM9i+o1NdP2omKD7EQla+74bavoRFXT8P1Rw+KHEwvlPi6b7w8ls/6qwGPi0u7r18DPi+/mRbP1lS8z1qJKi9YxX9vhByWz+mZ/U9G2OnvWEB/76A3Fo/mZj4PZLVrL13tv++R4haP8J2/T2QJ7a95y8Av+8hWj9h4AI+YrzGvWWDAL+Nj1k/lkcIPobj3b0YmwC/ufJYP4lVDj5SY/i9ODwAv6p5WD/QLxQ+18MJvvqn/r6AQFg/60IZPhlOFr67/vu+yElYP5ovHT4anCC+2w/5vp9/WD9vqx8+N5Ynvluw9r7Iu1g/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8vXx8+0tgmvovi9r4iulg/z6YcPmF8H74fNPm+rohYP7rBGT65BBi+BTn7vnxqWD8DZBg+ZZYUvg8K/L5PY1g/MQIaPl/cFr7Ilvy+ug5YP2y0HT6hHR2+IN38vgGIVz9A4CE+6k8mvmpU+77wWlc/VY0lPiziML7p5ve+raVXPz9IKD49Eju+yCLzvlFVWD9crSk+ZaFDvjJ/7b4JW1k/CsgpPh+cSb4cOui+EW5aPwOKKT4D5Eu+CdTlvmzxWj9kDyk+2IxJvi4T574Gxlo/GbEnPmNqQ76aQeq+SFdaP1l/JT4pxzq+PHzuvtXFWT+8qiI+Fugwvsrz8r6fL1k/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/JIsgPuAoKr4FvPW+w9ZYPySLID7gKCq+Bbz1vsPWWD8kiyA+4CgqvgW89b7D1lg/6pQgPp7cKr53JfW+EvhYPw2uID7nrCy+qJ/zvqJNWT+RxiA++yMvvjZ+8b4ExVk/BdAgPnzSMb5wFe++yEtaP6/KID5qWTS+4cTsvizMWj/szCA+JG02vjX86r6EK1s/4wMhPjvTN76ROuq+G0pbPyeuIT6qQTi+PQHrvk4HWz/02iM+yes3viv57r5c3lk/swIoPsRyN77fYva+rZ5XP6EYLT6RITe+NF7/vuzAVD/U4TE+u/E2vhHqA7/J6lE/3cM1PlZVN74TUQe/L4JPP/GFOD5ndDi+p6EJv7zDTT+eyjo+NB46vqM/C79rc0w/sk89PjzhO77D1Qy/QR1LP3RLPz41ZTq+d7cOvwbEST/RJD8+Qg41vgb+D7/dK0k/uiM8PuopL75OaQ+/VxZKP9k2Nz4Ifiq+UC0Nv6QuTD9KtzI+860nvum1Cr/BQU4/GV4xPssmJ76k2gm/9e1OP2r9Mz4fyii+MEQLv4PBTT9NJDk+X/wrvn8WDr+cXEs/y8s/PnauML48nhG/9zNIPwzBRj5EyDa+6QsVv9LiRD/J2Uw+NEk+vrOkF782DEI/PXlRPtr/Rr4FFRm/lQ1AP8+MVD5B7U++OoAZv73pPj+sMFY++hdXvghnGb9uYT4/sr1WPtj6Wb4kSRm/Cjs+P7K9Vj7Y+lm+JEkZvwo7Pj+yvVY+2PpZviRJGb8KOz4/VWZfNGTPUD8yAy4zVNLIMmjPUD/rIpszeHyevLDKLL0feOG+pYhlP1tsnryqziy9TnfhvtiIZT+O+528guosvftw4b5kimU/q8mcvAk2Lb1TX+G+t45lP3DSebxXFzW9/PjevlAjZj9bNDW8rpo9vUXe275T32Y/g5i5u6iuSL0aS9e+kuxnPx8zV7pRzFK9ny7Tvi/WaD8z/oI7HgpdvUuyzr4+zWk/U3TGO2BtYb25jsy+mkBqP4nc8jvCVWS9XBbLvvGOaj/CJxU8Y/1nva5jyb7852o/1XEVPPsGaL2gk8m+p91qPxhWIDzCeGm9QM7IvggGaz+LKys85ulqvckGyL6iLms/2i4xPOy2a71/AMi+4i5rPwVNRDy5Rm69TcrGvhJtaz+L3EA8ptBtvdbPxr6NbGs/gcIoPMyZar3N58a+3mtrPzVnzjuqAWK9NqPGvh2Faz8774W8fxIzveYSzr5HC2o/xOtSva6L0rzm4dS+FFtoP5pzlL0gCma8AcTYvkknZz8/6ZS9/X5kvHg/3L4jU2Y/go+RvY0fdLx3zN2+ZftlPynNi71aSYe8hILfvr2dZT/kf4G9ZYSevLPR4b5zIWU/4fdlvT64vrz0GuS+PalkP/JRRL04ruK8+Kvlvv5bZD94wSG90V8DvXEI5r4pVmQ/1cUBvfCuE73MLeW+ipdkP5v0zrwazyC9aJ7jvsX/ZD/wgKu8GpQpvYYd4r4DYGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT+YnK+8744ovR2Z4r59QWU/N9nVvNsTH72q2OS+CrFkP3vM/LyxVxW9B8PmvlgyZD/YWwe9UtMQvRyF577z/mM/gzEBvdvWE715qum+UXRjP7JP4bxL5xu964Dtvst4Yj/3ALK8OoonvdWG776A8mE/iI54vL39NL25re2+4G1iP+fAELztE0K9GXDnvvwEZD/Ubm27I9lMvcau3r5aKWY/BMwvuVYXVL21b9a+XhZoPyUpjjptxVa98bnSvvXsaD+J6Z652tVTvVoT1L5EoWg/nweCu5kqTL01Zde+DeRnP8KSFrxBaEG9XIfbvjjyZj9jLXm8ASo1vSVf376GCmY/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/eHyevLDKLL0feOG+pYhlP3h8nrywyiy9H3jhvqWIZT94fJ68sMosvR944b6liGU/fRmbvAekLb0AjOC+bMJlP2ROkryp1y+9SxjevoVaZj/IVIa8Gdcyvf2L2r7UMmc/zpJyvNAdNr0XVta+0i1oP13HWbzWQjm9ePDRvm0taT9Ir0S8M/07vd3jzb4ME2o/FLM0vFQhPr37xMq+N8BqP2DQK7zTXz+9SjDJvpwWaz+PoyK8iLNAvd5Oyr5r2Go/nfUQvDs+Q72B+M2+7gpqP/l78Lvg/ka9nPTRvpklaT8LXL27jU5LvQiK077sxmg/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4gzaP7VZD7+1Com/8SHGP7VZD7+1Com/SEyzP7VZD7+1Com/wkSiP7VZD7+1Com/OsSTP7VZD7+1Com/joOIP7VZD7+1Com/mDuBP7VZD7+1Com/Ykp9P7VZD7+1Com/Ykp9P7VZD7+1Com/Ykp9P7VZD7+1Com/hUnlsoVJ5bL0BDW/9AQ1P4VJ5bKFSeWy9AQ1v/QENT8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/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AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP5IMgT+SDIE/AACAP5QDhD+UA4Q/AACAP/SeiD/0nog/AACAP6OYjj+jmI4/AACAP5KqlT+SqpU/AACAP7GOnT+xjp0/AACAP/D+pT/w/qU/AACAPz61rj8+ta4/AACAP4xrtz+Ma7c/AACAP8zbvz/M278/AACAP+q/xz/qv8c/AACAP9rRzj/a0c4/AACAP4rL1D+Ky9Q/AACAP+pm2T/qZtk/AACAP+ld3D/pXdw/AACAP3xq3T98at0/AACAP8BZ2z98at0/AACAP+iJ1T98at0/AACAP4SOzD98at0/AACAPyH7wD98at0/AACAP05jsz98at0/AACAP5hapD98at0/AACAP4x0lD98at0/AACAP7pEhD98at0/AACAP1+9aD98at0/AACAP/KrSj98at0/AACAP018Lz98at0/AACAP4ZVGD98at0/AACAP7xeBj98at0/AACAPyB+9T58at0/AACAPy077T58at0/AACAPy077T58at0/AACAPy077T58at0/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utbk/6lwQQLRZD797gqw/6lwQQLRZD79IT58/6lwQQLRZD79IT5k/6lwQQGaz/r6utZ0/6lwQQABNuL5IT6k/6lwQQDjNY76utbk/6lwQQDXNI757gsw/6lwQQDfNY75IT98/6lwQQAFNuL6tte8/6lwQQGez/r5HT/s/6lwQQLRZD7+utf8/6lwQQLNZD79HT/s/6lwQQLRZD7+ste8/6lwQQLRZD79GT98/6lwQQLRZD796gsw/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/6lwQQLRZD7+utb8/x1UQQLRZD78EhME/0yMQQLRZD7/oRsY/PJwPQLRZD78pAs0/MpQOQLRZD7+ZudQ/4+AMQLRZD78Jcdw/fVcKQLRZD79KLOM/MM0GQLRZD78t7+c/KhcCQLRZD7+Dvek/uef0P7RZD790D+c/YGTeP7RZD7+//t8/DoDDP7RZD7+cAdY/ghanP7RZD79Djso/ggOMP7RZD7/qGr8/mEVqP7VZD7/IHbU/TKBKP7VZD78SDa4/pM4+P7RZD78DX6s/lpVQP7RZD78DX6s/8AZ9P7RZD78DX6s/wGabP7RZD78DX6s/CEq4P7RZD78DX6s/toLOP7RZD78DX6s/LmbXP7RZD78DX6s/VszRP7RZD78DX6s/osnCP7RZD78DX6s/UQ6tP7RZD78DX6s/okqTP7RZD78EX6s/qF1wP7RZD78EX6s/StY8P7RZD78EX6s/qF8RP7RZD78EX6s/hLTmPrRZD78EX6s/IE3QPrRZD78EX6s/IE3QPrRZD78EX6s/IE3QPrRZD78EX6s/hUnlsoVJ5bL0BDW/9AQ1P4VJ5bKFSeWy9AQ1v/QENT8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/ViaAP1YmgD8AAIA/V5eAP1eXgD8AAIA/AlCBPwJQgT8AAIA/VU2CP1VNgj8AAIA/T4yDP0+Mgz8AAIA/7wmFP+8JhT8AAIA/NMOGPzTDhj8AAIA/G7WIPxu1iD8AAIA/pdyKP6Xcij8AAIA/zzaNP882jT8AAIA/mcCPP5nAjz8AAIA/AHeSPwB3kj8AAIA/A1eVPwNXlT8AAIA/o12YP6NdmD8AAIA/3IebP9yHmz8AAIA/rtKeP67Snj8AAIA/FjuiPxY7oj8AAIA/Fr6lPxa+pT8AAIA/qlipP6pYqT8AAIA/0QetP9EHrT8AAIA/i8iwP4vIsD8AAIA/1Ze0P9WXtD8AAIA/rnK4P65yuD8AAIA/F1a8PxdWvD8AAIA/Cz/APws/wD8AAIA/iyrEP4sqxD8AAIA/lhXIP5YVyD8AAIA/Kv3LPyr9yz8AAIA/Rd7PP0Xezz8AAIA/57XTP+e10z8AAIA/DYHXPw2B1z8AAIA/tzzbP7c82z8AAIA/4+XeP+Pl3j8AAIA/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tFkPvxnErL4gwuK9tFkPvxnErL6ACWC9tFkPvxnErL5AFw69tFkPvxnErL5AFw69tFkPvxnErL5AFw69tFkPvxnErL6FSeWyhUnlMvQENT/0BDU/hUnlsoVJ5TL0BDU/9AQ1PwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD9vNoA/bzaAPwAAgD851oA/OdaAPwAAgD8Z2oE/GdqBPwAAgD/KPIM/yjyDPwAAgD8I+YQ/CPmEPwAAgD+QCYc/kAmHPwAAgD8caYk/HGmJPwAAgD9nEow/ZxKMPwAAgD8tAI8/LQCPPwAAgD8pLZI/KS2SPwAAgD8XlJU/F5SVPwAAgD+zL5k/sy+ZPwAAgD+3+pw/t/qcPwAAgD/g76A/4O+gPwAAgD/oCaU/6AmlPwAAgD+MQ6k/jEOpPwAAgD+Gl60/hpetPwAAgD+TALI/kwCyPwAAgD9tebY/bXm2PwAAgD/R/Lo/0fy6PwAAgD95hb8/eYW/PwAAgD8hDsQ/IQ7EPwAAgD+Ekcg/hJHIPwAAgD9eCs0/XgrNPwAAgD9qc9E/anPRPwAAgD9mx9U/ZsfVPwAAgD8KAdo/CgHaPwAAgD8QG94/EBvePwAAgD86EOI/OhDiPwAAgD8/2+U/P9vlPwAAgD/Zduk/2XbpPwAAgD/I3ew/yN3sPwAAgD/FCvA/xQrwPwAAgD+L+PI/i/jyPwAAgD/VofU/1aH1PwAAgD9hAfg/YQH4PwAAgD/pEfo/6RH6PwAAgD8mzvs/Js77PwAAgD/YMP0/2DD9PwAAgD+4NP4/uDT+PwAAgD+D1P4/g9T+PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD/xCv8/8Qr/PwAAgD+Wsfo/8Qr/PwAAgD/YxO4/8Qr/PwAAgD+y89w/8Qr/PwAAgD8c7cY/8Qr/PwAAgD8OYK4/8Qr/PwAAgD+F+5Q/8Qr/PwAAgD/v3Hg/8Qr/PwAAgD/Az0w/8Qr/PwAAgD9wLSk/8Qr/PwAAgD/2UxE/8Qr/PwAAgD9CoQg/8Qr/PwAAgD9CoQg/8Qr/PwAAgD9CoQg/8Qr/PweaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8A2zSO+UHMIvQeaF8A4zWO+FTNePAeaF8ACTbi+kvnuPQeaF8Bns/6+XhZhPgeaF8C0WQ+/MIuIPgeaF8C0WQ+/kkl6PgeaF8C0WQ+/+K86PgeaF8C0WQ+/jPmyPQeaF8C0WQ+/UHMIvQeaF8C0WQ+/brYtvgeaF8C0WQ+/aA6ZvgeaF8CzWQ+/znTKvgeaF8C0WQ+/N9vdvgeaF8Bms/6+Ntu9vgeaF8AATbi+oeluvgeaF8A2zWO+qznEvQeaF8A2zSO+UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvQeaF8C0WQ+/UHMIvSVLF8C0WQ+/gVX5vDFiFsC0WQ+/Xbu2vLDkFMC0WQ+/HHwevCvYEsC0WQ+/MPLbOypCEMC0WQ+/mM7VPDMoDcC0WQ+/HolDPc+PCcC0WQ+/ZiiRPYZ+BcC0WQ+/tBXCPd35AMC0WQ+/AAPzPb0O+L+0WQ+/bDMRPiBZ7b+0WQ+/4lsnPvTd4b+0WQ+/JDY7Pkmo1b+0WQ+/dv1LPizDyL+0WQ+/Hu1YPq85u7+0WQ+/ZEBhPt8Wrb+0WQ+/iDJkPpRsnr+0WQ+/iDJkPs9nj7+0WQ+/iDJkPlk8gL+0WQ+/iDJkPvI7Yr+0WQ+/iDJkPvCARL+0WQ+/iDJkPkCvJ7+0WQ+/iDJkPnYuDL+0WQ+/iDJkPjjM5L60WQ+/iDJkPpB7tb60WQ+/iDJkPig6i760WQ+/iDJkPvCtTb60WQ+/iDJkPpBCEr60WQ+/iDJkPuCgy720WQ+/iDJkPmDrk720WQ+/iDJkPqChgL20WQ+/iDJkPqChgL20WQ+/iDJkPqChgL20WQ+/iDJkPoVJ5bKFSeUy9AQ1P/QENT+FSeWyhUnlMvQENT/0BDU/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP5IMgT+SDIE/AACAP5QDhD+UA4Q/AACAP/SeiD/0nog/AACAP6OYjj+jmI4/AACAP5KqlT+SqpU/AACAP7GOnT+xjp0/AACAP/D+pT/w/qU/AACAPz61rj8+ta4/AACAP4xrtz+Ma7c/AACAP8zbvz/M278/AACAP+q/xz/qv8c/AACAP9rRzj/a0c4/AACAP4rL1D+Ky9Q/AACAP+pm2T/qZtk/AACAP+ld3D/pXdw/AACAP3xq3T98at0/AACAP8BZ2z98at0/AACAP+iJ1T98at0/AACAP4SOzD98at0/AACAPyH7wD98at0/AACAP05jsz98at0/AACAP5hapD98at0/AACAP4x0lD98at0/AACAP7pEhD98at0/AACAP1+9aD98at0/AACAP/KrSj98at0/AACAP018Lz98at0/AACAP4ZVGD98at0/AACAP7xeBj98at0/AACAPyB+9T58at0/AACAPy077T58at0/AACAPy077T58at0/AACAPy077T58at0/B5oXwLRZD7++SjI/B5oXwLRZD7++SjI/B5oXwLRZD7++SjI/B5oXwLRZD7++SjI/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AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/ViaAP1YmgD8AAIA/V5eAP1eXgD8AAIA/AlCBPwJQgT8AAIA/VU2CP1VNgj8AAIA/T4yDP0+Mgz8AAIA/7wmFP+8JhT8AAIA/NMOGPzTDhj8AAIA/G7WIPxu1iD8AAIA/pdyKP6Xcij8AAIA/zzaNP882jT8AAIA/mcCPP5nAjz8AAIA/AHeSPwB3kj8AAIA/A1eVPwNXlT8AAIA/o12YP6NdmD8AAIA/3IebP9yHmz8AAIA/rtKeP67Snj8AAIA/FjuiPxY7oj8AAIA/Fr6lPxa+pT8AAIA/qlipP6pYqT8AAIA/0QetP9EHrT8AAIA/i8iwP4vIsD8AAIA/1Ze0P9WXtD8AAIA/rnK4P65yuD8AAIA/F1a8PxdWvD8AAIA/Cz/APws/wD8AAIA/iyrEP4sqxD8AAIA/lhXIP5YVyD8AAIA/Kv3LPyr9yz8AAIA/Rd7PP0Xezz8AAIA/57XTP+e10z8AAIA/DYHXPw2B1z8AAIA/tzzbP7c82z8AAIA/4+XeP+Pl3j8AAIA/kXniP5F54j8AAIA/vvTlP7705T8AAIA/aFTpP2hU6T8AAIA/lJXsP5SV7D8AAIA/OLXvPzi17z8AAIA/VrDyP1aw8j8AAIA/7oP1P+6D9T8AAIA//yz4P/8s+D8AAIA/hqj6P4ao+j8AAIA/gvP8P4Lz/D8AAIA/8Qr/P/EK/z8AAIA/+nUAQPp1AEAAAIA/E0oBQBNKAUAAAIA/pAACQKQAAkAAAIA/jJgCQIyYAkAAAIA/qBADQKgQA0AAAIA/2GcDQNhnA0AAAIA//ZwDQP2cA0AAAIA/9a4DQPWuA0AAAIA/9a4DQPWuA0AAAIA/9a4DQPWuA0AAAIA/9a4DQPWuA0AAAIA/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AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+SDIE/kgyBPwAAgD+UA4Q/lAOEPwAAgD/0nog/9J6IPwAAgD+jmI4/o5iOPwAAgD+SqpU/kqqVPwAAgD+xjp0/sY6dPwAAgD/w/qU/8P6lPwAAgD8+ta4/PrWuPwAAgD+Ma7c/jGu3PwAAgD/M278/zNu/PwAAgD/qv8c/6r/HPwAAgD/a0c4/2tHOPwAAgD+Ky9Q/isvUPwAAgD/qZtk/6mbZPwAAgD/pXdw/6V3cPwAAgD98at0/fGrdPwAAgD/AWds/fGrdPwAAgD/oidU/fGrdPwAAgD+Ejsw/fGrdPwAAgD8h+8A/fGrdPwAAgD9OY7M/fGrdPwAAgD+YWqQ/fGrdPwAAgD+MdJQ/fGrdPwAAgD+6RIQ/fGrdPwAAgD9fvWg/fGrdPwAAgD/yq0o/fGrdPwAAgD9NfC8/fGrdPwAAgD+GVRg/fGrdPwAAgD+8XgY/fGrdPwAAgD8gfvU+fGrdPwAAgD8tO+0+fGrdPwAAgD8tO+0+fGrdPwAAgD8tO+0+fGrdPw=="}]} diff --git a/data/games/garage/mods/gltf/models/gltf_triangle_with_vertex_stride.gltf b/data/games/garage/mods/gltf/models/gltf_triangle_with_vertex_stride.gltf deleted file mode 100644 index feddfbb..0000000 --- a/data/games/garage/mods/gltf/models/gltf_triangle_with_vertex_stride.gltf +++ /dev/null @@ -1 +0,0 @@ -{"scene":0,"scenes":[{"nodes":[0]}],"nodes":[{"mesh":0}],"meshes":[{"primitives":[{"attributes":{"POSITION":1},"indices":0}]}],"buffers":[{"uri":"data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAA=","byteLength":80}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":6,"target":34963},{"buffer":0,"byteOffset":8,"byteLength":72,"byteStride":24,"target":34962}],"accessors":[{"bufferView":0,"byteOffset":0,"componentType":5123,"count":3,"type":"SCALAR","max":[2],"min":[0]},{"bufferView":1,"byteOffset":0,"componentType":5126,"count":3,"type":"VEC3","max":[1,1,0],"min":[0,0,0]}],"asset":{"version":"2.0"}} diff --git a/data/games/garage/mods/gltf/models/gltf_triangle_without_indices.gltf b/data/games/garage/mods/gltf/models/gltf_triangle_without_indices.gltf deleted file mode 100644 index e91cc0e..0000000 --- a/data/games/garage/mods/gltf/models/gltf_triangle_without_indices.gltf +++ /dev/null @@ -1 +0,0 @@ -{"scene":0,"scenes":[{"nodes":[0]}],"nodes":[{"mesh":0}],"meshes":[{"primitives":[{"attributes":{"POSITION":0}}]}],"buffers":[{"uri":"data:application/octet-stream;base64,AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAA","byteLength":36}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":36,"target":34962}],"accessors":[{"bufferView":0,"byteOffset":0,"componentType":5126,"count":3,"type":"VEC3","max":[1,1,0],"min":[0,0,0]}],"asset":{"version":"2.0"}} diff --git a/data/games/garage/mods/gltf/textures/gltf_cube.png b/data/games/garage/mods/gltf/textures/gltf_cube.png deleted file mode 100644 index 1d01910..0000000 Binary files a/data/games/garage/mods/gltf/textures/gltf_cube.png and /dev/null differ diff --git a/data/games/garage/mods/gltf/textures/gltf_frog.png b/data/games/garage/mods/gltf/textures/gltf_frog.png deleted file mode 100644 index 552ae36..0000000 Binary files a/data/games/garage/mods/gltf/textures/gltf_frog.png and /dev/null differ diff --git a/data/games/garage/mods/gltf/textures/gltf_snow_man.png b/data/games/garage/mods/gltf/textures/gltf_snow_man.png deleted file mode 100644 index 7f27843..0000000 Binary files a/data/games/garage/mods/gltf/textures/gltf_snow_man.png and /dev/null differ diff --git a/data/games/garage/mods/gltf/textures/gltf_spider.png b/data/games/garage/mods/gltf/textures/gltf_spider.png deleted file mode 100644 index 1e3d3ae..0000000 Binary files a/data/games/garage/mods/gltf/textures/gltf_spider.png and /dev/null differ diff --git a/data/games/garage/mods/initial_message/init.lua b/data/games/garage/mods/initial_message/init.lua deleted file mode 100644 index 255dca0..0000000 --- a/data/games/garage/mods/initial_message/init.lua +++ /dev/null @@ -1,9 +0,0 @@ -core.register_on_joinplayer(function(player) - local cb = function(player) - if not player or not player:is_player() then - return - end - core.chat_send_player(player:get_player_name(), "This is the \"Development Test\" [devtest], meant only for testing and development.") - end - core.after(2.0, cb, player) -end) diff --git a/data/games/garage/mods/initial_message/mod.conf b/data/games/garage/mods/initial_message/mod.conf deleted file mode 100644 index 32aa2ac..0000000 --- a/data/games/garage/mods/initial_message/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = initial_message -description = Show message to joining players explaining what this testing game is about diff --git a/data/games/garage/mods/keys/README.txt b/data/games/garage/mods/keys/README.txt new file mode 100644 index 0000000..0db27df --- /dev/null +++ b/data/games/garage/mods/keys/README.txt @@ -0,0 +1,21 @@ +Minetest Game mod: keys +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures, sounds, models and schematics) +---------------------------------------------------------- + +Textures +-------- +Gambit (CC BY-SA 3.0): + keys_key.png + keys_key_skeleton.png + +Features +-------- +This mod uses the key API as defined in game_api.txt section [Key API]. diff --git a/data/games/garage/mods/keys/aliases.lua b/data/games/garage/mods/keys/aliases.lua new file mode 100644 index 0000000..4297498 --- /dev/null +++ b/data/games/garage/mods/keys/aliases.lua @@ -0,0 +1,6 @@ +-- +-- Aliases for backward compatibility +-- + +minetest.register_alias("default:key", "keys:key") +minetest.register_alias("default:skeleton_key", "keys:skeleton_key") diff --git a/data/games/garage/mods/keys/crafting.lua b/data/games/garage/mods/keys/crafting.lua new file mode 100644 index 0000000..b9b503a --- /dev/null +++ b/data/games/garage/mods/keys/crafting.lua @@ -0,0 +1,28 @@ +-- +-- Crafting recipes +-- + +minetest.register_craft({ + output = "keys:skeleton_key", + recipe = { + {"default:gold_ingot"}, + } +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "keys:key", + cooktime = 5, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "keys:skeleton_key", + cooktime = 5, +}) diff --git a/data/games/garage/mods/keys/craftitems.lua b/data/games/garage/mods/keys/craftitems.lua new file mode 100644 index 0000000..45e0b82 --- /dev/null +++ b/data/games/garage/mods/keys/craftitems.lua @@ -0,0 +1,101 @@ +-- Load support for MT game translation. +local S = minetest.get_translator("keys") + +-- +-- Craftitems +-- + +minetest.register_craftitem("keys:skeleton_key", { + description = S("Skeleton Key"), + inventory_image = "keys_key_skeleton.png", + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + local node = minetest.get_node(pos) + + if not node then + return itemstack + end + + local node_reg = minetest.registered_nodes[node.name] + local on_skeleton_key_use = node_reg and node_reg.on_skeleton_key_use + if not on_skeleton_key_use then + return itemstack + end + + -- make a new key secret in case the node callback needs it + local random = math.random + local newsecret = string.format( + "%04x%04x%04x%04x", + random(2^16) - 1, random(2^16) - 1, + random(2^16) - 1, random(2^16) - 1) + + local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) + + if secret then + local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) + + -- update original itemstack + itemstack:take_item() + + -- finish and return the new key + local new_stack = ItemStack("keys:key") + local meta = new_stack:get_meta() + meta:set_string("secret", secret) + meta:set_string("description", S("Key to @1's @2", user:get_player_name(), + minetest.registered_nodes[node.name].description)) + + if itemstack:get_count() == 0 then + itemstack = new_stack + else + if inv:add_item("main", new_stack):get_count() > 0 then + minetest.add_item(user:get_pos(), new_stack) + end -- else: added to inventory successfully + end + + return itemstack + end + end +}) + +minetest.register_craftitem("keys:key", { + description = S("Key"), + inventory_image = "keys_key.png", + groups = {key = 1, not_in_creative_inventory = 1}, + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + node = minetest.get_node(pos) + + if not node or node.name == "ignore" then + return itemstack + end + + local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end + + local on_key_use = ndef.on_key_use + if on_key_use then + on_key_use(pos, placer) + end + + return nil + end +}) diff --git a/data/games/garage/mods/keys/init.lua b/data/games/garage/mods/keys/init.lua new file mode 100644 index 0000000..ed45adb --- /dev/null +++ b/data/games/garage/mods/keys/init.lua @@ -0,0 +1,6 @@ +-- Minetest Game mod: keys +local keys_path = minetest.get_modpath("keys") + +dofile(keys_path.."/craftitems.lua") +dofile(keys_path.."/crafting.lua") +dofile(keys_path.."/aliases.lua") diff --git a/data/games/garage/mods/keys/license.txt b/data/games/garage/mods/keys/license.txt new file mode 100644 index 0000000..e96ffb9 --- /dev/null +++ b/data/games/garage/mods/keys/license.txt @@ -0,0 +1,52 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2018 celeron55, Perttu Ahola +Copyright (C) 2011-2018 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2018: + + Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/keys/locale/keys.de.tr b/data/games/garage/mods/keys/locale/keys.de.tr new file mode 100644 index 0000000..499a6ba --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.de.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Schlüssel +Key to @1's @2=Schlüssel für @2 von @1 +Skeleton Key=Skelettschlüssel diff --git a/data/games/garage/mods/keys/locale/keys.eo.tr b/data/games/garage/mods/keys/locale/keys.eo.tr new file mode 100644 index 0000000..02a06d4 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.eo.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Ŝlosilo +Key to @1's @2=Ŝlosilo por la @2 de @1 +Skeleton Key=Skeleta ŝlosilo diff --git a/data/games/garage/mods/keys/locale/keys.es.tr b/data/games/garage/mods/keys/locale/keys.es.tr new file mode 100644 index 0000000..e408c32 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.es.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Llave +Key to @1's @2=Llave para @2 de @1 +Skeleton Key=Llave esqueleto diff --git a/data/games/garage/mods/keys/locale/keys.fr.tr b/data/games/garage/mods/keys/locale/keys.fr.tr new file mode 100644 index 0000000..b1b9e6a --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.fr.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Clé +Key to @1's @2=Clé pour @2 de @1 +Skeleton Key=Squelette diff --git a/data/games/garage/mods/keys/locale/keys.id.tr b/data/games/garage/mods/keys/locale/keys.id.tr new file mode 100644 index 0000000..58f8fc5 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.id.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Kunci +Key to @1's @2=Kunci @2 milik @1 +Skeleton Key=Kunci Induk diff --git a/data/games/garage/mods/keys/locale/keys.it.tr b/data/games/garage/mods/keys/locale/keys.it.tr new file mode 100644 index 0000000..ed7bb31 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.it.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Chiave +Key to @1's @2=Chiave per @2 di @1 +Skeleton Key=Chiave dello Scheletro diff --git a/data/games/garage/mods/keys/locale/keys.ja.tr b/data/games/garage/mods/keys/locale/keys.ja.tr new file mode 100644 index 0000000..b356178 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.ja.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=鍵 +Key to @1's @2=@1の@2への鍵 +Skeleton Key=スケルトンの鍵 diff --git a/data/games/garage/mods/keys/locale/keys.jbo.tr b/data/games/garage/mods/keys/locale/keys.jbo.tr new file mode 100644 index 0000000..bd12f09 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.jbo.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=lo ckiku +Key to @1's @2=lo ckiku be @2 po la'o zo'i.@1.zo'i +Skeleton Key=lo greku ckiku diff --git a/data/games/garage/mods/keys/locale/keys.lv.tr b/data/games/garage/mods/keys/locale/keys.lv.tr new file mode 100644 index 0000000..04922cc --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.lv.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Atslēga +Key to @1's @2=Atslēga priekš @1 @2 +Skeleton Key=Novīlēta atslēga diff --git a/data/games/garage/mods/keys/locale/keys.ms.tr b/data/games/garage/mods/keys/locale/keys.ms.tr new file mode 100644 index 0000000..58f8fc5 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.ms.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Kunci +Key to @1's @2=Kunci @2 milik @1 +Skeleton Key=Kunci Induk diff --git a/data/games/garage/mods/keys/locale/keys.pl.tr b/data/games/garage/mods/keys/locale/keys.pl.tr new file mode 100644 index 0000000..864d8a9 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.pl.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Klucz +Key to @1's @2=Klucz do @2 gracza @1 +Skeleton Key=Szkieletowy klucz diff --git a/data/games/garage/mods/keys/locale/keys.pt_BR.tr b/data/games/garage/mods/keys/locale/keys.pt_BR.tr new file mode 100644 index 0000000..ef9ca1e --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Chave +Key to @1's @2=Chave para @2 de @1 +Skeleton Key=Chave de Mestra diff --git a/data/games/garage/mods/keys/locale/keys.ru.tr b/data/games/garage/mods/keys/locale/keys.ru.tr new file mode 100644 index 0000000..a804e18 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.ru.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Ключ +Key to @1's @2=Ключ к @2 от @1 +Skeleton Key=Заготовка ключа diff --git a/data/games/garage/mods/keys/locale/keys.sv.tr b/data/games/garage/mods/keys/locale/keys.sv.tr new file mode 100644 index 0000000..f666eb3 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.sv.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=Nyckel +Key to @1's @2=Nyckel till @1s @2 +Skeleton Key=Skelettnyckel diff --git a/data/games/garage/mods/keys/locale/keys.uk.tr b/data/games/garage/mods/keys/locale/keys.uk.tr new file mode 100644 index 0000000..6f6a681 --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.uk.tr @@ -0,0 +1,4 @@ +# textdomain: keys +Key=Ключ +Key to @1's @2=Ключ з биркою "@2, власником якого(-ої/-их) є @1" +Skeleton Key=Заготовка ключа diff --git a/data/games/garage/mods/keys/locale/keys.zh_CN.tr b/data/games/garage/mods/keys/locale/keys.zh_CN.tr new file mode 100644 index 0000000..57f632a --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.zh_CN.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=钥匙 +Key to @1's @2=@1的@2的钥匙 +Skeleton Key=万能钥匙 diff --git a/data/games/garage/mods/keys/locale/keys.zh_TW.tr b/data/games/garage/mods/keys/locale/keys.zh_TW.tr new file mode 100644 index 0000000..c97879c --- /dev/null +++ b/data/games/garage/mods/keys/locale/keys.zh_TW.tr @@ -0,0 +1,5 @@ +# textdomain: keys + +Key=鑰匙 +Key to @1's @2=@1的@2的鑰匙 +Skeleton Key=萬能鑰匙 diff --git a/data/games/garage/mods/keys/locale/template.txt b/data/games/garage/mods/keys/locale/template.txt new file mode 100644 index 0000000..9fbf62f --- /dev/null +++ b/data/games/garage/mods/keys/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: keys + +Key= +Key to @1's @2= +Skeleton Key= diff --git a/data/games/garage/mods/keys/mod.conf b/data/games/garage/mods/keys/mod.conf new file mode 100644 index 0000000..8b8d669 --- /dev/null +++ b/data/games/garage/mods/keys/mod.conf @@ -0,0 +1,3 @@ +name = keys +description = Minetest Game mod: keys +depends = default diff --git a/data/games/garage/mods/keys/textures/keys_key.png b/data/games/garage/mods/keys/textures/keys_key.png new file mode 100644 index 0000000..d39d9af Binary files /dev/null and b/data/games/garage/mods/keys/textures/keys_key.png differ diff --git a/data/games/garage/mods/keys/textures/keys_key_skeleton.png b/data/games/garage/mods/keys/textures/keys_key_skeleton.png new file mode 100644 index 0000000..f60cace Binary files /dev/null and b/data/games/garage/mods/keys/textures/keys_key_skeleton.png differ diff --git a/data/games/garage/mods/last_mod/init.lua b/data/games/garage/mods/last_mod/init.lua deleted file mode 100644 index 3909a39..0000000 --- a/data/games/garage/mods/last_mod/init.lua +++ /dev/null @@ -1 +0,0 @@ --- Nothing to do here, loading order is tested in C++ unittests. diff --git a/data/games/garage/mods/last_mod/mod.conf b/data/games/garage/mods/last_mod/mod.conf deleted file mode 100644 index 734bf4c..0000000 --- a/data/games/garage/mods/last_mod/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = last_mod -description = Mod which should be loaded as last mod. -# Test dependencies -optional_depends = unittests -depends = first_mod diff --git a/data/games/garage/mods/lighting/init.lua b/data/games/garage/mods/lighting/init.lua deleted file mode 100644 index 1251ef1..0000000 --- a/data/games/garage/mods/lighting/init.lua +++ /dev/null @@ -1,156 +0,0 @@ -local lighting_sections = { - {n = "shadows", d = "Shadows", - entries = { - { n = "intensity", d = "Shadow Intensity", min = 0, max = 1 } - } - }, - { - n = "exposure", d = "Exposure", - entries = { - {n = "luminance_min", d = "Minimum Luminance", min = -10, max = 10}, - {n = "luminance_max", d = "Maximum Luminance", min = -10, max = 10}, - {n = "exposure_correction", d = "Exposure Correction", min = -10, max = 10}, - {n = "speed_dark_bright", d = "Bright light adaptation speed", min = -10, max = 10, type="log2"}, - {n = "speed_bright_dark", d = "Dark scene adaptation speed", min = -10, max = 10, type="log2"}, - {n = "center_weight_power", d = "Power factor for center-weighting", min = 0.1, max = 10}, - } - }, - { - n = "bloom", d = "Bloom", - entries = { - {n = "intensity", d = "Intensity", min = 0, max = 1}, - {n = "strength_factor", d = "Strength Factor", min = 0.1, max = 10}, - {n = "radius", d = "Radius", min = 0.1, max = 8}, - }, - }, - { - n = "volumetric_light", d = "Volumetric Lighting", - entries = { - {n = "strength", d = "Strength", min = 0, max = 1}, - }, - }, -} - -local function dump_lighting(lighting) - local result = "{\n" - local section_count = 0 - for _,section in ipairs(lighting_sections) do - section_count = section_count + 1 - - local parameters = section.entries or {} - local state = lighting[section.n] or {} - - result = result.." "..section.n.." = {\n" - - local count = 0 - for _,v in ipairs(parameters) do - count = count + 1 - result = result.." "..v.n.." = "..(math.floor(state[v.n] * 1000)/1000) - if count < #parameters then - result = result.."," - end - result = result.."\n" - end - - result = result.." }" - - if section_count < #lighting_sections then - result = result.."," - end - result = result.."\n" - end - result = result .."}" - return result -end - -core.register_chatcommand("set_lighting", { - params = "", - description = "Tune lighting parameters", - func = function(player_name, param) - local player = core.get_player_by_name(player_name); - if not player then return end - - local lighting = player:get_lighting() - local exposure = lighting.exposure or {} - - local content = {} - local line = 1 - for _,section in ipairs(lighting_sections) do - local parameters = section.entries or {} - local state = lighting[section.n] or {} - - table.insert(content, "label[1,"..line..";"..section.d.."]") - line = line + 1 - - for _,v in ipairs(parameters) do - table.insert(content, "label[2,"..line..";"..v.d.."]") - table.insert(content, "scrollbaroptions[min=0;max=1000;smallstep=10;largestep=100;thumbsize=10]") - local value = state[v.n] - if v.type == "log2" then - value = math.log(value or 1) / math.log(2) - end - local sb_scale = math.floor(1000 * (math.max(v.min, value or 0) - v.min) / (v.max - v.min)) - table.insert(content, "scrollbar[2,"..(line+0.7)..";12,1;horizontal;"..section.n.."."..v.n..";"..sb_scale.."]") - line = line + 2.7 - end - - line = line + 1 - end - - local form = { - "formspec_version[2]", - "size[15,", line, "]", - "position[0.99,0.15]", - "anchor[1,0]", - "padding[0.05,0.1]", - "no_prepend[]", - } - table.insert_all(form, content) - - core.show_formspec(player_name, "lighting", table.concat(form)) - local debug_value = dump_lighting(lighting) - local debug_ui = player:hud_add({type="text", position={x=0.1, y=0.3}, scale={x=1,y=1}, alignment = {x=1, y=1}, text=debug_value, number=0xFFFFFF}) - player:get_meta():set_int("lighting_hud", debug_ui) - end -}) - -core.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "lighting" then return end - - if not player then return end - - local hud_id = player:get_meta():get_int("lighting_hud") - - if fields.quit then - player:hud_remove(hud_id) - player:get_meta():set_int("lighting_hud", -1) - return - end - - local lighting = player:get_lighting() - for _,section in ipairs(lighting_sections) do - local parameters = section.entries or {} - - local state = (lighting[section.n] or {}) - lighting[section.n] = state - - for _,v in ipairs(parameters) do - - if fields[section.n.."."..v.n] then - local event = core.explode_scrollbar_event(fields[section.n.."."..v.n]) - if event.type == "CHG" then - local value = v.min + (v.max - v.min) * (event.value / 1000); - if v.type == "log2" then - value = math.pow(2, value); - end - state[v.n] = value; - end - end - end - end - - local debug_value = dump_lighting(lighting) - player:hud_change(hud_id, "text", debug_value) - - player:set_lighting(lighting) -end) \ No newline at end of file diff --git a/data/games/garage/mods/lighting/mod.conf b/data/games/garage/mods/lighting/mod.conf deleted file mode 100644 index 83bbbef..0000000 --- a/data/games/garage/mods/lighting/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = lighting -description = UI to control and debug lighting parameters diff --git a/data/games/garage/mods/log/init.lua b/data/games/garage/mods/log/init.lua deleted file mode 100644 index 64673f2..0000000 --- a/data/games/garage/mods/log/init.lua +++ /dev/null @@ -1,16 +0,0 @@ -local modname = core.get_current_modname() -local prefix = "["..modname.."] " - --- Startup info -core.log("action", prefix.."modname="..dump(modname)) -core.log("action", prefix.."modpath="..dump(core.get_modpath(modname))) -core.log("action", prefix.."worldpath="..dump(core.get_worldpath())) - --- Callback info -core.register_on_mods_loaded(function() - core.log("action", prefix.."Callback: on_mods_loaded()") -end) - -core.register_on_chatcommand(function(name, command, params) - core.log("action", prefix.."Caught command '"..command.."', issued by '"..name.."'. Parameters: '"..params.."'") -end) diff --git a/data/games/garage/mods/log/mod.conf b/data/games/garage/mods/log/mod.conf deleted file mode 100644 index d2f37b9..0000000 --- a/data/games/garage/mods/log/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = log -description = Log DevTest-related actions diff --git a/data/games/garage/mods/map/README.txt b/data/games/garage/mods/map/README.txt new file mode 100644 index 0000000..068439a --- /dev/null +++ b/data/games/garage/mods/map/README.txt @@ -0,0 +1,44 @@ +Minetest Game mod: map +====================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) + +Authors of media (textures) +--------------------------- +TumeniNodes (CC BY-SA 3.0): + map_mapping_kit.png (map) + +paramat (CC BY-SA 3.0): + map_mapping_kit.png (compass and pen) + +Crafting +-------- +map:mapping_kit + +default:glass G +default:paper P +group:stick S +default:steel_ingot I +group:wood W +dye:black D + +GPS +IPI +WPD + +Usage +----- +In survival mode, use of the minimap requires the mapping kit item in your +inventory. It can take up to 5 seconds for adding to or removal from inventory +to have an effect, however to instantly allow the use of the minimap 'use' +(leftclick) the item. +Minimap radar mode is always disallowed in survival mode. + +Minimap and minimap radar mode are automatically allowed in creative mode and +for any player with the 'creative' privilege. + +The 'map.update_hud_flags()' function is global so can be redefined by a mod for +alternative behaviour. diff --git a/data/games/garage/mods/map/init.lua b/data/games/garage/mods/map/init.lua new file mode 100644 index 0000000..b91e528 --- /dev/null +++ b/data/games/garage/mods/map/init.lua @@ -0,0 +1,80 @@ +-- map/init.lua + +-- Mod global namespace + +map = {} + + +-- Load support for MT game translation. +local S = minetest.get_translator("map") + + +-- Update HUD flags +-- Global to allow overriding + +function map.update_hud_flags(player) + local creative_enabled = minetest.is_creative_enabled(player:get_player_name()) + + local minimap_enabled = creative_enabled or + player:get_inventory():contains_item("main", "map:mapping_kit") + local radar_enabled = creative_enabled + + player:hud_set_flags({ + minimap = minimap_enabled, + minimap_radar = radar_enabled + }) +end + + +-- Set HUD flags 'on joinplayer' + +minetest.register_on_joinplayer(function(player) + map.update_hud_flags(player) +end) + + +-- Cyclic update of HUD flags + +local function cyclic_update() + for _, player in ipairs(minetest.get_connected_players()) do + map.update_hud_flags(player) + end + minetest.after(5.3, cyclic_update) +end + +minetest.after(5.3, cyclic_update) + + +-- Mapping kit item + +minetest.register_craftitem("map:mapping_kit", { + description = S("Mapping Kit") .. "\n" .. S("Use with 'Minimap' key"), + inventory_image = "map_mapping_kit.png", + stack_max = 1, + groups = {flammable = 3, tool = 1}, + + on_use = function(itemstack, user, pointed_thing) + map.update_hud_flags(user) + end, +}) + + +-- Crafting + +minetest.register_craft({ + output = "map:mapping_kit", + recipe = { + {"default:glass", "default:paper", "group:stick"}, + {"default:steel_ingot", "default:paper", "default:steel_ingot"}, + {"group:wood", "default:paper", "dye:black"}, + } +}) + + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "map:mapping_kit", + burntime = 5, +}) diff --git a/data/games/garage/mods/map/license.txt b/data/games/garage/mods/map/license.txt new file mode 100644 index 0000000..a89f59c --- /dev/null +++ b/data/games/garage/mods/map/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2017 paramat + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2017 TumeniNodes +Copyright (C) 2017 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/map/locale/map.de.tr b/data/games/garage/mods/map/locale/map.de.tr new file mode 100644 index 0000000..1a784ab --- /dev/null +++ b/data/games/garage/mods/map/locale/map.de.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartenset +Use with 'Minimap' key=Mit „Karte an/aus“-Taste benutzen diff --git a/data/games/garage/mods/map/locale/map.eo.tr b/data/games/garage/mods/map/locale/map.eo.tr new file mode 100644 index 0000000..906be7b --- /dev/null +++ b/data/games/garage/mods/map/locale/map.eo.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Mapa ilaro +Use with 'Minimap' key=Uzi per 'Minimapo' klavo diff --git a/data/games/garage/mods/map/locale/map.es.tr b/data/games/garage/mods/map/locale/map.es.tr new file mode 100644 index 0000000..0faed52 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.es.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit de cartografía +Use with 'Minimap' key=Usar con la tecla 'Minimapa' diff --git a/data/games/garage/mods/map/locale/map.fr.tr b/data/games/garage/mods/map/locale/map.fr.tr new file mode 100644 index 0000000..fcffb6d --- /dev/null +++ b/data/games/garage/mods/map/locale/map.fr.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit de carthographie +Use with 'Minimap' key=Utiliser avec le bouton « Mini-carte » diff --git a/data/games/garage/mods/map/locale/map.id.tr b/data/games/garage/mods/map/locale/map.id.tr new file mode 100644 index 0000000..c90a029 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.id.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Alat Pemetaan +Use with 'Minimap' key=Gunakan dengan tombol 'Peta Mini' diff --git a/data/games/garage/mods/map/locale/map.it.tr b/data/games/garage/mods/map/locale/map.it.tr new file mode 100644 index 0000000..59885e9 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.it.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit di mappatura +Use with 'Minimap' key=Usalo col tasto 'Minimappa' diff --git a/data/games/garage/mods/map/locale/map.ja.tr b/data/games/garage/mods/map/locale/map.ja.tr new file mode 100644 index 0000000..7205f24 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.ja.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=地図キット +Use with 'Minimap' key=ミニマップキーで使います diff --git a/data/games/garage/mods/map/locale/map.jbo.tr b/data/games/garage/mods/map/locale/map.jbo.tr new file mode 100644 index 0000000..8f37c18 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.jbo.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=lo cartu ke sidju bakfu +Use with 'Minimap' key=.i tu'a le cmalu cartu batke cu tadji lo nu pilno diff --git a/data/games/garage/mods/map/locale/map.lv.tr b/data/games/garage/mods/map/locale/map.lv.tr new file mode 100644 index 0000000..fb74f51 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.lv.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartēšanas komplekts +Use with 'Minimap' key=Izmantojiet ar pogu 'Minikarte' diff --git a/data/games/garage/mods/map/locale/map.ms.tr b/data/games/garage/mods/map/locale/map.ms.tr new file mode 100644 index 0000000..8564f91 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.ms.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Alat Pemetaan +Use with 'Minimap' key=Guna dengan kekunci 'Peta Mini' diff --git a/data/games/garage/mods/map/locale/map.pl.tr b/data/games/garage/mods/map/locale/map.pl.tr new file mode 100644 index 0000000..d665de0 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.pl.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Zestaw kartograficzny +Use with 'Minimap' key=Naciśnij 'Minimap' aby użyć diff --git a/data/games/garage/mods/map/locale/map.pt_BR.tr b/data/games/garage/mods/map/locale/map.pt_BR.tr new file mode 100644 index 0000000..0095c39 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kit de mapeamento +Use with 'Minimap' key=Use com a tecla do 'mini-mapa' diff --git a/data/games/garage/mods/map/locale/map.ru.tr b/data/games/garage/mods/map/locale/map.ru.tr new file mode 100644 index 0000000..4c03d54 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.ru.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Картографический комплект +Use with 'Minimap' key=Используйте клавишей 'Миникарта' diff --git a/data/games/garage/mods/map/locale/map.sk.tr b/data/games/garage/mods/map/locale/map.sk.tr new file mode 100644 index 0000000..2016c85 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.sk.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartografická súprava +Use with 'Minimap' key=Použi klávesou 'Prepni minimpu' diff --git a/data/games/garage/mods/map/locale/map.sv.tr b/data/games/garage/mods/map/locale/map.sv.tr new file mode 100644 index 0000000..bc79d44 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.sv.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Kartläggningssats +Use with 'Minimap' key=Använd med 'Minimap'-tangent diff --git a/data/games/garage/mods/map/locale/map.uk.tr b/data/games/garage/mods/map/locale/map.uk.tr new file mode 100644 index 0000000..b7d6452 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.uk.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=Картографічний набір +Use with 'Minimap' key=Використовується клавішею 'Мінімапа' diff --git a/data/games/garage/mods/map/locale/map.zh_CN.tr b/data/games/garage/mods/map/locale/map.zh_CN.tr new file mode 100644 index 0000000..cec95bb --- /dev/null +++ b/data/games/garage/mods/map/locale/map.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=地图绘制工具包 +Use with 'Minimap' key=与“迷你地图”键一起使用 diff --git a/data/games/garage/mods/map/locale/map.zh_TW.tr b/data/games/garage/mods/map/locale/map.zh_TW.tr new file mode 100644 index 0000000..a098124 --- /dev/null +++ b/data/games/garage/mods/map/locale/map.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit=地圖繪製工具包 +Use with 'Minimap' key=與“迷你地圖”鍵一起使用 diff --git a/data/games/garage/mods/map/locale/template.txt b/data/games/garage/mods/map/locale/template.txt new file mode 100644 index 0000000..2dbe2ee --- /dev/null +++ b/data/games/garage/mods/map/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: map +Mapping Kit= +Use with 'Minimap' key= diff --git a/data/games/garage/mods/map/mod.conf b/data/games/garage/mods/map/mod.conf new file mode 100644 index 0000000..bb045c7 --- /dev/null +++ b/data/games/garage/mods/map/mod.conf @@ -0,0 +1,3 @@ +name = map +description = Minetest Game mod: map +depends = default, dye diff --git a/data/games/garage/mods/map/textures/map_mapping_kit.png b/data/games/garage/mods/map/textures/map_mapping_kit.png new file mode 100644 index 0000000..015b878 Binary files /dev/null and b/data/games/garage/mods/map/textures/map_mapping_kit.png differ diff --git a/data/games/garage/mods/mapgen/init.lua b/data/games/garage/mods/mapgen/init.lua deleted file mode 100644 index d843902..0000000 --- a/data/games/garage/mods/mapgen/init.lua +++ /dev/null @@ -1,104 +0,0 @@ --- --- Aliases for map generator outputs --- - --- ESSENTIAL node aliases --- Basic nodes -core.register_alias("mapgen_stone", "basenodes:stone") -core.register_alias("mapgen_water_source", "basenodes:water_source") -core.register_alias("mapgen_river_water_source", "basenodes:river_water_source") - --- Additional essential aliases for v6 -core.register_alias("mapgen_lava_source", "basenodes:lava_source") -core.register_alias("mapgen_dirt", "basenodes:dirt") -core.register_alias("mapgen_dirt_with_grass", "basenodes:dirt_with_grass") -core.register_alias("mapgen_sand", "basenodes:sand") -core.register_alias("mapgen_tree", "basenodes:tree") -core.register_alias("mapgen_leaves", "basenodes:leaves") -core.register_alias("mapgen_apple", "basenodes:apple") - --- Essential alias for dungeons -core.register_alias("mapgen_cobble", "basenodes:cobble") - --- Optional aliases for v6 (they all have fallback values in the engine) -if core.settings:get_bool("devtest_v6_mapgen_aliases", false) then - core.register_alias("mapgen_gravel", "basenodes:gravel") - core.register_alias("mapgen_desert_stone", "basenodes:desert_stone") - core.register_alias("mapgen_desert_sand", "basenodes:desert_sand") - core.register_alias("mapgen_dirt_with_snow", "basenodes:dirt_with_snow") - core.register_alias("mapgen_snowblock", "basenodes:snowblock") - core.register_alias("mapgen_snow", "basenodes:snow") - core.register_alias("mapgen_ice", "basenodes:ice") - core.register_alias("mapgen_junglegrass", "basenodes:junglegrass") - core.register_alias("mapgen_jungletree", "basenodes:jungletree") - core.register_alias("mapgen_jungleleaves", "basenodes:jungleleaves") - core.register_alias("mapgen_pine_tree", "basenodes:pine_tree") - core.register_alias("mapgen_pine_needles", "basenodes:pine_needles") -end --- Optional alias for mossycobble (should fall back to cobble) -if core.settings:get_bool("devtest_dungeon_mossycobble", false) then - core.register_alias("mapgen_mossycobble", "basenodes:mossycobble") -end --- Optional aliases for dungeon stairs (should fall back to full nodes) -if core.settings:get_bool("devtest_dungeon_stairs", false) then - core.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") - if core.settings:get_bool("devtest_v6_mapgen_aliases", false) then - core.register_alias("mapgen_stair_desert_stone", "stairs:stair_desert_stone") - end -end - --- --- Register biomes for biome API --- - -core.clear_registered_biomes() -core.clear_registered_decorations() - -if core.settings:get_bool("devtest_register_biomes", true) then - core.register_biome({ - name = "mapgen:grassland", - node_top = "basenodes:dirt_with_grass", - depth_top = 1, - node_filler = "basenodes:dirt", - depth_filler = 1, - node_riverbed = "basenodes:sand", - depth_riverbed = 2, - node_dungeon = "basenodes:cobble", - node_dungeon_alt = "basenodes:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = 31000, - y_min = 4, - heat_point = 50, - humidity_point = 50, - }) - - core.register_biome({ - name = "mapgen:grassland_ocean", - node_top = "basenodes:sand", - depth_top = 1, - node_filler = "basenodes:sand", - depth_filler = 3, - node_riverbed = "basenodes:sand", - depth_riverbed = 2, - node_cave_liquid = "basenodes:water_source", - node_dungeon = "basenodes:cobble", - node_dungeon_alt = "basenodes:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = 3, - y_min = -255, - heat_point = 50, - humidity_point = 50, - }) - - core.register_biome({ - name = "mapgen:grassland_under", - node_cave_liquid = {"basenodes:water_source", "basenodes:lava_source"}, - node_dungeon = "basenodes:cobble", - node_dungeon_alt = "basenodes:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = -256, - y_min = -31000, - heat_point = 50, - humidity_point = 50, - }) -end diff --git a/data/games/garage/mods/mapgen/mod.conf b/data/games/garage/mods/mapgen/mod.conf deleted file mode 100644 index 15750cc..0000000 --- a/data/games/garage/mods/mapgen/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mapgen -description = Minimal map generator -depends = basenodes diff --git a/data/games/garage/mods/modchannels/init.lua b/data/games/garage/mods/modchannels/init.lua deleted file mode 100644 index 2003841..0000000 --- a/data/games/garage/mods/modchannels/init.lua +++ /dev/null @@ -1,14 +0,0 @@ --- --- Mod channels experimental handlers --- -local mod_channel = core.mod_channel_join("experimental_preview") - -core.register_on_modchannel_message(function(channel, sender, message) - core.log("action", "[modchannels] Server received message `" .. message - .. "` on channel `" .. channel .. "` from sender `" .. sender .. "`") - - if mod_channel:is_writeable() then - mod_channel:send_all("experimental answers to preview") - mod_channel:leave() - end -end) diff --git a/data/games/garage/mods/modchannels/mod.conf b/data/games/garage/mods/modchannels/mod.conf deleted file mode 100644 index 7c13aad..0000000 --- a/data/games/garage/mods/modchannels/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = modchannels -description = Add experimental mod channel handlers diff --git a/data/games/garage/mods/mtg_craftguide/README.md b/data/games/garage/mods/mtg_craftguide/README.md new file mode 100644 index 0000000..9c4ed7a --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/README.md @@ -0,0 +1,25 @@ +Minetest Game mod: mtg_craftguide +================================= + +Adds a "Recipes" tab to the inventory. Click an item to see it's recipes. +Click again to show usages. + +Based on [craftguide](https://github.com/minetest-mods/craftguide). + +Authors of media +---------------- + +paramat (CC BY-SA 3.0): + +* craftguide_clear_icon.png +* craftguide_next_icon.png +* craftguide_prev_icon.png +* craftguide_search_icon.png + +Neuromancer (CC BY-SA 3.0): + +* craftguide_furnace.png + +Wuzzy (CC BY-SA 3.0): + +* craftguide_shapeless.png diff --git a/data/games/garage/mods/mtg_craftguide/init.lua b/data/games/garage/mods/mtg_craftguide/init.lua new file mode 100644 index 0000000..97cd63a --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/init.lua @@ -0,0 +1,438 @@ +local S = minetest.get_translator("mtg_craftguide") +local esc = minetest.formspec_escape + +local player_data = {} +local init_items = {} +local recipes_cache = {} +local usages_cache = {} + +local group_stereotypes = { + dye = "dye:white", + wool = "wool:white", + coal = "default:coal_lump", + vessel = "vessels:glass_bottle", + flower = "flowers:dandelion_yellow" +} + +local group_names = { + coal = S("Any coal"), + sand = S("Any sand"), + wool = S("Any wool"), + stick = S("Any stick"), + vessel = S("Any vessel"), + wood = S("Any wood planks"), + stone = S("Any kind of stone block"), + + ["color_red,flower"] = S("Any red flower"), + ["color_blue,flower"] = S("Any blue flower"), + ["color_black,flower"] = S("Any black flower"), + ["color_green,flower"] = S("Any green flower"), + ["color_white,flower"] = S("Any white flower"), + ["color_orange,flower"] = S("Any orange flower"), + ["color_violet,flower"] = S("Any violet flower"), + ["color_yellow,flower"] = S("Any yellow flower"), + + ["color_red,dye"] = S("Any red dye"), + ["color_blue,dye"] = S("Any blue dye"), + ["color_cyan,dye"] = S("Any cyan dye"), + ["color_grey,dye"] = S("Any grey dye"), + ["color_pink,dye"] = S("Any pink dye"), + ["color_black,dye"] = S("Any black dye"), + ["color_brown,dye"] = S("Any brown dye"), + ["color_green,dye"] = S("Any green dye"), + ["color_white,dye"] = S("Any white dye"), + ["color_orange,dye"] = S("Any orange dye"), + ["color_violet,dye"] = S("Any violet dye"), + ["color_yellow,dye"] = S("Any yellow dye"), + ["color_magenta,dye"] = S("Any magenta dye"), + ["color_dark_grey,dye"] = S("Any dark grey dye"), + ["color_dark_green,dye"] = S("Any dark green dye") +} + +local function table_replace(t, val, new) + for k, v in pairs(t) do + if v == val then + t[k] = new + end + end +end + +local function extract_groups(str) + if str:sub(1, 6) == "group:" then + return str:sub(7):split() + end + return nil +end + +local function item_has_groups(item_groups, groups) + for _, group in ipairs(groups) do + if not item_groups[group] then + return false + end + end + return true +end + +local function groups_to_item(groups) + if #groups == 1 then + local group = groups[1] + if group_stereotypes[group] then + return group_stereotypes[group] + elseif minetest.registered_items["default:"..group] then + return "default:"..group + end + end + + for name, def in pairs(minetest.registered_items) do + if item_has_groups(def.groups, groups) then + return name + end + end + + return ":unknown" +end + +local function get_craftable_recipes(output) + local recipes = minetest.get_all_craft_recipes(output) + if not recipes then + return nil + end + + for i = #recipes, 1, -1 do + for _, item in pairs(recipes[i].items) do + local groups = extract_groups(item) + if groups then + item = groups_to_item(groups) + end + if not minetest.registered_items[item] then + table.remove(recipes, i) + break + end + end + end + + if #recipes > 0 then + return recipes + end +end + +local function show_item(def) + return def.groups.not_in_craft_guide ~= 1 and def.description ~= "" +end + +local function cache_usages(recipe) + local added = {} + for _, item in pairs(recipe.items) do + if not added[item] then + local groups = extract_groups(item) + if groups then + for name, def in pairs(minetest.registered_items) do + if not added[name] and show_item(def) + and item_has_groups(def.groups, groups) then + local usage = table.copy(recipe) + table_replace(usage.items, item, name) + usages_cache[name] = usages_cache[name] or {} + table.insert(usages_cache[name], usage) + added[name] = true + end + end + elseif show_item(minetest.registered_items[item]) then + usages_cache[item] = usages_cache[item] or {} + table.insert(usages_cache[item], recipe) + end + added[item] = true + end + end +end + +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_items) do + if show_item(def) then + local recipes = get_craftable_recipes(name) + if recipes then + recipes_cache[name] = recipes + for _, recipe in ipairs(recipes) do + cache_usages(recipe) + end + end + end + end + for name, def in pairs(minetest.registered_items) do + if recipes_cache[name] or usages_cache[name] then + table.insert(init_items, name) + end + end + table.sort(init_items) +end) + +local function coords(i, cols) + return i % cols, math.floor(i / cols) +end + +local function is_fuel(item) + return minetest.get_craft_result({method="fuel", items={item}}).time > 0 +end + +local function item_button_fs(fs, x, y, item, element_name, groups) + table.insert(fs, ("item_image_button[%s,%s;1.05,1.05;%s;%s;%s]") + :format(x, y, item, element_name, groups and "\n"..esc(S("G")) or "")) + + local tooltip + if groups then + table.sort(groups) + tooltip = group_names[table.concat(groups, ",")] + if not tooltip then + local groupstr = {} + for _, group in ipairs(groups) do + table.insert(groupstr, minetest.colorize("yellow", group)) + end + groupstr = table.concat(groupstr, ", ") + tooltip = S("Any item belonging to the group(s): @1", groupstr) + end + elseif is_fuel(item) then + local itemdef = minetest.registered_items[item:match("%S*")] + local desc = itemdef and itemdef.description or S("Unknown Item") + tooltip = desc.."\n"..minetest.colorize("orange", S("Fuel")) + end + if tooltip then + table.insert(fs, ("tooltip[%s;%s]"):format(element_name, esc(tooltip))) + end +end + +local function recipe_fs(fs, data) + local recipe = data.recipes[data.rnum] + local width = recipe.width + local cooktime, shapeless + + if recipe.method == "cooking" then + cooktime, width = width, 1 + elseif width == 0 then + shapeless = true + if #recipe.items == 1 then + width = 1 + elseif #recipe.items <= 4 then + width = 2 + else + width = 3 + end + end + + table.insert(fs, ("label[5.5,1;%s]"):format(esc(data.show_usages + and S("Usage @1 of @2", data.rnum, #data.recipes) + or S("Recipe @1 of @2", data.rnum, #data.recipes)))) + + if #data.recipes > 1 then + table.insert(fs, + "image_button[5.5,1.6;0.8,0.8;craftguide_prev_icon.png;recipe_prev;]".. + "image_button[6.2,1.6;0.8,0.8;craftguide_next_icon.png;recipe_next;]".. + "tooltip[recipe_prev;"..esc(S("Previous recipe")).."]".. + "tooltip[recipe_next;"..esc(S("Next recipe")).."]") + end + + local rows = math.ceil(table.maxn(recipe.items) / width) + if width > 3 or rows > 3 then + table.insert(fs, ("label[0,1;%s]") + :format(esc(S("Recipe is too big to be displayed.")))) + return + end + + local base_x = 3 - width + local base_y = rows == 1 and 1 or 0 + + for i, item in pairs(recipe.items) do + local x, y = coords(i - 1, width) + + local elem_name = item + local groups = extract_groups(item) + if groups then + item = groups_to_item(groups) + elem_name = esc(item.."."..table.concat(groups, "+")) + end + item_button_fs(fs, base_x + x, base_y + y, item, elem_name, groups) + end + + if shapeless or recipe.method == "cooking" then + table.insert(fs, ("image[3.2,0.5;0.5,0.5;craftguide_%s.png]") + :format(shapeless and "shapeless" or "furnace")) + local tooltip = shapeless and S("Shapeless") or + S("Cooking time: @1", minetest.colorize("yellow", cooktime)) + table.insert(fs, "tooltip[3.2,0.5;0.5,0.5;"..esc(tooltip).."]") + end + table.insert(fs, "image[3,1;1,1;sfinv_crafting_arrow.png]") + + item_button_fs(fs, 4, 1, recipe.output, recipe.output:match("%S*")) +end + +local function get_formspec(player) + local name = player:get_player_name() + local data = player_data[name] + data.pagemax = math.max(1, math.ceil(#data.items / 32)) + + local fs = {} + table.insert(fs, + "style_type[item_image_button;padding=2]".. + "field[0.3,4.2;2.8,1.2;filter;;"..esc(data.filter).."]".. + "label[5.8,4.15;"..minetest.colorize("yellow", data.pagenum).." / ".. + data.pagemax.."]".. + "image_button[2.63,4.05;0.8,0.8;craftguide_search_icon.png;search;]".. + "image_button[3.25,4.05;0.8,0.8;craftguide_clear_icon.png;clear;]".. + "image_button[5,4.05;0.8,0.8;craftguide_prev_icon.png;prev;]".. + "image_button[7.25,4.05;0.8,0.8;craftguide_next_icon.png;next;]".. + "tooltip[search;"..esc(S("Search")).."]".. + "tooltip[clear;"..esc(S("Reset")).."]".. + "tooltip[prev;"..esc(S("Previous page")).."]".. + "tooltip[next;"..esc(S("Next page")).."]".. + "field_enter_after_edit[filter;true]".. + "field_close_on_enter[filter;false]") + + if #data.items == 0 then + table.insert(fs, "label[3,2;"..esc(S("No items to show.")).."]") + else + local first_item = (data.pagenum - 1) * 32 + for i = first_item, first_item + 31 do + local item = data.items[i + 1] + if not item then + break + end + local x, y = coords(i % 32, 8) + item_button_fs(fs, x, y, item, item) + end + end + + table.insert(fs, "container[0,5.6]") + if data.recipes then + recipe_fs(fs, data) + elseif data.prev_item then + table.insert(fs, ("label[2,1;%s]"):format(esc(data.show_usages + and S("No usages.").."\n"..S("Click again to show recipes.") + or S("No recipes.").."\n"..S("Click again to show usages.")))) + end + table.insert(fs, "container_end[]") + + return table.concat(fs) +end + +local function imatch(str, filter) + return str:lower():find(filter, 1, true) ~= nil +end + +local function execute_search(data) + local filter = data.filter + if filter == "" then + data.items = init_items + return + end + data.items = {} + + for _, item in ipairs(init_items) do + local def = minetest.registered_items[item] + local desc = def and minetest.get_translated_string(data.lang_code, def.description) + + if imatch(item, filter) or desc and imatch(desc, filter) then + table.insert(data.items, item) + end + end +end + +local function on_receive_fields(player, fields) + local name = player:get_player_name() + local data = player_data[name] + + if fields.clear then + data.filter = "" + data.pagenum = 1 + data.prev_item = nil + data.recipes = nil + data.items = init_items + return true + + elseif (fields.key_enter_field == "filter" or fields.search) + and fields.filter then + local new = fields.filter:sub(1, 128) -- truncate to a sane length + :gsub("[%z\1-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) + :lower() -- search is case insensitive + if data.filter == new then + return + end + data.filter = new + data.pagenum = 1 + execute_search(data) + return true + + elseif fields.prev or fields.next then + if data.pagemax == 1 then + return + end + data.pagenum = data.pagenum + (fields.next and 1 or -1) + if data.pagenum > data.pagemax then + data.pagenum = 1 + elseif data.pagenum == 0 then + data.pagenum = data.pagemax + end + return true + + elseif fields.recipe_next or fields.recipe_prev then + data.rnum = data.rnum + (fields.recipe_next and 1 or -1) + if data.rnum > #data.recipes then + data.rnum = 1 + elseif data.rnum == 0 then + data.rnum = #data.recipes + end + return true + + else + local item + for field in pairs(fields) do + if field:find(":") then + item = field:match("[%w_:]+") + break + end + end + if not item then + return + end + + if item == data.prev_item then + data.show_usages = not data.show_usages + else + data.show_usages = nil + end + if data.show_usages then + data.recipes = usages_cache[item] + else + data.recipes = recipes_cache[item] + end + data.prev_item = item + data.rnum = 1 + return true + end +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + local info = minetest.get_player_information(name) + + player_data[name] = { + filter = "", + pagenum = 1, + items = init_items, + lang_code = info.lang_code + } +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_data[name] = nil +end) + +sfinv.register_page("mtg_craftguide:craftguide", { + title = esc(S("Recipes")), + get = function(self, player, context) + return sfinv.make_formspec(player, context, get_formspec(player)) + end, + on_player_receive_fields = function(self, player, context, fields) + if on_receive_fields(player, fields) then + sfinv.set_player_inventory_formspec(player) + end + end +}) diff --git a/data/games/garage/mods/mtg_craftguide/license.txt b/data/games/garage/mods/mtg_craftguide/license.txt new file mode 100644 index 0000000..8d28c5c --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) + +Copyright (C) 2015-2019 Jean-Patrick Guerrero and contributors. +Copyright (C) 2020 pauloue + +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. + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + +Copyright (C) 2018 paramat +Copyright (C) Neuromancer +Copyright (C) 2017 Wuzzy + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.de.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.de.tr new file mode 100644 index 0000000..d90f833 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.de.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Beliebige Kohle +Any sand=Beliebiger Sand +Any wool=Beliebige Wolle +Any stick=Beliebiger Stock +Any vessel=Beliebiges Gefäß +Any wood planks=Beliebige Holzplanken +Any kind of stone block=Beliebige Art von Steinblock +Any red flower=Beliebige rote Blume +Any blue flower=Beliebige blaue Blume +Any black flower=Beliebige schwarze Blume +Any green flower=Beliebige grüne Blume +Any white flower=Beliebige weiße Blume +Any orange flower=Beliebige orange Blume +Any violet flower=Beliebige violette Blume +Any yellow flower=Beliebige gelbe Blume +Any red dye=Beliebiger roter Farbstoff +Any blue dye=Beliebiger blauer Farbstoff +Any cyan dye=Beliebiger türkiser Farbstoff +Any grey dye=Beliebiger grauer Farbstoff +Any pink dye=Beliebiger rosa Farbstoff +Any black dye=Beliebiger schwarzer Farbstoff +Any brown dye=Beliebiger brauner Farbstoff +Any green dye=Beliebiger grüner Farbstoff +Any white dye=Beliebiger weißer Farbstoff +Any orange dye=Beliebiger orange Farbstoff +Any violet dye=Beliebiger violetter Farbstoff +Any yellow dye=Beliebiger gelber Farbstoff +Any magenta dye=Beliebiger magenta Farbstoff +Any dark grey dye=Beliebiger dunkelgrauer Farbstoff +Any dark green dye=Beliebiger dunkelgrüner Farbstoff +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Beliebiger Gegenstand, der zu Gruppe(n) gehört: @1 +Unknown Item=Unbekannter Gegenstand +Fuel=Brennstoff +Usage @1 of @2=Verwendung @1 von @2 +Recipe @1 of @2=Rezept @1 von @2 +Previous recipe=Vorheriges Rezept +Next recipe=Nächstes Rezept +Recipe is too big to be displayed.=Rezept ist zu groß für die Anzeige. +Shapeless=Formlos +Cooking time: @1=Kochdauer: @1 +Search=Suche +Reset=Zurücksetzen +Previous page=Vorherige Seite +Next page=Nächste Seite +No items to show.=Keine Gegenstände anzuzeigen. +No usages.=Keine Verwendungen. +Click again to show recipes.=Erneut klicken, um Rezepte zu zeigen. +No recipes.=Keine Rezepte. +Click again to show usages.=Erneut klicken, um Verwendungen zu zeigen. +Recipes=Rezepte diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.eo.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.eo.tr new file mode 100644 index 0000000..80a1e39 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.eo.tr @@ -0,0 +1,54 @@ +# textdomain: mtg_craftguide + +Any coal=Ajna karbo +Any sand=Ajna sablo +Any wool=Ajna lano +Any stick=Ajna bastono +Any vessel=Ajna vazo +Any wood planks=Ajnaj lignaj tabuloj +Any kind of stone block=Ia ŝtona bloko +Any red flower=Ajna ruĝa floro +Any blue flower=Ajna blua floro +Any black flower=Ajna nigra floro +Any green flower=Ajna verda floro +Any white flower=Ajna blanka floro +Any orange flower=Ajna oranĝkolora floro +Any violet flower=Ajna violkolora floro +Any yellow flower=Ajna flava floro +Any red dye=Ajna ruĝa tinkturo +Any blue dye=Ajna blua tinkturo +Any cyan dye=Ajna bluverda tinkturo +Any grey dye=Ajna griza tinkturo +Any pink dye=Ajna rozkolora tinkturo +Any black dye=Ajna nigra tinkturo +Any brown dye=Ajna bruna tinkturo +Any green dye=Ajna verda tinkturo +Any white dye=Ajna blanka tinkturo +Any orange dye=Ajna oranĝkolora tinkturo +Any violet dye=Ajna violkolora tinkturo +Any yellow dye=Ajna flava tinkturo +Any magenta dye=Ajna fuksina tinkturo +Any dark grey dye=Ajna malhela griza tinkturo +Any dark green dye=Ajna malhela verda tinkturo +# Label for group ingredients +G=A +Any item belonging to the group(s): @1=Ajna objekto de la aro(j): @1 +Unknown Item=Nekonata objekto +Fuel=Brulaĵo +Usage @1 of @2=Uzo @1 el @2 +Recipe @1 of @2=Recepto @1 el @2 +Previous recipe=Antaŭa recepto +Next recipe=Sekva recepto +Recipe is too big to be displayed.=La recepto estas tro granda por prezenti. +Shapeless=Senforma +Cooking time: @1=Tempo por kuirado: @1 +Search=Serĉi +Reset=Rekomincigi +Previous page=Antaŭa paĝo +Next page=Sekva paĝo +No items to show.=Neniu objekto por prezenti. +No usages.=Neniu uzo. +Click again to show recipes.=Reklaki por prezenti receptojn. +No recipes.=Neniu recepto. +Click again to show usages.=Reklaki por prezenti uzojn. +Recipes=Receptoj diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.es.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.es.tr new file mode 100644 index 0000000..a5b5149 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.es.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Carbón +Any sand=Arena +Any wool=Lana +Any stick=Palitos +Any vessel=Recipiente +Any wood planks=Tablas de madera +Any kind of stone block=Derivado de bloque de piedra +Any red flower=Flor roja +Any blue flower=Flor azul +Any black flower=Flor negra +Any green flower=Flor verde +Any white flower=Flor blanca +Any orange flower=Flor naranja +Any violet flower=Flor violeta +Any yellow flower=Flor amarilla +Any red dye=Tinte rojo +Any blue dye=Tinte azul +Any cyan dye=Tinte cian +Any grey dye=Tinte gris +Any pink dye=Tinte rosa +Any black dye=Tinte negro +Any brown dye=Tinte marrón +Any green dye=Tinte verde +Any white dye=Tinte blanco +Any orange dye=Tinte naranja +Any violet dye=Tinte violeta +Any yellow dye=Tinte amarillo +Any magenta dye=Tinte magenta +Any dark grey dye=Tinte gris oscuro +Any dark green dye=Tinte verde oscuro +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Objeto del grupo: @1 +Unknown Item=Objeto desconocido +Fuel=Combustible +Usage @1 of @2=Usa @1 en @2 +Recipe @1 of @2=Receta @1 en @2 +Previous recipe=Receta anterior +Next recipe=Próxima Receta +Recipe is too big to be displayed.=La receta es muy grande para ser mostrada. +Shapeless=Sin forma +Cooking time: @1=Tiempo de cocción: @1 +Search=Buscar +Reset=Resetear +Previous page=Página anterior +Next page=Próxima página +No items to show.=No hay objetos para mostrar. +No usages.=Sin usos. +Click again to show recipes.=Clica de nuevo para mostrar recetas. +No recipes.=No hay recetas. +Click again to show usages.=Clica de nuevo para mostrar usos. +Recipes=Recetas diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.fr.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.fr.tr new file mode 100644 index 0000000..afc8224 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.fr.tr @@ -0,0 +1,54 @@ +# textdomain: mtg_craftguide + +Any coal=Quelconque charbon +Any sand=Quelconque sable +Any wool=Quelconque laine +Any stick=Quelconque bâton +Any vessel=Quelconque couvert +Any wood planks=Quelconques planches de bois +Any kind of stone block=Quelconque roche +Any red flower=Quelconque fleur rouge +Any blue flower=Quelconque fleur bleue +Any black flower=Quelconque fleur noire +Any green flower=Quelconque fleur verte +Any white flower=Quelconque fleur blanche +Any orange flower=Quelconque fleur orange +Any violet flower=Quelconque fleur violette +Any yellow flower=Quelconque fleur jaune +Any red dye=Quelconque colorant rouge +Any blue dye=Quelconque colorant bleu +Any cyan dye=Quelconque colorant bleu ciel +Any grey dye=Quelconque colorant gris +Any pink dye=Quelconque colorant rose +Any black dye=Quelconque colorant noir +Any brown dye=Quelconque colorant marron +Any green dye=Quelconque colorant vert +Any white dye=Quelconque colorant blanc +Any orange dye=Quelconque colorant orange +Any violet dye=Quelconque colorant violet +Any yellow dye=Quelconque colorant jaune +Any magenta dye=Quelconque colorant magenta +Any dark grey dye=Quelconque colorant gris foncé +Any dark green dye=Quelconque colorant vert foncé +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Tout item appartenant au(x) groupe(s) : @1 +Unknown Item=Object inconnu +Fuel=Combustible +Usage @1 of @2=Usage @1 sur @2 +Recipe @1 of @2=Recette @1 sur @2 +Previous recipe=Recette précédente +Next recipe=Prochaine recette +Recipe is too big to be displayed.=Recette trop grande pour être affichée. +Shapeless=Sans forme +Cooking time: @1=Temps de cuisson : @1 +Search=Recherche +Reset=Réinitialiser +Previous page=Page précédente +Next page=Prochaine page +No items to show.=Aucun item à afficher. +No usages.=Sans utilité. +Click again to show recipes.=Cliquez encore pour afficher la recette. +No recipes.=Aucune recette. +Click again to show usages.=Cliquez encore pour afficher l'usage. +Recipes=Recettes diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.id.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.id.tr new file mode 100644 index 0000000..d4e6ea0 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.id.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Batu bara apa pun +Any sand=Pasir apa pun +Any wool=Wol apa pun +Any stick=Tongkat apa pun +Any vessel=Bejana apa pun +Any wood planks=Papan kayu apa pun +Any kind of stone block=Blok batu apa pun +Any red flower=Bunga merah apa pun +Any blue flower=Bunga biru apa pun +Any black flower=Bunga hitam apa pun +Any green flower=Bunga hijau apa pun +Any white flower=Bunga putih apa pun +Any orange flower=Bunga oranye apa pun +Any violet flower=Bunga ungu apa pun +Any yellow flower=Bunga kuning apa pun +Any red dye=Pewarna merah apa pun +Any blue dye=Pewarna biru apa pun +Any cyan dye=Pewarna sian apa pun +Any grey dye=Pewarna abu apa pun +Any pink dye=Pewarna merah jambu apa pun +Any black dye=Pewarna hitam apa pun +Any brown dye=Pewarna cokelat apa pun +Any green dye=Pewarna hijau apa pun +Any white dye=Pewarna putih apa pun +Any orange dye=Pewarna oranye apa pun +Any violet dye=Pewarna ungu apa pun +Any yellow dye=Pewarna kuning apa pun +Any magenta dye=Pewarna magenta apa pun +Any dark grey dye=Pewarna abu tua apa pun +Any dark green dye=Pewarna hijau tua apa pun +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Barang apa pun yang termasuk grup: @1 +Unknown Item=Barang Tak Diketahui +Fuel=Bahan Bakar +Usage @1 of @2=Penggunaan @1 dari @2 +Recipe @1 of @2=Resep @1 dari @2 +Previous recipe=Resep sebelumnya +Next recipe=Resep selanjutnya +Recipe is too big to be displayed.=Resep terlalu besar untuk ditampilkan. +Shapeless=Tak berbentuk +Cooking time: @1=Waktu memasak: @1 +Search=Cari +Reset=Atur ulang +Previous page=Halaman sebelumnya +Next page=Halaman selanjutnya +No items to show.=Tidak ada barang untuk ditampilkan. +No usages.=Tidak ada penggunaan. +Click again to show recipes.=Klik lagi untuk menampilkan resep. +No recipes.=Tidak ada resep. +Click again to show usages.=Klik lagi untuk menampilkan penggunaan. +Recipes=Resep diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ja.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ja.tr new file mode 100644 index 0000000..c6ec66a --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ja.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=石炭 +Any sand=砂 +Any wool=羊毛 +Any stick=棒 +Any vessel=瓶 +Any wood planks=板材 +Any kind of stone block=石のブロック +Any red flower=赤色の花 +Any blue flower=青色の花 +Any black flower=黒色の花 +Any green flower=緑色の花 +Any white flower=白色の花 +Any orange flower=橙色の花 +Any violet flower=紫色の花 +Any yellow flower=黄色の花 +Any red dye=赤色の染料 +Any blue dye=青色の染料 +Any cyan dye=青緑色の染料 +Any grey dye=灰色の染料 +Any pink dye=桃色の染料 +Any black dye=黒色の染料 +Any brown dye=茶色の染料 +Any green dye=緑色の染料 +Any white dye=白色の染料 +Any orange dye=橙色の染料 +Any violet dye=紫色の染料 +Any yellow dye=黄色の染料 +Any magenta dye=赤紫色の染料 +Any dark grey dye=濃灰色の染料 +Any dark green dye=濃緑色の染料 +# Label for group ingredients +G= +Any item belonging to the group(s): @1=グループに属するアイテム: @1 +Unknown Item=不明なアイテム +Fuel=燃料 +Usage @1 of @2=利用方法 @1 / @2 +Recipe @1 of @2=レシピ @1 / @2 +Previous recipe=前のレシピ +Next recipe=次のレシピ +Recipe is too big to be displayed.=レシピが大きすぎて表示できません。 +Shapeless=無形 +Cooking time: @1=調理時間: @1 +Search=検索 +Reset=リセット +Previous page=前のページ +Next page=次のページ +No items to show.=表示する項目がありません。 +No usages.=利用方法がありません。 +Click again to show recipes.=もう一度クリックするとレシピを表示します。 +No recipes.=レシピがありません。 +Click again to show usages.=もう一度クリックすると使用方法を表示します。 +Recipes=レシピ diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.jbo.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.jbo.tr new file mode 100644 index 0000000..c9e6fbf --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.jbo.tr @@ -0,0 +1,54 @@ +# textdomain: mtg_craftguide +Any coal=lo cmina lo'i kolme +Any sand=lo cmima lo'i sance +Any wool=lo cmima lo'i sunla +Any stick=lo cmima lo'i grana +Any vessel=lo cmima lo'i vasru +Any wood planks=lo cmima lo'i mudri tanbo +Any kind of stone block=lo cmima lo'i rokci bliku +Any red flower=lo cmima lo'i xunre xrula +Any blue flower=lo cmima lo'i blanu xrula +Any black flower=lo cmima lo'i xekri xrula +Any green flower=lo cmima lo'i crino xrula +Any white flower=lo cmima lo'i blabi xrula +Any orange flower=lo cmima lo'i narju xrula +Any violet flower=lo cmima lo'i zirpu xrula +Any yellow flower=lo cmima lo'i pelxu xrula +Any red dye=lo cmima lo'i xunre xinmo +Any blue dye=lo cmima lo'i blanu xinmo +Any cyan dye=lo cmima lo'i cicna xinmo +Any grey dye=lo cmima lo'i grusi xinmo +Any pink dye=lo cmima lo'i xunblabi xinmo +Any black dye=lo cmima lo'i xekri xinmo +Any brown dye=lo cmima lo'i bunre xinmo +Any green dye=lo cmima lo'i crino xinmo +Any white dye=lo cmima lo'i blabi xinmo +Any orange dye=lo cmima lo'i narju xinmo +Any violet dye=lo cmima lo'i zirpu xinmo +Any yellow dye=lo cmima lo'i pelxu xinmo +Any magenta dye=lo cmima lo'i nukni xinmo +Any dark grey dye=lo cmima lo'i xekri grusi xinmo +Any dark green dye=lo cmima lo'i xekri crino xinmo +# Label for group ingredients +# c = cmima +G=c +Any item belonging to the group(s): @1=lo cmima lo'i me zoi gi'u.@1.gi'u +Unknown Item=lo na te djuno dacti +Fuel=.i livla +Usage @1 of @2=.i meirmoi fe li @1 li @2@nle'i te zbasu +Recipe @1 of @2=.i meirmoi fe li @1 li @2@nle'i te jukpa +Previous recipe=lidne +Next recipe=selyli'e +Recipe is too big to be displayed.=.i lo te jukpa cu dukse lo ka barda tezu'e lo nu jarco +Shapeless=tarmi claxu +Cooking time: @1=lo pu'u jukpa cu snidu li @1 +Search=sisku +Reset=kraga'igau +Previous page=lidne +Next page=selyli'e +No items to show.=no da dacti cu se jarco +No usages.=na te zbasu +Click again to show recipes.=.i ko rapli .iklki fi lo nu .arco lo te jukpa +No recipes.=na te jukpa +Click again to show usages.=.i ko rapli .iklki fi lo nu .arco lo te zbasu +Recipes=lo te jukpa diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.lv.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.lv.tr new file mode 100644 index 0000000..253aae5 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.lv.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Jebkura ogle +Any sand=Jebkura smilts +Any wool=Jebkura vilna +Any stick=Jebkurš puļķis +Any vessel=Jebkurš trauks +Any wood planks=Jebkuri dēļi +Any kind of stone block=Jebkads akmens bloks +Any red flower=Jebkāda sarkana puķe +Any blue flower=Jebkāda zila puķe +Any black flower=Jebkāda melna puķe +Any green flower=Jebkāda zaļa puķe +Any white flower=Jebkāda balta puķe +Any orange flower=Jebkāda oranža puķe +Any violet flower=Jebkāda violeta puķe +Any yellow flower=Jebkāda dzeltena puķe +Any red dye=Jebkāda sarkanā krāsa +Any blue dye=Jebkāda zilā krāsa +Any cyan dye=Jebkāda ciānkrāsas krāsa +Any grey dye=Jebkāda pelēkā krāsa +Any pink dye=Jebkāda rozā krāsa +Any black dye=Jebkāda melnā krāsa +Any brown dye=Jebkāda brūnā krāsa +Any green dye=Jebkāda zaļā krāsa +Any white dye=Jebkāda baltā krāsa +Any orange dye=Jebkāda oranžā krāsa +Any violet dye=Jebkāda violetā krāsa +Any yellow dye=Jebkāda dzeltanā krāsa +Any magenta dye=Jebkāda fuksīna krāsa +Any dark grey dye=Jebkāda tumšpelēkā krāsa +Any dark green dye=Jebkāka tumši zaļā krāsa +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Jebkurš priekšmets no grupas/ām: @1 +Unknown Item=Nezināms priekšmets +Fuel=Degviela +Usage @1 of @2=Izmantošana @1 no @2 +Recipe @1 of @2=Recepte @1 no @2 +Previous recipe=Iepriekšējā recepte +Next recipe=Nākošā recepte +Recipe is too big to be displayed.=Recepte ir pārāk liela lai to attēlotu. +Shapeless=Bezformas +Cooking time: @1=Apstādāšanas laiks @1 +Search=Meklēšana +Reset=Atiestatīt +Previous page=Iepriekšējā lapa +Next page=Nākošā lapa +No items to show.=Nav priekšmetu ko parādīt. +No usages.=Nav pielietojumu. +Click again to show recipes.=Uzklikšķiniet atkal lai parādītu receptes. +No recipes.=Nav recepšu. +Click again to show usages.=Uzklikšķiniet atkal lai parādītu izmantojamības. +Recipes=Receptes diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ms.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ms.tr new file mode 100644 index 0000000..0cfb297 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ms.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Sebarang arang +Any sand=Sebarang pasir +Any wool=Sebarang bulu biri-biri +Any stick=Sebarang serpihan kayu +Any vessel=Sebarang bekas kaca +Any wood planks=Sebarang papan kayu +Any kind of stone block=Sebarang jenis bongkah batu +Any red flower=Sebarang bunga merah +Any blue flower=Sebarang bunga biru +Any black flower=Sebarang bunga hitam +Any green flower=Sebarang bunga hijau +Any white flower=Sebarang bunga putih +Any orange flower=Sebarang bunga jingga +Any violet flower=Sebarang bunga ungu +Any yellow flower=Sebarang bunga kuning +Any red dye=Sebarang pewarna merah +Any blue dye=Sebarang pewarna biru +Any cyan dye=Sebarang pewarna biru kehijauan +Any grey dye=Sebarang pewarna kelabu +Any pink dye=Sebarang pewarna merah jambu +Any black dye=Sebarang pewarna hitam +Any brown dye=Sebarang pewarna perang +Any green dye=Sebarang pewarna hijau +Any white dye=Sebarang pewarna putih +Any orange dye=Sebarang pewarna jingga +Any violet dye=Sebarang pewarna ungu +Any yellow dye=Sebarang pewarna kuning +Any magenta dye=Sebarang pewarna magenta +Any dark grey dye=Sebarang pewarna kelabu tua +Any dark green dye=Sebarang pewarna hijau tua +# Label for group ingredients +G=K +Any item belonging to the group(s): @1=Sebarang item milik kumpulan: @1 +Unknown Item=Item Tidak Diketahui +Fuel=Bahan Api +Usage @1 of @2=Kegunaan @1 daripada @2 +Recipe @1 of @2=Resipi @1 daripada @2 +Previous recipe=Resipi sebelumnya +Next recipe=Resipi seterusnya +Recipe is too big to be displayed.=Resipi terlalu besar untuk dipaparkan. +Shapeless=Tidak Berbentuk +Cooking time: @1=Masa memasak: @1 +Search=Cari +Reset=Tetap Semula +Previous page=Halaman sebelumnya +Next page=Halaman seterusnya +No items to show.=Tiada item untuk ditunjukkan. +No usages.=Tiada kegunaan. +Click again to show recipes.=Klik lagi untuk tunjuk resipi. +No recipes.=Tiada resipi. +Click again to show usages.=Klik lagi untuk tunjuk kegunaan. +Recipes=Resipi diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.pl.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.pl.tr new file mode 100644 index 0000000..88d8e95 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.pl.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Dowolny węgiel +Any sand=Dowonly piasek +Any wool=Dowolna wełna +Any stick=Dowolny patyk +Any vessel=Dowolne naczynie +Any wood planks=Dowolne deski +Any kind of stone block=Dowolny rodzaj kamiennego bloku +Any red flower=Dowolny czerwony kwiat +Any blue flower=Dowolny niebieski kwiat +Any black flower=Dowolny czarny kwiat +Any green flower=Dowolny zielony kwiat +Any white flower=Dowolny biały kwiat +Any orange flower=Dowolny pomarańczowy kwiat +Any violet flower=Dowolny fioletowy kwiat +Any yellow flower=Dowolny żółty kwiat +Any red dye=Dowolny czerwony barwnik +Any blue dye=Dowolny niebieski barwnik +Any cyan dye=Dowolny cyjanowy barwnik +Any grey dye=Dowolny szary barwnik +Any pink dye=Dowolny różowy barwnik +Any black dye=Dowolny czarny barwnik +Any brown dye=Dowolny brązowy barwnik +Any green dye=Dowolny zielony barwnik +Any white dye=Dowolny biały barwnik +Any orange dye=Dowolny pomarańczowy barwnik +Any violet dye=Dowolny fioletowy barwnik +Any yellow dye=Dowolny zółty barwnik +Any magenta dye=Dowolny karmazynowy barwnik +Any dark grey dye=Dowolny ciemnoszary barwnik +Any dark green dye=Dowolny ciemnozielony barwnik +# Label for group ingredients +G=G +Any item belonging to the group(s): @1= +Unknown Item=Nieznany przedmiot +Fuel=Paliwo +Usage @1 of @2=Użycie @1 z @2 +Recipe @1 of @2=Receptura @1 z @2 +Previous recipe=Poprzednia receptura +Next recipe=Następna receptura +Recipe is too big to be displayed.=Receptura jest zbyt duża aby mogła być wyświetlona. +Shapeless=Bez kształtu +Cooking time: @1=Czas przepalania: @1 +Search=Wyszukaj +Reset=Zresetuj +Previous page=Poprzednia strona +Next page=Następna strona +No items to show.=Brak przedmiotów do pokazania. +No usages.=Brak użyć. +Click again to show recipes.=Naciśnij jeszcze raz aby pokazać receptury. +No recipes.=Brak receptur. +Click again to show usages.=Naciśnij jeszcze raz aby pokazać użycia. +Recipes=Receptury diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.pt_BR.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.pt_BR.tr new file mode 100644 index 0000000..a4bbf7f --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.pt_BR.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Qualquer carvão +Any sand=Qualquer areia +Any wool=Qualquer madeira +Any stick=Qualquer graveto +Any vessel=Qualquer navio +Any wood planks=Qualquer tábua de madeira +Any kind of stone block=Qualquer tipo de bloco de pedra +Any red flower=Qualquer flor vermelha +Any blue flower=Qualquer flor azul +Any black flower=Qualquer flor preta +Any green flower=Qualquer flor verde +Any white flower=Qualquer flor branca +Any orange flower=Qualquer flor laranja +Any violet flower=Qualquer flor violeta +Any yellow flower=Qualquer flor amarela +Any red dye=Qualquer tinta vermelha +Any blue dye=Qualquer tinta azul +Any cyan dye=Qualquer tinta ciano +Any grey dye=Qualquer tinta cinza +Any pink dye=Qualquer tinta rosa +Any black dye=Qualquer tinta preto +Any brown dye=Qualquer tinta marrom +Any green dye=Qualquer tinta verde +Any white dye=Qualquer tinta branca +Any orange dye=Qualquer tinta laranja +Any violet dye=Qualquer tinta violeta +Any yellow dye=Qualquer tinta amarela +Any magenta dye=Qualquer tinta magenta +Any dark grey dye=Qualquer tinta cinza-escuro +Any dark green dye=Qualquer tinta cinza-escuro +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Qualquer item pertencente ao(s) grupo(s): @1 +Unknown Item=Item Desconhecido +Fuel=Combustível +Usage @1 of @2=Uso @1 de @2 +Recipe @1 of @2=Receita @1 de @2 +Previous recipe=Receita anterior +Next recipe=Próxima receita +Recipe is too big to be displayed.=Receita é muito grande para ser exibida. +Shapeless=Sem forma +Cooking time: @1=Tempo de Cozimento: @1 +Search=Buscar +Reset=Redefinir +Previous page=Página anterior +Next page=Próxima página +No items to show.=Nenhum item para mostrar. +No usages.=Nenhum uso. +Click again to show recipes.=Clique novamente para mostrar receitas. +No recipes.=Nenhuma receita. +Click again to show usages.=Clique novamente para mostrar os usos. +Recipes=Receitas diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ru.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ru.tr new file mode 100644 index 0000000..ea7a717 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.ru.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Любой уголь +Any sand=Любой песок +Any wool=Любая шерсть +Any stick=Любая палка +Any vessel=Любой сосуд +Any wood planks=Любые доски +Any kind of stone block=Любой вид камня +Any red flower=Любой красный цветок +Any blue flower=Любой синий цветок +Any black flower=Любой чёрный цветок +Any green flower=Любой зелёный цветок +Any white flower=Любой белый цветок +Any orange flower=Любой оранжевый цветок +Any violet flower=Любой фиолетовый цветок +Any yellow flower=Любой жёлтый цветок +Any red dye=Любой красный краситель +Any blue dye=Любой синий краситель +Any cyan dye=Любой бирюзовый краситель +Any grey dye=Любой серый краситель +Any pink dye=Любой розовый краситель +Any black dye=Любой чёрный краситель +Any brown dye=Любой коричневый краситель +Any green dye=Любой зелёный краситель +Any white dye=Любой белый краситель +Any orange dye=Любой оранжевый краситель +Any violet dye=Любой фиолетовый краситель +Any yellow dye=Любой жёлтый краситель +Any magenta dye=Любой сиреневый краситель +Any dark grey dye=Любой тёмно-серый краситель +Any dark green dye=Любой тёмно-зелёный краситель +# Label for group ingredients +G=Г +Any item belonging to the group(s): @1=Любой предмет из групп(ы): @1 +Unknown Item=Неизвестный предмет +Fuel=Топливо +Usage @1 of @2=Использование @1 из @2 +Recipe @1 of @2=Рецепт @1 из @2 +Previous recipe=Предыдущий рецепт +Next recipe=Следующий рецепт +Recipe is too big to be displayed.=Рецепт слишком большой для отображения. +Shapeless=Бесформенный +Cooking time: @1=Время готовки: @1 +Search=Поиск +Reset=Сброс +Previous page=Предыдущая страница +Next page=Следующая страница +No items to show.=Нет предметов. +No usages.=Нет использований. +Click again to show recipes.=Кликните снова чтобы увидеть рецепты. +No recipes.=Нет рецептов. +Click again to show usages.=Кликните снова чтобы увидеть использования. +Recipes=Рецепты diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.sv.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.sv.tr new file mode 100644 index 0000000..00b4056 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.sv.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Någon typ av kol +Any sand=Någon typ av sand +Any wool=Någon typ av ull +Any stick=Någon typ av pinne +Any vessel=Någon typ av fartygshylla +Any wood planks=Någon typ av träplanka +Any kind of stone block=Någon typ av stenblock +Any red flower=Någon typ av röd blomma +Any blue flower=Någon typ av blå blomma +Any black flower=Någon typ av svart blomma +Any green flower=Någon typ av grön blomma +Any white flower=Någon typ av vit blomma +Any orange flower=Någon typ av orange blomma +Any violet flower=Någon typ av violett blomma +Any yellow flower=Någon typ av gul blomma +Any red dye=Någon typ av röd färg +Any blue dye=Någon typ av blå färg +Any cyan dye=Någon typ av cyan färg +Any grey dye=Någon typ av grå färg +Any pink dye=Någon typ av rosa färg +Any black dye=Någon typ av svart färg +Any brown dye=Någon typ av brun färg +Any green dye=Någon typ av grön färg +Any white dye=Någon typ av vit färg +Any orange dye=Någon typ av orange färg +Any violet dye=Någon typ av violett färg +Any yellow dye=Någon typ av gul färg +Any magenta dye=Någon typ av magenta färg +Any dark grey dye=Någon typ av mörkgrå färg +Any dark green dye=Någon typ av mörkgrön färg +# Label for group ingredients +G=G +Any item belonging to the group(s): @1=Vilket föremål som helst som tillhör grupp(erna): @1 +Unknown Item=Okänt föremål +Fuel=Bränsle +Usage @1 of @2=Användning @1 av @2 +Recipe @1 of @2=Recept @1 av @2 +Previous recipe=Föregående recept +Next recipe=Nästa recept +Recipe is too big to be displayed.=Receptet är för stort för att visas. +Shapeless=Formlöst +Cooking time: @1=Tillagningstid: @1 +Search=Sök +Reset=Återställ +Previous page=Föregående sida +Next page=Nästa sida +No items to show.=Inga föremål att visa. +No usages.=Inga användningsområden. +Click again to show recipes.=Tryck igen för att visa recept. +No recipes.=Inga recept. +Click again to show usages.=Tryck igen för att visa användningsområden. +Recipes=Recept diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.uk.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.uk.tr new file mode 100644 index 0000000..8fe78a9 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.uk.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=Будь-яке вугілля +Any sand=Будь-який пісок +Any wool=Будь-яка вовна +Any stick=Будь-яка палиця +Any vessel=Будь-який посуд +Any wood planks=Будь-які дошки +Any kind of stone block=Будь-який кам'яний блок +Any red flower=Будь-яка червона квітка +Any blue flower=Будь-яка синя квітка +Any black flower=Будь-яка чорна квітка +Any green flower=Будь-яка зелена квітка +Any white flower=Будь-яка біла квітка +Any orange flower=Будь-яка помаранчева квітка +Any violet flower=Будь-яка фіолетова квітка +Any yellow flower=Будь-яка жовта квітка +Any red dye=Будь-який червоний барвник +Any blue dye=Будь-який синій барвник +Any cyan dye=Будь-який синьо-зелений барвник +Any grey dye=Будь-який сірий барвник +Any pink dye=Будь-який рожевий барвник +Any black dye=Будь-який чорний барвник +Any brown dye=Будь-який коричневий барвник +Any green dye=Будь-який зелений барвник +Any white dye=Будь-який білий барвник +Any orange dye=Будь-який помаранчевий барвник +Any violet dye=Будь-який фіолетовий барвник +Any yellow dye=Будь-який жовтий барвник +Any magenta dye=Будь-який пурпурний барвник +Any dark grey dye=Будь-який темно-сірий барвник +Any dark green dye=Будь-який темно-зелений барвник +# Label for group ingredients +G=Г +Any item belonging to the group(s): @1=Будь-який предмет з груп(и): @1 +Unknown Item=Невідомий предмет +Fuel=Паливо +Usage @1 of @2=Матеріал: @1 з @2 +Recipe @1 of @2=Рецепт: @1 з @2 +Previous recipe=Попередній рецепт +Next recipe=Наступний рецепт +Recipe is too big to be displayed.=Рецепт завеликий для показу. +Shapeless=Безформний +Cooking time: @1=Час виготовлення: @1 +Search=Пошук +Reset=Скинути +Previous page=Попередня сторінка +Next page=Наступна сторінка +No items to show.=Немає результатів. +No usages.=Не використовується. +Click again to show recipes.=Натисніть ще раз для рецептів. +No recipes.=Немає рецептів. +Click again to show usages.=Натисніть ще раз для використань. +Recipes=Рецепти diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.zh_CN.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.zh_CN.tr new file mode 100644 index 0000000..56ae7d5 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.zh_CN.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=任何煤炭 +Any sand=任何沙子 +Any wool=任何羊毛 +Any stick=任何棒 +Any vessel=任何容器 +Any wood planks=任何木板 +Any kind of stone block=任何种类的石块 +Any red flower=任何红色花朵 +Any blue flower=任何蓝色花朵 +Any black flower=任何黑色花朵 +Any green flower=任何绿色花朵 +Any white flower=任何白色花朵 +Any orange flower=任何橙色花朵 +Any violet flower=任何紫色花朵 +Any yellow flower=任何黄色花朵 +Any red dye=任何红色染料 +Any blue dye=任何蓝色染料 +Any cyan dye=任何青色染料 +Any grey dye=任何灰色染料 +Any pink dye=任何粉色染料 +Any black dye=任何黑色染料 +Any brown dye=任何棕色染料 +Any green dye=任何绿色染料 +Any white dye=任何白色染料 +Any orange dye=任何橙色染料 +Any violet dye=任何紫色染料 +Any yellow dye=任何黄色染料 +Any magenta dye=任何品红染料 +Any dark grey dye=任何暗灰染料 +Any dark green dye=任何暗绿染料 +# Label for group ingredients +G= +Any item belonging to the group(s): @1=属于该组的任何项目:@1 +Unknown Item=未知项目 +Fuel=燃料 +Usage @1 of @2=用法@1,共@2个 +Recipe @1 of @2=配方@1,共@2个 +Previous recipe=上一配方 +Next recipe=下一配方 +Recipe is too big to be displayed.=配方太大,无法显示 +Shapeless=没有形状 +Cooking time: @1=烹饪时间:@1 +Search=搜索 +Reset=重置 +Previous page=上一页 +Next page=下一页 +No items to show.=没有项目可以显示。 +No usages.=没有用法 +Click again to show recipes.=再次单击以显示配方。 +No recipes.=没有配方。 +Click again to show usages.=再次单击以显示用法 +Recipes=配方 diff --git a/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.zh_TW.tr b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.zh_TW.tr new file mode 100644 index 0000000..859cdfe --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/mtg_craftguide.zh_TW.tr @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal=任何煤炭 +Any sand=任何沙子 +Any wool=任何羊毛 +Any stick=任何棒 +Any vessel=任何容器 +Any wood planks=任何木板 +Any kind of stone block=任何種類的石塊 +Any red flower=任何紅色花朵 +Any blue flower=任何藍色花朵 +Any black flower=任何黑色花朵 +Any green flower=任何綠色花朵 +Any white flower=任何白色花朵 +Any orange flower=任何橙色花朵 +Any violet flower=任何紫色花朵 +Any yellow flower=任何黃色花朵 +Any red dye=任何紅色染料 +Any blue dye=任何藍色染料 +Any cyan dye=任何青色染料 +Any grey dye=任何灰色染料 +Any pink dye=任何粉色染料 +Any black dye=任何黑色染料 +Any brown dye=任何棕色染料 +Any green dye=任何綠色染料 +Any white dye=任何白色染料 +Any orange dye=任何橙色染料 +Any violet dye=任何紫色染料 +Any yellow dye=任何黃色染料 +Any magenta dye=任何品紅染料 +Any dark grey dye=任何暗灰染料 +Any dark green dye=任何暗綠染料 +# Label for group ingredients +G= +Any item belonging to the group(s): @1=屬於該組的任何項目:@1 +Unknown Item=未知項目 +Fuel=燃料 +Usage @1 of @2=用法@1,共@2個 +Recipe @1 of @2=配方@1,共@2個 +Previous recipe=上一配方 +Next recipe=下一配方 +Recipe is too big to be displayed.=配方太大,無法顯示 +Shapeless=沒有形狀 +Cooking time: @1=烹飪時間:@1 +Search=搜索 +Reset=重置 +Previous page=上一頁 +Next page=下一頁 +No items to show.=沒有項目可以顯示。 +No usages.=沒有用法 +Click again to show recipes.=再次單擊以顯示配方。 +No recipes.=沒有配方。 +Click again to show usages.=再次單擊以顯示用法 +Recipes=配方 diff --git a/data/games/garage/mods/mtg_craftguide/locale/template.txt b/data/games/garage/mods/mtg_craftguide/locale/template.txt new file mode 100644 index 0000000..e02a721 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/locale/template.txt @@ -0,0 +1,53 @@ +# textdomain: mtg_craftguide +Any coal= +Any sand= +Any wool= +Any stick= +Any vessel= +Any wood planks= +Any kind of stone block= +Any red flower= +Any blue flower= +Any black flower= +Any green flower= +Any white flower= +Any orange flower= +Any violet flower= +Any yellow flower= +Any red dye= +Any blue dye= +Any cyan dye= +Any grey dye= +Any pink dye= +Any black dye= +Any brown dye= +Any green dye= +Any white dye= +Any orange dye= +Any violet dye= +Any yellow dye= +Any magenta dye= +Any dark grey dye= +Any dark green dye= +# Label for group ingredients +G= +Any item belonging to the group(s): @1= +Unknown Item= +Fuel= +Usage @1 of @2= +Recipe @1 of @2= +Previous recipe= +Next recipe= +Recipe is too big to be displayed.= +Shapeless= +Cooking time: @1= +Search= +Reset= +Previous page= +Next page= +No items to show.= +No usages.= +Click again to show recipes.= +No recipes.= +Click again to show usages.= +Recipes= diff --git a/data/games/garage/mods/mtg_craftguide/mod.conf b/data/games/garage/mods/mtg_craftguide/mod.conf new file mode 100644 index 0000000..3b2d975 --- /dev/null +++ b/data/games/garage/mods/mtg_craftguide/mod.conf @@ -0,0 +1,3 @@ +name = mtg_craftguide +description = Minetest Game mod: mtg_craftguide +depends = sfinv diff --git a/data/games/garage/mods/mtg_craftguide/textures/craftguide_clear_icon.png b/data/games/garage/mods/mtg_craftguide/textures/craftguide_clear_icon.png new file mode 100644 index 0000000..1a0e513 Binary files /dev/null and b/data/games/garage/mods/mtg_craftguide/textures/craftguide_clear_icon.png differ diff --git a/data/games/garage/mods/mtg_craftguide/textures/craftguide_furnace.png b/data/games/garage/mods/mtg_craftguide/textures/craftguide_furnace.png new file mode 100644 index 0000000..60d1a61 Binary files /dev/null and b/data/games/garage/mods/mtg_craftguide/textures/craftguide_furnace.png differ diff --git a/data/games/garage/mods/mtg_craftguide/textures/craftguide_next_icon.png b/data/games/garage/mods/mtg_craftguide/textures/craftguide_next_icon.png new file mode 100644 index 0000000..266c9ba Binary files /dev/null and b/data/games/garage/mods/mtg_craftguide/textures/craftguide_next_icon.png differ diff --git a/data/games/garage/mods/mtg_craftguide/textures/craftguide_prev_icon.png b/data/games/garage/mods/mtg_craftguide/textures/craftguide_prev_icon.png new file mode 100644 index 0000000..c807296 Binary files /dev/null and b/data/games/garage/mods/mtg_craftguide/textures/craftguide_prev_icon.png differ diff --git a/data/games/garage/mods/mtg_craftguide/textures/craftguide_search_icon.png b/data/games/garage/mods/mtg_craftguide/textures/craftguide_search_icon.png new file mode 100644 index 0000000..1c374ca Binary files /dev/null and b/data/games/garage/mods/mtg_craftguide/textures/craftguide_search_icon.png differ diff --git a/data/games/garage/mods/mtg_craftguide/textures/craftguide_shapeless.png b/data/games/garage/mods/mtg_craftguide/textures/craftguide_shapeless.png new file mode 100644 index 0000000..51d8ce5 Binary files /dev/null and b/data/games/garage/mods/mtg_craftguide/textures/craftguide_shapeless.png differ diff --git a/data/games/garage/mods/player_api/README.txt b/data/games/garage/mods/player_api/README.txt new file mode 100644 index 0000000..eade644 --- /dev/null +++ b/data/games/garage/mods/player_api/README.txt @@ -0,0 +1,27 @@ +Minetest Game mod: player_api +============================= +See license.txt for license information. + +Provides an API to allow multiple mods to set player models and textures. +Also sets the default model, texture, and player flags. +This mod is only for content related to the Player API and the player object. + +Authors of source code +---------------------- +Originally by celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures, models and sounds) +---------------------------------------------- +Original model by MirceaKitsune (CC BY-SA 3.0). +Various alterations and fixes by kilbith, sofar, xunto, Rogier-5, TeTpaAka, Desour, +stujones11, An0n3m0us (CC BY-SA 3.0): + character.b3d + character.blend + +Jordach (CC BY-SA 3.0): + character.png + +celeron55, Perttu Ahola (CC BY-SA 3.0): + player.png + player_back.png diff --git a/data/games/garage/mods/player_api/api.lua b/data/games/garage/mods/player_api/api.lua new file mode 100644 index 0000000..6a572f5 --- /dev/null +++ b/data/games/garage/mods/player_api/api.lua @@ -0,0 +1,239 @@ +player_api = {} + +-- Player animation blending +-- Note: This is currently broken due to a bug in Irrlicht, leave at 0 +local animation_blend = 0 + +player_api.registered_models = {} + +-- Local for speed. +local models = player_api.registered_models + +local function collisionbox_equals(collisionbox, other_collisionbox) + if collisionbox == other_collisionbox then + return true + end + for index = 1, 6 do + if collisionbox[index] ~= other_collisionbox[index] then + return false + end + end + return true +end + +function player_api.register_model(name, def) + models[name] = def + def.visual_size = def.visual_size or {x = 1, y = 1} + def.collisionbox = def.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3} + def.stepheight = def.stepheight or 0.6 + def.eye_height = def.eye_height or 1.47 + + -- Sort animations into property classes: + -- Animations with same properties have the same _equals value + for animation_name, animation in pairs(def.animations) do + animation.eye_height = animation.eye_height or def.eye_height + animation.collisionbox = animation.collisionbox or def.collisionbox + animation.override_local = animation.override_local or false + + for _, other_animation in pairs(def.animations) do + if other_animation._equals then + if collisionbox_equals(animation.collisionbox, other_animation.collisionbox) + and animation.eye_height == other_animation.eye_height then + animation._equals = other_animation._equals + break + end + end + end + animation._equals = animation._equals or animation_name + end +end + +-- Player stats and animations +-- model, textures, animation +local players = {} +player_api.player_attached = {} + +local function get_player_data(player) + return assert(players[player:get_player_name()]) +end + +function player_api.get_animation(player) + return get_player_data(player) +end + +-- Called when a player's appearance needs to be updated +function player_api.set_model(player, model_name) + local player_data = get_player_data(player) + if player_data.model == model_name then + return + end + -- Update data + player_data.model = model_name + -- Clear animation data as the model has changed + -- (required for setting the `stand` animation not to be a no-op) + player_data.animation, player_data.animation_speed, player_data.animation_loop = nil, nil, nil + + local model = models[model_name] + if model then + player:set_properties({ + mesh = model_name, + textures = player_data.textures or model.textures, + visual = "mesh", + visual_size = model.visual_size, + stepheight = model.stepheight + }) + -- sets local_animation, collisionbox & eye_height + player_api.set_animation(player, "stand") + else + player:set_properties({ + textures = {"player.png", "player_back.png"}, + visual = "upright_sprite", + visual_size = {x = 1, y = 2}, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.75, 0.3}, + stepheight = 0.6, + eye_height = 1.625, + }) + end +end + +function player_api.get_textures(player) + local player_data = get_player_data(player) + local model = models[player_data.model] + return assert(player_data.textures or (model and model.textures)) +end + +function player_api.set_textures(player, textures) + local player_data = get_player_data(player) + local model = models[player_data.model] + local new_textures = assert(textures or (model and model.textures)) + player_data.textures = new_textures + player:set_properties({textures = new_textures}) +end + +function player_api.set_texture(player, index, texture) + local textures = table.copy(player_api.get_textures(player)) + textures[index] = texture + player_api.set_textures(player, textures) +end + +function player_api.set_animation(player, anim_name, speed, loop) + local player_data = get_player_data(player) + local model = models[player_data.model] + if not (model and model.animations[anim_name]) then + return + end + speed = speed or model.animation_speed + if loop == nil then + loop = true + end + if player_data.animation == anim_name + and player_data.animation_speed == speed + and player_data.animation_loop == loop + then + return + end + local previous_anim = model.animations[player_data.animation] or {} + local anim = model.animations[anim_name] + player_data.animation = anim_name + player_data.animation_speed = speed + player_data.animation_loop = loop + -- If necessary change the local animation (only seen by the client of *that* player) + -- `override_local` <=> suspend local animations while this one is active + -- (this is basically a hack, proper engine feature needed...) + if anim.override_local ~= previous_anim.override_local then + if anim.override_local then + local none = {x=0, y=0} + player:set_local_animation(none, none, none, none, 1) + else + local a = model.animations -- (not specific to the animation being set) + player:set_local_animation( + a.stand, a.walk, a.mine, a.walk_mine, + model.animation_speed or 30 + ) + end + end + -- Set the animation seen by everyone else + player:set_animation(anim, speed, animation_blend, loop) + -- Update related properties if they changed + if anim._equals ~= previous_anim._equals then + player:set_properties({ + collisionbox = anim.collisionbox, + eye_height = anim.eye_height + }) + end +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + players[name] = {} + player_api.player_attached[name] = false +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + players[name] = nil + player_api.player_attached[name] = nil +end) + +-- Localize for better performance. +local player_set_animation = player_api.set_animation +local player_attached = player_api.player_attached + +-- Prevent knockback for attached players +local old_calculate_knockback = minetest.calculate_knockback +function minetest.calculate_knockback(player, ...) + if player_attached[player:get_player_name()] then + return 0 + end + return old_calculate_knockback(player, ...) +end + +-- Check each player and apply animations +function player_api.globalstep() + for _, player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local player_data = players[name] + local model = player_data and models[player_data.model] + if model and not player_attached[name] then + local controls = player:get_player_control() + local animation_speed_mod = model.animation_speed or 30 + + -- Determine if the player is sneaking, and reduce animation speed if so + if controls.sneak then + animation_speed_mod = animation_speed_mod / 2 + end + + -- Apply animations based on what the player is doing + if player:get_hp() == 0 then + player_set_animation(player, "lay") + elseif controls.up or controls.down or controls.left or controls.right then + if controls.LMB or controls.RMB then + player_set_animation(player, "walk_mine", animation_speed_mod) + else + player_set_animation(player, "walk", animation_speed_mod) + end + elseif controls.LMB or controls.RMB then + player_set_animation(player, "mine", animation_speed_mod) + else + player_set_animation(player, "stand", animation_speed_mod) + end + end + end +end + +-- Mods can modify the globalstep by overriding player_api.globalstep +minetest.register_globalstep(function(...) + player_api.globalstep(...) +end) + +for _, api_function in pairs({"get_animation", "set_animation", "set_model", "set_textures"}) do + local original_function = player_api[api_function] + player_api[api_function] = function(player, ...) + if not players[player:get_player_name()] then + -- HACK for keeping backwards compatibility + minetest.log("warning", api_function .. " called on offline player") + return + end + return original_function(player, ...) + end +end diff --git a/data/games/garage/mods/player_api/init.lua b/data/games/garage/mods/player_api/init.lua new file mode 100644 index 0000000..f258aea --- /dev/null +++ b/data/games/garage/mods/player_api/init.lua @@ -0,0 +1,26 @@ +dofile(minetest.get_modpath("player_api") .. "/api.lua") + +-- Default player appearance +player_api.register_model("character.b3d", { + animation_speed = 30, + textures = {"character.png"}, + animations = { + -- Standard animations. + stand = {x = 0, y = 79}, + lay = {x = 162, y = 166, eye_height = 0.3, override_local = true, + collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}}, + walk = {x = 168, y = 187}, + mine = {x = 189, y = 198}, + walk_mine = {x = 200, y = 219}, + sit = {x = 81, y = 160, eye_height = 0.8, override_local = true, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}} + }, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, + stepheight = 0.6, + eye_height = 1.47, +}) + +-- Update appearance when the player joins +minetest.register_on_joinplayer(function(player) + player_api.set_model(player, "character.b3d") +end) diff --git a/data/games/garage/mods/player_api/license.txt b/data/games/garage/mods/player_api/license.txt new file mode 100644 index 0000000..8ddb090 --- /dev/null +++ b/data/games/garage/mods/player_api/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011 celeron55, Perttu Ahola +Copyright (C) 2011 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011 celeron55, Perttu Ahola +Copyright (C) 2012 MirceaKitsune +Copyright (C) 2012 Jordach +Copyright (C) 2015 kilbith +Copyright (C) 2016 sofar +Copyright (C) 2016 xunto +Copyright (C) 2016 Rogier-5 +Copyright (C) 2017 TeTpaAka +Copyright (C) 2017 Desour +Copyright (C) 2018 stujones11 +Copyright (C) 2019 An0n3m0us + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/player_api/mod.conf b/data/games/garage/mods/player_api/mod.conf new file mode 100644 index 0000000..bf62327 --- /dev/null +++ b/data/games/garage/mods/player_api/mod.conf @@ -0,0 +1,2 @@ +name = player_api +description = Minetest Game mod: Manages player visuals diff --git a/data/games/garage/mods/testentities/models/testentities_sam.b3d b/data/games/garage/mods/player_api/models/character.b3d similarity index 100% rename from data/games/garage/mods/testentities/models/testentities_sam.b3d rename to data/games/garage/mods/player_api/models/character.b3d diff --git a/data/games/garage/mods/player_api/models/character.blend b/data/games/garage/mods/player_api/models/character.blend new file mode 100644 index 0000000..a32c343 Binary files /dev/null and b/data/games/garage/mods/player_api/models/character.blend differ diff --git a/data/games/garage/mods/testentities/models/testentities_sam.png b/data/games/garage/mods/player_api/models/character.png similarity index 100% rename from data/games/garage/mods/testentities/models/testentities_sam.png rename to data/games/garage/mods/player_api/models/character.png diff --git a/data/games/garage/mods/player_api/textures/player.png b/data/games/garage/mods/player_api/textures/player.png new file mode 100644 index 0000000..6d61c43 Binary files /dev/null and b/data/games/garage/mods/player_api/textures/player.png differ diff --git a/data/games/garage/mods/player_api/textures/player_back.png b/data/games/garage/mods/player_api/textures/player_back.png new file mode 100644 index 0000000..5e9ef05 Binary files /dev/null and b/data/games/garage/mods/player_api/textures/player_back.png differ diff --git a/data/games/garage/mods/screwdriver/README.txt b/data/games/garage/mods/screwdriver/README.txt new file mode 100644 index 0000000..aa95e19 --- /dev/null +++ b/data/games/garage/mods/screwdriver/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: screwdriver +============================== +See license.txt for license information. + +License of source code +---------------------- +Originally by RealBadAngel, Maciej Kasatkin (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +License of media (textures) +--------------------------- +Created by Gambit (CC BY-SA 3.0): + screwdriver.png diff --git a/data/games/garage/mods/screwdriver/init.lua b/data/games/garage/mods/screwdriver/init.lua new file mode 100644 index 0000000..e7227bf --- /dev/null +++ b/data/games/garage/mods/screwdriver/init.lua @@ -0,0 +1,194 @@ +-- screwdriver/init.lua + +screwdriver = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("screwdriver") + + +screwdriver.ROTATE_FACE = 1 +screwdriver.ROTATE_AXIS = 2 +screwdriver.disallow = function(pos, node, user, mode, new_param2) + return false +end +screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end +end + +-- For attached wallmounted nodes: returns true if rotation is valid +-- simplified version of minetest:builtin/game/falling.lua#L148. +local function check_attached_node(pos, rotation) + local d = minetest.wallmounted_to_dir(rotation) + local p2 = vector.add(pos, d) + local n = minetest.get_node(p2).name + local def2 = minetest.registered_nodes[n] + if def2 and not def2.walkable then + return false + end + return true +end + +screwdriver.rotate = {} + +local facedir_tbl = { + [screwdriver.ROTATE_FACE] = { + [0] = 1, [1] = 2, [2] = 3, [3] = 0, + [4] = 5, [5] = 6, [6] = 7, [7] = 4, + [8] = 9, [9] = 10, [10] = 11, [11] = 8, + [12] = 13, [13] = 14, [14] = 15, [15] = 12, + [16] = 17, [17] = 18, [18] = 19, [19] = 16, + [20] = 21, [21] = 22, [22] = 23, [23] = 20, + }, + [screwdriver.ROTATE_AXIS] = { + [0] = 4, [1] = 4, [2] = 4, [3] = 4, + [4] = 8, [5] = 8, [6] = 8, [7] = 8, + [8] = 12, [9] = 12, [10] = 12, [11] = 12, + [12] = 16, [13] = 16, [14] = 16, [15] = 16, + [16] = 20, [17] = 20, [18] = 20, [19] = 20, + [20] = 0, [21] = 0, [22] = 0, [23] = 0, + }, +} + +screwdriver.rotate.facedir = function(pos, node, mode) + local rotation = node.param2 % 32 -- get first 5 bits + local other = node.param2 - rotation + rotation = facedir_tbl[mode][rotation] or 0 + return rotation + other +end + +screwdriver.rotate.colorfacedir = screwdriver.rotate.facedir + +screwdriver.rotate["4dir"] = function(pos, node, mode) + if mode ~= screwdriver.ROTATE_FACE then + -- Can only rotate 4dir nodes in face mode + return nil + end + local rotation = node.param2 % 4 -- get first 2 bits + local other = node.param2 - rotation + rotation = (rotation + 1) % 4 + return rotation + other +end + +screwdriver.rotate["color4dir"] = screwdriver.rotate["4dir"] + +local wallmounted_tbl = { + [screwdriver.ROTATE_FACE] = {[2] = 5, [3] = 4, [4] = 2, [5] = 3, [1] = 0, [0] = 1}, + [screwdriver.ROTATE_AXIS] = {[2] = 5, [3] = 4, [4] = 2, [5] = 1, [1] = 0, [0] = 3} +} + +screwdriver.rotate.wallmounted = function(pos, node, mode) + local rotation = node.param2 % 8 -- get first 3 bits + local other = node.param2 - rotation + rotation = wallmounted_tbl[mode][rotation] or 0 + if minetest.get_item_group(node.name, "attached_node") ~= 0 then + -- find an acceptable orientation + for i = 1, 5 do + if not check_attached_node(pos, rotation) then + rotation = wallmounted_tbl[mode][rotation] or 0 + else + break + end + end + end + return rotation + other +end + +screwdriver.rotate.colorwallmounted = screwdriver.rotate.wallmounted + +-- Handles rotation +screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + local player_name = user and user:get_player_name() or "" + + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end + -- can we rotate this paramtype2? + local fn = screwdriver.rotate[ndef.paramtype2] + if not fn and not ndef.on_rotate then + return itemstack + end + + local should_rotate = true + local new_param2 + if fn then + new_param2 = fn(pos, node, mode) + if not new_param2 then + -- rotation refused + return itemstack + end + else + new_param2 = node.param2 + end + + -- Node provides a handler, so let the handler decide instead if the node can be rotated + if ndef.on_rotate then + -- Copy pos and node because callback can modify it + local result = ndef.on_rotate(vector.new(pos), + {name = node.name, param1 = node.param1, param2 = node.param2}, + user, mode, new_param2) + if result == false then -- Disallow rotation + return itemstack + elseif result == true then + should_rotate = false + end + elseif ndef.on_rotate == false then + return itemstack + elseif ndef.can_dig and not ndef.can_dig(pos, user) then + return itemstack + end + + if should_rotate and new_param2 ~= node.param2 then + node.param2 = new_param2 + minetest.swap_node(pos, node) + minetest.check_for_falling(pos) + end + + if not minetest.is_creative_enabled(player_name) then + itemstack:add_wear_by_uses(uses or 200) + end + + return itemstack +end + +-- Screwdriver +minetest.register_tool("screwdriver:screwdriver", { + description = S("Screwdriver") .. "\n" .. S("(left-click rotates face, right-click rotates axis)"), + inventory_image = "screwdriver.png", + groups = {tool = 1}, + on_use = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, 200) + return itemstack + end, +}) + + +minetest.register_craft({ + output = "screwdriver:screwdriver", + recipe = { + {"default:steel_ingot"}, + {"group:stick"} + } +}) + +minetest.register_alias("screwdriver:screwdriver1", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver2", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver3", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver4", "screwdriver:screwdriver") diff --git a/data/games/garage/mods/screwdriver/license.txt b/data/games/garage/mods/screwdriver/license.txt new file mode 100644 index 0000000..cc5a28d --- /dev/null +++ b/data/games/garage/mods/screwdriver/license.txt @@ -0,0 +1,50 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2013-2016 RealBadAngel, Maciej Kasatkin +Copyright (C) 2013-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2013-2016 Gambit + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.de.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.de.tr new file mode 100644 index 0000000..3c48ab4 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.de.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Schraubendreher +(left-click rotates face, right-click rotates axis)=(Linksklick dreht Seite, Rechtsklick dreht Achse) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.eo.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.eo.tr new file mode 100644 index 0000000..7f8fedf --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.eo.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Ŝraŭbturnilo +(left-click rotates face, right-click rotates axis)=(maldekstra-klako turnas supraĵon, dekstra-klako turnas akson) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.es.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.es.tr new file mode 100644 index 0000000..868ffc3 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.es.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Destornillador +(left-click rotates face, right-click rotates axis)=(clic-izquierdo gira la cara, clic-derecho rota el eje) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.fr.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.fr.tr new file mode 100644 index 0000000..fe34a9b --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.fr.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Tournevis +(left-click rotates face, right-click rotates axis)=(clic gauche pour changer de face, clic droit pour changer d'axe) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.id.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.id.tr new file mode 100644 index 0000000..ec83c79 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.id.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Obeng +(left-click rotates face, right-click rotates axis)=(klik kiri putar sisi, klik kanan putar sumbu) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.it.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.it.tr new file mode 100644 index 0000000..ff44b89 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.it.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Cacciavite +(left-click rotates face, right-click rotates axis)=(click sinistro ruota la faccia, click destro ruota l'asse) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.ja.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.ja.tr new file mode 100644 index 0000000..55690f2 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.ja.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=ドライバー +(left-click rotates face, right-click rotates axis)=(左クリックで面が回転。右クリックで軸が回転) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.jbo.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.jbo.tr new file mode 100644 index 0000000..1a85bb6 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.jbo.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=lo lupcartci +(left-click rotates face, right-click rotates axis)=.i tu'a le zulselpevysmacu cu rinka lo nu le sefta cu carna@n.i tu'a le prityselpevysmacu cu rinka lo nu le jendu cu carna diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.lv.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.lv.tr new file mode 100644 index 0000000..3296dab --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.lv.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Skrūvgrieznis +(left-click rotates face, right-click rotates axis)=(kreisais klikšķis rotē plakni, labais klikšķis rotē asi) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.ms.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.ms.tr new file mode 100644 index 0000000..f296fc5 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.ms.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Pemutar Skru +(left-click rotates face, right-click rotates axis)=(klik-kiri putar muka, klik-kanan putar paksi) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.pl.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.pl.tr new file mode 100644 index 0000000..3b4bfd6 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.pl.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Śrubokręt +(left-click rotates face, right-click rotates axis)=(lewy przycisk myszy obraca powierzchnię, prawy przycisk myszy obraca oś) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.pt_BR.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.pt_BR.tr new file mode 100644 index 0000000..3e89f40 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Chave de fenda +(left-click rotates face, right-click rotates axis)=(Clique esquerdo rotaciona a face, clique direito rotaciona o eixo) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.ru.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.ru.tr new file mode 100644 index 0000000..d50ee76 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.ru.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Отвёртка +(left-click rotates face, right-click rotates axis)=(левый клик вращает грань, правый клик вращает ось) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.sk.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.sk.tr new file mode 100644 index 0000000..74cb417 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.sk.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Skrutkovač +(left-click rotates face, right-click rotates axis)=(Ľavý klik otáča stranu, pravý klik otáča os) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.sv.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.sv.tr new file mode 100644 index 0000000..be440a7 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.sv.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Skruvmejsel +(left-click rotates face, right-click rotates axis)=(vänster-klick roterar ansikte, höger-klick roterar axeln) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.uk.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.uk.tr new file mode 100644 index 0000000..b88fc2a --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.uk.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=Викрутка +(left-click rotates face, right-click rotates axis)=(ЛКМ повертає грань, ПКМ — вісь) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.zh_CN.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.zh_CN.tr new file mode 100644 index 0000000..caddf79 --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.zh_CN.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=螺丝刀 +(left-click rotates face, right-click rotates axis)=(左键单击旋转面,右键单击旋转轴) diff --git a/data/games/garage/mods/screwdriver/locale/screwdriver.zh_TW.tr b/data/games/garage/mods/screwdriver/locale/screwdriver.zh_TW.tr new file mode 100644 index 0000000..e638bfa --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/screwdriver.zh_TW.tr @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver=螺絲刀 +(left-click rotates face, right-click rotates axis)=(左鍵單擊旋轉面,右鍵單擊旋轉軸) diff --git a/data/games/garage/mods/screwdriver/locale/template.txt b/data/games/garage/mods/screwdriver/locale/template.txt new file mode 100644 index 0000000..4cc8e2a --- /dev/null +++ b/data/games/garage/mods/screwdriver/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: screwdriver +Screwdriver= +(left-click rotates face, right-click rotates axis)= diff --git a/data/games/garage/mods/screwdriver/mod.conf b/data/games/garage/mods/screwdriver/mod.conf new file mode 100644 index 0000000..306c52b --- /dev/null +++ b/data/games/garage/mods/screwdriver/mod.conf @@ -0,0 +1,2 @@ +name = screwdriver +description = Minetest Game mod: screwdriver diff --git a/data/games/garage/mods/screwdriver/textures/screwdriver.png b/data/games/garage/mods/screwdriver/textures/screwdriver.png new file mode 100644 index 0000000..b2a56d5 Binary files /dev/null and b/data/games/garage/mods/screwdriver/textures/screwdriver.png differ diff --git a/data/games/garage/mods/sethome/README.txt b/data/games/garage/mods/sethome/README.txt new file mode 100644 index 0000000..6f0a282 --- /dev/null +++ b/data/games/garage/mods/sethome/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: sethome +========================== +See license.txt for license information. + +Authors of source code +---------------------- +sfan5 (MIT) diff --git a/data/games/garage/mods/sethome/init.lua b/data/games/garage/mods/sethome/init.lua new file mode 100644 index 0000000..19de958 --- /dev/null +++ b/data/games/garage/mods/sethome/init.lua @@ -0,0 +1,114 @@ +-- sethome/init.lua + +sethome = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("sethome") + + +local homes_file = minetest.get_worldpath() .. "/homes" +local homepos = {} + +local function loadhomes() + local input = io.open(homes_file, "r") + if not input then + return -- no longer an error + end + + -- Iterate over all stored positions in the format "x y z player" for each line + for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do + homepos[name] = minetest.string_to_pos(pos) + end + input:close() +end + +loadhomes() + +sethome.set = function(name, pos) + local player = minetest.get_player_by_name(name) + if not player or not pos then + return false + end + local player_meta = player:get_meta() + player_meta:set_string("sethome:home", minetest.pos_to_string(pos)) + + -- remove `name` from the old storage file + if not homepos[name] then + return true + end + local data = {} + local output = io.open(homes_file, "w") + if output then + homepos[name] = nil + for i, v in pairs(homepos) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i)) + end + output:write(table.concat(data)) + io.close(output) + return true + end + return true -- if the file doesn't exist - don't return an error. +end + +sethome.get = function(name) + local player = minetest.get_player_by_name(name) + if not player then + return false, S("This command can only be executed in-game!") + end + local player_meta = player:get_meta() + local pos = minetest.string_to_pos(player_meta:get_string("sethome:home")) + if pos then + return pos + end + + -- fetch old entry from storage table + pos = homepos[name] + if pos then + return vector.new(pos) + else + return nil + end +end + +sethome.go = function(name) + local pos = sethome.get(name) + local player = minetest.get_player_by_name(name) + if player and pos then + player:set_pos(pos) + return true + end + return false +end + +minetest.register_privilege("home", { + description = S("Can use /sethome and /home"), + give_to_singleplayer = false +}) + +minetest.register_chatcommand("home", { + description = S("Teleport you to your home point"), + privs = {home = true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then + return false, S("This command can only be executed in-game!") + end + if sethome.go(name) then + return true, S("Teleported to home!") + end + return false, S("Set a home using /sethome") + end, +}) + +minetest.register_chatcommand("sethome", { + description = S("Set your home point"), + privs = {home = true}, + func = function(name) + name = name or "" -- fallback to blank name if nil + local player = minetest.get_player_by_name(name) + if player and sethome.set(name, player:get_pos()) then + return true, S("Home set!") + end + return false, S("Player not found!") + end, +}) diff --git a/data/games/garage/mods/sethome/license.txt b/data/games/garage/mods/sethome/license.txt new file mode 100644 index 0000000..09f03b0 --- /dev/null +++ b/data/games/garage/mods/sethome/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 sfan5 + +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. + +For more details: +https://opensource.org/licenses/MIT diff --git a/data/games/garage/mods/sethome/locale/sethome.de.tr b/data/games/garage/mods/sethome/locale/sethome.de.tr new file mode 100644 index 0000000..c59b26e --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.de.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Dieser Befehl kann nur im Spiel ausgeführt werden! +Can use /sethome and /home=Kann /sethome und /home benutzen +Teleport you to your home point=Teleportieren Sie sich zu Ihrem Zuhause-Punkt +Teleported to home!=Nach Hause teleportiert! +Set a home using /sethome=Ein Zuhause mit /sethome setzen +Set your home point=Ihren Zuhause-Punkt setzen +Home set!=Zuhause gesetzt! +Player not found!=Spieler nicht gefunden! diff --git a/data/games/garage/mods/sethome/locale/sethome.eo.tr b/data/games/garage/mods/sethome/locale/sethome.eo.tr new file mode 100644 index 0000000..86ef814 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.eo.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Povas uzi /sethome kaj /home +Teleport you to your home point=Teletransporti vin al via hejmo +Teleported to home!=Teletransportita al hejmo! +Set a home using /sethome=Fiksi hejmon per /sethome +Set your home point=Fiksi vian hejman punkton +Home set!=Fiksita hejmo! +Player not found!=Ludanto ne troveblas! diff --git a/data/games/garage/mods/sethome/locale/sethome.es.tr b/data/games/garage/mods/sethome/locale/sethome.es.tr new file mode 100644 index 0000000..661bc62 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.es.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Puedes usar /sethome y /home +Teleport you to your home point=Teletranspórtate a tu hogar +Teleported to home!=¡Teletransportado a tu hogar! +Set a home using /sethome=Establece tu hogar usando /sethome +Set your home point=Establece el sitio de tu hogar +Home set!=¡Hogar establecido! +Player not found!=¡Jugador no encontrado! diff --git a/data/games/garage/mods/sethome/locale/sethome.fr.tr b/data/games/garage/mods/sethome/locale/sethome.fr.tr new file mode 100644 index 0000000..01345e0 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.fr.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Cette commande peut seulement être exécutée en jeu ! +Can use /sethome and /home=Peut utiliser /sethome et /home +Teleport you to your home point=Vous téléporter à votre domicile +Teleported to home!=Téléporté à votre domicile ! +Set a home using /sethome=Définir un domicile en utilisant /sethome +Set your home point=Définir votre domicile +Home set!=Domicile défini ! +Player not found!=Joueur non trouvé ! diff --git a/data/games/garage/mods/sethome/locale/sethome.id.tr b/data/games/garage/mods/sethome/locale/sethome.id.tr new file mode 100644 index 0000000..f5c68dd --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.id.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Perintah ini hanya bisa dijalankan dalam permainan! +Can use /sethome and /home=Boleh gunakan /sethome dan /home +Teleport you to your home point=Teleportasi ke rumah Anda +Teleported to home!=Teleportasi ke rumah! +Set a home using /sethome=Atur letak rumah dengan /sethome +Set your home point=Atur letak rumah +Home set!=Letak rumah diatur! +Player not found!=Pemain tidak ditemukan! diff --git a/data/games/garage/mods/sethome/locale/sethome.it.tr b/data/games/garage/mods/sethome/locale/sethome.it.tr new file mode 100644 index 0000000..4f1d757 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.it.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Può usare /sethome e /home +Teleport you to your home point=Ti teletrasporta al tuo punto di domicilio +Teleported to home!=Teletrasportato a casa! +Set a home using /sethome=Imposta un domicilio usando /sethome +Set your home point=Imposta il tuo punto di domicilio +Home set!=Domicilio impostato! +Player not found!=Giocatore non trovato! diff --git a/data/games/garage/mods/sethome/locale/sethome.ja.tr b/data/games/garage/mods/sethome/locale/sethome.ja.tr new file mode 100644 index 0000000..e652387 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.ja.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=/sethomeと/homeが使えます +Teleport you to your home point=ホーム地点にテレポートします +Teleported to home!=ホームにテレポート! +Set a home using /sethome=/sethomeを使ってホームを設定します +Set your home point=ホーム地点を設定します +Home set!=ホーム地点をセット! +Player not found!=プレーヤーが見つかりません! diff --git a/data/games/garage/mods/sethome/locale/sethome.jbo.tr b/data/games/garage/mods/sethome/locale/sethome.jbo.tr new file mode 100644 index 0000000..2fe7bf0 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.jbo.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=kakne lo nu pilno lo me zoi gy./sethome.gy. ku .e lo me zoi gy./home.gy. +Teleport you to your home point=sukmu'u lo do zdani mokca +Teleported to home!=puba'o sukmu'u lo zdani +Set a home using /sethome=ko tcimi'e fi lo zdani sepi'o lo me zoi gy./sethome.gy. +Set your home point=tcimi'e fi lo do zdani mokca +Home set!=puba'o tcimi'e fi lo zdani +Player not found!=lo kelci na te facki diff --git a/data/games/garage/mods/sethome/locale/sethome.lv.tr b/data/games/garage/mods/sethome/locale/sethome.lv.tr new file mode 100644 index 0000000..e4b8597 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.lv.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Šī komanda var tikt izpildīta tikai atrodoties spēlē! +Can use /sethome and /home=Var izmantot /sethome un /home +Teleport you to your home point=Teleportēt jūs uz mājas punktu +Teleported to home!=Esiet teleportēts mājās! +Set a home using /sethome=Uzstādiet māju punktu izmantojot /sethome +Set your home point=Uzstādiet savu mājas punktu +Home set!=Mājas punkts uzstādīts! +Player not found!=Spēlētājs nav atrasts! diff --git a/data/games/garage/mods/sethome/locale/sethome.ms.tr b/data/games/garage/mods/sethome/locale/sethome.ms.tr new file mode 100644 index 0000000..09721fe --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.ms.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Perintah ini hanya boleh dijalankan dalam permainan! +Can use /sethome and /home=Boleh guna /sethome dan /home +Teleport you to your home point=Teleportasikan anda ke titik rumah anda +Teleported to home!=Diteleportasikan ke rumah! +Set a home using /sethome=Tetapkan rumah menggunakan /sethome +Set your home point=Tetapkan titik rumah anda +Home set!=Rumah ditetapkan! +Player not found!=Pemain tidak dijumpai! diff --git a/data/games/garage/mods/sethome/locale/sethome.pl.tr b/data/games/garage/mods/sethome/locale/sethome.pl.tr new file mode 100644 index 0000000..b45cb46 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.pl.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Może używać /sethome i /home +Teleport you to your home point=Teleportuj się do swojego punktu domowego +Teleported to home!=Teleportowano do punktu domowego +Set a home using /sethome=Ustaw punkt domowy używając /sethome +Set your home point=Ustaw swój punkt domowy +Home set!=Punkt domowy ustawiony! +Player not found!=Gracz nie odnaleziony! diff --git a/data/games/garage/mods/sethome/locale/sethome.pt_BR.tr b/data/games/garage/mods/sethome/locale/sethome.pt_BR.tr new file mode 100644 index 0000000..6abd416 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Pode usar /sethome e /home +Teleport you to your home point=Teletransportá-lo para seu ponto de origem +Teleported to home!=Teletransportado para o ponto de origem! +Set a home using /sethome=Defina um ponto de origem usando /sethome +Set your home point=Define seu ponto de origem +Home set!=Ponto de origem definido! +Player not found!=Jogador não encontrado! diff --git a/data/games/garage/mods/sethome/locale/sethome.ru.tr b/data/games/garage/mods/sethome/locale/sethome.ru.tr new file mode 100644 index 0000000..d68cf6e --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.ru.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Эта команда может быть использована только в игре! +Can use /sethome and /home=Возможность использовать /sethome и /home +Teleport you to your home point=Вы телепортируетесь в свою домашнюю точку +Teleported to home!=Вы телепортировались домой! +Set a home using /sethome=Установите домашнюю точку, используя /sethome +Set your home point=Установите вашу домашнюю точку +Home set!=Домашняя точка установлена! +Player not found!=Игрок не найден! diff --git a/data/games/garage/mods/sethome/locale/sethome.sk.tr b/data/games/garage/mods/sethome/locale/sethome.sk.tr new file mode 100644 index 0000000..c0e6cee --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.sk.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Môžeš použivať /sethome a /home +Teleport you to your home point=Teleportuj sa domov +Teleported to home!=Teleportovaný domov! +Set a home using /sethome=Nastav si domov použitím /sethome +Set your home point=Nastaviť si domov +Home set!=Domov nastavený! +Player not found!=Hráč nenájdený! diff --git a/data/games/garage/mods/sethome/locale/sethome.sv.tr b/data/games/garage/mods/sethome/locale/sethome.sv.tr new file mode 100644 index 0000000..4e100b8 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.sv.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home=Kan använda /sethome och /home +Teleport you to your home point=Teleportera dig till din hempunkt +Teleported to home!=Teleporterad hem! +Set a home using /sethome=Ställ in ett hem med /sethome +Set your home point=Ställ in din hempunkt +Home set!=Hem inställt! +Player not found!=Spelare finns inte! diff --git a/data/games/garage/mods/sethome/locale/sethome.uk.tr b/data/games/garage/mods/sethome/locale/sethome.uk.tr new file mode 100644 index 0000000..f17ac77 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.uk.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=Ця команда може бути виконана тільки у грі! +Can use /sethome and /home=Можливість використання /sethome та /home +Teleport you to your home point=Телепортуватися до домашньої точки +Teleported to home!=Телепортовано додому! +Set a home using /sethome=Встановіть домашню точку, використовуючи /sethome +Set your home point=Встановити домашню точку +Home set!=Домашню точку встановлено! +Player not found!=Гравця не знайдено! diff --git a/data/games/garage/mods/sethome/locale/sethome.zh_CN.tr b/data/games/garage/mods/sethome/locale/sethome.zh_CN.tr new file mode 100644 index 0000000..6e05576 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.zh_CN.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=该指令只能在游戏内使用! +Can use /sethome and /home=可以使用/sethome和/home +Teleport you to your home point=将您传送到家 +Teleported to home!=已传送到家! +Set a home using /sethome=使用/sethome设定家 +Set your home point=设定您家的地点 +Home set!=已设定家! +Player not found!=未找到玩家! diff --git a/data/games/garage/mods/sethome/locale/sethome.zh_TW.tr b/data/games/garage/mods/sethome/locale/sethome.zh_TW.tr new file mode 100644 index 0000000..c5e455c --- /dev/null +++ b/data/games/garage/mods/sethome/locale/sethome.zh_TW.tr @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!=此指令僅能在游戲内使用! +Can use /sethome and /home=可以使用/sethome和/home +Teleport you to your home point=傳送您到您家的地點 +Teleported to home!=已傳送到家! +Set a home using /sethome=使用/sethome設定家 +Set your home point=設定您家的地點 +Home set!=已設定家! +Player not found!=未找到玩家! diff --git a/data/games/garage/mods/sethome/locale/template.txt b/data/games/garage/mods/sethome/locale/template.txt new file mode 100644 index 0000000..f91c719 --- /dev/null +++ b/data/games/garage/mods/sethome/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: sethome +This command can only be executed in-game!= +Can use /sethome and /home= +Teleport you to your home point= +Teleported to home!= +Set a home using /sethome= +Set your home point= +Home set!= +Player not found!= diff --git a/data/games/garage/mods/sethome/mod.conf b/data/games/garage/mods/sethome/mod.conf new file mode 100644 index 0000000..0079925 --- /dev/null +++ b/data/games/garage/mods/sethome/mod.conf @@ -0,0 +1,2 @@ +name = sethome +description = Minetest Game mod: sethome diff --git a/data/games/garage/mods/sfinv/README.txt b/data/games/garage/mods/sfinv/README.txt new file mode 100644 index 0000000..2ef8386 --- /dev/null +++ b/data/games/garage/mods/sfinv/README.txt @@ -0,0 +1,18 @@ +Minetest Game mod: sfinv +======================== +See license.txt for license information. + +Simple Fast Inventory. +A cleaner, simpler, solution to having an advanced inventory in Luanti. +See game_api.txt for this mod's API. +Available for use outside of MTG here: +https://forum.luanti.org/viewtopic.php?t=19765 + +Authors of source code +---------------------- +rubenwardy (MIT) + +Authors of media +---------------- +paramat (CC BY-SA 3.0): + sfinv_crafting_arrow.png - derived from a texture by BlockMen (CC BY-SA 3.0) diff --git a/data/games/garage/mods/sfinv/api.lua b/data/games/garage/mods/sfinv/api.lua new file mode 100644 index 0000000..1dbc44a --- /dev/null +++ b/data/games/garage/mods/sfinv/api.lua @@ -0,0 +1,189 @@ +sfinv = { + pages = {}, + pages_unordered = {}, + contexts = {}, + enabled = true +} + +function sfinv.register_page(name, def) + assert(name, "Invalid sfinv page. Requires a name") + assert(def, "Invalid sfinv page. Requires a def[inition] table") + assert(def.get, "Invalid sfinv page. Def requires a get function.") + assert(not sfinv.pages[name], "Attempt to register already registered sfinv page " .. dump(name)) + + sfinv.pages[name] = def + def.name = name + table.insert(sfinv.pages_unordered, def) +end + +function sfinv.override_page(name, def) + assert(name, "Invalid sfinv page override. Requires a name") + assert(def, "Invalid sfinv page override. Requires a def[inition] table") + local page = sfinv.pages[name] + assert(page, "Attempt to override sfinv page " .. dump(name) .. " which does not exist.") + for key, value in pairs(def) do + page[key] = value + end +end + +function sfinv.get_nav_fs(player, context, nav, current_idx) + -- Only show tabs if there is more than one page + if #nav > 1 then + return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") .. + ";" .. current_idx .. ";true;false]" + else + return "" + end +end + +local theme_inv = [[ + image[0,5.2;1,1;gui_hb_bg.png] + image[1,5.2;1,1;gui_hb_bg.png] + image[2,5.2;1,1;gui_hb_bg.png] + image[3,5.2;1,1;gui_hb_bg.png] + image[4,5.2;1,1;gui_hb_bg.png] + image[5,5.2;1,1;gui_hb_bg.png] + image[6,5.2;1,1;gui_hb_bg.png] + image[7,5.2;1,1;gui_hb_bg.png] + list[current_player;main;0,5.2;8,1;] + list[current_player;main;0,6.35;8,3;8] + ]] + +function sfinv.make_formspec(player, context, content, show_inv, size) + local tmp = { + size or "size[8,9.1]", + sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx), + show_inv and theme_inv or "", + content + } + return table.concat(tmp, "") +end + +function sfinv.get_homepage_name(player) + return "sfinv:crafting" +end + +function sfinv.get_formspec(player, context) + -- Generate navigation tabs + local nav = {} + local nav_ids = {} + local current_idx = 1 + for i, pdef in pairs(sfinv.pages_unordered) do + if not pdef.is_in_nav or pdef:is_in_nav(player, context) then + nav[#nav + 1] = pdef.title + nav_ids[#nav_ids + 1] = pdef.name + if pdef.name == context.page then + current_idx = #nav_ids + end + end + end + context.nav = nav_ids + context.nav_titles = nav + context.nav_idx = current_idx + + -- Generate formspec + local page = sfinv.pages[context.page] or sfinv.pages["404"] + if page then + return page:get(player, context) + else + local old_page = context.page + local home_page = sfinv.get_homepage_name(player) + + if old_page == home_page then + minetest.log("error", "[sfinv] Couldn't find " .. dump(old_page) .. + ", which is also the old page") + + return "" + end + + context.page = home_page + assert(sfinv.pages[context.page], "[sfinv] Invalid homepage") + minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) .. + " so switching to homepage") + + return sfinv.get_formspec(player, context) + end +end + +function sfinv.get_or_create_context(player) + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + context = { + page = sfinv.get_homepage_name(player) + } + sfinv.contexts[name] = context + end + return context +end + +function sfinv.set_context(player, context) + sfinv.contexts[player:get_player_name()] = context +end + +function sfinv.set_player_inventory_formspec(player, context) + local fs = sfinv.get_formspec(player, + context or sfinv.get_or_create_context(player)) + player:set_inventory_formspec(fs) +end + +function sfinv.set_page(player, pagename) + local context = sfinv.get_or_create_context(player) + local oldpage = sfinv.pages[context.page] + if oldpage and oldpage.on_leave then + oldpage:on_leave(player, context) + end + context.page = pagename + local page = sfinv.pages[pagename] + if page.on_enter then + page:on_enter(player, context) + end + sfinv.set_player_inventory_formspec(player, context) +end + +function sfinv.get_page(player) + local context = sfinv.contexts[player:get_player_name()] + return context and context.page or sfinv.get_homepage_name(player) +end + +minetest.register_on_joinplayer(function(player) + if sfinv.enabled then + sfinv.set_player_inventory_formspec(player) + end +end) + +minetest.register_on_leaveplayer(function(player) + sfinv.contexts[player:get_player_name()] = nil +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" or not sfinv.enabled then + return false + end + + -- Get Context + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + sfinv.set_player_inventory_formspec(player) + return false + end + + -- Was a tab selected? + if fields.sfinv_nav_tabs and context.nav then + local tid = tonumber(fields.sfinv_nav_tabs) + if tid and tid > 0 then + local id = context.nav[tid] + local page = sfinv.pages[id] + if id and page then + sfinv.set_page(player, id) + end + end + else + -- Pass event to page + local page = sfinv.pages[context.page] + if page and page.on_player_receive_fields then + return page:on_player_receive_fields(player, context, fields) + end + end +end) diff --git a/data/games/garage/mods/sfinv/init.lua b/data/games/garage/mods/sfinv/init.lua new file mode 100644 index 0000000..71e9ee7 --- /dev/null +++ b/data/games/garage/mods/sfinv/init.lua @@ -0,0 +1,19 @@ +-- sfinv/init.lua + +dofile(minetest.get_modpath("sfinv") .. "/api.lua") + +-- Load support for MT game translation. +local S = minetest.get_translator("sfinv") + +sfinv.register_page("sfinv:crafting", { + title = S("Crafting"), + get = function(self, player, context) + return sfinv.make_formspec(player, context, [[ + list[current_player;craft;1.75,0.5;3,3;] + list[current_player;craftpreview;5.75,1.5;1,1;] + image[4.75,1.5;1,1;sfinv_crafting_arrow.png] + listring[current_player;main] + listring[current_player;craft] + ]], true) + end +}) diff --git a/data/games/garage/mods/sfinv/license.txt b/data/games/garage/mods/sfinv/license.txt new file mode 100644 index 0000000..6676d74 --- /dev/null +++ b/data/games/garage/mods/sfinv/license.txt @@ -0,0 +1,59 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2016-2018 rubenwardy + +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. + +For more details: +https://opensource.org/licenses/MIT + + +License of media +---------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2019 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/sfinv/locale/sfinv.de.tr b/data/games/garage/mods/sfinv/locale/sfinv.de.tr new file mode 100644 index 0000000..044e9ba --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.de.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Fertigung diff --git a/data/games/garage/mods/sfinv/locale/sfinv.eo.tr b/data/games/garage/mods/sfinv/locale/sfinv.eo.tr new file mode 100644 index 0000000..1fac1ad --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.eo.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Konstruado diff --git a/data/games/garage/mods/sfinv/locale/sfinv.es.tr b/data/games/garage/mods/sfinv/locale/sfinv.es.tr new file mode 100644 index 0000000..d3d6609 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.es.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Creación diff --git a/data/games/garage/mods/sfinv/locale/sfinv.fr.tr b/data/games/garage/mods/sfinv/locale/sfinv.fr.tr new file mode 100644 index 0000000..58ead96 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.fr.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Artisanat diff --git a/data/games/garage/mods/sfinv/locale/sfinv.id.tr b/data/games/garage/mods/sfinv/locale/sfinv.id.tr new file mode 100644 index 0000000..643196e --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.id.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Kerajinan diff --git a/data/games/garage/mods/sfinv/locale/sfinv.it.tr b/data/games/garage/mods/sfinv/locale/sfinv.it.tr new file mode 100644 index 0000000..e449b75 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.it.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Assemblaggio diff --git a/data/games/garage/mods/sfinv/locale/sfinv.ja.tr b/data/games/garage/mods/sfinv/locale/sfinv.ja.tr new file mode 100644 index 0000000..04122d7 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.ja.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=クラフト diff --git a/data/games/garage/mods/sfinv/locale/sfinv.jbo.tr b/data/games/garage/mods/sfinv/locale/sfinv.jbo.tr new file mode 100644 index 0000000..0ff0328 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.jbo.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=nu zbasu diff --git a/data/games/garage/mods/sfinv/locale/sfinv.lv.tr b/data/games/garage/mods/sfinv/locale/sfinv.lv.tr new file mode 100644 index 0000000..58da91d --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.lv.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Taisīšana diff --git a/data/games/garage/mods/sfinv/locale/sfinv.ms.tr b/data/games/garage/mods/sfinv/locale/sfinv.ms.tr new file mode 100644 index 0000000..f62ba8a --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.ms.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Pertukangan diff --git a/data/games/garage/mods/sfinv/locale/sfinv.pl.tr b/data/games/garage/mods/sfinv/locale/sfinv.pl.tr new file mode 100644 index 0000000..6230d82 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.pl.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Konstruowanie diff --git a/data/games/garage/mods/sfinv/locale/sfinv.pt_BR.tr b/data/games/garage/mods/sfinv/locale/sfinv.pt_BR.tr new file mode 100644 index 0000000..f9e57ae --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Construir diff --git a/data/games/garage/mods/sfinv/locale/sfinv.ru.tr b/data/games/garage/mods/sfinv/locale/sfinv.ru.tr new file mode 100644 index 0000000..d7c11b2 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.ru.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Крафтинг diff --git a/data/games/garage/mods/sfinv/locale/sfinv.sk.tr b/data/games/garage/mods/sfinv/locale/sfinv.sk.tr new file mode 100644 index 0000000..18566f1 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.sk.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Vytváranie diff --git a/data/games/garage/mods/sfinv/locale/sfinv.sv.tr b/data/games/garage/mods/sfinv/locale/sfinv.sv.tr new file mode 100644 index 0000000..df426b6 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.sv.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Tillverkning diff --git a/data/games/garage/mods/sfinv/locale/sfinv.uk.tr b/data/games/garage/mods/sfinv/locale/sfinv.uk.tr new file mode 100644 index 0000000..aff9420 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.uk.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=Майстрування diff --git a/data/games/garage/mods/sfinv/locale/sfinv.zh_CN.tr b/data/games/garage/mods/sfinv/locale/sfinv.zh_CN.tr new file mode 100644 index 0000000..3ec3c72 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.zh_CN.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=合成 diff --git a/data/games/garage/mods/sfinv/locale/sfinv.zh_TW.tr b/data/games/garage/mods/sfinv/locale/sfinv.zh_TW.tr new file mode 100644 index 0000000..3ec3c72 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/sfinv.zh_TW.tr @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting=合成 diff --git a/data/games/garage/mods/sfinv/locale/template.txt b/data/games/garage/mods/sfinv/locale/template.txt new file mode 100644 index 0000000..ace5519 --- /dev/null +++ b/data/games/garage/mods/sfinv/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: sfinv +Crafting= diff --git a/data/games/garage/mods/sfinv/mod.conf b/data/games/garage/mods/sfinv/mod.conf new file mode 100644 index 0000000..2934435 --- /dev/null +++ b/data/games/garage/mods/sfinv/mod.conf @@ -0,0 +1,2 @@ +name = sfinv +description = Minetest Game mod: sfinv diff --git a/data/games/garage/mods/sfinv/textures/sfinv_crafting_arrow.png b/data/games/garage/mods/sfinv/textures/sfinv_crafting_arrow.png new file mode 100644 index 0000000..42bba58 Binary files /dev/null and b/data/games/garage/mods/sfinv/textures/sfinv_crafting_arrow.png differ diff --git a/data/games/garage/mods/soundstuff/bigfoot.lua b/data/games/garage/mods/soundstuff/bigfoot.lua deleted file mode 100644 index afa2b6e..0000000 --- a/data/games/garage/mods/soundstuff/bigfoot.lua +++ /dev/null @@ -1,48 +0,0 @@ - -local walk_speed = 2 -local walk_distance = 10 - -core.register_entity("soundstuff:bigfoot", { - initial_properties = { - physical = false, - collisionbox = {-1, -1, -1, 1, 1, 1}, - selectionbox = {-1, -1, -1, 1, 1, 1}, - visual = "upright_sprite", - visual_size = {x = 2, y = 2, z = 2}, - textures = {"soundstuff_bigfoot.png", "soundstuff_bigfoot.png^[transformFX"}, - makes_footstep_sound = true, - static_save = false, - }, - - on_activate = function(self, _staticdata, _dtime_s) - self.min_x = self.object:get_pos().x - walk_distance * 0.5 - self.max_x = self.min_x + walk_distance - self.vel = vector.new(walk_speed, 0, 0) - end, - - on_step = function(self, _dtime, _moveresult) - local pos = self.object:get_pos() - if pos.x < self.min_x then - self.vel = vector.new(walk_speed, 0, 0) - elseif pos.x > self.max_x then - self.vel = vector.new(-walk_speed, 0, 0) - end - self.object:set_velocity(self.vel) - end, -}) - -core.register_chatcommand("spawn_bigfoot", { - params = "", - description = "Spawn a big foot object that makes footstep sounds", - func = function(name, _param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local pos = player:get_pos() - pos.y = pos.y + player:get_properties().collisionbox[2] - pos.y = pos.y - (-1) -- bigfoot collisionbox goes 1 down - core.add_entity(pos, "soundstuff:bigfoot") - return true - end, -}) diff --git a/data/games/garage/mods/soundstuff/init.lua b/data/games/garage/mods/soundstuff/init.lua deleted file mode 100644 index 6c0049a..0000000 --- a/data/games/garage/mods/soundstuff/init.lua +++ /dev/null @@ -1,6 +0,0 @@ - -local path = core.get_modpath("soundstuff") .. "/" -dofile(path .. "sound_event_items.lua") -dofile(path .. "jukebox.lua") -dofile(path .. "bigfoot.lua") -dofile(path .. "racecar.lua") diff --git a/data/games/garage/mods/soundstuff/jukebox.lua b/data/games/garage/mods/soundstuff/jukebox.lua deleted file mode 100644 index 6c70fe3..0000000 --- a/data/games/garage/mods/soundstuff/jukebox.lua +++ /dev/null @@ -1,331 +0,0 @@ -local F = core.formspec_escape - --- hashed node pos -> sound handle -local played_sounds = {} - --- all of these can be set via the formspec -local meta_keys = { - -- SimpleSoundSpec - "sss.name", - "sss.gain", - "sss.pitch", - "sss.fade", - -- sound parameters - "sparam.gain", - "sparam.pitch", - "sparam.fade", - "sparam.start_time", - "sparam.loop", - "sparam.pos", - "sparam.object", - "sparam.to_player", - "sparam.exclude_player", - "sparam.max_hear_distance", - -- fade - "fade.step", - "fade.gain", - -- other - "ephemeral", -} - -local function get_all_metadata(meta) - return { - sss = { - name = meta:get_string("sss.name"), - gain = meta:get_string("sss.gain"), - pitch = meta:get_string("sss.pitch"), - fade = meta:get_string("sss.fade"), - }, - sparam = { - gain = meta:get_string("sparam.gain"), - pitch = meta:get_string("sparam.pitch"), - fade = meta:get_string("sparam.fade"), - start_time = meta:get_string("sparam.start_time"), - loop = meta:get_string("sparam.loop"), - pos = meta:get_string("sparam.pos"), - object = meta:get_string("sparam.object"), - to_player = meta:get_string("sparam.to_player"), - exclude_player = meta:get_string("sparam.exclude_player"), - max_hear_distance = meta:get_string("sparam.max_hear_distance"), - }, - fade = { - gain = meta:get_string("fade.gain"), - step = meta:get_string("fade.step"), - }, - ephemeral = meta:get_string("ephemeral"), - } -end - -local function log_msg(msg) - core.log("action", msg) - core.chat_send_all(msg) -end - -local function try_call(f, ...) - local function log_on_err(success, errmsg, ...) - if not success then - log_msg("[soundstuff:jukebox] Call failed: "..errmsg) - else - return errmsg, ... - end - end - - return log_on_err(pcall(f, ...)) -end - -local function show_formspec(pos, player) - local meta = core.get_meta(pos) - - local md = get_all_metadata(meta) - - local pos_hash = core.hash_node_position(pos) - local sound_handle = played_sounds[pos_hash] - - local fs = {} - local function fs_add(str) - table.insert(fs, str) - end - - fs_add([[ - formspec_version[6] - size[14,12] - ]]) - - -- SimpleSoundSpec - fs_add(string.format([[ - container[0.5,0.5] - box[-0.1,-0.1;4.2,3.2;#EBEBEB20] - style[*;font=mono,bold] - label[0,0.25;SimpleSoundSpec] - style[*;font=mono] - field[0.00,1.00;4,0.75;sss.name;name;%s] - field[0.00,2.25;1,0.75;sss.gain;gain;%s] - field[1.25,2.25;1,0.75;sss.pitch;pitch;%s] - field[2.50,2.25;1,0.75;sss.fade;fade;%s] - container_end[] - field_close_on_enter[sss.name;false] - field_close_on_enter[sss.gain;false] - field_close_on_enter[sss.pitch;false] - field_close_on_enter[sss.fade;false] - ]], F(md.sss.name), F(md.sss.gain), F(md.sss.pitch), F(md.sss.fade))) - - -- sound parameter table - fs_add(string.format([[ - container[5.5,0.5] - box[-0.1,-0.1;4.2,10.7;#EBEBEB20] - style[*;font=mono,bold] - label[0,0.25;sound parameter table] - style[*;font=mono] - field[0.00,1;1,0.75;sparam.gain;gain;%s] - field[1.25,1;1,0.75;sparam.pitch;pitch;%s] - field[2.50,1;1,0.75;sparam.fade;fade;%s] - field[0,2.25;4,0.75;sparam.start_time;start_time;%s] - field[0,3.50;4,0.75;sparam.loop;loop;%s] - field[0,4.75;4,0.75;sparam.pos;pos;%s] - field[0,6.00;4,0.75;sparam.object;object;%s] - field[0,7.25;4,0.75;sparam.to_player;to_player;%s] - field[0,8.50;4,0.75;sparam.exclude_player;exclude_player;%s] - field[0,9.75;4,0.75;sparam.max_hear_distance;max_hear_distance;%s] - container_end[] - field_close_on_enter[sparam.gain;false] - field_close_on_enter[sparam.pitch;false] - field_close_on_enter[sparam.fade;false] - field_close_on_enter[sparam.start_time;false] - field_close_on_enter[sparam.loop;false] - field_close_on_enter[sparam.pos;false] - field_close_on_enter[sparam.object;false] - field_close_on_enter[sparam.to_player;false] - field_close_on_enter[sparam.exclude_player;false] - field_close_on_enter[sparam.max_hear_distance;false] - tooltip[sparam.object;Get a name with the Branding Iron.] - ]], F(md.sparam.gain), F(md.sparam.pitch), F(md.sparam.fade), - F(md.sparam.start_time), F(md.sparam.loop), F(md.sparam.pos), - F(md.sparam.object), F(md.sparam.to_player), F(md.sparam.exclude_player), - F(md.sparam.max_hear_distance))) - - -- fade - fs_add(string.format([[ - container[10.75,3] - box[-0.1,-0.1;3.2,3.2;#EBEBEB20] - style[*;font=mono,bold] - label[0,0.25;fade] - style[*;font=mono] - field[0.00,1;1,0.75;fade.step;step;%s] - field[1.25,1;1,0.75;fade.gain;gain;%s] - ]], F(md.fade.step), F(md.fade.gain))) - if not sound_handle then - fs_add([[ - box[0,2;3,0.75;#363636FF] - label[0.25,2.375;no sound] - ]]) - else - fs_add([[ - button[0,2;3,0.75;btn_fade;Fade] - ]]) - end - fs_add([[ - container_end[] - field_close_on_enter[fade.step;false] - field_close_on_enter[fade.gain;false] - ]]) - - -- ephemeral - fs_add(string.format([[ - checkbox[0.5,5;ephemeral;ephemeral;%s] - ]], md.ephemeral)) - - -- play/stop and release buttons - if not sound_handle then - fs_add([[ - container[10.75,0.5] - button[0,0;3,0.75;btn_play;Play] - container_end[] - ]]) - else - fs_add([[ - container[10.75,0.5] - button[0,0;3,0.75;btn_stop;Stop] - button[0,1;3,0.75;btn_release;Release] - container_end[] - ]]) - end - - -- save and quit button - fs_add([[ - button_exit[10.75,11;3,0.75;btn_save_quit;Save & Quit] - ]]) - - core.show_formspec(player:get_player_name(), "soundstuff:jukebox@"..pos:to_string(), - table.concat(fs)) -end - -core.register_node("soundstuff:jukebox", { - description = "Jukebox\nAllows to play arbitrary sounds.", - tiles = {"soundstuff_jukebox.png"}, - groups = {dig_immediate = 2}, - - on_construct = function(pos) - local meta = core.get_meta(pos) - -- SimpleSoundSpec - meta:set_string("sss.name", "") - meta:set_string("sss.gain", "") - meta:set_string("sss.pitch", "") - meta:set_string("sss.fade", "") - -- sound parameters - meta:set_string("sparam.gain", "") - meta:set_string("sparam.pitch", "") - meta:set_string("sparam.fade", "") - meta:set_string("sparam.start_time", "") - meta:set_string("sparam.loop", "") - meta:set_string("sparam.pos", pos:to_string()) - meta:set_string("sparam.object", "") - meta:set_string("sparam.to_player", "") - meta:set_string("sparam.exclude_player", "") - meta:set_string("sparam.max_hear_distance", "") - -- fade - meta:set_string("fade.gain", "") - meta:set_string("fade.step", "") - -- other - meta:set_string("ephemeral", "") - - meta:mark_as_private(meta_keys) - end, - - on_rightclick = function(pos, _node, clicker, _itemstack, _pointed_thing) - show_formspec(pos, clicker) - end, -}) - -core.register_on_player_receive_fields(function(player, formname, fields) - if formname:sub(1, 19) ~= "soundstuff:jukebox@" then - return false - end - - local pos = vector.from_string(formname, 20) - if not pos or pos ~= pos:round() then - core.log("error", "[soundstuff:jukebox] Invalid formname.") - return true - end - - local meta = core.get_meta(pos) - - for _, k in ipairs(meta_keys) do - if fields[k] then - meta:set_string(k, fields[k]) - end - end - meta:mark_as_private(meta_keys) - - local pos_hash = core.hash_node_position(pos) - local sound_handle = played_sounds[pos_hash] - - if not sound_handle then - if fields.btn_play then - local md = get_all_metadata(meta) - - local sss = { - name = md.sss.name, - gain = tonumber(md.sss.gain), - pitch = tonumber(md.sss.pitch), - fade = tonumber(md.sss.fade), - } - local sparam = { - gain = tonumber(md.sparam.gain), - pitch = tonumber(md.sparam.pitch), - fade = tonumber(md.sparam.fade), - start_time = tonumber(md.sparam.start_time), - loop = core.is_yes(md.sparam.loop), - pos = vector.from_string(md.sparam.pos), - object = testtools.get_branded_object(md.sparam.object), - to_player = md.sparam.to_player, - exclude_player = md.sparam.exclude_player, - max_hear_distance = tonumber(md.sparam.max_hear_distance), - } - local ephemeral = core.is_yes(md.ephemeral) - - log_msg(string.format( - "[soundstuff:jukebox] Playing sound: core.sound_play(%s, %s, %s)", - string.format("{name=\"%s\", gain=%s, pitch=%s, fade=%s}", - sss.name, sss.gain, sss.pitch, sss.fade), - string.format("{gain=%s, pitch=%s, fade=%s, start_time=%s, loop=%s, pos=%s, " - .."object=%s, to_player=\"%s\", exclude_player=\"%s\", max_hear_distance=%s}", - sparam.gain, sparam.pitch, sparam.fade, sparam.start_time, - sparam.loop, sparam.pos, sparam.object and "", - sparam.to_player, sparam.exclude_player, - sparam.max_hear_distance), - tostring(ephemeral))) - - sound_handle = try_call(core.sound_play, sss, sparam, ephemeral) - - played_sounds[pos_hash] = sound_handle - show_formspec(pos, player) - end - - else - if fields.btn_stop then - log_msg("[soundstuff:jukebox] Stopping sound: core.sound_stop()") - - try_call(core.sound_stop, sound_handle) - - elseif fields.btn_release then - log_msg("[soundstuff:jukebox] Releasing handle.") - - played_sounds[pos_hash] = nil - show_formspec(pos, player) - - elseif fields.btn_fade then - local md = get_all_metadata(meta) - - local step = tonumber(md.fade.step) - local gain = tonumber(md.fade.gain) - - log_msg(string.format( - "[soundstuff:jukebox] Fading sound: core.sound_fade(, %s, %s)", - step, gain)) - - try_call(core.sound_fade, sound_handle, step, gain) - end - end - - return true -end) diff --git a/data/games/garage/mods/soundstuff/mod.conf b/data/games/garage/mods/soundstuff/mod.conf deleted file mode 100644 index a6ed6d4..0000000 --- a/data/games/garage/mods/soundstuff/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = soundstuff -description = Example items and nodes for testing sound effects -depends = testtools diff --git a/data/games/garage/mods/soundstuff/racecar.lua b/data/games/garage/mods/soundstuff/racecar.lua deleted file mode 100644 index 9162792..0000000 --- a/data/games/garage/mods/soundstuff/racecar.lua +++ /dev/null @@ -1,31 +0,0 @@ - -local drive_speed = 20 -local drive_distance = 30 - -core.register_entity("soundstuff:racecar", { - initial_properties = { - physical = false, - collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - visual = "upright_sprite", - visual_size = {x = 1, y = 1, z = 1}, - textures = {"soundstuff_racecar.png", "soundstuff_racecar.png^[transformFX"}, - static_save = false, - }, - - on_activate = function(self, _staticdata, _dtime_s) - self.min_x = self.object:get_pos().x - drive_distance * 0.5 - self.max_x = self.min_x + drive_distance - self.vel = vector.new(drive_speed, 0, 0) - end, - - on_step = function(self, _dtime, _moveresult) - local pos = self.object:get_pos() - if pos.x < self.min_x then - self.vel = vector.new(drive_speed, 0, 0) - elseif pos.x > self.max_x then - self.vel = vector.new(-drive_speed, 0, 0) - end - self.object:set_velocity(self.vel) - end, -}) diff --git a/data/games/garage/mods/soundstuff/sound_event_items.lua b/data/games/garage/mods/soundstuff/sound_event_items.lua deleted file mode 100644 index 9b2eb6b..0000000 --- a/data/games/garage/mods/soundstuff/sound_event_items.lua +++ /dev/null @@ -1,209 +0,0 @@ -local simple_nodes = { - footstep = { "Footstep Sound Node", "soundstuff_node_footstep.png", "Plays sound when you step on it" }, - dig = { "Dig Sound Node", "soundstuff_node_dig.png", "Plays sound when you dig it" }, - dug = { "Dug Sound Node", "soundstuff_node_dug.png", "Plays sound when you've dug it" }, - place = { "Place Sound Node", "soundstuff_node_place.png", "Plays sound when you place it" }, - place_failed = { "Place Failed Sound Node", "soundstuff_node_place_failed.png", "Plays sound when you try to place it but failed" }, -} - -for k,v in pairs(simple_nodes) do - core.register_node("soundstuff:"..k, { - description = v[1].."\n"..v[3], - tiles = {"soundstuff_node_sound.png","soundstuff_node_sound.png",v[2]}, - groups = {dig_immediate=2}, - sounds = { - [k] = { name = "soundstuff_mono", gain = 1.0 }, - } - }) -end - -core.register_node("soundstuff:place_failed_attached", { - description = "Attached Place Failed Sound Node".."\n".. - "Attached to the floor; plays a sound when you try to place it but failed", - tiles = {"soundstuff_node_sound.png", "soundstuff_node_sound.png", "soundstuff_node_place_failed.png"}, - groups = {dig_immediate=2, attached_node=1}, - drawtype = "nodebox", - paramtype = "light", - node_box = { type = "fixed", fixed = { - { -7/16, -7/16, -7/16, 7/16, 7/16, 7/16 }, - { -0.5, -0.5, -0.5, 0.5, -7/16, 0.5 }, - }}, - sounds = { - place_failed = { name = "soundstuff_mono", gain = 1.0 }, - }, -}) - -core.register_node("soundstuff:fall", { - description = "Fall Sound Node".."\n".. - "Falls and plays sound if node below is gone", - tiles = {"soundstuff_node_sound.png", "soundstuff_node_sound.png", "soundstuff_node_fall.png"}, - groups = {dig_immediate=2, falling_node=1}, - sounds = { - fall = { name = "soundstuff_mono", gain = 1.0 }, - } -}) - -core.register_node("soundstuff:fall_attached", { - description = "Attached Fall Sound Node".."\n".. - "Drops as item and plays sound if node below is gone", - tiles = {"soundstuff_node_sound.png", "soundstuff_node_sound.png", "soundstuff_node_fall.png"}, - groups = {dig_immediate=2, attached_node=1}, - drawtype = "nodebox", - paramtype = "light", - node_box = { type = "fixed", fixed = { - { -7/16, -7/16, -7/16, 7/16, 7/16, 7/16 }, - { -0.5, -0.5, -0.5, 0.5, -7/16, 0.5 }, - }}, - sounds = { - fall = { name = "soundstuff_mono", gain = 1.0 }, - } -}) - -core.register_node("soundstuff:footstep_liquid", { - description = "Liquid Footstep Sound Node".."\n".. - "Plays sound when moving inside it; swimmable", - drawtype = "liquid", - tiles = { - "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", - }, - special_tiles = { - {name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", - backface_culling = false}, - {name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", - backface_culling = true}, - }, - liquids_pointable = true, - liquidtype = "source", - liquid_alternative_flowing = "soundstuff:footstep_liquid", - liquid_alternative_source = "soundstuff:footstep_liquid", - liquid_renewable = false, - liquid_range = 0, - liquid_viscosity = 0, - use_texture_alpha = "blend", - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - post_effect_color = {a = 64, r = 0, g = 0, b = 200}, - sounds = { - footstep = { name = "soundstuff_mono", gain = 1.0 }, - } -}) - -core.register_node("soundstuff:footstep_climbable", { - description = "Climbable Footstep Sound Node".."\n".. - "Plays sound when moving inside it; can climb up and down here", - drawtype = "allfaces", - tiles = { - "soundstuff_node_climbable.png", - }, - paramtype = "light", - sunlight_propagates = true, - walkable = false, - climbable = true, - is_ground_content = false, - groups = { dig_immediate = 2 }, - sounds = { - footstep = { name = "soundstuff_mono", gain = 1.0 }, - } -}) - - - -core.register_craftitem("soundstuff:eat", { - description = "Eat Sound Item".."\n".. - "Makes a sound when 'eaten' (with punch key)", - inventory_image = "soundstuff_eat.png", - on_use = core.item_eat(0), - sound = { - eat = { name = "soundstuff_mono", gain = 1.0 }, - } -}) - -core.register_tool("soundstuff:breaks", { - description = "Break Sound Tool".."\n".. - "Digs cracky=3 and more".."\n".. - "Makes a sound when it breaks", - inventory_image = "soundstuff_node_dug.png", - sound = { - breaks = { name = "soundstuff_mono", gain = 1.0 }, - }, - tool_capabilities = { - max_drop_level=0, - groupcaps={ - cracky={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, - choppy={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, - snappy={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, - crumbly={times={[2]=2.00, [3]=1.20}, uses=1, maxlevel=0}, - }, - }, -}) - - -core.register_tool("soundstuff:punch_use", { - description = "Punch Use Sound Tool\n".. - "Digs cracky=3 and more\n".. - "Makes a sound when used on node or entity", - inventory_image = "soundstuff_node_dig.png", - sound = { - punch_use = { name = "soundstuff_mono", gain = 1.0 }, - }, - tool_capabilities = { - max_drop_level=0, - groupcaps={ - cracky={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, - choppy={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, - snappy={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, - crumbly={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, - }, - }, -}) - -core.register_tool("soundstuff:punch_use_air", { - description = "Punch Use (Air) Sound Tool\n".. - "Makes a sound when used pointing at nothing", - inventory_image = "soundstuff_node_dig.png", - sound = { - punch_use_air = { name = "soundstuff_mono", gain = 1.0 }, - }, -}) - --- Plays sound repeatedly -core.register_node("soundstuff:positional", { - description = "Positional Sound Node".."\n".. - "Repeatedly plays a sound at the node location", - on_construct = function(pos) - local timer = core.get_node_timer(pos) - timer:start(0) - end, - on_timer = function(pos, elapsed) - local node = core.get_node(pos) - local dist = node.param2 - if dist == 0 then - dist = nil - end - core.sound_play("soundstuff_mono", { pos = pos, max_hear_distance = dist }) - local timer = core.get_node_timer(pos) - timer:start(0.7) - end, - on_rightclick = function(pos, node, clicker) - node.param2 = (node.param2 + 1) % 64 - core.set_node(pos, node) - if clicker and clicker:is_player() then - local dist = node.param2 - local diststr - if dist == 0 then - diststr = "" - else - diststr = tostring(dist) - end - core.chat_send_player(clicker:get_player_name(), "max_hear_distance = " .. diststr) - end - end, - - groups = { dig_immediate = 2 }, - tiles = { "soundstuff_node_sound.png" }, -}) - diff --git a/data/games/garage/mods/soundstuff/sounds/gitignored_sounds/custom_sounds_here.txt b/data/games/garage/mods/soundstuff/sounds/gitignored_sounds/custom_sounds_here.txt deleted file mode 100644 index f07d44b..0000000 --- a/data/games/garage/mods/soundstuff/sounds/gitignored_sounds/custom_sounds_here.txt +++ /dev/null @@ -1,2 +0,0 @@ -Put your own testing sounds here. The folder is gitignored. -Using a sound-pack is also possible. diff --git a/data/games/garage/mods/soundstuff/sounds/soundstuff_mono.ogg b/data/games/garage/mods/soundstuff/sounds/soundstuff_mono.ogg deleted file mode 100644 index 43428d5..0000000 Binary files a/data/games/garage/mods/soundstuff/sounds/soundstuff_mono.ogg and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/sounds/soundstuff_sinus.ogg b/data/games/garage/mods/soundstuff/sounds/soundstuff_sinus.ogg deleted file mode 100644 index 8dbc00a..0000000 Binary files a/data/games/garage/mods/soundstuff/sounds/soundstuff_sinus.ogg and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_bigfoot.png b/data/games/garage/mods/soundstuff/textures/soundstuff_bigfoot.png deleted file mode 100644 index 6770b3f..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_bigfoot.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_eat.png b/data/games/garage/mods/soundstuff/textures/soundstuff_eat.png deleted file mode 100644 index aed2054..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_eat.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_jukebox.png b/data/games/garage/mods/soundstuff/textures/soundstuff_jukebox.png deleted file mode 100644 index b8c17a6..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_jukebox.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_blank.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_blank.png deleted file mode 100644 index 4dffacc..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_blank.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_climbable.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_climbable.png deleted file mode 100644 index 3888f79..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_climbable.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_dig.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_dig.png deleted file mode 100644 index 67ba111..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_dig.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_dug.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_dug.png deleted file mode 100644 index bab5fbe..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_dug.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_fall.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_fall.png deleted file mode 100644 index 17b14f1..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_fall.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_footstep.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_footstep.png deleted file mode 100644 index 6367ae9..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_footstep.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_place.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_place.png deleted file mode 100644 index d159ad5..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_place.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_place_failed.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_place_failed.png deleted file mode 100644 index 780ba94..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_place_failed.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_node_sound.png b/data/games/garage/mods/soundstuff/textures/soundstuff_node_sound.png deleted file mode 100644 index 0592a02..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_node_sound.png and /dev/null differ diff --git a/data/games/garage/mods/soundstuff/textures/soundstuff_racecar.png b/data/games/garage/mods/soundstuff/textures/soundstuff_racecar.png deleted file mode 100644 index 8e8ff5a..0000000 Binary files a/data/games/garage/mods/soundstuff/textures/soundstuff_racecar.png and /dev/null differ diff --git a/data/games/garage/mods/spawn/README.txt b/data/games/garage/mods/spawn/README.txt new file mode 100644 index 0000000..fc16c2a --- /dev/null +++ b/data/games/garage/mods/spawn/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: spawn +======================== +See license.txt for license information. + +Authors of source code +---------------------- +paramat (MIT) diff --git a/data/games/garage/mods/spawn/api.lua b/data/games/garage/mods/spawn/api.lua new file mode 100644 index 0000000..bffe32a --- /dev/null +++ b/data/games/garage/mods/spawn/api.lua @@ -0,0 +1,49 @@ +spawn = {} + +-- provide empty default implementations + +function spawn.get_default_pos() + return nil +end + +function spawn.add_suitable_biome(biome) +end + +-- Callback registration + +spawn.registered_on_spawn = {} + +function spawn.register_on_spawn(func) + table.insert(spawn.registered_on_spawn, func) +end + +-- Logic run on spawn + +local use_engine_spawn = minetest.settings:get("static_spawnpoint") or + minetest.settings:get_bool("engine_spawn") + +local function on_spawn(player, is_new) + -- Ask all callbacks first + for _, cb in ipairs(spawn.registered_on_spawn) do + if cb(player, is_new) then + return true + end + end + -- Fall back to default spawn + if not use_engine_spawn then + local pos = spawn.get_default_pos() + if pos then + player:set_pos(pos) + return true + end + end + return false +end + +minetest.register_on_newplayer(function(player) + on_spawn(player, true) +end) + +minetest.register_on_respawnplayer(function(player) + return on_spawn(player, false) +end) diff --git a/data/games/garage/mods/spawn/init.lua b/data/games/garage/mods/spawn/init.lua new file mode 100644 index 0000000..b439997 --- /dev/null +++ b/data/games/garage/mods/spawn/init.lua @@ -0,0 +1,135 @@ +-- Always load the API +---------------------- +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/api.lua") + +-- Disable biome-search implementation on unsuitable mapgens +------------------------------------------------------------ + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" or mg_name == "singlenode" then + return +end + + +-- Parameters +------------- + +-- Resolution of search grid in nodes. +local res = 64 +-- Number of points checked in the square search grid (edge * edge). +local checks = 128 * 128 +-- Starting point for biome checks. This also sets the y co-ordinate for all +-- points checked, so the suitable biomes must be active at this y. +local pos = {x = 0, y = 8, z = 0} + + +-- Table of suitable biomes and matching API function + +local biome_ids = {} + +function spawn.add_suitable_biome(biome) + local id = minetest.get_biome_id(biome) + assert(id ~= nil) + biome_ids[id] = true +end + +for _, name in ipairs({ + "taiga", "coniferous_forest", "deciduous_forest", "grassland", "savanna" +}) do + local id = minetest.get_biome_id(name) + if id then + biome_ids[id] = true + end +end + +-- End of parameters +-------------------- + +-- Direction table + +local dirs = { + vector.new(0, 0, 1), + vector.new(-1, 0, 0), + vector.new(0, 0, -1), + vector.new(1, 0, 0), +} + + +-- Initial variables + +local edge_len = 1 +local edge_dist = 0 +local dir_step = 0 +local dir_ind = 1 +local searched = false +local success = false +local spawn_pos = {} + + +-- Get world 'mapgen_limit' and 'chunksize' to calculate 'spawn_limit'. +-- This accounts for how mapchunks are not generated if they or their shell exceed +-- 'mapgen_limit'. + +local mapgen_limit = tonumber(minetest.get_mapgen_setting("mapgen_limit")) +local chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) +local spawn_limit = math.max(mapgen_limit - (chunksize + 1) * 16, 0) + + +-- Functions +------------ + +-- Get next position on square search spiral + +local function next_pos() + if edge_dist == edge_len then + edge_dist = 0 + dir_ind = dir_ind + 1 + if dir_ind == 5 then + dir_ind = 1 + end + dir_step = dir_step + 1 + edge_len = math.floor(dir_step / 2) + 1 + end + + local dir = dirs[dir_ind] + local move = vector.multiply(dir, res) + + edge_dist = edge_dist + 1 + + return vector.add(pos, move) +end + + +-- Spawn position search + +local function search() + for iter = 1, checks do + local biome_data = minetest.get_biome_data(pos) + -- Sometimes biome_data is nil + if biome_data and biome_ids[biome_data.biome] then + local spawn_y = minetest.get_spawn_level(pos.x, pos.z) + if spawn_y then + spawn_pos = vector.new(pos.x, spawn_y, pos.z) + return true + end + end + + pos = next_pos() + -- Check for position being outside world edge + if math.abs(pos.x) > spawn_limit or math.abs(pos.z) > spawn_limit then + return false + end + end + + return false +end + + +function spawn.get_default_pos() + -- Search for spawn position once per server session + if not searched then + success = search() + searched = true + end + return success and spawn_pos +end diff --git a/data/games/garage/mods/spawn/license.txt b/data/games/garage/mods/spawn/license.txt new file mode 100644 index 0000000..a466aab --- /dev/null +++ b/data/games/garage/mods/spawn/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +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. + +For more details: +https://opensource.org/licenses/MIT diff --git a/data/games/garage/mods/spawn/mod.conf b/data/games/garage/mods/spawn/mod.conf new file mode 100644 index 0000000..7a09d4a --- /dev/null +++ b/data/games/garage/mods/spawn/mod.conf @@ -0,0 +1,3 @@ +name = spawn +description = Minetest Game mod: spawn +depends = default diff --git a/data/games/garage/mods/stairs/README.txt b/data/games/garage/mods/stairs/README.txt new file mode 100644 index 0000000..e684aed --- /dev/null +++ b/data/games/garage/mods/stairs/README.txt @@ -0,0 +1,27 @@ +Minetest Game mod: stairs +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Kahrl (LGPLv2.1+) and +celeron55, Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures) +--------------------------- + +Textures +-------- +Copyright (c) 2018 Shara RedCat (CC BY-SA 3.0): + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_outer_stairside.png + stairs_obsidian_glass_stairside.png + +Copyright (c) 2018 TumeniNodes (CC BY-SA 3.0): + Derived from a texture by celeron55 (CC BY-SA 3.0) and + converted to bright white by Krock (CC BY-SA 3.0): + stairs_glass_stairside.png + stairs_glass_split.png + Derived from a texture by PilzAdam (CC BY-SA 3.0): + stairs_obsidian_glass_split.png diff --git a/data/games/garage/mods/stairs/init.lua b/data/games/garage/mods/stairs/init.lua index 267540e..f3cddd1 100644 --- a/data/games/garage/mods/stairs/init.lua +++ b/data/games/garage/mods/stairs/init.lua @@ -1,66 +1,1073 @@ +-- stairs/init.lua + +-- Minetest Game mod: stairs +-- See README.txt for licensing and other information. + + +-- Global namespace for functions + stairs = {} +-- Load support for MT game translation. +local S = minetest.get_translator("stairs") +-- Same as S, but will be ignored by translation file update scripts +local T = S + + +-- Register aliases for new pine node names + +minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood") +minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") + + +-- Get setting for replace ABM + +local replace = minetest.settings:get_bool("enable_stairs_replace_abm") + +local function rotate_and_place(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + if placer then + local placer_pos = placer:get_pos() + if placer_pos then + local diff = vector.subtract(p1, placer_pos) + param2 = minetest.dir_to_facedir(diff) + -- The player places a node on the side face of the node he is standing on + if p0.y == p1.y and math.abs(diff.x) <= 0.5 and math.abs(diff.z) <= 0.5 and diff.y < 0 then + -- reverse node direction + param2 = (param2 + 2) % 4 + end + end + + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 + + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end + +local function warn_if_exists(nodename) + if minetest.registered_nodes[nodename] then + minetest.log("warning", "Overwriting stairs node: " .. nodename) + end +end + +-- Set backface culling and world-aligned textures +local function set_textures(images, worldaligntex) + local stair_images = {} + for i, image in ipairs(images) do + stair_images[i] = type(image) == "string" and {name = image} or table.copy(image) + if stair_images[i].backface_culling == nil then + stair_images[i].backface_culling = true + end + if worldaligntex and stair_images[i].align_style == nil then + stair_images[i].align_style = "world" + end + end + return stair_images +end + +-- Register stair -- Node will be called stairs:stair_ -function stairs.register_stair(subname, recipeitem, groups, images, description) - core.register_node(":stairs:stair_" .. subname, { - description = description.."\n".. - "param2 = facedir rotation (0..23)", + +function stairs.register_stair(subname, recipeitem, groups, images, description, + sounds, worldaligntex) + local def = minetest.registered_nodes[recipeitem] or {} + local stair_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.stair = 1 + warn_if_exists("stairs:stair_" .. subname) + minetest.register_node(":stairs:stair_" .. subname, { + description = description, drawtype = "nodebox", - tiles = images, + tiles = stair_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, paramtype = "light", paramtype2 = "facedir", - is_ground_content = true, - groups = groups, + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, }, }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:stair_" .. subname .. "upside_down", { + replace_name = "stairs:stair_" .. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + -- Recipe matches appearence in inventory + minetest.register_craft({ + output = "stairs:stair_" .. subname .. " 8", + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Use stairs to craft full blocks again (1:1) + minetest.register_craft({ + output = recipeitem .. " 3", + recipe = { + {"stairs:stair_" .. subname, "stairs:stair_" .. subname}, + {"stairs:stair_" .. subname, "stairs:stair_" .. subname}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:stair_" .. subname, + burntime = math.floor(baseburntime * 0.75), + }) + end + end end + +-- Register slab -- Node will be called stairs:slab_ -function stairs.register_slab(subname, recipeitem, groups, images, description) - core.register_node(":stairs:slab_" .. subname, { + +function stairs.register_slab(subname, recipeitem, groups, images, description, + sounds, worldaligntex) + local def = minetest.registered_nodes[recipeitem] or {} + local slab_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.slab = 1 + warn_if_exists("stairs:slab_" .. subname) + minetest.register_node(":stairs:slab_" .. subname, { description = description, drawtype = "nodebox", - tiles = images, + tiles = slab_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, paramtype = "light", - is_ground_content = true, - groups = groups, + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, node_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, }, - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - }, + on_place = function(itemstack, placer, pointed_thing) + local under = minetest.get_node(pointed_thing.under) + local wield_item = itemstack:get_name() + local player_name = placer and placer:get_player_name() or "" + + if under and under.name:find("^stairs:slab_") then + -- place slab using under node orientation + local dir = minetest.dir_to_facedir(vector.subtract( + pointed_thing.above, pointed_thing.under), true) + + local p2 = under.param2 + + -- Placing a slab on an upside down slab should make it right-side up. + if p2 >= 20 and dir == 8 then + p2 = p2 - 20 + -- same for the opposite case: slab below normal slab + elseif p2 <= 3 and dir == 4 then + p2 = p2 + 20 + end + + -- else attempt to place node with proper param2 + minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2) + if not minetest.is_creative_enabled(player_name) then + itemstack:take_item() + end + return itemstack + else + return rotate_and_place(itemstack, placer, pointed_thing) + end + end, + }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:slab_" .. subname .. "upside_down", { + replace_name = "stairs:slab_".. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + minetest.register_craft({ + output = "stairs:slab_" .. subname .. " 6", + recipe = { + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Use 2 slabs to craft a full block again (1:1) + minetest.register_craft({ + output = recipeitem, + recipe = { + {"stairs:slab_" .. subname}, + {"stairs:slab_" .. subname}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:slab_" .. subname, + burntime = math.floor(baseburntime * 0.5), + }) + end + end +end + + +-- Optionally replace old "upside_down" nodes with new param2 versions. +-- Disabled by default. + +if replace then + minetest.register_abm({ + label = "Slab replace", + nodenames = {"group:slabs_replace"}, + interval = 16, + chance = 1, + action = function(pos, node) + node.name = minetest.registered_nodes[node.name].replace_name + node.param2 = node.param2 + 20 + if node.param2 == 21 then + node.param2 = 23 + elseif node.param2 == 23 then + node.param2 = 21 + end + minetest.set_node(pos, node) + end, }) end --- Nodes will be called stairs:{stair,slab}_ -function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab) - stairs.register_stair(subname, recipeitem, groups, images, desc_stair) - stairs.register_slab(subname, recipeitem, groups, images, desc_slab) + +-- Register inner stair +-- Node will be called stairs:stair_inner_ + +function stairs.register_stair_inner(subname, recipeitem, groups, images, + description, sounds, worldaligntex, full_description) + local def = minetest.registered_nodes[recipeitem] or {} + local stair_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.stair = 1 + if full_description then + description = full_description + else + description = "Inner " .. description + end + warn_if_exists("stairs:stair_inner_" .. subname) + minetest.register_node(":stairs:stair_inner_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = stair_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5}, + {-0.5, 0.0, -0.5, 0.0, 0.5, 0.0}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + if recipeitem then + minetest.register_craft({ + output = "stairs:stair_inner_" .. subname .. " 7", + recipe = { + {"", recipeitem, ""}, + {recipeitem, "", recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:stair_inner_" .. subname, + burntime = math.floor(baseburntime * 0.875), + }) + end + end end -stairs.register_stair_and_slab("stone", "basenodes:stone", - {cracky=3}, - {"default_stone.png"}, - "Stone Stair", - "Stone Slab") -stairs.register_stair_and_slab("desert_stone", "basenodes:desert_stone", - {cracky=3}, - {"default_desert_stone.png"}, - "Desert Stone Stair", - "Desert Stone Slab") +-- Register outer stair +-- Node will be called stairs:stair_outer_ -stairs.register_stair_and_slab("cobble", "basenodes:cobble", - {cracky=3}, - {"default_cobble.png"}, - "Cobblestone Stair", - "Cobblestone Slab") +function stairs.register_stair_outer(subname, recipeitem, groups, images, + description, sounds, worldaligntex, full_description) + local def = minetest.registered_nodes[recipeitem] or {} + local stair_images = set_textures(images, worldaligntex) + local new_groups = table.copy(groups) + new_groups.stair = 1 + if full_description then + description = full_description + else + description = "Outer " .. description + end + warn_if_exists("stairs:stair_outer_" .. subname) + minetest.register_node(":stairs:stair_outer_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = stair_images, + use_texture_alpha = def.use_texture_alpha, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = new_groups, + sounds = sounds or def.sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, + {-0.5, 0.0, 0.0, 0.0, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + if recipeitem then + minetest.register_craft({ + output = "stairs:stair_outer_" .. subname .. " 6", + recipe = { + {"", recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = "stairs:stair_outer_" .. subname, + burntime = math.floor(baseburntime * 0.625), + }) + end + end +end + + +-- Stair/slab registration function. +-- Nodes will be called stairs:{stair,slab}_ + +function stairs.register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds, worldaligntex, + desc_stair_inner, desc_stair_outer) + stairs.register_stair(subname, recipeitem, groups, images, desc_stair, + sounds, worldaligntex) + stairs.register_stair_inner(subname, recipeitem, groups, images, + desc_stair, sounds, worldaligntex, desc_stair_inner) + stairs.register_stair_outer(subname, recipeitem, groups, images, + desc_stair, sounds, worldaligntex, desc_stair_outer) + stairs.register_slab(subname, recipeitem, groups, images, desc_slab, + sounds, worldaligntex) +end + +-- Local function so we can apply translations +local function my_register_stair_and_slab(subname, recipeitem, groups, images, + desc_stair, desc_slab, sounds, worldaligntex) + stairs.register_stair(subname, recipeitem, groups, images, S(desc_stair), + sounds, worldaligntex) + stairs.register_stair_inner(subname, recipeitem, groups, images, "", + sounds, worldaligntex, T("Inner " .. desc_stair)) + stairs.register_stair_outer(subname, recipeitem, groups, images, "", + sounds, worldaligntex, T("Outer " .. desc_stair)) + stairs.register_slab(subname, recipeitem, groups, images, S(desc_slab), + sounds, worldaligntex) +end + + +-- Register default stairs and slabs + +my_register_stair_and_slab( + "wood", + "default:wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_wood.png"}, + "Wooden Stair", + "Wooden Slab", + default.node_sound_wood_defaults(), + false +) + +my_register_stair_and_slab( + "junglewood", + "default:junglewood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_junglewood.png"}, + "Jungle Wood Stair", + "Jungle Wood Slab", + default.node_sound_wood_defaults(), + false +) + +my_register_stair_and_slab( + "pine_wood", + "default:pine_wood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_pine_wood.png"}, + "Pine Wood Stair", + "Pine Wood Slab", + default.node_sound_wood_defaults(), + false +) + +my_register_stair_and_slab( + "acacia_wood", + "default:acacia_wood", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"default_acacia_wood.png"}, + "Acacia Wood Stair", + "Acacia Wood Slab", + default.node_sound_wood_defaults(), + false +) + +my_register_stair_and_slab( + "aspen_wood", + "default:aspen_wood", + {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_aspen_wood.png"}, + "Aspen Wood Stair", + "Aspen Wood Slab", + default.node_sound_wood_defaults(), + false +) + +my_register_stair_and_slab( + "stone", + "default:stone", + {cracky = 3}, + {"default_stone.png"}, + "Stone Stair", + "Stone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "cobble", + "default:cobble", + {cracky = 3}, + {"default_cobble.png"}, + "Cobblestone Stair", + "Cobblestone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "mossycobble", + "default:mossycobble", + {cracky = 3}, + {"default_mossycobble.png"}, + "Mossy Cobblestone Stair", + "Mossy Cobblestone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "stonebrick", + "default:stonebrick", + {cracky = 2}, + {"default_stone_brick.png"}, + "Stone Brick Stair", + "Stone Brick Slab", + default.node_sound_stone_defaults(), + false +) + +my_register_stair_and_slab( + "stone_block", + "default:stone_block", + {cracky = 2}, + {"default_stone_block.png"}, + "Stone Block Stair", + "Stone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_stone", + "default:desert_stone", + {cracky = 3}, + {"default_desert_stone.png"}, + "Desert Stone Stair", + "Desert Stone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_cobble", + "default:desert_cobble", + {cracky = 3}, + {"default_desert_cobble.png"}, + "Desert Cobblestone Stair", + "Desert Cobblestone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_stonebrick", + "default:desert_stonebrick", + {cracky = 2}, + {"default_desert_stone_brick.png"}, + "Desert Stone Brick Stair", + "Desert Stone Brick Slab", + default.node_sound_stone_defaults(), + false +) + +my_register_stair_and_slab( + "desert_stone_block", + "default:desert_stone_block", + {cracky = 2}, + {"default_desert_stone_block.png"}, + "Desert Stone Block Stair", + "Desert Stone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "sandstone", + "default:sandstone", + {crumbly = 1, cracky = 3}, + {"default_sandstone.png"}, + "Sandstone Stair", + "Sandstone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "sandstonebrick", + "default:sandstonebrick", + {cracky = 2}, + {"default_sandstone_brick.png"}, + "Sandstone Brick Stair", + "Sandstone Brick Slab", + default.node_sound_stone_defaults(), + false +) + +my_register_stair_and_slab( + "sandstone_block", + "default:sandstone_block", + {cracky = 2}, + {"default_sandstone_block.png"}, + "Sandstone Block Stair", + "Sandstone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_sandstone", + "default:desert_sandstone", + {crumbly = 1, cracky = 3}, + {"default_desert_sandstone.png"}, + "Desert Sandstone Stair", + "Desert Sandstone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "desert_sandstone_brick", + "default:desert_sandstone_brick", + {cracky = 2}, + {"default_desert_sandstone_brick.png"}, + "Desert Sandstone Brick Stair", + "Desert Sandstone Brick Slab", + default.node_sound_stone_defaults(), + false +) + +my_register_stair_and_slab( + "desert_sandstone_block", + "default:desert_sandstone_block", + {cracky = 2}, + {"default_desert_sandstone_block.png"}, + "Desert Sandstone Block Stair", + "Desert Sandstone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "silver_sandstone", + "default:silver_sandstone", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone.png"}, + "Silver Sandstone Stair", + "Silver Sandstone Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "silver_sandstone_brick", + "default:silver_sandstone_brick", + {cracky = 2}, + {"default_silver_sandstone_brick.png"}, + "Silver Sandstone Brick Stair", + "Silver Sandstone Brick Slab", + default.node_sound_stone_defaults(), + false +) + +my_register_stair_and_slab( + "silver_sandstone_block", + "default:silver_sandstone_block", + {cracky = 2}, + {"default_silver_sandstone_block.png"}, + "Silver Sandstone Block Stair", + "Silver Sandstone Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "obsidian", + "default:obsidian", + {cracky = 1, level = 2}, + {"default_obsidian.png"}, + "Obsidian Stair", + "Obsidian Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "obsidianbrick", + "default:obsidianbrick", + {cracky = 1, level = 2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick Stair", + "Obsidian Brick Slab", + default.node_sound_stone_defaults(), + false +) + +my_register_stair_and_slab( + "obsidian_block", + "default:obsidian_block", + {cracky = 1, level = 2}, + {"default_obsidian_block.png"}, + "Obsidian Block Stair", + "Obsidian Block Slab", + default.node_sound_stone_defaults(), + true +) + +my_register_stair_and_slab( + "brick", + "default:brick", + {cracky = 3}, + {"default_brick.png"}, + "Brick Stair", + "Brick Slab", + default.node_sound_stone_defaults(), + false +) + +my_register_stair_and_slab( + "steelblock", + "default:steelblock", + {cracky = 1, level = 2}, + {"default_steel_block.png"}, + "Steel Block Stair", + "Steel Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "tinblock", + "default:tinblock", + {cracky = 1, level = 2}, + {"default_tin_block.png"}, + "Tin Block Stair", + "Tin Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "copperblock", + "default:copperblock", + {cracky = 1, level = 2}, + {"default_copper_block.png"}, + "Copper Block Stair", + "Copper Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "bronzeblock", + "default:bronzeblock", + {cracky = 1, level = 2}, + {"default_bronze_block.png"}, + "Bronze Block Stair", + "Bronze Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "goldblock", + "default:goldblock", + {cracky = 1}, + {"default_gold_block.png"}, + "Gold Block Stair", + "Gold Block Slab", + default.node_sound_metal_defaults(), + true +) + +my_register_stair_and_slab( + "ice", + "default:ice", + {cracky = 3, cools_lava = 1, slippery = 3}, + {"default_ice.png"}, + "Ice Stair", + "Ice Slab", + default.node_sound_ice_defaults(), + true +) + +my_register_stair_and_slab( + "snowblock", + "default:snowblock", + {crumbly = 3, cools_lava = 1, snowy = 1}, + {"default_snow.png"}, + "Snow Block Stair", + "Snow Block Slab", + default.node_sound_snow_defaults(), + true +) + +-- Glass stair nodes need to be registered individually to utilize specialized textures. + +stairs.register_stair( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"stairs_glass_split.png", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png", + "default_glass.png", "stairs_glass_split.png"}, + S("Glass Stair"), + default.node_sound_glass_defaults(), + false +) + +stairs.register_slab( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"default_glass.png", "default_glass.png", "stairs_glass_split.png"}, + S("Glass Slab"), + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_inner( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"stairs_glass_stairside.png^[transformR270", "default_glass.png", + "stairs_glass_stairside.png^[transformFX", "default_glass.png", + "default_glass.png", "stairs_glass_stairside.png"}, + "", + default.node_sound_glass_defaults(), + false, + S("Inner Glass Stair") +) + +stairs.register_stair_outer( + "glass", + "default:glass", + {cracky = 3, oddly_breakable_by_hand = 3}, + {"stairs_glass_stairside.png^[transformR90", "default_glass.png", + "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", + "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, + "", + default.node_sound_glass_defaults(), + false, + S("Outer Glass Stair") +) + +stairs.register_stair( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + S("Obsidian Glass Stair"), + default.node_sound_glass_defaults(), + false +) + +stairs.register_slab( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, + S("Obsidian Glass Slab"), + default.node_sound_glass_defaults(), + false +) + +stairs.register_stair_inner( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png", + "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png", + "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"}, + "", + default.node_sound_glass_defaults(), + false, + S("Inner Obsidian Glass Stair") +) + +stairs.register_stair_outer( + "obsidian_glass", + "default:obsidian_glass", + {cracky = 3}, + {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png", + "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png", + "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"}, + "", + default.node_sound_glass_defaults(), + false, + S("Outer Obsidian Glass Stair") +) + +-- Dummy calls to S() to allow translation scripts to detect the strings. +-- To update this add this code to my_register_stair_and_slab: +-- for _,x in ipairs({"","Inner ","Outer "}) do print(("S(%q)"):format(x..desc_stair)) end +-- print(("S(%q)"):format(desc_slab)) + +--[[ +S("Wooden Stair") +S("Inner Wooden Stair") +S("Outer Wooden Stair") +S("Wooden Slab") +S("Jungle Wood Stair") +S("Inner Jungle Wood Stair") +S("Outer Jungle Wood Stair") +S("Jungle Wood Slab") +S("Pine Wood Stair") +S("Inner Pine Wood Stair") +S("Outer Pine Wood Stair") +S("Pine Wood Slab") +S("Acacia Wood Stair") +S("Inner Acacia Wood Stair") +S("Outer Acacia Wood Stair") +S("Acacia Wood Slab") +S("Aspen Wood Stair") +S("Inner Aspen Wood Stair") +S("Outer Aspen Wood Stair") +S("Aspen Wood Slab") +S("Stone Stair") +S("Inner Stone Stair") +S("Outer Stone Stair") +S("Stone Slab") +S("Cobblestone Stair") +S("Inner Cobblestone Stair") +S("Outer Cobblestone Stair") +S("Cobblestone Slab") +S("Mossy Cobblestone Stair") +S("Inner Mossy Cobblestone Stair") +S("Outer Mossy Cobblestone Stair") +S("Mossy Cobblestone Slab") +S("Stone Brick Stair") +S("Inner Stone Brick Stair") +S("Outer Stone Brick Stair") +S("Stone Brick Slab") +S("Stone Block Stair") +S("Inner Stone Block Stair") +S("Outer Stone Block Stair") +S("Stone Block Slab") +S("Desert Stone Stair") +S("Inner Desert Stone Stair") +S("Outer Desert Stone Stair") +S("Desert Stone Slab") +S("Desert Cobblestone Stair") +S("Inner Desert Cobblestone Stair") +S("Outer Desert Cobblestone Stair") +S("Desert Cobblestone Slab") +S("Desert Stone Brick Stair") +S("Inner Desert Stone Brick Stair") +S("Outer Desert Stone Brick Stair") +S("Desert Stone Brick Slab") +S("Desert Stone Block Stair") +S("Inner Desert Stone Block Stair") +S("Outer Desert Stone Block Stair") +S("Desert Stone Block Slab") +S("Sandstone Stair") +S("Inner Sandstone Stair") +S("Outer Sandstone Stair") +S("Sandstone Slab") +S("Sandstone Brick Stair") +S("Inner Sandstone Brick Stair") +S("Outer Sandstone Brick Stair") +S("Sandstone Brick Slab") +S("Sandstone Block Stair") +S("Inner Sandstone Block Stair") +S("Outer Sandstone Block Stair") +S("Sandstone Block Slab") +S("Desert Sandstone Stair") +S("Inner Desert Sandstone Stair") +S("Outer Desert Sandstone Stair") +S("Desert Sandstone Slab") +S("Desert Sandstone Brick Stair") +S("Inner Desert Sandstone Brick Stair") +S("Outer Desert Sandstone Brick Stair") +S("Desert Sandstone Brick Slab") +S("Desert Sandstone Block Stair") +S("Inner Desert Sandstone Block Stair") +S("Outer Desert Sandstone Block Stair") +S("Desert Sandstone Block Slab") +S("Silver Sandstone Stair") +S("Inner Silver Sandstone Stair") +S("Outer Silver Sandstone Stair") +S("Silver Sandstone Slab") +S("Silver Sandstone Brick Stair") +S("Inner Silver Sandstone Brick Stair") +S("Outer Silver Sandstone Brick Stair") +S("Silver Sandstone Brick Slab") +S("Silver Sandstone Block Stair") +S("Inner Silver Sandstone Block Stair") +S("Outer Silver Sandstone Block Stair") +S("Silver Sandstone Block Slab") +S("Obsidian Stair") +S("Inner Obsidian Stair") +S("Outer Obsidian Stair") +S("Obsidian Slab") +S("Obsidian Brick Stair") +S("Inner Obsidian Brick Stair") +S("Outer Obsidian Brick Stair") +S("Obsidian Brick Slab") +S("Obsidian Block Stair") +S("Inner Obsidian Block Stair") +S("Outer Obsidian Block Stair") +S("Obsidian Block Slab") +S("Brick Stair") +S("Inner Brick Stair") +S("Outer Brick Stair") +S("Brick Slab") +S("Steel Block Stair") +S("Inner Steel Block Stair") +S("Outer Steel Block Stair") +S("Steel Block Slab") +S("Tin Block Stair") +S("Inner Tin Block Stair") +S("Outer Tin Block Stair") +S("Tin Block Slab") +S("Copper Block Stair") +S("Inner Copper Block Stair") +S("Outer Copper Block Stair") +S("Copper Block Slab") +S("Bronze Block Stair") +S("Inner Bronze Block Stair") +S("Outer Bronze Block Stair") +S("Bronze Block Slab") +S("Gold Block Stair") +S("Inner Gold Block Stair") +S("Outer Gold Block Stair") +S("Gold Block Slab") +S("Ice Stair") +S("Inner Ice Stair") +S("Outer Ice Stair") +S("Ice Slab") +S("Snow Block Stair") +S("Inner Snow Block Stair") +S("Outer Snow Block Stair") +S("Snow Block Slab") +--]] diff --git a/data/games/garage/mods/stairs/license.txt b/data/games/garage/mods/stairs/license.txt new file mode 100644 index 0000000..ec758cf --- /dev/null +++ b/data/games/garage/mods/stairs/license.txt @@ -0,0 +1,16 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2017 Kahrl +Copyright (C) 2011-2017 celeron55, Perttu Ahola +Copyright (C) 2012-2017 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/data/games/garage/mods/stairs/locale/stairs.de.tr b/data/games/garage/mods/stairs/locale/stairs.de.tr new file mode 100644 index 0000000..beb4579 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.de.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Glastreppe +Glass Slab=Glasplatte +Inner Glass Stair=Innere Glastreppe +Outer Glass Stair=Äußere Glastreppe +Obsidian Glass Stair=Obsidianglastreppe +Obsidian Glass Slab=Obsidianglasplatte +Inner Obsidian Glass Stair=Innere Obsidianglastreppe +Outer Obsidian Glass Stair=Äußere Obsidianglastreppe +Wooden Stair=Holztreppe +Inner Wooden Stair=Innere Holztreppe +Outer Wooden Stair=Äußere Holztreppe +Wooden Slab=Holzplatte +Jungle Wood Stair=Dschungelholztreppe +Inner Jungle Wood Stair=Innere Dschungelholztreppe +Outer Jungle Wood Stair=Äußere Dschungelholztreppe +Jungle Wood Slab=Dschungelholzplatte +Pine Wood Stair=Kiefernholztreppe +Inner Pine Wood Stair=Innere Kiefernholztreppe +Outer Pine Wood Stair=Äußere Kiefernholztreppe +Pine Wood Slab=Kiefernholzplatte +Acacia Wood Stair=Akazienholztreppe +Inner Acacia Wood Stair=Innere Akazienholztreppe +Outer Acacia Wood Stair=Äußere Akazienholztreppe +Acacia Wood Slab=Akazienholzplatte +Aspen Wood Stair=Espenholztreppe +Inner Aspen Wood Stair=Innere Espenholztreppe +Outer Aspen Wood Stair=Äußere Espenholztreppe +Aspen Wood Slab=Espenholzplatte +Stone Stair=Steintreppe +Inner Stone Stair=Innere Steintreppe +Outer Stone Stair=Äußere Steintreppe +Stone Slab=Steinplatte +Cobblestone Stair=Kopfsteinpflastertreppe +Inner Cobblestone Stair=Innere Kopfsteinpflastertreppe +Outer Cobblestone Stair=Äußere Kopfsteinpflastertreppe +Cobblestone Slab=Kopfsteinpflasterplatte +Mossy Cobblestone Stair=Moosige Kopfsteinpflastertreppe +Inner Mossy Cobblestone Stair=Innere moosige Kopfsteinpflastertreppe +Outer Mossy Cobblestone Stair=Äußere moosige Kopfsteinpflastertreppe +Mossy Cobblestone Slab=Moosige Kopfsteinpflasterplatte +Stone Brick Stair=Steinziegeltreppe +Inner Stone Brick Stair=Innere Steinziegeltreppe +Outer Stone Brick Stair=Äußere Steinziegeltreppe +Stone Brick Slab=Steinziegelplatte +Stone Block Stair=Steinblocktreppe +Inner Stone Block Stair=Innere Steinblocktreppe +Outer Stone Block Stair=Äußere Steinblocktreppe +Stone Block Slab=Steinblockplatte +Desert Stone Stair=Wüstensteintreppe +Inner Desert Stone Stair=Innere Wüstensteintreppe +Outer Desert Stone Stair=Äußere Wüstensteintreppe +Desert Stone Slab=Wüstensteinplatte +Desert Cobblestone Stair=Wüstenkopfsteinpflastertreppe +Inner Desert Cobblestone Stair=Innere Wüstenkopfsteinpflastertreppe +Outer Desert Cobblestone Stair=Äußere Wüstenkopfsteinpflastertreppe +Desert Cobblestone Slab=Wüstenkopfsteinpflasterplatte +Desert Stone Brick Stair=Wüstensteinziegeltreppe +Inner Desert Stone Brick Stair=Innere Wüstensteinziegeltreppe +Outer Desert Stone Brick Stair=Äußere Wüstensteinziegeltreppe +Desert Stone Brick Slab=Wüstensteinziegelplatte +Desert Stone Block Stair=Wüstensteinblocktreppe +Inner Desert Stone Block Stair=Innere Wüstensteinblocktreppe +Outer Desert Stone Block Stair=Äußere Wüstensteinblocktreppe +Desert Stone Block Slab=Wüstensteinblockplatte +Sandstone Stair=Sandsteintreppe +Inner Sandstone Stair=Innere Sandsteintreppe +Outer Sandstone Stair=Äußere Sandsteintreppe +Sandstone Slab=Sandsteinplatte +Sandstone Brick Stair=Sandsteinziegeltreppe +Inner Sandstone Brick Stair=Innere Sandsteinziegeltreppe +Outer Sandstone Brick Stair=Äußere Sandsteinziegeltreppe +Sandstone Brick Slab=Sandsteinziegelplatte +Sandstone Block Stair=Sandsteinblocktreppe +Inner Sandstone Block Stair=Innere Sandsteinblocktreppe +Outer Sandstone Block Stair=Äußere Sandsteinblocktreppe +Sandstone Block Slab=Sandsteinblockplatte +Desert Sandstone Stair=Wüstensandsteintreppe +Inner Desert Sandstone Stair=Innere Wüstensandsteintreppe +Outer Desert Sandstone Stair=Äußere Wüstensandsteintreppe +Desert Sandstone Slab=Wüstensandsteinplatte +Desert Sandstone Brick Stair=Wüstensandsteinziegeltreppe +Inner Desert Sandstone Brick Stair=Innere Wüstensandsteinziegeltreppe +Outer Desert Sandstone Brick Stair=Äußere Wüstensandsteinziegeltreppe +Desert Sandstone Brick Slab=Wüstensandsteinziegelplatte +Desert Sandstone Block Stair=Wüstensandsteinblocktreppe +Inner Desert Sandstone Block Stair=Innere Wüstensandsteinblocktreppe +Outer Desert Sandstone Block Stair=Äußere Wüstensandsteinblocktreppe +Desert Sandstone Block Slab=Wüstensandsteinblockplatte +Silver Sandstone Stair=Silbersandsteintreppe +Inner Silver Sandstone Stair=Innere Silbersandsteintreppe +Outer Silver Sandstone Stair=Äußere Silbersandsteintreppe +Silver Sandstone Slab=Silbersandsteinplatte +Silver Sandstone Brick Stair=Silbersandsteinziegeltreppe +Inner Silver Sandstone Brick Stair=Innere Silbersandsteinziegeltreppe +Outer Silver Sandstone Brick Stair=Äußere Silbersandsteinziegeltreppe +Silver Sandstone Brick Slab=Silbersandsteinziegelplatte +Silver Sandstone Block Stair=Silbersandsteinblocktreppe +Inner Silver Sandstone Block Stair=Innere Silbersandsteinblocktreppe +Outer Silver Sandstone Block Stair=Äußere Silbersandsteinblocktreppe +Silver Sandstone Block Slab=Silbersandsteinblockplatte +Obsidian Stair=Obsidiantreppe +Inner Obsidian Stair=Innere Obsidiantreppe +Outer Obsidian Stair=Äußere Obsidiantreppe +Obsidian Slab=Obsidianplatte +Obsidian Brick Stair=Obsidianziegeltreppe +Inner Obsidian Brick Stair=Innere Obsidianziegeltreppe +Outer Obsidian Brick Stair=Äußere Obsidianziegeltreppe +Obsidian Brick Slab=Obsidianziegelplatte +Obsidian Block Stair=Obsidianblocktreppe +Inner Obsidian Block Stair=Innere Obsidianblocktreppe +Outer Obsidian Block Stair=Äußere Obsidianblocktreppe +Obsidian Block Slab=Obsidianblockplatte +Brick Stair=Ziegeltreppe +Inner Brick Stair=Innere Ziegeltreppe +Outer Brick Stair=Äußere Ziegeltreppe +Brick Slab=Ziegelplatte +Steel Block Stair=Stahlblocktreppe +Inner Steel Block Stair=Innere Stahlblocktreppe +Outer Steel Block Stair=Äußere Stahlblocktreppe +Steel Block Slab=Stahlblockplatte +Tin Block Stair=Zinnblocktreppe +Inner Tin Block Stair=Innere Zinnblocktreppe +Outer Tin Block Stair=Äußere Zinnblocktreppe +Tin Block Slab=Zinnblockplatte +Copper Block Stair=Kupferblocktreppe +Inner Copper Block Stair=Innere Kupferblocktreppe +Outer Copper Block Stair=Äußere Kupferblocktreppe +Copper Block Slab=Kupferblockplatte +Bronze Block Stair=Bronzeblocktreppe +Inner Bronze Block Stair=Innere Bronzeblocktreppe +Outer Bronze Block Stair=Äußere Bronzeblocktreppe +Bronze Block Slab=Bronzeblockplatte +Gold Block Stair=Goldblocktreppe +Inner Gold Block Stair=Innere Goldblocktreppe +Outer Gold Block Stair=Äußere Goldblocktreppe +Gold Block Slab=Goldblockplatte +Ice Stair=Eistreppe +Inner Ice Stair=Innere Eistreppe +Outer Ice Stair=Äußere Eistreppe +Ice Slab=Eisplatte +Snow Block Stair=Schneeblocktreppe +Inner Snow Block Stair=Innere Schneeblocktreppe +Outer Snow Block Stair=Äußere Schneeblocktreppe +Snow Block Slab=Schneeblockplatte diff --git a/data/games/garage/mods/stairs/locale/stairs.eo.tr b/data/games/garage/mods/stairs/locale/stairs.eo.tr new file mode 100644 index 0000000..f018dc9 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.eo.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Vitra ŝtupo +Glass Slab=Vitra plato +Inner Glass Stair=Interna vitra ŝtupo +Outer Glass Stair=Ekstera vitra ŝtupo +Obsidian Glass Stair=Obsidiana vitra ŝtupo +Obsidian Glass Slab=Obsidiana vitra plato +Inner Obsidian Glass Stair=Interna obsidiana vitra ŝtupo +Outer Obsidian Glass Stair=Ekstera obsidiana vitra ŝtupo +Wooden Stair=Ligna ŝtupo +Inner Wooden Stair=Interna ligna ŝtupo +Outer Wooden Stair=Ekstera ligna ŝtupo +Wooden Slab=Ligna plato +Jungle Wood Stair=Ĝangala ligna ŝtupo +Inner Jungle Wood Stair=Interna ĝangala ligna ŝtupo +Outer Jungle Wood Stair=Ekstera ĝangala ligna ŝtupo +Jungle Wood Slab=Ĝangala ligna plato +Pine Wood Stair=Pina ligna ŝtupo +Inner Pine Wood Stair=Interna pina ligna ŝtupo +Outer Pine Wood Stair=Ekstera pina ligna ŝtupo +Pine Wood Slab=Pina ligna plato +Acacia Wood Stair=Akacia ligna ŝtupo +Inner Acacia Wood Stair=Interna akacia ligna ŝtupo +Outer Acacia Wood Stair=Ekstera akacia ligna ŝtupo +Acacia Wood Slab=Akacia ligna plato +Aspen Wood Stair=Tremola ligna ŝtupo +Inner Aspen Wood Stair=Interna tremola ligna ŝtupo +Outer Aspen Wood Stair=Ekstera tremola ligna ŝtupo +Aspen Wood Slab=Tremola ligna plato +Stone Stair=Ŝtona ŝtupo +Inner Stone Stair=Interna ŝtona ŝtupo +Outer Stone Stair=Ekstera ŝtona ŝtupo +Stone Slab=Ŝtona plato +Cobblestone Stair=Pavimŝtona ŝtupo +Inner Cobblestone Stair=Interna pavimŝtona ŝtupo +Outer Cobblestone Stair=Ekstera pavimŝtona ŝtupo +Cobblestone Slab=Pavimŝtona plato +Mossy Cobblestone Stair=Muska pavimŝtona ŝtupo +Inner Mossy Cobblestone Stair=Interna muska pavimŝtona ŝtupo +Outer Mossy Cobblestone Stair=Ekstera muska pavimŝtona ŝtupo +Mossy Cobblestone Slab=Muska pavimŝtona plato +Stone Brick Stair=Ŝtona brika ŝtupo +Inner Stone Brick Stair=Interna ŝtona brika ŝtupo +Outer Stone Brick Stair=Ekstera ŝtona brika ŝtupo +Stone Brick Slab=Ŝtona brika plato +Stone Block Stair=Ŝtona ŝtipa ŝtupo +Inner Stone Block Stair=Interna ŝtona ŝtipa ŝtupo +Outer Stone Block Stair=Ekstera ŝtona ŝtipa ŝtupo +Stone Block Slab=Ŝtona ŝtipa plato +Desert Stone Stair=Dezerta ŝtona ŝtupo +Inner Desert Stone Stair=Interna dezerta ŝtona ŝtupo +Outer Desert Stone Stair=Ekstera dezerta ŝtona ŝtupo +Desert Stone Slab=Dezerta ŝtona plato +Desert Cobblestone Stair=Dezerta pavimŝtona ŝtupo +Inner Desert Cobblestone Stair=Interna dezerta pavimŝtona ŝtupo +Outer Desert Cobblestone Stair=Ekstera dezerta pavimŝtona ŝtupo +Desert Cobblestone Slab=Dezerta pavimŝtona plato +Desert Stone Brick Stair=Dezerta ŝtona brika ŝtupo +Inner Desert Stone Brick Stair=Interna dezerta ŝtona brika ŝtupo +Outer Desert Stone Brick Stair=Ekstera dezerta ŝtona brika ŝtupo +Desert Stone Brick Slab=Dezerta ŝtona brika plato +Desert Stone Block Stair=Dezerta ŝtona bloko ŝtupo +Inner Desert Stone Block Stair=Interna dezerta ŝtona bloko ŝtupo +Outer Desert Stone Block Stair=Ekstera dezerta ŝtona bloko ŝtupo +Desert Stone Block Slab=Dezerta ŝtona bloko plato +Sandstone Stair=Sablŝtona ŝtupo +Inner Sandstone Stair=Interna ŝablŝtona ŝtupo +Outer Sandstone Stair=Ekstera ŝablŝtona ŝtupo +Sandstone Slab=Ŝablŝtona plato +Sandstone Brick Stair=Ŝablŝtona brika ŝtupo +Inner Sandstone Brick Stair=Interna ŝablŝtona brika ŝtupo +Outer Sandstone Brick Stair=Ekstera ŝablŝtona brika ŝtupo +Sandstone Brick Slab=Ŝablŝtona brika plato +Sandstone Block Stair=Ŝablŝtona ŝtipa ŝtupo +Inner Sandstone Block Stair=Interna ŝablŝtona ŝtipa ŝtupo +Outer Sandstone Block Stair=Ekstera ŝablŝtona ŝtipa ŝtupo +Sandstone Block Slab=Ŝablŝtona ŝtipa plato +Desert Sandstone Stair=Dezerta ŝablŝtona ŝtupo +Inner Desert Sandstone Stair=Interna dezerta ŝablŝtona ŝtupo +Outer Desert Sandstone Stair=Ekstera dezerta ŝablŝtona ŝtupo +Desert Sandstone Slab=Dezerta ŝablŝtona plato +Desert Sandstone Brick Stair=Dezerta ŝablŝtona brika ŝtupo +Inner Desert Sandstone Brick Stair=Interna dezerta ŝablŝtona brika ŝtupo +Outer Desert Sandstone Brick Stair=Ekstera dezerta ŝablŝtona brika ŝtupo +Desert Sandstone Brick Slab=Dezerta ŝablŝtona brika plato +Desert Sandstone Block Stair=Dezerta ŝablŝtona ŝtipa ŝtupo +Inner Desert Sandstone Block Stair=Interna dezerta ŝablŝtona brika ŝtupo +Outer Desert Sandstone Block Stair=Ekstera dezerta ŝablŝtona brika ŝtupo +Desert Sandstone Block Slab=Dezerta ŝablŝtona ŝtipa plato +Silver Sandstone Stair=Arĝenta ŝablŝtona ŝtupo +Inner Silver Sandstone Stair=Interna arĝenta ŝablŝtona ŝtupo +Outer Silver Sandstone Stair=Ekstera arĝenta ŝablŝtona ŝtupo +Silver Sandstone Slab=Arĝenta ŝablŝtona plato +Silver Sandstone Brick Stair=Arĝenta ŝablŝtona brika ŝtupo +Inner Silver Sandstone Brick Stair=Interna arĝenta ŝablŝtona brika ŝtupo +Outer Silver Sandstone Brick Stair=Ekstera arĝenta ŝablŝtona brika ŝtupo +Silver Sandstone Brick Slab=Arĝenta ŝablŝtona brika plato +Silver Sandstone Block Stair=Arĝenta ŝablŝtona ŝtipa ŝtupo +Inner Silver Sandstone Block Stair=Interna arĝenta ŝablŝtona ŝtipa ŝtupo +Outer Silver Sandstone Block Stair=Ekstera arĝenta ŝablŝtona ŝtipa ŝtupo +Silver Sandstone Block Slab=Arĝenta ŝablŝtona ŝtipa plato +Obsidian Stair=Obsidiana ŝtupo +Inner Obsidian Stair=Interna obsidiana ŝtupo +Outer Obsidian Stair=Ekstera obsidiana ŝtupo +Obsidian Slab=Obsidiana plato +Obsidian Brick Stair=Obsidiana brika ŝtupo +Inner Obsidian Brick Stair=Interna obsidiana brika ŝtupo +Outer Obsidian Brick Stair=Ekstera obsidiana brika ŝtupo +Obsidian Brick Slab=Obsidiana brika plato +Obsidian Block Stair=Obsidiana ŝtipa ŝtupo +Inner Obsidian Block Stair=Interna obsidiana ŝtipa ŝtupo +Outer Obsidian Block Stair=Ekstera obsidiana ŝtipa ŝtupo +Obsidian Block Slab=Obsidiana ŝtipa plato +Brick Stair=Brika ŝtupo +Inner Brick Stair=Interna brika ŝtupo +Outer Brick Stair=Ekstera brika ŝtupo +Brick Slab=Brika plato +Steel Block Stair=Ŝtala ŝtipa ŝtupo +Inner Steel Block Stair=Interna ŝtala ŝtipa ŝtupo +Outer Steel Block Stair=Ekstera ŝtala ŝtipa ŝtupo +Steel Block Slab=Ŝtala ŝtipa plato +Tin Block Stair=Stana ŝtipa ŝtupo +Inner Tin Block Stair=Interna stana ŝtipa ŝtupo +Outer Tin Block Stair=Ekstera stana ŝtipa ŝtupo +Tin Block Slab=Stana ŝtipa plato +Copper Block Stair=Kupra ŝtipa ŝtupo +Inner Copper Block Stair=Interna kupra ŝtipa ŝtupo +Outer Copper Block Stair=Ekstera kupra ŝtipa ŝtupo +Copper Block Slab=Kupra ŝtipa plato +Bronze Block Stair=Bronza ŝtipa ŝtupo +Inner Bronze Block Stair=Interna bronza ŝtipa ŝtupo +Outer Bronze Block Stair=Ekstera bronza ŝtipa ŝtupo +Bronze Block Slab=Bronza ŝtipa plato +Gold Block Stair=Ora ŝtipa ŝtupo +Inner Gold Block Stair=Interna ora ŝtipa ŝtupo +Outer Gold Block Stair=Ekstera ora ŝtipa ŝtupo +Gold Block Slab=Ora ŝtipa plato +Ice Stair=Glacia ŝtupo +Inner Ice Stair=Interna glacia ŝtupo +Outer Ice Stair=Ekstera glacia ŝtupo +Ice Slab=Glacia plato +Snow Block Stair=Neĝa ŝtipa ŝtupo +Inner Snow Block Stair=Interna neĝa ŝtipa ŝtupo +Outer Snow Block Stair=Ekstera neĝa ŝtipa ŝtupo +Snow Block Slab=Neĝa ŝtipa plato diff --git a/data/games/garage/mods/stairs/locale/stairs.es.tr b/data/games/garage/mods/stairs/locale/stairs.es.tr new file mode 100644 index 0000000..374540c --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.es.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escalera de vidrio +Glass Slab=Losa de vidrio +Inner Glass Stair=Escalera interior de vidrio +Outer Glass Stair=Escalera exterior de vidrio +Obsidian Glass Stair=Escalera de vidrio de obsidiana +Obsidian Glass Slab=Losa de vidrio de obsidiana +Inner Obsidian Glass Stair=Escalera interior de vidrio de obsidiana +Outer Obsidian Glass Stair=Escalera exterior de vidrio de obsidiana +Wooden Stair=Escalera de madera +Inner Wooden Stair=Escalera interior de madera +Outer Wooden Stair=Escalera exterior de madera +Wooden Slab=Losa de madera +Jungle Wood Stair=Escalera de madera tropical +Inner Jungle Wood Stair=Escalera interior de madera tropical +Outer Jungle Wood Stair=Escalera exterior de madera tropical +Jungle Wood Slab=Losa de madera tropical +Pine Wood Stair=Escalera de pino +Inner Pine Wood Stair=Escalera interior de pino +Outer Pine Wood Stair=Escalera exterior de pino +Pine Wood Slab=Losa de pino +Acacia Wood Stair=Escalera de acacia +Inner Acacia Wood Stair=Escalera interior de acacia +Outer Acacia Wood Stair=Escalera exterior de acacia +Acacia Wood Slab=Losa de acacia +Aspen Wood Stair=Escalera de álamo +Inner Aspen Wood Stair=Escalera interior de álamo +Outer Aspen Wood Stair=Escalera exterior de álamo +Aspen Wood Slab=Losa de álamo +Stone Stair=Escalera de piedra +Inner Stone Stair=Escalera interior de piedra +Outer Stone Stair=Escalera exterior de piedra +Stone Slab=Losa de piedra +Cobblestone Stair=Escalera de adoquines +Inner Cobblestone Stair=Escalera interior de adoquines +Outer Cobblestone Stair=Escalera exterior de adoquines +Cobblestone Slab=Losa de adoquines +Mossy Cobblestone Stair=Escalera de adoquines musgosos +Inner Mossy Cobblestone Stair=Escalera interior de adoquines musgosos +Outer Mossy Cobblestone Stair=Escalera exterior de adoquines musgosos +Mossy Cobblestone Slab=Losa de adoquines musgosos +Stone Brick Stair=Escalera de ladrillos de piedra +Inner Stone Brick Stair=Escalera interior de ladrillos de piedra +Outer Stone Brick Stair=Escalera exterior de ladrillos de piedra +Stone Brick Slab=Losa de ladrillos de piedra +Stone Block Stair=Escalera de bloques de piedra +Inner Stone Block Stair=Escalera interior de bloques de piedra +Outer Stone Block Stair=Escalera exterior de bloques de piedra +Stone Block Slab=Losa de bloques de piedra +Desert Stone Stair=Escalera de piedra desértica +Inner Desert Stone Stair=Escalera interior de piedra desértica +Outer Desert Stone Stair=Escalera exterior de piedra desértica +Desert Stone Slab=Losa de piedra desértica +Desert Cobblestone Stair=Escalera de adoquines desérticos +Inner Desert Cobblestone Stair=Escalera interior de adoquines desérticos +Outer Desert Cobblestone Stair=Escalera exterior de adoquines desérticos +Desert Cobblestone Slab=Losa de adoquines desérticos +Desert Stone Brick Stair=Escalera de ladrillos desérticos +Inner Desert Stone Brick Stair=Escalera interior de ladrillos desérticos +Outer Desert Stone Brick Stair=Escalera exterior de ladrillos desérticos +Desert Stone Brick Slab=Losa de ladrillos desérticos +Desert Stone Block Stair=Escalera de bloques de piedra desértica +Inner Desert Stone Block Stair=Escalera interior de bloques de piedra desértica +Outer Desert Stone Block Stair=Escalera exterior de bloques de piedra desértica +Desert Stone Block Slab=Losa de bloques de piedra desértica +Sandstone Stair=Escalera de arenisca +Inner Sandstone Stair=Escalera interior de arenisca +Outer Sandstone Stair=Escalera exterior de arenisca +Sandstone Slab=Losa de arenisca +Sandstone Brick Stair=Escalera de ladrillos de arenisca +Inner Sandstone Brick Stair=Escalera interior de ladrillos de arenisca +Outer Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca +Sandstone Brick Slab=Losa de ladrillos de arenisca +Sandstone Block Stair=Escalera de bloques de arenisca +Inner Sandstone Block Stair=Escalera interior de bloques de arenisca +Outer Sandstone Block Stair=Escalera exterior de bloques de arenisca +Sandstone Block Slab=Losa de bloques de arenisca +Desert Sandstone Stair=Escalera de arenisca desértica +Inner Desert Sandstone Stair=Escalera interior de arenisca desértica +Outer Desert Sandstone Stair=Escalera exterior de arenisca desértica +Desert Sandstone Slab=Losa de arenisca desértica +Desert Sandstone Brick Stair=Escalera de ladrillos de arenisca desértica +Inner Desert Sandstone Brick Stair=Escalera interior de ladrillos de arenisca desértica +Outer Desert Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca desértica +Desert Sandstone Brick Slab=Losa de ladrillos de arenisca desértica +Desert Sandstone Block Stair=Escalera de bloques de arenisca desértica +Inner Desert Sandstone Block Stair=Escalera interior de bloques de arenisca desértica +Outer Desert Sandstone Block Stair=Escalera exterior de bloques de arenisca desértica +Desert Sandstone Block Slab=Losa de bloques de arenisca desértica +Silver Sandstone Stair=Escalera de arenisca plateada +Inner Silver Sandstone Stair=Escalera interior de arenisca plateada +Outer Silver Sandstone Stair=Escalera exterior de arenisca plateada +Silver Sandstone Slab=Losa de arenisca plateada +Silver Sandstone Brick Stair=Escalera de ladrillos de arenisca plateada +Inner Silver Sandstone Brick Stair=Escalera interior de ladrillos de arenisca plateada +Outer Silver Sandstone Brick Stair=Escalera exterior de ladrillos de arenisca plateada +Silver Sandstone Brick Slab=Losa de ladrillos de arenisca plateada +Silver Sandstone Block Stair=Escalera de bloques de arenisca plateada +Inner Silver Sandstone Block Stair=Escalera interior de bloques de arenisca plateada +Outer Silver Sandstone Block Stair=Escalera exterior de bloques de arenisca plateada +Silver Sandstone Block Slab=Losa de bloques de arenisca plateada +Obsidian Stair=Escalera de obsidiana +Inner Obsidian Stair=Escalera interior de obsidiana +Outer Obsidian Stair=Escalera exterior de obsidiana +Obsidian Slab=Losa de obsidiana +Obsidian Brick Stair=Escalera de ladrillos de obsidiana +Inner Obsidian Brick Stair=Escalera interior de ladrillos de obsidiana +Outer Obsidian Brick Stair=Escalera exterior de ladrillos de obsidiana +Obsidian Brick Slab=Losa de ladrillos de obsidiana +Obsidian Block Stair=Escalera de bloques de obsidiana +Inner Obsidian Block Stair=Escalera interior de bloques de obsidiana +Outer Obsidian Block Stair=Escalera exterior de bloques de obsidiana +Obsidian Block Slab=Losa de bloques de obsidiana +Brick Stair=Escalera de ladrillos +Inner Brick Stair=Escalera interior de ladrillos +Outer Brick Stair=Escalera exterior de ladrillos +Brick Slab=Losa de ladrillos +Steel Block Stair=Escalera de acero +Inner Steel Block Stair=Escalera interior de acero +Outer Steel Block Stair=Escalera exterior de acero +Steel Block Slab=Losa de acero +Tin Block Stair=Escalera de estaño +Inner Tin Block Stair=Escalera interior de estaño +Outer Tin Block Stair=Escalera exterior de estaño +Tin Block Slab=Losa de estaño +Copper Block Stair=Escalera de cobre +Inner Copper Block Stair=Escalera interior de cobre +Outer Copper Block Stair=Escalera exterior de cobre +Copper Block Slab=Losa de cobre +Bronze Block Stair=Escalera de bronce +Inner Bronze Block Stair=Escalera interior de bronce +Outer Bronze Block Stair=Escalera exterior de bronce +Bronze Block Slab=Losa de bronce +Gold Block Stair=Escalera de oro +Inner Gold Block Stair=Escalera interior de oro +Outer Gold Block Stair=Escalera exterior de oro +Gold Block Slab=Losa de oro +Ice Stair=Escalera de hielo +Inner Ice Stair=Escalera interior de hielo +Outer Ice Stair=Escalera exterior de hielo +Ice Slab=Losa de hielo +Snow Block Stair=Escalera de nieve +Inner Snow Block Stair=Escalera interior de nieve +Outer Snow Block Stair=Escalera exterior de nieve +Snow Block Slab=Losa de nieve diff --git a/data/games/garage/mods/stairs/locale/stairs.fr.tr b/data/games/garage/mods/stairs/locale/stairs.fr.tr new file mode 100644 index 0000000..81b575e --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.fr.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escalier de verre +Glass Slab=Dalle de verre +Inner Glass Stair=Escalier intérieur de verre +Outer Glass Stair=Escalier extérieur de verre +Obsidian Glass Stair=Escalier de verre d'obsidienne +Obsidian Glass Slab=Dalle de verre d'obsidienne +Inner Obsidian Glass Stair=Escalier intérieur de verre d'obsidienne +Outer Obsidian Glass Stair=Escalier extérieur de verre d'obsidienne +Wooden Stair=Escalier en bois +Inner Wooden Stair=Escalier intérieur en bois +Outer Wooden Stair=Escalier extérieur en bois +Wooden Slab=Dalle de bois +Jungle Wood Stair=Escalier en bois de la jungle +Inner Jungle Wood Stair=Escalier intérieur en bois de la jungle +Outer Jungle Wood Stair=Escalier extérieur en bois de la jungle +Jungle Wood Slab=Dalle en bois de la jungle +Pine Wood Stair=Escalier en pin +Inner Pine Wood Stair=Escalier intérieur en pin +Outer Pine Wood Stair=Escalier extérieur en pin +Pine Wood Slab=Dalle en pin +Acacia Wood Stair=Escalier en acacia +Inner Acacia Wood Stair=Escalier intérieur en acacia +Outer Acacia Wood Stair=Escalier extérieur en acacia +Acacia Wood Slab=Dalle en acacia +Aspen Wood Stair=Escalier en tremble +Inner Aspen Wood Stair=Escalier intérieur en tremble +Outer Aspen Wood Stair=Escalier extérieur en tremble +Aspen Wood Slab=Dalle en tremble +Stone Stair=Escalier de pierre +Inner Stone Stair=Escalier intérieur de pierre +Outer Stone Stair=Escalier extérieur de pierre +Stone Slab=Dalle de pierre +Cobblestone Stair=Escalier en pavé +Inner Cobblestone Stair=Escalier intérieur en pavé +Outer Cobblestone Stair=Escalier extérieur en pavé +Cobblestone Slab=Dalle en pavé +Mossy Cobblestone Stair=Escalier en pavé moussu +Inner Mossy Cobblestone Stair=Escalier intérieur en pavé moussu +Outer Mossy Cobblestone Stair=Escalier extérieur en pavé moussu +Mossy Cobblestone Slab=Dalle en pavé moussu +Stone Brick Stair=Escalier en brique de pierre +Inner Stone Brick Stair=Escalier intérieur en brique de pierre +Outer Stone Brick Stair=Escalier extérieur en brique de pierre +Stone Brick Slab=Dalle en brique de pierre +Stone Block Stair=Escalier en bloc de pierre +Inner Stone Block Stair=Escalier intérieur en bloc de pierre +Outer Stone Block Stair=Escalier extérieur en bloc de pierre +Stone Block Slab=Dalle en bloc de pierre +Desert Stone Stair=Escalier en pierre du désert +Inner Desert Stone Stair=Escalier intérieur en pierre du désert +Outer Desert Stone Stair=Escalier extérieur en pierre du désert +Desert Stone Slab=Dalle en pierre du désert +Desert Cobblestone Stair=Escalier en pavé du désert +Inner Desert Cobblestone Stair=Escalier intérieur en pavé du désert +Outer Desert Cobblestone Stair=Escalier extérieur en pavé du désert +Desert Cobblestone Slab=Dalle en pavé du désert +Desert Stone Brick Stair=Escalier en brique de pierre du désert +Inner Desert Stone Brick Stair=Escalier intérieur en brique de pierre du désert +Outer Desert Stone Brick Stair=Escalier extérieur en brique de pierre du désert +Desert Stone Brick Slab=Dalle en brique de pierre du désert +Desert Stone Block Stair=Escalier en bloc de pierre du désert +Inner Desert Stone Block Stair=Escalier intérieur en bloc de pierre du désert +Outer Desert Stone Block Stair=Escalier extérieur en bloc de pierre du désert +Desert Stone Block Slab=Dalle en bloc de pierre du désert +Sandstone Stair=Escalier en grès +Inner Sandstone Stair=Escalier intérieur en grès +Outer Sandstone Stair=Escalier extérieur en grès +Sandstone Slab=Dalle en grès +Sandstone Brick Stair=Escalier en brique de grès +Inner Sandstone Brick Stair=Escalier intérieur en brique de grès +Outer Sandstone Brick Stair=Escalier extérieur en brique de grès +Sandstone Brick Slab=Dalle en brique de grès +Sandstone Block Stair=Escalier en bloc de grès +Inner Sandstone Block Stair=Escalier intérieur en bloc de grès +Outer Sandstone Block Stair=Escalier extérieur en bloc de grès +Sandstone Block Slab=Dalle en bloc de grès +Desert Sandstone Stair=Escalier en grès du désert +Inner Desert Sandstone Stair=Escalier intérieur en grès du désert +Outer Desert Sandstone Stair=Escalier extérieur en grès du désert +Desert Sandstone Slab=Dalle en grès du désert +Desert Sandstone Brick Stair=Escalier en brique de grès du désert +Inner Desert Sandstone Brick Stair=Escalier intérieur en brique de grès du désert +Outer Desert Sandstone Brick Stair=Escalier extérieur en brique de grès du désert +Desert Sandstone Brick Slab=Dalle en brique de grès du désert +Desert Sandstone Block Stair=Escalier en bloc de grès du désert +Inner Desert Sandstone Block Stair=Escalier intérieur en bloc de grès du désert +Outer Desert Sandstone Block Stair=Escalier extérieur en bloc de grès du désert +Desert Sandstone Block Slab=Dalle en bloc de grès du désert +Silver Sandstone Stair=Escalier en grès argenté +Inner Silver Sandstone Stair=Escalier intérieur en grès argenté +Outer Silver Sandstone Stair=Escalier extérieur en grès argenté +Silver Sandstone Slab=Dalle en grès argenté +Silver Sandstone Brick Stair=Escalier en brique de grès argenté +Inner Silver Sandstone Brick Stair=Escalier intérieur en brique de grès argenté +Outer Silver Sandstone Brick Stair=Escalier extérieur en brique de grès argenté +Silver Sandstone Brick Slab=Dalle en brique de grès argenté +Silver Sandstone Block Stair=Escalier en bloc de grès argenté +Inner Silver Sandstone Block Stair=Escalier intérieur en bloc de grès argenté +Outer Silver Sandstone Block Stair=Escalier extérieur en bloc de grès argenté +Silver Sandstone Block Slab=Dalle en bloc de grès argenté +Obsidian Stair=Escalier en obsidienne +Inner Obsidian Stair=Escalier intérieur en obsidienne +Outer Obsidian Stair=Escalier extérieur en obsidienne +Obsidian Slab=Dalle en obsidienne +Obsidian Brick Stair=Escalier en brique d'obsidienne +Inner Obsidian Brick Stair=Escalier intérieur en brique d'obsidienne +Outer Obsidian Brick Stair=Escalier extérieur en brique d'obsidienne +Obsidian Brick Slab=Dalle en brique d'obsidienne +Obsidian Block Stair=Escalier en bloc d'obsidienne +Inner Obsidian Block Stair=Escalier intérieur en bloc d'obsidienne +Outer Obsidian Block Stair=Escalier extérieur en bloc d'obsidienne +Obsidian Block Slab=Dalle en bloc d'obsidienne +Brick Stair=Escalier en brique +Inner Brick Stair=Escalier intérieur en brique +Outer Brick Stair=Escalier extérieur en brique +Brick Slab=Dalle en brique +Steel Block Stair=Escalier en acier +Inner Steel Block Stair=Escalier intérieur en acier +Outer Steel Block Stair=Escalier extérieur en acier +Steel Block Slab=Dalle en acier +Tin Block Stair=Escalier en bloc d'étain +Inner Tin Block Stair=Escalier intérieur en bloc d'étain +Outer Tin Block Stair=Escalier extérieur en bloc d'étain +Tin Block Slab=Dalle en bloc d'étain +Copper Block Stair=Escalier en bloc de cuivre +Inner Copper Block Stair=Escalier intérieur en bloc de cuivre +Outer Copper Block Stair=Escalier extérieur en bloc de cuivre +Copper Block Slab=Dalle en bloc de cuivre +Bronze Block Stair=Escalier en bronze +Inner Bronze Block Stair=Escalier intérieur en bronze +Outer Bronze Block Stair=Escalier extérieur en bronze +Bronze Block Slab=Dalle en bronze +Gold Block Stair=Escalier en bloc d'or +Inner Gold Block Stair=Escalier intérieur en bloc d'or +Outer Gold Block Stair=Escalier extérieur en bloc d'or +Gold Block Slab=Dalle en bloc d'or +Ice Stair=Escalier de glace +Inner Ice Stair=Escalier intérieur de glace +Outer Ice Stair=Escalier extérieur de glace +Ice Slab=Dalle de glace +Snow Block Stair=Escalier en bloc de neige +Inner Snow Block Stair=Escalier intérieur en bloc de neige +Outer Snow Block Stair=Escalier extérieur en bloc de neige +Snow Block Slab=Dalle en bloc de neige diff --git a/data/games/garage/mods/stairs/locale/stairs.id.tr b/data/games/garage/mods/stairs/locale/stairs.id.tr new file mode 100644 index 0000000..dbdfaa0 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.id.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Tangga Kaca +Glass Slab=Lempengan Kaca +Inner Glass Stair=Tangga Kaca Dalam +Outer Glass Stair=Tangga Kaca Luar +Obsidian Glass Stair=Tangga Kaca Obsidian +Obsidian Glass Slab=Lempengan Kaca Obsidian +Inner Obsidian Glass Stair=Tangga Kaca Obsidian Dalam +Outer Obsidian Glass Stair=Tangga Kaca Obsidian Luar +Wooden Stair=Tangga Kayu +Inner Wooden Stair=Tangga Kayu Dalam +Outer Wooden Stair=Tangga Kayu Luar +Wooden Slab=Lempengan Kayu +Jungle Wood Stair=Tangga Kayu Rimba +Inner Jungle Wood Stair=Tangga Kayu Rimba Dalam +Outer Jungle Wood Stair=Tangga Kayu Rimba Luar +Jungle Wood Slab=Lempengan Kayu Rimba +Pine Wood Stair=Tangga Kayu Pinus +Inner Pine Wood Stair=Tangga Kayu Pinus Dalam +Outer Pine Wood Stair=Tangga Kayu Pinus Luar +Pine Wood Slab=Lempengan Kayu Pinus +Acacia Wood Stair=Tangga Kayu Akasia +Inner Acacia Wood Stair=Tangga Kayu Akasia Dalam +Outer Acacia Wood Stair=Tangga Kayu Akasia Luar +Acacia Wood Slab=Lempengan Kayu Akasia +Aspen Wood Stair=Tangga Kayu Aspen +Inner Aspen Wood Stair=Tangga Kayu Aspen Dalam +Outer Aspen Wood Stair=Tangga Kayu Aspen Luar +Aspen Wood Slab=Lempengan Kayu Aspen +Stone Stair=Tangga Batu +Inner Stone Stair=Tangga Batu Dalam +Outer Stone Stair=Tangga Batu Luar +Stone Slab=Lempengan Batu +Cobblestone Stair=Tangga Bongkahan Batu +Inner Cobblestone Stair=Tangga Bongkahan Batu Dalam +Outer Cobblestone Stair=Tangga Bongkahan Batu Luar +Cobblestone Slab=Lempengan Bongkahan Batu +Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut +Inner Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Dalam +Outer Mossy Cobblestone Stair=Tangga Bongkahan Batu Berlumut Luar +Mossy Cobblestone Slab=Lempengan Bongkahan Batu Berlumut +Stone Brick Stair=Tangga Tembok Batu +Inner Stone Brick Stair=Tangga Tembok Batu Dalam +Outer Stone Brick Stair=Tangga Tembok Batu Luar +Stone Brick Slab=Lempengan Tembok Batu +Stone Block Stair=Tangga Balok Batu +Inner Stone Block Stair=Tangga Balok Batu Dalam +Outer Stone Block Stair=Tangga Balok Batu Luar +Stone Block Slab=Lempengan Balok Batu +Desert Stone Stair=Tangga Batu Gurun +Inner Desert Stone Stair=Tangga Batu Gurun Dalam +Outer Desert Stone Stair=Tangga Batu Gurun Luar +Desert Stone Slab=Lempengan Batu Gurun +Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun +Inner Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Dalam +Outer Desert Cobblestone Stair=Tangga Bongkahan Batu Gurun Luar +Desert Cobblestone Slab=Lempengan Bongkahan Batu Gurun +Desert Stone Brick Stair=Tangga Tembok Batu Gurun +Inner Desert Stone Brick Stair=Tangga Tembok Batu Gurun Dalam +Outer Desert Stone Brick Stair=Tangga Tembok Batu Gurun Luar +Desert Stone Brick Slab=Lempengan Tembok Batu Gurun +Desert Stone Block Stair=Tangga Balok Batu Gurun +Inner Desert Stone Block Stair=Tangga Balok Batu Gurun Dalam +Outer Desert Stone Block Stair=Tangga Balok Batu Gurun Luar +Desert Stone Block Slab=Lempengan Balok Batu Gurun +Sandstone Stair=Tangga Batu Pasir +Inner Sandstone Stair=Tangga Batu Pasir Dalam +Outer Sandstone Stair=Tangga Batu Pasir Luar +Sandstone Slab=Lempengan Batu Pasir +Sandstone Brick Stair=Tangga Tembok Batu Pasir +Inner Sandstone Brick Stair=Tangga Tembok Batu Pasir Dalam +Outer Sandstone Brick Stair=Tangga Tembok Batu Pasir Luar +Sandstone Brick Slab=Lempengan Tembok Batu Pasir +Sandstone Block Stair=Tangga Balok Batu Pasir +Inner Sandstone Block Stair=Tangga Balok Batu Pasir Dalam +Outer Sandstone Block Stair=Tangga Balok Batu Pasir Luar +Sandstone Block Slab=Lempengan Balok Batu Pasir +Desert Sandstone Stair=Tangga Batu Pasir Gurun +Inner Desert Sandstone Stair=Tangga Batu Pasir Gurun Dalam +Outer Desert Sandstone Stair=Tangga Batu Pasir Gurun Luar +Desert Sandstone Slab=Lempengan Batu Pasir Gurun +Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun +Inner Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Dalam +Outer Desert Sandstone Brick Stair=Tangga Tembok Batu Pasir Gurun Luar +Desert Sandstone Brick Slab=Lempengan Tembok Batu Pasir Gurun +Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun +Inner Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Dalam +Outer Desert Sandstone Block Stair=Tangga Balok Batu Pasir Gurun Luar +Desert Sandstone Block Slab=Lempengan Balok Batu Pasir Gurun +Silver Sandstone Stair=Tangga Batu Pasir Perak +Inner Silver Sandstone Stair=Tangga Batu Pasir Perak Dalam +Outer Silver Sandstone Stair=Tangga Batu Pasir Perak Luar +Silver Sandstone Slab=Lempengan Batu Pasir Perak +Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak +Inner Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Dalam +Outer Silver Sandstone Brick Stair=Tangga Tembok Batu Pasir Perak Luar +Silver Sandstone Brick Slab=Lempengan Tembok Batu Pasir Perak +Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak +Inner Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Dalam +Outer Silver Sandstone Block Stair=Tangga Balok Batu Pasir Perak Luar +Silver Sandstone Block Slab=Lempengan Balok Batu Pasir Perak +Obsidian Stair=Tangga Obsidian +Inner Obsidian Stair=Tangga Obsidian Dalam +Outer Obsidian Stair=Tangga Obsidian Luar +Obsidian Slab=Lempengan Obsidian +Obsidian Brick Stair=Tangga Tembok Obsidian +Inner Obsidian Brick Stair=Tangga Tembok Obsidian Dalam +Outer Obsidian Brick Stair=Tangga Tembok Obsidian Luar +Obsidian Brick Slab=Lempengan Tembok Obsidian +Obsidian Block Stair=Tangga Balok Obsidian +Inner Obsidian Block Stair=Tangga Balok Obsidian Dalam +Outer Obsidian Block Stair=Tangga Balok Obsidian Luar +Obsidian Block Slab=Lempengan Balok Obsidian +Brick Stair=Tangga Bata +Inner Brick Stair=Tangga Bata Dalam +Outer Brick Stair=Tangga Bata Luar +Brick Slab=Lempengan Bata +Steel Block Stair=Tangga Balok Baja +Inner Steel Block Stair=Tangga Balok Baja Dalam +Outer Steel Block Stair=Tangga Balok Baja Luar +Steel Block Slab=Lempengan Balok Baja +Tin Block Stair=Tangga Balok Timah +Inner Tin Block Stair=Tangga Balok Timah Dalam +Outer Tin Block Stair=Tangga Balok Timah Luar +Tin Block Slab=Lempengan Balok Timah +Copper Block Stair=Tangga Balok Tembaga +Inner Copper Block Stair=Tangga Balok Tembaga Dalam +Outer Copper Block Stair=Tangga Balok Tembaga Luar +Copper Block Slab=Lempengan Balok Tembaga +Bronze Block Stair=Tangga Balok Perunggu +Inner Bronze Block Stair=Tangga Balok Perunggu Dalam +Outer Bronze Block Stair=Tangga Balok Perunggu Luar +Bronze Block Slab=Lempengan Balok Perunggu +Gold Block Stair=Tangga Balok Emas +Inner Gold Block Stair=Tangga Balok Emas Dalam +Outer Gold Block Stair=Tangga Balok Emas Luar +Gold Block Slab=Lempengan Balok Emas +Ice Stair=Tangga Es +Inner Ice Stair=Tangga Es Dalam +Outer Ice Stair=Tangga Es Luar +Ice Slab=Lempengan Es +Snow Block Stair=Tangga Balok Salju +Inner Snow Block Stair=Tangga Balok Salju Dalam +Outer Snow Block Stair=Tangga Balok Salju Luar +Snow Block Slab=Lempengan Balok Salju diff --git a/data/games/garage/mods/stairs/locale/stairs.it.tr b/data/games/garage/mods/stairs/locale/stairs.it.tr new file mode 100644 index 0000000..16945ec --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.it.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Scala di vetro +Glass Slab=Lastra di vetro +Inner Glass Stair=Scala di vetro interna +Outer Glass Stair=Scala di vetro esterna +Obsidian Glass Stair=Scala di vetro d'ossidiana +Obsidian Glass Slab=Lastra di vetro d'ossidiana +Inner Obsidian Glass Stair=Scala di vetro d'ossidiana interna +Outer Obsidian Glass Stair=Scala di vetro d'ossidiana esterna +Wooden Stair=Scala di legno +Inner Wooden Stair=Scala di legno interna +Outer Wooden Stair=Scala di legno esterna +Wooden Slab=Lastra di legno +Jungle Wood Stair=Scala di legno della giungla +Inner Jungle Wood Stair=Scala di legno della giungla interna +Outer Jungle Wood Stair=Scala di legno della giungla esterna +Jungle Wood Slab=Lastra di legno della giungla +Pine Wood Stair=Scala di legno di pino +Inner Pine Wood Stair=Scala di legno di pino interna +Outer Pine Wood Stair=Scala di legno di pino esterna +Pine Wood Slab=Lastra di legno di pino +Acacia Wood Stair=Scala di legno d'acacia +Inner Acacia Wood Stair=Scala di legno d'acacia interna +Outer Acacia Wood Stair=Scala di legno d'acacia esterna +Acacia Wood Slab=Lastra di legno d'acacia +Aspen Wood Stair=Scala di legno di pioppo +Inner Aspen Wood Stair=Scala di legno di pioppo interna +Outer Aspen Wood Stair=Scala di legno di pioppo esterna +Aspen Wood Slab=Lastra di legno di pioppo +Stone Stair=Scala di pietra +Inner Stone Stair=Scala di pietra interna +Outer Stone Stair=Scala di pietra esterna +Stone Slab=Lastra di pietra +Cobblestone Stair=Scala di ciottoli +Inner Cobblestone Stair=Scala di ciottoli interna +Outer Cobblestone Stair=Scala di ciottoli esterna +Cobblestone Slab=Lastra di ciottoli +Mossy Cobblestone Stair=Scala di ciottoli muschiosi +Inner Mossy Cobblestone Stair=Scala di ciottoli muschiosi interna +Outer Mossy Cobblestone Stair=Scala di ciottoli muschiosi esterna +Mossy Cobblestone Slab=Lastra di ciottoli muschiosi +Stone Brick Stair=Scala di mattone di pietra +Inner Stone Brick Stair=Scala di mattone di pietra interna +Outer Stone Brick Stair=Scala di mattone di pietra esterna +Stone Brick Slab=Lastra di mattone di pietra +Stone Block Stair=Scala di blocco di pietra +Inner Stone Block Stair=Scala di blocco di pietra interna +Outer Stone Block Stair=Scala di blocco di pietra esterna +Stone Block Slab=Lastra di blocco di pietra +Desert Stone Stair=Scala di pietra del deserto +Inner Desert Stone Stair=Scala di pietra del deserto interna +Outer Desert Stone Stair=Scala di pietra del deserto esterna +Desert Stone Slab=Lastra di pietra del deserto +Desert Cobblestone Stair=Scala di ciottoli del deserto +Inner Desert Cobblestone Stair=Scala di ciottoli del deserto interna +Outer Desert Cobblestone Stair=Scala di ciottoli del deserto esterna +Desert Cobblestone Slab=Lastra di ciottoli del deserto +Desert Stone Brick Stair=Scala di mattone di pietra del deserto +Inner Desert Stone Brick Stair=Scala di mattone di pietra del deserto interna +Outer Desert Stone Brick Stair=Scala di mattone di pietra del deserto esterna +Desert Stone Brick Slab=Lastra di mattone di pietra del deserto +Desert Stone Block Stair=Scala di blocco di pietra del deserto +Inner Desert Stone Block Stair=Scala di blocco di pietra del deserto interna +Outer Desert Stone Block Stair=Scala di blocco di pietra del deserto esterna +Desert Stone Block Slab=Lastra di blocco di pietra del deserto +Sandstone Stair=Scala d'arenaria +Inner Sandstone Stair=Scala d'arenaria interna +Outer Sandstone Stair=Scala d'arenaria esterna +Sandstone Slab=Lastra d'arenaria +Sandstone Brick Stair=Scala di mattone d'arenaria +Inner Sandstone Brick Stair=Scala di mattone d'arenaria interna +Outer Sandstone Brick Stair=Scala di mattone d'arenaria esterna +Sandstone Brick Slab=Lastra di mattone d'arenaria +Sandstone Block Stair=Scala di blocco d'arenaria +Inner Sandstone Block Stair=Scala di blocco d'arenaria interna +Outer Sandstone Block Stair=Scala di blocco d'arenaria esterna +Sandstone Block Slab=Lastra di blocco d'arenaria +Desert Sandstone Stair=Scala d'arenaria del deserto +Inner Desert Sandstone Stair=Scala d'arenaria del deserto interna +Outer Desert Sandstone Stair=Scala d'arenaria del deserto esterna +Desert Sandstone Slab=Lastra d'arenaria del deserto +Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto +Inner Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto interna +Outer Desert Sandstone Brick Stair=Scala di mattone d'arenaria del deserto esterna +Desert Sandstone Brick Slab=Lastra di mattone d'arenaria del deserto +Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto +Inner Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto interna +Outer Desert Sandstone Block Stair=Scala di blocco d'arenaria del deserto esterna +Desert Sandstone Block Slab=Lastra di blocco d'arenaria del deserto +Silver Sandstone Stair=Scala d'arenaria argentata +Inner Silver Sandstone Stair=Scala d'arenaria argentata interna +Outer Silver Sandstone Stair=Scala d'arenaria argentata esterna +Silver Sandstone Slab=Lastra d'arenaria argentata +Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata +Inner Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata interna +Outer Silver Sandstone Brick Stair=Scala di mattone d'arenaria argentata esterna +Silver Sandstone Brick Slab=Lastra di mattone d'arenaria argentata +Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata +Inner Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata interna +Outer Silver Sandstone Block Stair=Scala di blocco d'arenaria argentata esterna +Silver Sandstone Block Slab=Lastra di blocco d'arenaria argentata +Obsidian Stair=Scala d'ossidiana +Inner Obsidian Stair=Scala d'ossidiana interna +Outer Obsidian Stair=Scala d'ossidiana esterna +Obsidian Slab=Lastra d'ossidiana +Obsidian Brick Stair=Scala di mattone d'ossidiana +Inner Obsidian Brick Stair=Scala di mattone d'ossidiana interna +Outer Obsidian Brick Stair=Scala di mattone d'ossidiana esterna +Obsidian Brick Slab=Lastra di mattone d'ossidiana +Obsidian Block Stair=Scala di blocco d'ossidiana +Inner Obsidian Block Stair=Scala di blocco d'ossidiana interna +Outer Obsidian Block Stair=Scala di blocco d'ossidiana esterna +Obsidian Block Slab=Lastra di blocco d'ossidiana +Brick Stair=Scala di mattone +Inner Brick Stair=Scala di mattone interna +Outer Brick Stair=Scala di mattone esterna +Brick Slab=Lastra di mattone +Steel Block Stair=Scala di blocco d'acciaio +Inner Steel Block Stair=Scala di blocco d'acciaio interna +Outer Steel Block Stair=Scala di blocco d'acciaio esterna +Steel Block Slab=Lastra di blocco d'acciaio +Tin Block Stair=Scala di blocco di stagno +Inner Tin Block Stair=Scala di blocco di stagno interna +Outer Tin Block Stair=Scala di blocco di stagno esterna +Tin Block Slab=Lastra di blocco di stagno +Copper Block Stair=Scala di blocco di rame +Inner Copper Block Stair=Scala di blocco di rame interna +Outer Copper Block Stair=Scala di blocco di rame esterna +Copper Block Slab=Lastra di blocco di rame +Bronze Block Stair=Scala di blocco di bronzo +Inner Bronze Block Stair=Scala di blocco di bronzo interna +Outer Bronze Block Stair=Scala di blocco di bronzo esterna +Bronze Block Slab=Lastra di blocco di bronzo +Gold Block Stair=Scala di blocco d'oro +Inner Gold Block Stair=Scala di blocco d'oro interna +Outer Gold Block Stair=Scala di blocco d'oro esterna +Gold Block Slab=Lastra di blocco d'oro +Ice Stair=Scala di ghiaccio +Inner Ice Stair=Scala di ghiaccio interna +Outer Ice Stair=Scala di ghiaccio esterna +Ice Slab=Lastra di ghiaccio +Snow Block Stair=Scala di blocco di neve +Inner Snow Block Stair=Scala di blocco di neve interna +Outer Snow Block Stair=Scala di blocco di neve esterna +Snow Block Slab=Lastra di blocco di neve diff --git a/data/games/garage/mods/stairs/locale/stairs.ja.tr b/data/games/garage/mods/stairs/locale/stairs.ja.tr new file mode 100644 index 0000000..02576cd --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.ja.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=ガラスの階段 +Glass Slab=ガラスの厚板 +Inner Glass Stair=ガラスの凹階段 +Outer Glass Stair=ガラスの凸階段 +Obsidian Glass Stair=黒曜石ガラスの階段 +Obsidian Glass Slab=黒曜石ガラスの厚板 +Inner Obsidian Glass Stair=黒曜石ガラスの凹階段 +Outer Obsidian Glass Stair=黒曜石ガラスの凸階段 +Wooden Stair=木製の階段 +Inner Wooden Stair=木製の凹階段 +Outer Wooden Stair=木製の凸階段 +Wooden Slab=木製の厚板 +Jungle Wood Stair=ジャングル材の階段 +Inner Jungle Wood Stair=ジャングル材の凹階段 +Outer Jungle Wood Stair=ジャングル材の凸階段 +Jungle Wood Slab=ジャングル材の厚板 +Pine Wood Stair=マツ材の階段 +Inner Pine Wood Stair=マツ材の凹階段 +Outer Pine Wood Stair=マツ材の凸階段 +Pine Wood Slab=マツ材の厚板 +Acacia Wood Stair=アカシア材の階段 +Inner Acacia Wood Stair=アカシア材の凹階段 +Outer Acacia Wood Stair=アカシア材の凸階段 +Acacia Wood Slab=アカシア材の厚板 +Aspen Wood Stair=ポプラ材の階段 +Inner Aspen Wood Stair=ポプラ材の凹階段 +Outer Aspen Wood Stair=ポプラ材の凸階段 +Aspen Wood Slab=ポプラ材の厚板 +Stone Stair=石の階段 +Inner Stone Stair=石の凹階段 +Outer Stone Stair=石の凸階段 +Stone Slab=石の厚板 +Cobblestone Stair=丸石の階段 +Inner Cobblestone Stair=丸石の凹階段 +Outer Cobblestone Stair=丸石の凸階段 +Cobblestone Slab=丸石の厚板 +Mossy Cobblestone Stair=苔むした丸石の階段 +Inner Mossy Cobblestone Stair=苔むした丸石の凹階段 +Outer Mossy Cobblestone Stair=苔むした丸石の凸階段 +Mossy Cobblestone Slab=苔むした丸石の厚板 +Stone Brick Stair=石レンガの階段 +Inner Stone Brick Stair=石レンガの凹階段 +Outer Stone Brick Stair=石レンガの凸階段 +Stone Brick Slab=石レンガの厚板 +Stone Block Stair=石ブロックの階段 +Inner Stone Block Stair=石ブロックの凹階段 +Outer Stone Block Stair=石ブロックの凸階段 +Stone Block Slab=石ブロックの厚板 +Desert Stone Stair=砂漠の石の階段 +Inner Desert Stone Stair=砂漠の石の凹階段 +Outer Desert Stone Stair=砂漠の石の凸階段 +Desert Stone Slab=砂漠の石の厚板 +Desert Cobblestone Stair=砂漠の丸石の階段 +Inner Desert Cobblestone Stair=砂漠の丸石の凹階段 +Outer Desert Cobblestone Stair=砂漠の丸石の凸階段 +Desert Cobblestone Slab=砂漠の丸石の厚板 +Desert Stone Brick Stair=砂漠の石レンガの階段 +Inner Desert Stone Brick Stair=砂漠の石レンガの凹階段 +Outer Desert Stone Brick Stair=砂漠の石レンガの凸階段 +Desert Stone Brick Slab=砂漠の石レンガの厚板 +Desert Stone Block Stair=砂漠の石ブロックの階段 +Inner Desert Stone Block Stair=砂漠の石ブロックの凹階段 +Outer Desert Stone Block Stair=砂漠の石ブロックの凸階段 +Desert Stone Block Slab=砂漠の石ブロックの厚板 +Sandstone Stair=砂岩の階段 +Inner Sandstone Stair=砂岩の凹階段 +Outer Sandstone Stair=砂岩の凸階段 +Sandstone Slab=砂岩の厚板 +Sandstone Brick Stair=砂岩レンガの階段 +Inner Sandstone Brick Stair=砂岩レンガの凹階段 +Outer Sandstone Brick Stair=砂岩レンガの凸階段 +Sandstone Brick Slab=砂岩レンガの厚板 +Sandstone Block Stair=砂岩ブロックの階段 +Inner Sandstone Block Stair=砂岩ブロックの凹階段 +Outer Sandstone Block Stair=砂岩ブロックの凸階段 +Sandstone Block Slab=砂岩ブロックの厚板 +Desert Sandstone Stair=砂漠の砂岩の階段 +Inner Desert Sandstone Stair=砂漠の砂岩の凹階段 +Outer Desert Sandstone Stair=砂漠の砂岩の凸階段 +Desert Sandstone Slab=砂漠の砂岩の厚板 +Desert Sandstone Brick Stair=砂漠の砂岩レンガの階段 +Inner Desert Sandstone Brick Stair=砂漠の砂岩レンガの凹階段 +Outer Desert Sandstone Brick Stair=砂漠の砂岩レンガの凸階段 +Desert Sandstone Brick Slab=砂漠の砂岩レンガの厚板 +Desert Sandstone Block Stair=砂漠の砂岩ブロックの階段 +Inner Desert Sandstone Block Stair=砂漠の砂岩ブロックの凹階段 +Outer Desert Sandstone Block Stair=砂漠の砂岩ブロックの凸階段 +Desert Sandstone Block Slab=砂漠の砂岩ブロックの厚板 +Silver Sandstone Stair=銀色の砂岩の階段 +Inner Silver Sandstone Stair=銀色の砂岩の凹階段 +Outer Silver Sandstone Stair=銀色の砂岩の凸階段 +Silver Sandstone Slab=銀色の砂岩の厚板 +Silver Sandstone Brick Stair=銀色の砂岩レンガの階段 +Inner Silver Sandstone Brick Stair=銀色の砂岩レンガの凹階段 +Outer Silver Sandstone Brick Stair=銀色の砂岩レンガの凸階段 +Silver Sandstone Brick Slab=銀色の砂岩レンガの厚板 +Silver Sandstone Block Stair=銀色の砂岩ブロックの階段 +Inner Silver Sandstone Block Stair=銀色の砂岩ブロックの凹階段 +Outer Silver Sandstone Block Stair=銀色の砂岩ブロックの凸階段 +Silver Sandstone Block Slab=銀色の砂岩ブロックの厚板 +Obsidian Stair=黒曜石の階段 +Inner Obsidian Stair=黒曜石の凹階段 +Outer Obsidian Stair=黒曜石の凸階段 +Obsidian Slab=黒曜石の厚板 +Obsidian Brick Stair=黒曜石レンガの階段 +Inner Obsidian Brick Stair=黒曜石レンガの凹階段 +Outer Obsidian Brick Stair=黒曜石レンガの凸階段 +Obsidian Brick Slab=黒曜石レンガの厚板 +Obsidian Block Stair=黒曜石ブロックの階段 +Inner Obsidian Block Stair=黒曜石ブロックの凹階段 +Outer Obsidian Block Stair=黒曜石ブロックの凸階段 +Obsidian Block Slab=黒曜石ブロックの厚板 +Brick Stair=レンガの階段 +Inner Brick Stair=レンガの凹階段 +Outer Brick Stair=レンガの凸階段 +Brick Slab=レンガの厚板 +Steel Block Stair=鉄ブロックの階段 +Inner Steel Block Stair=鉄ブロックの凹階段 +Outer Steel Block Stair=鉄ブロックの凸階段 +Steel Block Slab=鉄ブロックの厚板 +Tin Block Stair=スズの階段 +Inner Tin Block Stair=スズの凹階段 +Outer Tin Block Stair=スズの凸階段 +Tin Block Slab=スズの厚板 +Copper Block Stair=銅ブロックの階段 +Inner Copper Block Stair=銅ブロックの凹階段 +Outer Copper Block Stair=銅ブロックの凸階段 +Copper Block Slab=銅ブロックの厚板 +Bronze Block Stair=青銅ブロックの階段 +Inner Bronze Block Stair=青銅ブロックの凹階段 +Outer Bronze Block Stair=青銅ブロックの凸階段 +Bronze Block Slab=青銅ブロックの厚板 +Gold Block Stair=金ブロックの階段 +Inner Gold Block Stair=金ブロックの凹階段 +Outer Gold Block Stair=金ブロックの凸階段 +Gold Block Slab=金ブロックの厚板 +Ice Stair=氷の階段 +Inner Ice Stair=氷の凹階段 +Outer Ice Stair=氷の凸階段 +Ice Slab=氷の厚板 +Snow Block Stair=雪の階段 +Inner Snow Block Stair=雪の凹階段 +Outer Snow Block Stair=雪の凸階段 +Snow Block Slab=雪の厚板 diff --git a/data/games/garage/mods/stairs/locale/stairs.jbo.tr b/data/games/garage/mods/stairs/locale/stairs.jbo.tr new file mode 100644 index 0000000..91d2806 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.jbo.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=lo blaci serti +Glass Slab=lo blaci xadba bliku +Inner Glass Stair=lo zo'i blaci serti +Outer Glass Stair=lo ze'o blaci serti +Obsidian Glass Stair=lo je'erma'ablaci blaci serti +Obsidian Glass Slab=lo je'erma'ablaci blaci ke xadba bliku +Inner Obsidian Glass Stair=lo zo'i je'erma'ablaci blaci serti +Outer Obsidian Glass Stair=lo ze'o je'erma'ablaci blaci serti +Wooden Stair=lo mudri serti +Inner Wooden Stair=lo zo'i mudri serti +Outer Wooden Stair=lo ze'o mudri serti +Wooden Slab=lo mudri ke xadba bliku +Jungle Wood Stair=lo glatimdemricfoi mudri serti +Inner Jungle Wood Stair=lo zo'i glatimdemricfoi mudri serti +Outer Jungle Wood Stair=lo ze'o glatimdemricfoi mudri serti +Jungle Wood Slab=lo glatimdemricfoi mudri ke xadba bliku +Pine Wood Stair=lo ku'urmudri serti +Inner Pine Wood Stair=lo zo'i ku'urmudri serti +Outer Pine Wood Stair=lo ze'o ku'urmudri serti +Pine Wood Slab=lo ku'urmudri ke xadba bliku +Acacia Wood Stair=lo atkaci,ia mudri serti +Inner Acacia Wood Stair=lo zo'i atkaci,ia mudri serti +Outer Acacia Wood Stair=lo ze'o atkaci,ia mudri serti +Acacia Wood Slab=lo atkaci,ia mudri ke xadba bliku +Aspen Wood Stair=lo mudrpopulu serti +Inner Aspen Wood Stair=lo zo'i mudrpopulu serti +Outer Aspen Wood Stair=lo ze'o mudrpopulu serti +Aspen Wood Slab=lo mudrpopulu ke xadba bliku +Stone Stair=lo rokci serti +Inner Stone Stair=lo zo'i rokci serti +Outer Stone Stair=lo ze'o rokci serti +Stone Slab=lo rokci ke xadba bliku +Cobblestone Stair=lo lolro'iboi serti +Inner Cobblestone Stair=lo zo'i lolro'iboi serti +Outer Cobblestone Stair=lo ze'o lolro'iboi serti +Cobblestone Slab=lo lolro'iboi xadba bliku +Mossy Cobblestone Stair=lo clika lolro'iboi serti +Inner Mossy Cobblestone Stair=lo zo'i clika lolro'iboi serti +Outer Mossy Cobblestone Stair=lo ze'o clika lolro'iboi serti +Mossy Cobblestone Slab=lo clika lolro'iboi ke xadba bliku +Stone Brick Stair=lo morna rokci serti +Inner Stone Brick Stair=lo zo'i morna rokci serti +Outer Stone Brick Stair=lo ze'o morna rokci serti +Stone Brick Slab=lo morna rokci ke xadba bliku +Stone Block Stair=lo rokci bliku serti +Inner Stone Block Stair=lo zo'i rokci bliku serti +Outer Stone Block Stair=lo ze'o rokci bliku serti +Stone Block Slab=lo rokci bliku ke xadba bliku +Desert Stone Stair=lo cantu'a rokci serti +Inner Desert Stone Stair=lo zo'i cantu'a rokci serti +Outer Desert Stone Stair=lo ze'o cantu'a rokci serti +Desert Stone Slab=lo cantu'a rokci ke xadba bliku +Desert Cobblestone Stair=lo cantu'a lolro'iboi serti +Inner Desert Cobblestone Stair=lo zo'i cantu'a lolro'iboi serti +Outer Desert Cobblestone Stair=lo ze'o cantu'a lolro'iboi serti +Desert Cobblestone Slab=lo cantu'a lolro'iboi ke xadba bliku +Desert Stone Brick Stair=lo morna ke cantu'a rokci serti +Inner Desert Stone Brick Stair=lo zo'i morna ke cantu'a rokci serti +Outer Desert Stone Brick Stair=lo ze'o morna ke cantu'a rokci serti +Desert Stone Brick Slab=lo morna ke cantu'a rokci ke xadba bliku +Desert Stone Block Stair=lo cantu'a rokci bliku serti +Inner Desert Stone Block Stair=lo zo'i cantu'a rokci bliku serti +Outer Desert Stone Block Stair=lo ze'o cantu'a rokci bliku serti +Desert Stone Block Slab=lo cantu'a rokci bliku ke xadba bliku +Sandstone Stair=lo canro'i serti +Inner Sandstone Stair=lo zo'i canro'i serti +Outer Sandstone Stair=lo ze'o canro'i serti +Sandstone Slab=lo canro'i ke xadba bliku +Sandstone Brick Stair=lo morna ke canro'i serti +Inner Sandstone Brick Stair=lo zo'i morna ke canro'i serti +Outer Sandstone Brick Stair=lo ze'o morna ke canro'i serti +Sandstone Brick Slab=lo morna canro'i ke xadba bliku +Sandstone Block Stair=lo canro'i bliku serti +Inner Sandstone Block Stair=lo zo'i canro'i bliku serti +Outer Sandstone Block Stair=lo ze'o canro'i bliku serti +Sandstone Block Slab=lo canro'i bliku ke xadba bliku +Desert Sandstone Stair=lo cantu'a canro'i serti +Inner Desert Sandstone Stair=lo zo'i cantu'a canro'i serti +Outer Desert Sandstone Stair=lo ze'o cantu'a canro'i serti +Desert Sandstone Slab=lo cantu'a canro'i ke xadba bliku +Desert Sandstone Brick Stair=lo morna ke cantu'a canro'i serti +Inner Desert Sandstone Brick Stair=lo zo'i morna ke cantu'a canro'i serti +Outer Desert Sandstone Brick Stair=lo ze'o morna ke cantu'a canro'i serti +Desert Sandstone Brick Slab=lo morna ke cantu'a canro'i ke xadba bliku +Desert Sandstone Block Stair=lo cantu'a canro'i bliku serti +Inner Desert Sandstone Block Stair=lo zo'i cantu'a canro'i bliku serti +Outer Desert Sandstone Block Stair=lo ze'o cantu'a canro'i bliku serti +Desert Sandstone Block Slab=lo cantu'a canro'i ke xadba bliku +Silver Sandstone Stair=lo rijyska canro'i serti +Inner Silver Sandstone Stair=lo zo'i rijyska canro'i serti +Outer Silver Sandstone Stair=lo ze'o rijyska canro'i serti +Silver Sandstone Slab=lo rijyska canro'i ke xadba bliku +Silver Sandstone Brick Stair=lo morna ke rijyska canro'i serti +Inner Silver Sandstone Brick Stair=lo zo'i morna ke rijyska canro'i serti +Outer Silver Sandstone Brick Stair=lo ze'o morna ke rijyska canro'i serti +Silver Sandstone Brick Slab=lo morna ke rijyska canro'i ke xadba bliku +Silver Sandstone Block Stair=lo rijyska canro'i bliku serti +Inner Silver Sandstone Block Stair=lo zo'i rijyska canro'i bliku serti +Outer Silver Sandstone Block Stair=lo ze'o rijyska canro'i bliku serti +Silver Sandstone Block Slab=lo rijyska canro'i bliku ke xadba bliku +Obsidian Stair=lo je'erma'ablaci serti +Inner Obsidian Stair=lo zo'i je'erma'ablaci serti +Outer Obsidian Stair=lo ze'o je'erma'ablaci serti +Obsidian Slab=lo je'erma'ablaci ke xadba bliku +Obsidian Brick Stair=lo morna ke je'erma'ablaci serti +Inner Obsidian Brick Stair=lo zo'i morna ke je'erma'ablaci serti +Outer Obsidian Brick Stair=lo ze'o morna ke je'erma'ablaci serti +Obsidian Brick Slab=lo morna je'erma'ablaci ke xadba bliku +Obsidian Block Stair=lo je'erma'ablaci bliku serti +Inner Obsidian Block Stair=lo zo'i je'erma'ablaci bliku serti +Outer Obsidian Block Stair=lo ze'o je'erma'ablaci bliku serti +Obsidian Block Slab=lo je'erma'ablaci bliku ke xadba bliku +Brick Stair=lo kitybli serti +Inner Brick Stair=lo zo'i kitybli serti +Outer Brick Stair=lo ze'o kitybli serti +Brick Slab=lo kitybli xadba bliku +Steel Block Stair=lo gasta bliku serti +Inner Steel Block Stair=lo zo'i gasta bliku serti +Outer Steel Block Stair=lo ze'o gasta bliku serti +Steel Block Slab=lo gasta bliku ke xadba bliku +Tin Block Stair=lo tinci bliku serti +Inner Tin Block Stair=lo zo'i tinci bliku serti +Outer Tin Block Stair=lo ze'o tinci bliku serti +Tin Block Slab=lo tinci bliku ke xadba bliku +Copper Block Stair=lo tunka bliku serti +Inner Copper Block Stair=lo zo'i tunka bliku serti +Outer Copper Block Stair=lo ze'o tunka bliku serti +Copper Block Slab=lo tunka xadba bliku +Bronze Block Stair=lo ransu bliku serti +Inner Bronze Block Stair=lo zo'i ransu bliku serti +Outer Bronze Block Stair=lo ze'o ransu bliku serti +Bronze Block Slab=lo ransu xadba bliku +Gold Block Stair=lo solji bliku serti +Inner Gold Block Stair=lo zo'i solji bliku serti +Outer Gold Block Stair=lo ze'o solji bliku serti +Gold Block Slab=lo solji bliku ke xadba bliku +Ice Stair=lo bisli serti +Inner Ice Stair=lo zo'i bisli serti +Outer Ice Stair=lo ze'o bisli serti +Ice Slab=lo bisli ke xadba bliku +Snow Block Stair=lo snime bliku serti +Inner Snow Block Stair=lo zo'i snime bliku serti +Outer Snow Block Stair=lo ze'o snime bliku serti +Snow Block Slab=lo snime bliku ke xadba bliku diff --git a/data/games/garage/mods/stairs/locale/stairs.lv.tr b/data/games/garage/mods/stairs/locale/stairs.lv.tr new file mode 100644 index 0000000..646040b --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.lv.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Stikla pakāpiens +Glass Slab=Stikla plātne +Inner Glass Stair=Iekšējs stikla pakāpiens +Outer Glass Stair=Ārējs stikla pakāpiens +Obsidian Glass Stair=Obsidiāna stikla pakāpiens +Obsidian Glass Slab=Obsidiāna stikla plātne +Inner Obsidian Glass Stair=Iekšējs obsidiāna stikla pakāpiens +Outer Obsidian Glass Stair=Ārējs obsidiāna stikla pakāpiens +Wooden Stair=Koka pakāpiens +Inner Wooden Stair=Iekšējs koka pakāpiens +Outer Wooden Stair=Ārējs koka pakāpiens +Wooden Slab=Koka plātne +Jungle Wood Stair=Džungļu koka pakāpiens +Inner Jungle Wood Stair=Iekšējs džungļu koka pakāpiens +Outer Jungle Wood Stair=Ārējs džungļu koka pakāpiens +Jungle Wood Slab=Džungļu koka plātne +Pine Wood Stair=Skujkoka koka pakāpiens +Inner Pine Wood Stair=Iekšējs skujkoka koka pakāpiens +Outer Pine Wood Stair= Arējs skujkoka koka pakāpiens +Pine Wood Slab=Skujkoka koka plātne +Acacia Wood Stair=Akācijas koka pakāpiens +Inner Acacia Wood Stair=Iekšējs akācijas koka pakāpiens +Outer Acacia Wood Stair=Ārējs akācijas koka pakāpiens +Acacia Wood Slab=Akācijas koka plātne +Aspen Wood Stair=Apses koka pakāpiens +Inner Aspen Wood Stair=Iekšējs apses koka pakāpiens +Outer Aspen Wood Stair=Ārējs apses koka pakāpiens +Aspen Wood Slab=Apses koka plātne +Stone Stair=Akmens pakāpiens +Inner Stone Stair=Iekšējs akmens pakāpiens +Outer Stone Stair=Ārējs akmens pakāpiens +Stone Slab=Akmens plātne +Cobblestone Stair=Mūrakmens pakāpiens +Inner Cobblestone Stair=Iekšējs mūrakmens pakāpiens +Outer Cobblestone Stair=Ārējs mūrakmens pakāpiens +Cobblestone Slab=Mūrakmens plātne +Mossy Cobblestone Stair=Apsūnējuša mūrakmens pakāpiens +Inner Mossy Cobblestone Stair=Apsūnējuša mūrakmens iekšējs pakāpiens +Outer Mossy Cobblestone Stair=Apsūnējuša mūrakmens ārējs pakāpiens +Mossy Cobblestone Slab=Apsūnējuša mūrakmens plātne +Stone Brick Stair=Akmens ķieģeļu pakāpiens +Inner Stone Brick Stair=Iekšējs akmens ķieģeļu pakāpiens +Outer Stone Brick Stair=Ārējs akmens ķieģeļu pakāpiens +Stone Brick Slab=Akmens ķieģeļu plātne +Stone Block Stair=Akmens bloka pakāpiens +Inner Stone Block Stair=Iekšējs akmens bloka pakāpiens +Outer Stone Block Stair=Ārējs akmens bloka pakāpiens +Stone Block Slab=Akmens bloka plātne +Desert Stone Stair=Tuksneša akmens pakāpiens +Inner Desert Stone Stair=Iekšējs tuksneša akmens pakāpiens +Outer Desert Stone Stair=Ārējs tuksneša akmens pakāpiens +Desert Stone Slab=Tuksneša akmens plātne +Desert Cobblestone Stair=Tuksneša mūrakmens pakāpiens +Inner Desert Cobblestone Stair=Iekšējs tuksneša mūrakmens pakāpiens +Outer Desert Cobblestone Stair=Ārējs tuksneša mūrakmens pakāpiens +Desert Cobblestone Slab=Tuksneša mūrakmens plātne +Desert Stone Brick Stair=Tuksneša akmens ķieģeļu pakāpiens +Inner Desert Stone Brick Stair=Iekšējs tuksneša akmens ķieģeļu pakāpiens +Outer Desert Stone Brick Stair=Ārējs tuksneša ķieģeļu pakāpiens +Desert Stone Brick Slab=Tuksneša ķieģeļu plātne +Desert Stone Block Stair=Tuksneša akmens bloka pakāpiens +Inner Desert Stone Block Stair=Iekšējs tuksneša akmens bloka pakāpiens +Outer Desert Stone Block Stair=Ārējs tuksneša akmens bloka pakāpiens +Desert Stone Block Slab=Tuksneša akmens bloka plātne +Sandstone Stair=Smilšakmens pakāpiens +Inner Sandstone Stair=Iekšējs smilšakmens pakāpiens +Outer Sandstone Stair=Ārējs smilšakmens pakāpiens +Sandstone Slab=Smilšakmens plātne +Sandstone Brick Stair=Smilšakmens ķieģeļu pakāpiens +Inner Sandstone Brick Stair=Iekšējs smilšakmens ķieģeļu pakāpiens +Outer Sandstone Brick Stair=Ārējs smilšakmens ķieģeļu pakāpiens +Sandstone Brick Slab=Smilšakmens ķieģeļu plātne +Sandstone Block Stair=Smilšakmens bloka pakāpiens +Inner Sandstone Block Stair=Iekšējs smilšakmens bloka pakāpiens +Outer Sandstone Block Stair=Ārējs smilšakmens bloka pakāpiens +Sandstone Block Slab=Smilšakmens bloka plātne +Desert Sandstone Stair=Tuksneša smilšakmens pakāpiens +Inner Desert Sandstone Stair=Iekšējs tuksneša smilšakmens pakāpiens +Outer Desert Sandstone Stair=Ārējs tuksneša smilšakmens pakāpiens +Desert Sandstone Slab=Tuksneša smilšakmens plātne +Desert Sandstone Brick Stair=Tuksneša smilšakmens ķieģeļu pakāpiens +Inner Desert Sandstone Brick Stair=Iekšējs tuksneša smilšakmens ķieģeļu pakāpiens +Outer Desert Sandstone Brick Stair=Ārējs tuksneša smilšakmens ķieģeļu pakāpiens +Desert Sandstone Brick Slab=Tuksneša smilšakmens ķieģeļu plātne +Desert Sandstone Block Stair=Tuksneša smilšakmens bloka pakāpiens +Inner Desert Sandstone Block Stair=Iekšējs tuksneša smilšakmens bloka pakāpiens +Outer Desert Sandstone Block Stair=Ārējs tuksneša smilšakmens bloka pakāpiens +Desert Sandstone Block Slab=Tuksneša smilšakmens bloka plātne +Silver Sandstone Stair=Baltā smilšakmens pakāpiens +Inner Silver Sandstone Stair=Iekšējs baltā smilšakmens pakāpiens +Outer Silver Sandstone Stair=Ārējs baltā smilšakmens pakāpiens +Silver Sandstone Slab=Baltā smilšakmens plātne +Silver Sandstone Brick Stair=Baltā smilšakmens ķieģeļu pakāpiens +Inner Silver Sandstone Brick Stair=Iekšējs baltā smilšakmens ķieģeļu pakāpiens +Outer Silver Sandstone Brick Stair=Ārējs baltā smilšakmens ķieģeļu pakāpiens +Silver Sandstone Brick Slab=Baltā smilšakmens ķieģeļu plātne +Silver Sandstone Block Stair=Baltā smilšakmens bloka pakāpiens +Inner Silver Sandstone Block Stair=Iekšējs baltā smilšakmens bloka pakāpiens +Outer Silver Sandstone Block Stair=Ārējs baltā smilšakmens bloka pakāpiens +Silver Sandstone Block Slab=Baltā smilšakmens bloka plātne +Obsidian Stair=Obsidiāna pakāpiens +Inner Obsidian Stair=Iekšējs obsidiāna pakāpiens +Outer Obsidian Stair=Ārējs obsidiāna pakāpiens +Obsidian Slab=Obsidiāna plātne +Obsidian Brick Stair=Obsidiāna ķieģeļu pakāpiens +Inner Obsidian Brick Stair=Iekšējs obsidiāna ķieģeļu pakāpiens +Outer Obsidian Brick Stair=Ārējs obsidiāna ķieģeļu pakāpiens +Obsidian Brick Slab=Obsidiāna ķieģeļu plātne +Obsidian Block Stair=Obsidiāna bloka pakāpiens +Inner Obsidian Block Stair=Iekšējs obsidiāna bloka pakāpiens +Outer Obsidian Block Stair=Ārejs obsidiāna bloka pakāpiens +Obsidian Block Slab=Obsidiāna bloka plātne +Brick Stair=Ķieģeļu pakāpiens +Inner Brick Stair=Iekšējs ķieģeļu pakāpiens +Outer Brick Stair=Ārējs ķieģeļu pakāpiens +Brick Slab=Ķieģeļu plātne +Steel Block Stair=Tērauda pakāpiens +Inner Steel Block Stair=Iekšējs tērauda pakāpiens +Outer Steel Block Stair=Ārējs tērauda pakāpiens +Steel Block Slab=Tērauda plātne +Tin Block Stair=Alvas pakāpiens +Inner Tin Block Stair=Iekšējs alvas pakāpiens +Outer Tin Block Stair=Ārējs alvas pakāpiens +Tin Block Slab=Alvas plātne +Copper Block Stair=Vara pakāpiens +Inner Copper Block Stair=Iekšējs vara pakāpiens +Outer Copper Block Stair=Ārējs vara pakāpiens +Copper Block Slab=Vara plātne +Bronze Block Stair=Bronzas pakāpiens +Inner Bronze Block Stair=Iekšējs bronza pakāpiens +Outer Bronze Block Stair=Ārējs bronzas pakāpiens +Bronze Block Slab=Bronzas plātne +Gold Block Stair=Zelta pakāpiens +Inner Gold Block Stair=Iekšējs zelta pakāpiens +Outer Gold Block Stair=Ārējs zelta pakāpiens +Gold Block Slab=Zelta plātne +Ice Stair=Ledus pakāpiens +Inner Ice Stair=Iekšējs ledus pakāpiens +Outer Ice Stair=Ārējs ledus pakāpiens +Ice Slab=Ledus plātne +Snow Block Stair=Sniega pakāpiens +Inner Snow Block Stair=Iekšējs sniega pakāpiens +Outer Snow Block Stair=Ārējs sniega pakāpiens +Snow Block Slab=Sniega plātne diff --git a/data/games/garage/mods/stairs/locale/stairs.ms.tr b/data/games/garage/mods/stairs/locale/stairs.ms.tr new file mode 100644 index 0000000..a39c7f6 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.ms.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Tangga Kaca +Glass Slab=Papak Kaca +Inner Glass Stair=Tangga Kaca Dalaman +Outer Glass Stair=Tangga Kaca Luaran +Obsidian Glass Stair=Tangga Obsidia +Obsidian Glass Slab=Papak Obsidia +Inner Obsidian Glass Stair=Tangga Obsidia Dalaman +Outer Obsidian Glass Stair=Tangga Obsidia Luaran +Wooden Stair=Tangga Kayu +Inner Wooden Stair=Tangga Kayu Dalaman +Outer Wooden Stair=Tangga Kayu Luaran +Wooden Slab=Papak Kayu +Jungle Wood Stair=Tangga Kayu Hutan +Inner Jungle Wood Stair=Tangga Kayu Hutan Dalaman +Outer Jungle Wood Stair=Tangga Kayu Hutan Luaran +Jungle Wood Slab=Papak Kayu Hutan +Pine Wood Stair=Tangga Kayu Pain +Inner Pine Wood Stair=Tangga Kayu Pain Dalaman +Outer Pine Wood Stair=Tangga Kayu Pain Luaran +Pine Wood Slab=Papak Kayu Pain +Acacia Wood Stair=Tangga Kayu Akasia +Inner Acacia Wood Stair=Tangga Kayu Akasia Dalaman +Outer Acacia Wood Stair=Tangga Kayu Akasia Luaran +Acacia Wood Slab=Papak Kayu Akasia +Aspen Wood Stair=Tangga Kayu Aspen +Inner Aspen Wood Stair=Tangga Kayu Aspen Dalaman +Outer Aspen Wood Stair=Tangga Kayu Aspen Luaran +Aspen Wood Slab=Papak Kayu Aspen +Stone Stair=Tangga Batu +Inner Stone Stair=Tangga Batu Dalaman +Outer Stone Stair=Tangga Batu Luaran +Stone Slab=Papak Batu +Cobblestone Stair=Tangga Batu Buntar +Inner Cobblestone Stair=Tangga Batu Buntar Dalaman +Outer Cobblestone Stair=Tangga Batu Buntar Luaran +Cobblestone Slab=Papak Batu Buntar +Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut +Inner Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut Dalaman +Outer Mossy Cobblestone Stair=Tangga Batu Buntar Berlumut Luaran +Mossy Cobblestone Slab=Papak Batu Buntar Berlumut +Stone Brick Stair=Tangga Bata Batu +Inner Stone Brick Stair=Tangga Bata Batu Dalaman +Outer Stone Brick Stair=Tangga Bata Batu Luaran +Stone Brick Slab=Papak Bata Batu +Stone Block Stair=Tangga Bongkah Batu +Inner Stone Block Stair=Tangga Bongkah Batu Dalaman +Outer Stone Block Stair=Tangga Bongkah Batu Luaran +Stone Block Slab=Papak Bongkah Batu +Desert Stone Stair=Tangga Batu Gurun +Inner Desert Stone Stair=Tangga Batu Gurun Dalaman +Outer Desert Stone Stair=Tangga Batu Gurun Luaran +Desert Stone Slab=Papak Batu Gurun +Desert Cobblestone Stair=Tangga Batu Buntar Gurun +Inner Desert Cobblestone Stair=Tangga Batu Buntar Gurun Dalaman +Outer Desert Cobblestone Stair=Tangga Batu Buntar Gurun Luaran +Desert Cobblestone Slab=Papak Batu Buntar Gurun +Desert Stone Brick Stair=Tangga Bata Batu Gurun +Inner Desert Stone Brick Stair=Tangga Bata Batu Gurun Dalaman +Outer Desert Stone Brick Stair=Tangga Bata Batu Gurun Luaran +Desert Stone Brick Slab=Papak Bata Batu Gurun +Desert Stone Block Stair=Tangga Bongkah Batu Gurun +Inner Desert Stone Block Stair=Tangga Bongkah Batu Gurun Dalaman +Outer Desert Stone Block Stair=Tangga Bongkah Batu Gurun Luaran +Desert Stone Block Slab=Papak Bongkah Batu Gurun +Sandstone Stair=Tangga Batu Pasir +Inner Sandstone Stair=Tangga Batu Pasir Dalaman +Outer Sandstone Stair=Tangga Batu Pasir Luaran +Sandstone Slab=Papak Batu Pasir +Sandstone Brick Stair=Tangga Bata Batu Pasir +Inner Sandstone Brick Stair=Tangga Bata Batu Pasir Dalaman +Outer Sandstone Brick Stair=Tangga Bata Batu Pasir Luaran +Sandstone Brick Slab=Papak Bata Batu Pasir +Sandstone Block Stair=Tangga Bongkah Batu Pasir +Inner Sandstone Block Stair=Tangga Bongkah Batu Pasir Dalaman +Outer Sandstone Block Stair=Tangga Bongkah Batu Pasir Luaran +Sandstone Block Slab=Papak Bongkah Batu Pasir +Desert Sandstone Stair=Tangga Batu Pasir Gurun +Inner Desert Sandstone Stair=Tangga Batu Pasir Gurun Dalaman +Outer Desert Sandstone Stair=Tangga Batu Pasir Gurun Luaran +Desert Sandstone Slab=Papak Batu Pasir Gurun +Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun +Inner Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun Dalaman +Outer Desert Sandstone Brick Stair=Tangga Bata Batu Pasir Gurun Luaran +Desert Sandstone Brick Slab=Papak Bata Batu Pasir Gurun +Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun +Inner Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun Dalaman +Outer Desert Sandstone Block Stair=Tangga Bongkah Batu Pasir Gurun Luaran +Desert Sandstone Block Slab=Papak Bongkah Batu Pasir Gurun +Silver Sandstone Stair=Tangga Batu Pasir Perak +Inner Silver Sandstone Stair=Tangga Batu Pasir Perak Dalaman +Outer Silver Sandstone Stair=Tangga Batu Pasir Perak Luaran +Silver Sandstone Slab=Papak Batu Pasir Perak +Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak +Inner Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak Dalaman +Outer Silver Sandstone Brick Stair=Tangga Bata Batu Pasir Perak Luaran +Silver Sandstone Brick Slab=Papak Bata Batu Pasir Perak +Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak +Inner Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak Dalaman +Outer Silver Sandstone Block Stair=Tangga Bongkah Batu Pasir Perak Luaran +Silver Sandstone Block Slab=Papak Bongkah Batu Pasir Perak +Obsidian Stair=Tangga Obsidia +Inner Obsidian Stair=Tangga Obsidia Dalaman +Outer Obsidian Stair=Tangga Obsidia Luaran +Obsidian Slab=Papak Obsidia +Obsidian Brick Stair=Tangga Bata Obsidia +Inner Obsidian Brick Stair=Tangga Bata Obsidia Dalaman +Outer Obsidian Brick Stair=Tangga Bata Obsidia Luaran +Obsidian Brick Slab=Papak Bata Obsidia +Obsidian Block Stair=Tangga Bongkah Obsidia +Inner Obsidian Block Stair=Tangga Bongkah Obsidia Dalaman +Outer Obsidian Block Stair=Tangga Bongkah Obsidia Luaran +Obsidian Block Slab=Papak Bongkah Obsidia +Brick Stair=Tangga Bata +Inner Brick Stair=Tangga Bata Dalaman +Outer Brick Stair=Tangga Bata Luaran +Brick Slab=Papak Bata +Steel Block Stair=Tangga Bongkah Keluli +Inner Steel Block Stair=Tangga Bongkah Keluli Dalaman +Outer Steel Block Stair=Tangga Bongkah Keluli Luaran +Steel Block Slab=Papak Bongkah Keluli +Tin Block Stair=Tangga Bongkah Timah +Inner Tin Block Stair=Tangga Bongkah Timah Dalaman +Outer Tin Block Stair=Tangga Bongkah Timah Luaran +Tin Block Slab=Papak Bongkah Timah +Copper Block Stair=Tangga Bongkah Tembaga +Inner Copper Block Stair=Tangga Bongkah Tembaga Dalaman +Outer Copper Block Stair=Tangga Bongkah Tembaga Luaran +Copper Block Slab=Papak Bongkah Tembaga +Bronze Block Stair=Tangga Bongkah Gangsa +Inner Bronze Block Stair=Tangga Bongkah Gangsa Dalaman +Outer Bronze Block Stair=Tangga Bongkah Gangsa Luaran +Bronze Block Slab=Papak Bongkah Gangsa +Gold Block Stair=Tangga Bongkah Emas +Inner Gold Block Stair=Tangga Bongkah Emas Dalaman +Outer Gold Block Stair=Tangga Bongkah Emas Luaran +Gold Block Slab=Papak Bongkah Emas +Ice Stair=Tangga Ais +Inner Ice Stair=Tangga Ais Dalaman +Outer Ice Stair=Tangga Ais Luaran +Ice Slab=Papak Ais +Snow Block Stair=Tangga Bongkah Salji +Inner Snow Block Stair=Tangga Bongkah Salji Dalaman +Outer Snow Block Stair=Tangga Bongkah Salji Luaran +Snow Block Slab=Papak Bongkah Salji diff --git a/data/games/garage/mods/stairs/locale/stairs.pl.tr b/data/games/garage/mods/stairs/locale/stairs.pl.tr new file mode 100644 index 0000000..14eed7b --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.pl.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Schody ze szkła +Glass Slab=Półblok ze szkła +Inner Glass Stair=Wewnętrzne schody ze szkła +Outer Glass Stair=Zewnętrzne schody ze szkła +Obsidian Glass Stair=Schody z obsydianowego szkła +Obsidian Glass Slab=Półblok z obsydianowego szkła +Inner Obsidian Glass Stair=Wewnętrzne schody z obsydianowego szkła +Outer Obsidian Glass Stair=Zewnętrzne schody z obsydianowego szkła +Wooden Stair=Schody z drewna +Inner Wooden Stair=Wewnętrzne schody z drewna +Outer Wooden Stair=Zewnętrzne schody z drewna +Wooden Slab=Półblok z drewna +Jungle Wood Stair=Schody z dżunglowego drewna +Inner Jungle Wood Stair=Wewnętrzne schody z dżunglowego drewna +Outer Jungle Wood Stair=Zewnętrzne schody z dżunglowego drewna +Jungle Wood Slab=Półblok z dżunglowego drewna +Pine Wood Stair=Schody z sosnowego drzewa +Inner Pine Wood Stair=Wewnętrzne schody z sosnowego drewna +Outer Pine Wood Stair=Zewnętrzne schody z sosnowego drewna +Pine Wood Slab=Półblok z sosnowego drewna +Acacia Wood Stair=Schody z akacjowego drewna +Inner Acacia Wood Stair=Wewnętrzne schody z akacjowego drewna +Outer Acacia Wood Stair=Zewnętrzne schody z akacjowego drewna +Acacia Wood Slab=Półblok z akacjowego drewna +Aspen Wood Stair=Schody z brzozowego drewna +Inner Aspen Wood Stair=Wewnętrzne schody z brzozowego drewna +Outer Aspen Wood Stair=Zewnętrzne schody z brzozowego drewna +Aspen Wood Slab=Półblok z brzozowego drewna +Stone Stair=Schody z kamienia +Inner Stone Stair=Wewnętrzne schody z kamienia +Outer Stone Stair=Zewnętrzne schody z kamienia +Stone Slab=Półblok z kamienia +Cobblestone Stair=Schody z bruku +Inner Cobblestone Stair=Wewnętrzne schody z bruku +Outer Cobblestone Stair=Zewnętrzne schody z bruku +Cobblestone Slab=Półblok z bruku +Mossy Cobblestone Stair=Schody z bruku z mchem +Inner Mossy Cobblestone Stair=Wewnętrzne schody z bruku z mchem +Outer Mossy Cobblestone Stair=Zewnętrzne schody z bruku z mchem +Mossy Cobblestone Slab=Półblok z bruku z mchem +Stone Brick Stair=Schody z kamiennych cegieł +Inner Stone Brick Stair=Wewnętrzne schody z kamiennych cegieł +Outer Stone Brick Stair=Zewnętrzne schody z kamiennych cegieł +Stone Brick Slab=Półblok z kamiennych cegieł +Stone Block Stair=Schody z kamiennego bloku +Inner Stone Block Stair=Wewnętrzne schody z kamiennego bloku +Outer Stone Block Stair=Zewnętrzne schody z kamiennego bloku +Stone Block Slab=Półblok z kamiennego bloku +Desert Stone Stair=Schody z pustynnego kamienia +Inner Desert Stone Stair=Wewnętrzne schody z pustynnego kamienia +Outer Desert Stone Stair=Zewnętrzne schody z pustynnego kamienia +Desert Stone Slab=Półblok z pustynnego kamienia +Desert Cobblestone Stair=Schody z pustynnego bruku +Inner Desert Cobblestone Stair=Wewnętrzne schody z pustynnego bruku +Outer Desert Cobblestone Stair=Zewnętrzne schody z pustynnego bruku +Desert Cobblestone Slab=Półblok z pustynnego bruku +Desert Stone Brick Stair=Schody z pustynnych kamiennych cegieł +Inner Desert Stone Brick Stair=Wewnętrzne schody z pustynnych kamiennych cegieł +Outer Desert Stone Brick Stair=Zewnętrzne schody z pustynnych kamiennych cegieł +Desert Stone Brick Slab=Półblok z pustynnych kamiennych cegieł +Desert Stone Block Stair=Schody z pustynnego kamiennego bloku +Inner Desert Stone Block Stair=Wewnętrzne schody z pustynnego kamiennego bloku +Outer Desert Stone Block Stair=Zewnętrzne schody z pustynnego kamiennego bloku +Desert Stone Block Slab=Półblok z pustynnego kamiennego bloku +Sandstone Stair=Schody z piaskowca +Inner Sandstone Stair=Wewnętrzne schody z piaskowca +Outer Sandstone Stair=Zewnętrzne schody z piaskowca +Sandstone Slab=Półblok z piaskowca +Sandstone Brick Stair=Schody z piaskowcowych cegieł +Inner Sandstone Brick Stair=Wewnętrzne schody z piaskowcowych cegieł +Outer Sandstone Brick Stair=Zewnętrzne schody z piaskowcowych cegieł +Sandstone Brick Slab=Półblok z piaskowcowych cegieł +Sandstone Block Stair=Schody z piaskowcowego bloku +Inner Sandstone Block Stair=Wewnętrzne schody z piaskowcowego bloku +Outer Sandstone Block Stair=Zewnętrzne schody z piaskowcowego bloku +Sandstone Block Slab=Półblok z piaskowcowego bloku +Desert Sandstone Stair=Schody z pustynnego piaskowca +Inner Desert Sandstone Stair=Wewnętrzne schody z pustynnego piaskowca +Outer Desert Sandstone Stair=Zewnętrzne schody z pustynnego piaskowca +Desert Sandstone Slab=Półblok z pustynnego piaskowca +Desert Sandstone Brick Stair=Schody z pustynnych piaskowcowych cegieł +Inner Desert Sandstone Brick Stair=Wewnętrzne schody z pustynnych piaskowcowych cegieł +Outer Desert Sandstone Brick Stair=Zewnętrzne schody z pustynnych piaskowcowych cegieł +Desert Sandstone Brick Slab=Półblok z pustynnych piaskowcowych cegieł +Desert Sandstone Block Stair=Schody z pustynnego piaskowcowego bloku +Inner Desert Sandstone Block Stair=Wewnętrzne schody z pustynnego piaskowcowego bloku +Outer Desert Sandstone Block Stair=Zewnętrzne schody z pustynnego piaskowcowego bloku +Desert Sandstone Block Slab=Półblok z pustynnego piaskowcowego bloku +Silver Sandstone Stair=Schody z srebrnego piaskowca +Inner Silver Sandstone Stair=Wewnętrzne schody z srebrnego piaskowca +Outer Silver Sandstone Stair=Zewnętrzne schody z srebrnego piaskowca +Silver Sandstone Slab=Półblok z srebrnego piaskowca +Silver Sandstone Brick Stair=Schody z srebrnych piaskowcowych cegieł +Inner Silver Sandstone Brick Stair=Wewnętrzne schody z srebrnych piaskowcowych cegieł +Outer Silver Sandstone Brick Stair=Zewnętrzne schody z srebrnych piaskowcowych cegieł +Silver Sandstone Brick Slab=Półblok z srebrnych piaskowcowych cegieł +Silver Sandstone Block Stair=Schody z srebrnego piaskowcowego bloku +Inner Silver Sandstone Block Stair=Wewnętrzne schody z srebrnego piaskowcowego bloku +Outer Silver Sandstone Block Stair=Zewnętrzne schody z srebrnego piaskowcowego bloku +Silver Sandstone Block Slab=Półblok z srebrnego piaskowcowego bloku +Obsidian Stair=Schody z obsydianu +Inner Obsidian Stair=Wewnętrzne schody z obsydianu +Outer Obsidian Stair=Zewnętrzne schody z obsydianu +Obsidian Slab=Półblok z obsydianu +Obsidian Brick Stair=Schody z obsydianowych cegieł +Inner Obsidian Brick Stair=Wewnętrzne schody z obsydianowych cegieł +Outer Obsidian Brick Stair=Zewnętrzne schody z obsydianowych cegieł +Obsidian Brick Slab=Półblok z obsydianowych cegieł +Obsidian Block Stair=Schody z obsydianowego bloku +Inner Obsidian Block Stair=Wewnętrzne schody z obsydianowego bloku +Outer Obsidian Block Stair=Zewnętrzne schody z obsydianowego bloku +Obsidian Block Slab=Półblok z obsydianowego bloku +Brick Stair=Schody z cegieł +Inner Brick Stair=Wewnętrzne schody z cegieł +Outer Brick Stair=Zewnętrzne schody z cegieł +Brick Slab=Półblok z cegieł +Steel Block Stair=Schody z bloku stali +Inner Steel Block Stair=Wewnętrzne schody z bloku stali +Outer Steel Block Stair=Zewnętrzne schody z bloku stali +Steel Block Slab=Półblok z bloku stali +Tin Block Stair=Schody z bloku cyny +Inner Tin Block Stair=Wewnętrzne schody z bloku cyny +Outer Tin Block Stair=Zewnętrzne schody z bloku cyny +Tin Block Slab=Półblok z bloku cyny +Copper Block Stair=Schody z bloku miedzi +Inner Copper Block Stair=Wewnętrzne schody z bloku miedzi +Outer Copper Block Stair=Zewnętrzne schody z bloku miedzi +Copper Block Slab=Półblok z bloku miedzi +Bronze Block Stair=Schody z bloku brązu +Inner Bronze Block Stair=Wewnętrnze schody z bloku brązu +Outer Bronze Block Stair=Zewnętrzne schody z bloku brązu +Bronze Block Slab=Półblok z bloku brązu +Gold Block Stair=Schody z bloku złota +Inner Gold Block Stair=Wewnętrzne schody z block złota +Outer Gold Block Stair=Zewnętrzne schody z bloku złota +Gold Block Slab=Półblok z bloku złota +Ice Stair=Schody z lodu +Inner Ice Stair=Wewnętrzne schody z lodu +Outer Ice Stair=Zewnętrzne schody z lodu +Ice Slab=Półblok z lodu +Snow Block Stair=Schody ze śniegu +Inner Snow Block Stair=Wewnętrzne schody ze śniegu +Outer Snow Block Stair=Zewnętrzne schody ze śniegu +Snow Block Slab=Półblok ze śniegu diff --git a/data/games/garage/mods/stairs/locale/stairs.pt_BR.tr b/data/games/garage/mods/stairs/locale/stairs.pt_BR.tr new file mode 100644 index 0000000..41777a8 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.pt_BR.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Escada de vidro +Glass Slab=Placa de vidro +Inner Glass Stair=Escada interior de vidro +Outer Glass Stair=Escada exterior de vidro +Obsidian Glass Stair=Escada de vidro de obsidiana +Obsidian Glass Slab=Placa de vidro de obsidiana +Inner Obsidian Glass Stair=Escada interior de vidro de obsidiana +Outer Obsidian Glass Stair=Escada exterior de vidro de obsidiana +Wooden Stair=Escada de madeira +Inner Wooden Stair=Escada interior de madeira +Outer Wooden Stair=Escada exterior de madeira +Wooden Slab=Laje de madeira +Jungle Wood Stair=Escada de madeira da selva +Inner Jungle Wood Stair=Escada interior de madeira da selva +Outer Jungle Wood Stair=Escada exterior de madeira da selva +Jungle Wood Slab=Laje de madeira da selva +Pine Wood Stair=Escada de madeira de pinho +Inner Pine Wood Stair=Escada interior de madeira de pinho +Outer Pine Wood Stair=Escada exterior de madeira de pinho +Pine Wood Slab=Laje de madeira de pinho +Acacia Wood Stair=Escada de madeira de acácia +Inner Acacia Wood Stair=Escada interior de madeira de acácia +Outer Acacia Wood Stair=Escada exterior de madeira de acácia +Acacia Wood Slab=Placa de madeira de acácia +Aspen Wood Stair=Escada de Álamo +Inner Aspen Wood Stair=Escada interior de Álamo +Outer Aspen Wood Stair=Escada exterior de Álamo +Aspen Wood Slab=Laje de Álamo +Stone Stair=Escada de Pedra +Inner Stone Stair=Escada interior de Pedra +Outer Stone Stair=Escada exterior de Pedra +Stone Slab=Laje de pedra +Cobblestone Stair=Escada de paralelepípedo +Inner Cobblestone Stair=Escada interior de paralelepípedo +Outer Cobblestone Stair=Escada exterior de paralelepípedo +Cobblestone Slab=Laje de paralelepípedo +Mossy Cobblestone Stair=Escada de paralelepípedo com musgo +Inner Mossy Cobblestone Stair=Escada interior de paralelepípedo com musgo +Outer Mossy Cobblestone Stair=Escada exterior de paralelepípedo com musgo +Mossy Cobblestone Slab=Laje de paralelepípedo com musgo +Stone Brick Stair=Escada de tijolo de pedra +Inner Stone Brick Stair=Escada interior de tijolo de pedra +Outer Stone Brick Stair=Escada exterior de tijolo de pedra +Stone Brick Slab=Laje de tijolo de pedra +Stone Block Stair=Escada Bloco de Pedra +Inner Stone Block Stair=Escada Interna de Bloco de Pedra +Outer Stone Block Stair=Escada Externa de Bloco de Pedra +Stone Block Slab=Laje de bloco de pedra +Desert Stone Stair=Escada de Pedra do Deserto +Inner Desert Stone Stair=Escada Interior de Pedra do Deserto +Outer Desert Stone Stair=Escada Exterior de Pedra do Deserto +Desert Stone Slab=Laje de pedra do deserto +Desert Cobblestone Stair=Escada de paralelepípedo do deserto +Inner Desert Cobblestone Stair=Escada interior de paralelepípedo do deserto +Outer Desert Cobblestone Stair=Escada exterior de paralelepípedo do deserto +Desert Cobblestone Slab=Laje de paralelepípedo do deserto +Desert Stone Brick Stair=Escada de tijolo de pedra do deserto +Inner Desert Stone Brick Stair=Escada interior de tijolos de pedra do deserto +Outer Desert Stone Brick Stair=Escada exterior de tijolos de pedra do deserto +Desert Stone Brick Slab=Laje de tijolo de pedra do deserto +Desert Stone Block Stair=Escada de Bloco de Pedra do Deserto +Inner Desert Stone Block Stair=Escada interior de bloco de pedra do deserto +Outer Desert Stone Block Stair=Escada exterior de Bloco de Pedra do Deserto +Desert Stone Block Slab=Laje do bloco de pedra do deserto +Sandstone Stair=Escada de arenito +Inner Sandstone Stair=Escada interior de arenito +Outer Sandstone Stair=Escada Exterior de Arenito +Sandstone Slab=Laje de arenito +Sandstone Brick Stair=Escada de tijolo de arenito +Inner Sandstone Brick Stair=Escada interior de tijolos de arenito +Outer Sandstone Brick Stair=Escada Exterior de Tijolo de Arenito +Sandstone Brick Slab=Laje de tijolo de arenito +Sandstone Block Stair=Escada do Bloco de Arenito +Inner Sandstone Block Stair=Escada interior de bloco de arenito +Outer Sandstone Block Stair=Escada exterior de bloco de arenito +Sandstone Block Slab=Laje de bloco de arenito +Desert Sandstone Stair=Escada de arenito do deserto +Inner Desert Sandstone Stair=Escada interior de arenito do deserto +Outer Desert Sandstone Stair=Escada exterior de arenito do deserto +Desert Sandstone Slab=Laje de arenito do deserto +Desert Sandstone Brick Stair=Escada de tijolos de arenito do deserto +Inner Desert Sandstone Brick Stair=Escada interior de tijolos de arenito do deserto +Outer Desert Sandstone Brick Stair=Escada exterior de tijolos de arenito do deserto +Desert Sandstone Brick Slab=Laje de tijolo de arenito do deserto +Desert Sandstone Block Stair=Escada do bloco de arenito do deserto +Inner Desert Sandstone Block Stair=Escada interior do bloco de arenito do deserto +Outer Desert Sandstone Block Stair=Escada exterior de bloco de arenito do deserto +Desert Sandstone Block Slab=Laje de bloco de arenito do deserto +Silver Sandstone Stair=Escada de arenito prateado +Inner Silver Sandstone Stair=Escada interior de Arenito Prateado +Outer Silver Sandstone Stair=Escada exterior de Arenito Prateado +Silver Sandstone Slab=Laje de arenito prateado +Silver Sandstone Brick Stair=Escada de tijolos de arenito prateado +Inner Silver Sandstone Brick Stair=Escada interior de tijolos de arenito prateado +Outer Silver Sandstone Brick Stair=Escada exterior de tijolos de arenito prateado +Silver Sandstone Brick Slab=Laje de tijolo de arenito prateado +Silver Sandstone Block Stair=Escada de blocos de arenito prateado +Inner Silver Sandstone Block Stair=Escada interior de bloco de arenito prateado +Outer Silver Sandstone Block Stair=Escada exterior de bloco de arenito prateado +Silver Sandstone Block Slab=Laje de bloco de arenito prateado +Obsidian Stair=Escada de Obsidiana +Inner Obsidian Stair=Escada interior de Obsidiana +Outer Obsidian Stair=Escada exterior de Obsidiana +Obsidian Slab=Laje de Obsidiana +Obsidian Brick Stair=Escada de Tijolos de Obsidiana +Inner Obsidian Brick Stair=Escada interna de Tijolos de Obsidiana +Outer Obsidian Brick Stair=Escada externa de Tijolos de Obsidiana +Obsidian Brick Slab=Laje de tijolos de obsidiana +Obsidian Block Stair=Escada de Bloco de Obsidiana +Inner Obsidian Block Stair=Escada interior de Bloco de obsidiana +Outer Obsidian Block Stair=Escada exterior de Bloco de obsidiana +Obsidian Block Slab=Laje de bloco de obsidiana +Brick Stair=Escada de Tijolos +Inner Brick Stair=Escada interior de Tijolos +Outer Brick Stair=Escada exterior de Tijolos +Brick Slab=Laje de tijolos +Steel Block Stair=Escada de bloco de aço +Inner Steel Block Stair=Escada interior de bloco de aço +Outer Steel Block Stair=Escada exterior de bloco de aço +Steel Block Slab=Laje de bloco de aço +Tin Block Stair=Escada de bloco de estanho +Inner Tin Block Stair=Escada interior de bloco de estanho +Outer Tin Block Stair=Escada exterior de bloco de lata +Tin Block Slab=Laje de bloco de estanho +Copper Block Stair=Escada de bloco de cobre +Inner Copper Block Stair=Escada interior de Bloco de Cobre +Outer Copper Block Stair=Escada exterior do Bloco de Cobre +Copper Block Slab=Laje de bloco de cobre +Bronze Block Stair=Escada Bloco de Bronze +Inner Bronze Block Stair=Escada interior de bloco de bronze +Outer Bronze Block Stair=Escada exterior de Bloco de Bronze +Bronze Block Slab=Laje de bloco de bronze +Gold Block Stair=Escada Bloco de Ouro +Inner Gold Block Stair=Escada interior de Bloco de Ouro +Outer Gold Block Stair=Escada exterior de Bloco de Ouro +Gold Block Slab=Laje de Bloco de Ouro +Ice Stair=Escada de gelo +Inner Ice Stair=Escada de gelo interior +Outer Ice Stair=Escada de gelo exterior +Ice Slab=Laje de gelo +Snow Block Stair=Escada Bloco de Neve +Inner Snow Block Stair=Escada de bloco de neve interior +Outer Snow Block Stair=Escada de bloco de neve exterior +Snow Block Slab=Laje de bloco de neve diff --git a/data/games/garage/mods/stairs/locale/stairs.ru.tr b/data/games/garage/mods/stairs/locale/stairs.ru.tr new file mode 100644 index 0000000..1296d4a --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.ru.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Стеклянные ступени +Glass Slab=Стеклянная плита +Inner Glass Stair=Внутренние стеклянные ступени +Outer Glass Stair=Внешние стеклянные ступени +Obsidian Glass Stair=Ступени из обсидианового стекла +Obsidian Glass Slab=Плита из обсидианового стекла +Inner Obsidian Glass Stair=Внутренние ступени из обсидианового стекла +Outer Obsidian Glass Stair=Внешние ступени из обсидианового стекла +Wooden Stair=Деревянные ступени +Inner Wooden Stair=Внутренние деревянные ступени +Outer Wooden Stair=Внешние деревянные ступени +Wooden Slab=Деревянная плита +Jungle Wood Stair=Ступени из тропического дерева +Inner Jungle Wood Stair=Внутренние ступени из тропического дерева +Outer Jungle Wood Stair=Внешние ступени из тропического дерева +Jungle Wood Slab=Плита из тропического дерева +Pine Wood Stair=Сосновые ступени +Inner Pine Wood Stair=Внутренние сосновые ступени +Outer Pine Wood Stair=Внешние сосновые ступени +Pine Wood Slab=Сосновая плита +Acacia Wood Stair=Акациевые ступени +Inner Acacia Wood Stair=Внутренние акациевые ступени +Outer Acacia Wood Stair=Внешние акациевые ступени +Acacia Wood Slab=Акациевая плита +Aspen Wood Stair=Осиновые ступени +Inner Aspen Wood Stair=Внутренние осиновые ступени +Outer Aspen Wood Stair=Внешние осиновые ступени +Aspen Wood Slab=Осиновая плита +Stone Stair=Каменные ступени +Inner Stone Stair=Внутренние каменные ступени +Outer Stone Stair=Внешние каменные ступени +Stone Slab=Каменная плита +Cobblestone Stair=Булыжниковые ступени +Inner Cobblestone Stair=Внутренние булыжниковые ступени +Outer Cobblestone Stair=Внешние булыжниковые ступени +Cobblestone Slab=Булыжниковая плита +Mossy Cobblestone Stair=Ступени из замшелого булыжника +Inner Mossy Cobblestone Stair=Внутренние ступени из замшелого булыжника +Outer Mossy Cobblestone Stair=Внешние ступени из замшелого булыжника +Mossy Cobblestone Slab=Плита из замшелого булыжника +Stone Brick Stair=Cтупени из каменных кирпичей +Inner Stone Brick Stair=Внутренние ступени из каменных кирпичей +Outer Stone Brick Stair=Внешние ступени из каменных кирпичей +Stone Brick Slab=Плита из каменных кирпичей +Stone Block Stair=Ступени из камня +Inner Stone Block Stair=Внутренние ступени из камня +Outer Stone Block Stair=Внешние ступени из камня +Stone Block Slab=Плита из камня +Desert Stone Stair=Ступени из пустынного камня +Inner Desert Stone Stair=Внутренние ступени из пустынного камня +Outer Desert Stone Stair=Внешние ступени из пустынного камня +Desert Stone Slab=Плита из пустынного камня +Desert Cobblestone Stair=Ступени из пустынного булыжника +Inner Desert Cobblestone Stair=Внутренние ступени из пустынного булыжника +Outer Desert Cobblestone Stair=Внешние ступени из пустынного булыжника +Desert Cobblestone Slab=Плита из пустынного булыжника +Desert Stone Brick Stair=Ступени из пустынных каменных кирпичей +Inner Desert Stone Brick Stair=Внутренние ступени из пустынных каменных кирпичей +Outer Desert Stone Brick Stair=Внешние ступени из пустынных каменных кирпичей +Desert Stone Brick Slab=Плита из пустынных каменных кирпичей +Desert Stone Block Stair=Ступени из пустынного каменного блока +Inner Desert Stone Block Stair=Внутренние ступени из пустынного каменного блока +Outer Desert Stone Block Stair=Внешние ступени из пустынного каменного блока +Desert Stone Block Slab=Плита из пустынного каменного блока +Sandstone Stair=Песчаниковые ступени +Inner Sandstone Stair=Внутренние песчаниковые ступени +Outer Sandstone Stair=Внешние песчаниковые ступени +Sandstone Slab=Песчаниковая плита +Sandstone Brick Stair=Ступени из песчаниковых кирпичей +Inner Sandstone Brick Stair=Внутренние ступени из песчаниковых кирпичей +Outer Sandstone Brick Stair=Внешние ступени из песчаниковых кирпичей +Sandstone Brick Slab=Плита из песчаниковых кирпичей +Sandstone Block Stair=Ступени из песчаникового блока +Inner Sandstone Block Stair=Внутренние ступени из песчаникового блока +Outer Sandstone Block Stair=Внешние ступени из песчаникового блока +Sandstone Block Slab=Плита из песчаникового блока +Desert Sandstone Stair=Ступени из пустынного песчаника +Inner Desert Sandstone Stair=Внутренние ступени из пустынного песчаника +Outer Desert Sandstone Stair=Внешние ступени из пустынного песчаника +Desert Sandstone Slab=Плита из пустынного песчаника +Desert Sandstone Brick Stair=Ступени из пустынных песчаниковых кирпичей +Inner Desert Sandstone Brick Stair=Внутренние ступени из пустынных песчаниковых кирпичей +Outer Desert Sandstone Brick Stair=Внешние ступени из пустынных песчаниковых кирпичей +Desert Sandstone Brick Slab=Плита из пустынных песчаниковых кирпичей +Desert Sandstone Block Stair=Ступени из пустынного песчаникового блока +Inner Desert Sandstone Block Stair=Внутренние ступени из пустынного песчаникового блока +Outer Desert Sandstone Block Stair=Внешние ступени из пустынного песчаникового блока +Desert Sandstone Block Slab=Плита из пустынного песчаникового блока +Silver Sandstone Stair=Ступени из серебристого песчаника +Inner Silver Sandstone Stair=Внутренние ступени из серебристого песчаника +Outer Silver Sandstone Stair=Внешние ступени из серебристого песчаника +Silver Sandstone Slab=Плита из серебристого песчаника +Silver Sandstone Brick Stair=Ступени из серебристых песчаниковых кирпичей +Inner Silver Sandstone Brick Stair=Внутренние ступени из серебристых песчаниковых кирпичей +Outer Silver Sandstone Brick Stair=Внешние ступени из серебристых песчаниковых кирпичей +Silver Sandstone Brick Slab=Плита из серебристых песчаниковых кирпичей +Silver Sandstone Block Stair=Ступени из серебристого песчаникового блока +Inner Silver Sandstone Block Stair=Внутренние ступени из серебристого песчаникового блока +Outer Silver Sandstone Block Stair=Внешние ступени из серебристого песчаникового блока +Silver Sandstone Block Slab=Плита из серебристого песчаникового блока +Obsidian Stair=Обсидиановые ступени +Inner Obsidian Stair=Внутренние обсидиановые ступени +Outer Obsidian Stair=Внешние обсидиановые ступени +Obsidian Slab=Обсидиановая плита +Obsidian Brick Stair=Ступени из обсидиановых кирпичей +Inner Obsidian Brick Stair=Внутренние ступени из обсидиановых кирпичей +Outer Obsidian Brick Stair=Внешние ступени из обсидиановых кирпичей +Obsidian Brick Slab=Плита из обсидиановых кирпичей +Obsidian Block Stair=Ступени из обсидианового блока +Inner Obsidian Block Stair=Внутренние ступени из обсидианового блока +Outer Obsidian Block Stair=Внешние ступени из обсидианового блока +Obsidian Block Slab=Плита из обсидианового блока +Brick Stair=Кирпичные ступени +Inner Brick Stair=Внутренние кирпичные ступени +Outer Brick Stair=Внешние кирпичные ступени +Brick Slab=Кирпичная плита +Steel Block Stair=Стальные ступени +Inner Steel Block Stair=Внутренние стальные ступени +Outer Steel Block Stair=Внешние стальные ступени +Steel Block Slab=Стальная плита +Tin Block Stair=Оловянные ступени +Inner Tin Block Stair=Внутренние оловянные ступени +Outer Tin Block Stair=Внешние оловянные ступени +Tin Block Slab=Оловянная плита +Copper Block Stair=Медные ступени +Inner Copper Block Stair=Внутренние медные ступени +Outer Copper Block Stair=Внешние медные ступени +Copper Block Slab=Медная плита +Bronze Block Stair=Бронзовые ступени +Inner Bronze Block Stair=Внутренние бронзовые ступени +Outer Bronze Block Stair=Внешние бронзовые ступени +Bronze Block Slab=Бронзовая плита +Gold Block Stair=Золотые ступени +Inner Gold Block Stair=Внутренние золотые ступени +Outer Gold Block Stair=Внешние золотые ступени +Gold Block Slab=Золотая плита +Ice Stair=Ледяные ступени +Inner Ice Stair=Внутренние ледяные ступени +Outer Ice Stair=Внешние ледяные ступени +Ice Slab=Ледяная плита +Snow Block Stair=Снежные ступени +Inner Snow Block Stair=Внутренние снежные ступени +Outer Snow Block Stair=Внешние снежные ступени +Snow Block Slab=Снежная плита diff --git a/data/games/garage/mods/stairs/locale/stairs.sk.tr b/data/games/garage/mods/stairs/locale/stairs.sk.tr new file mode 100644 index 0000000..b006fdb --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.sk.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Sklenené schod +Glass Slab=Sklenený stupienok +Inner Glass Stair=Vnútorný sklenené schod +Outer Glass Stair=Vonkajší sklenené schod +Obsidian Glass Stair=Obsidiánové sklenené schod +Obsidian Glass Slab=Obsidiánový sklenený stupienok +Inner Obsidian Glass Stair=Vnútorný obsidiánové sklenené schod +Outer Obsidian Glass Stair=Vonkajší obsidiánové sklenené schod +Wooden Stair=Drevené schod +Inner Wooden Stair=Vnútorný drevené schod +Outer Wooden Stair=Vonkajší drevené schod +Wooden Slab=Drevený stupienok +Jungle Wood Stair=Drevené schod z džungľového dreva +Inner Jungle Wood Stair=Vnútorný drevené schod z džungľového dreva +Outer Jungle Wood Stair=Vonkajší drevené schod z džungľového dreva +Jungle Wood Slab=Stupienok z džungľového dreva +Pine Wood Stair=Drevené schod z borovicového dreva +Inner Pine Wood Stair=Vnútorný drevené schod z borovicového dreva +Outer Pine Wood Stair=Vonkajší drevené schod z borovicového dreva +Pine Wood Slab=Stupienok z borovicového dreva +Acacia Wood Stair=Drevené schod z akáciového dreva +Inner Acacia Wood Stair=Vnútorný drevené schod z akáciového dreva +Outer Acacia Wood Stair=Vonkajší drevené schod z akáciového dreva +Acacia Wood Slab=Stupienok z akáciového dreva +Aspen Wood Stair=Drevené schod z osiky +Inner Aspen Wood Stair=Vnútorný drevené schod z osiky +Outer Aspen Wood Stair=Vonkajší drevené schod z osiky +Aspen Wood Slab=Stupienok z osiky +Stone Stair=Kamenné schod +Inner Stone Stair=Vnútorný kamenné schod +Outer Stone Stair=Vonkajší kamenné schod +Stone Slab=Kamenný stupienok +Cobblestone Stair=Schod z dlažbového kameňa +Inner Cobblestone Stair=Vnútorný schod z dlažbového kameňa +Outer Cobblestone Stair=Vonkajší schod z dlažbového kameňa +Cobblestone Slab=Stupienok z dlažbového kameňa +Mossy Cobblestone Stair=Schod dlažbového kameňa obrastené machom +Inner Mossy Cobblestone Stair=Vnútorný schod dlažbového kameňa obrastené machom +Outer Mossy Cobblestone Stair=Vonkajší schod dlažbového kameňa obrastené machom +Mossy Cobblestone Slab=Stupienok z dlažbového kameňa obrastený machom +Stone Brick Stair=Schod z kamenných tehál +Inner Stone Brick Stair=Vnútorný schod z kamenných tehál +Outer Stone Brick Stair=Vonkajší schod z kamenných tehál +Stone Brick Slab=Stupienok z kamenných tehál +Stone Block Stair=Schod z kameňa +Inner Stone Block Stair=Vnútorný schod z kameňa +Outer Stone Block Stair=Vonkajší schod z kameňa +Stone Block Slab=Stupienok z kameňa +Desert Stone Stair=Schod z púštneho kameňa +Inner Desert Stone Stair=Vnútorný schod z púštneho kameňa +Outer Desert Stone Stair=Vonkajší schod z púštneho kameňa +Desert Stone Slab=Stupienok z púštneho kameňa +Desert Cobblestone Stair=Schod z púštneho dlažbového kameňa +Inner Desert Cobblestone Stair=Vnútorný schod z púštneho dlažbového kameňa +Outer Desert Cobblestone Stair=Vonkajší schod z púštneho dlažbového kameňa +Desert Cobblestone Slab=Stupienok z púštneho dlažbového kameňa +Desert Stone Brick Stair=Schod z tehiel z púštneho kameňa +Inner Desert Stone Brick Stair=Vnútorný schod z tehiel z púštneho kameňa +Outer Desert Stone Brick Stair=Vonkajší schod z tehiel z púštneho kameňa +Desert Stone Brick Slab=Stupienok z tehiel z púštneho kameňa +Desert Stone Block Stair=Schod z blokov púštneho kameňa +Inner Desert Stone Block Stair=Vnútorný schod z blokov púštneho kameňa +Outer Desert Stone Block Stair=Vonkajší schod z blokov púštneho kameňa +Desert Stone Block Slab=Stupienok z blokov púštneho kameňa +Sandstone Stair=Schod z pieskovca +Inner Sandstone Stair=Vnútorný schod z pieskovca +Outer Sandstone Stair=Vonkajší schod z pieskovca +Sandstone Slab=Stupienok z pieskovca +Sandstone Brick Stair=Schod z tehál pieskovca +Inner Sandstone Brick Stair=Vnútorný schod z tehál pieskovca +Outer Sandstone Brick Stair=Vonkajší schod z tehál pieskovca +Sandstone Brick Slab=Stupienok z tehál pieskovca +Sandstone Block Stair=Schod z blokov pieskovca +Inner Sandstone Block Stair=Vnútorný schod z blokov pieskovca +Outer Sandstone Block Stair=Vonkajší schod z blokov pieskovca +Sandstone Block Slab=Stupienok z blokov pieskovca +Desert Sandstone Stair=Schod z púštneho pieskovca +Inner Desert Sandstone Stair=Vnútorný schod z púštneho pieskovca +Outer Desert Sandstone Stair=Vonkajší schod z púštneho pieskovca +Desert Sandstone Slab=Stupienok z púštneho pieskovca +Desert Sandstone Brick Stair=Schod z tehál z púštneho pieskovca +Inner Desert Sandstone Brick Stair=Vnútorný schod z tehál z púštneho pieskovca +Outer Desert Sandstone Brick Stair=Vonkajší schod z tehál z púštneho pieskovca +Desert Sandstone Brick Slab=Stupienok z tehál z púštneho pieskovca +Desert Sandstone Block Stair=Schod z blokov púštneho pieskovca +Inner Desert Sandstone Block Stair=Vnútorný schod z blokov púštneho pieskovca +Outer Desert Sandstone Block Stair=Vonkajší schod z blokov púštneho pieskovca +Desert Sandstone Block Slab=Stupienok z blokov púštneho pieskovca +Silver Sandstone Stair=Schod zo strieborného pieskovca +Inner Silver Sandstone Stair=Vnútorný schod zo strieborného pieskovca +Outer Silver Sandstone Stair=Vonkajší schod zo strieborného pieskovca +Silver Sandstone Slab=Stupienok zo strieborného pieskovca +Silver Sandstone Brick Stair=Schod z tehál zo strieborného pieskovca +Inner Silver Sandstone Brick Stair=Vnútorný schod z tehál zo strieborného pieskovca +Outer Silver Sandstone Brick Stair=Vonkajší schod z tehál zo strieborného pieskovca +Silver Sandstone Brick Slab=Stupienok z tehál zo strieborného pieskovca +Silver Sandstone Block Stair=Schod z blokov strieborného pieskovca +Inner Silver Sandstone Block Stair=Vnútorný schod z blokov strieborného pieskovca +Outer Silver Sandstone Block Stair=Vonkajší schod z blokov strieborného pieskovca +Silver Sandstone Block Slab=Stupienok z blokov strieborného pieskovca +Obsidian Stair=Schod z obsidiánu +Inner Obsidian Stair=Vnútorný schod z obsidiánu +Outer Obsidian Stair=Vonkajší schod z obsidiánu +Obsidian Slab=Stupienok z obsidiánu +Obsidian Brick Stair=Schod z tehál obsidiánu +Inner Obsidian Brick Stair=Vnútorný schod z tehál obsidiánu +Outer Obsidian Brick Stair=Vonkajší schod z tehál obsidiánu +Obsidian Brick Slab=Stupienok z tehál obsidiánu +Obsidian Block Stair=Schod z bloku obsidiánu +Inner Obsidian Block Stair=Vnútorný schod z bloku obsidiánu +Outer Obsidian Block Stair=Vonkajší schod z bloku obsidiánu +Obsidian Block Slab=Stupienok z bloku obsidiánu +Brick Stair=Schod z tehál +Inner Brick Stair=Vnútorný schod z tehál +Outer Brick Stair=Vonkajší schod z tehál +Brick Slab=Stupienok z tehál +Steel Block Stair=Oceľový schod +Inner Steel Block Stair=Vnútorný oceľový schod +Outer Steel Block Stair=Vonkajší oceľový schod +Steel Block Slab=Oceľový stupienok +Tin Block Stair=Cínový schod +Inner Tin Block Stair=Vnútorný cínový schod +Outer Tin Block Stair=Vonkajší cínový schod +Tin Block Slab=Cínový stupienok +Copper Block Stair=Medený schod +Inner Copper Block Stair=Vnútorný medený schod +Outer Copper Block Stair=Vonkajší medený schod +Copper Block Slab=Medený stupienok +Bronze Block Stair=Bronzový schod +Inner Bronze Block Stair=Vnútorný bronzový schod +Outer Bronze Block Stair=Vonkajší bronzový schod +Bronze Block Slab=Bronzový stupienok +Gold Block Stair=Zlatý schod +Inner Gold Block Stair=Vnútorný zlatý schod +Outer Gold Block Stair=Vonkajší zlatý schod +Gold Block Slab=Zlatý stupienok +Ice Stair=Ľadový schod +Inner Ice Stair=Vnútorný ľadový schod +Outer Ice Stair=Vonkajší ľadový schod +Ice Slab=Ľadový stupienok +Snow Block Stair=Snehový schod +Inner Snow Block Stair=Vnútorný snehový schod +Outer Snow Block Stair=Vonkajší snehový schod +Snow Block Slab=Snehový stupienok diff --git a/data/games/garage/mods/stairs/locale/stairs.sv.tr b/data/games/garage/mods/stairs/locale/stairs.sv.tr new file mode 100644 index 0000000..8044af8 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.sv.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Glastrappa +Glass Slab=Glasplatta +Inner Glass Stair=Inre glasstrappa +Outer Glass Stair=Yttre glasstrappa +Obsidian Glass Stair=Obsidianglasstrappa +Obsidian Glass Slab=Obsidianglasplatta +Inner Obsidian Glass Stair=Inre obsidianglastrappa +Outer Obsidian Glass Stair=Yttre obsidianglastrappa +Wooden Stair=Trätrappa +Inner Wooden Stair=Inre trätrappa +Outer Wooden Stair=Yttre trätrappa +Wooden Slab=Träplatta +Jungle Wood Stair=Djungelträtrappa +Inner Jungle Wood Stair=Inre djungelträtrappa +Outer Jungle Wood Stair=Ytter djungelträtrappa +Jungle Wood Slab=Djungelträplatta +Pine Wood Stair=Tallträplatta +Inner Pine Wood Stair=Inre tallträplatta +Outer Pine Wood Stair=Ytter tallträplatta +Pine Wood Slab=Tallskiva +Acacia Wood Stair=Acaciatrappa +Inner Acacia Wood Stair=Inre acaciatrappa +Outer Acacia Wood Stair=Yttre acaciatrappa +Acacia Wood Slab=Acaciaplatta +Aspen Wood Stair=Aspträtrappa +Inner Aspen Wood Stair=Inre aspträtrappa +Outer Aspen Wood Stair=Yttre aspträtrappa +Aspen Wood Slab=Aspträplatta +Stone Stair=Stentrappa +Inner Stone Stair=Inre stentrappa +Outer Stone Stair=Yttre stentrappa +Stone Slab=Stenplatta +Cobblestone Stair=Kullerstenstrappa +Inner Cobblestone Stair=Inre kullerstenstrappa +Outer Cobblestone Stair=Yttre kullerstenstrappa +Cobblestone Slab=Kullerstenplatta +Mossy Cobblestone Stair=Mossig kullerstenstrappa +Inner Mossy Cobblestone Stair=Inre mossig kullerstenstrappa +Outer Mossy Cobblestone Stair=Yttre mossig kullerstenstrappa +Mossy Cobblestone Slab=Mossig kullerstenplatta +Stone Brick Stair=Stentegeltrappa +Inner Stone Brick Stair=Inre stentegeltrappa +Outer Stone Brick Stair=Yttre stentegeltrappa +Stone Brick Slab=Stentegelplatta +Stone Block Stair=Stenblockstrappa +Inner Stone Block Stair=Inre stenblockstrappa +Outer Stone Block Stair=Yttre stenblockstrappa +Stone Block Slab=Stenblocksplatta +Desert Stone Stair=Ökenstentrappa +Inner Desert Stone Stair=Inre ökenstentrappa +Outer Desert Stone Stair=Yttre ökenstentrappa +Desert Stone Slab=Ökenstenplatta +Desert Cobblestone Stair=Ökenkullerstenstrappa +Inner Desert Cobblestone Stair=Inre ökenkullerstenstrappa +Outer Desert Cobblestone Stair=Yttre ökenkullerstenstrappa +Desert Cobblestone Slab=Ökenkullerstensplatta +Desert Stone Brick Stair=Ökentegelstenstrappa +Inner Desert Stone Brick Stair=Inre Ökentegelstenstrappa +Outer Desert Stone Brick Stair=Yttre Ökentegelstenstrappa +Desert Stone Brick Slab=Ökentegelstensplatta +Desert Stone Block Stair=Ökenstenblockstrappa +Inner Desert Stone Block Stair=Inre ökenstenblockstrappa +Outer Desert Stone Block Stair=Yttre ökenstenblockstrappa +Desert Stone Block Slab=Ökenstenblocksplatta +Sandstone Stair=Sandstenstrappa +Inner Sandstone Stair=Inre Sandstenstrappa +Outer Sandstone Stair=Yttre Sandstenstrappa +Sandstone Slab=Sandstenplatta +Sandstone Brick Stair=Sandstentegeltrappa +Inner Sandstone Brick Stair=Inre Sandstentegeltrappa +Outer Sandstone Brick Stair=Yttre Sandstentegeltrappa +Sandstone Brick Slab=Sandstentegelplatta +Sandstone Block Stair=Sandstenblockstrappa +Inner Sandstone Block Stair=Inre Sandstenblockstrappa +Outer Sandstone Block Stair=Yttre Sandstenblockstrappa +Sandstone Block Slab=Sandstenblocksplatta +Desert Sandstone Stair=Ökensandstenstrappa +Inner Desert Sandstone Stair=Inre ökensandstenstrappa +Outer Desert Sandstone Stair=Yttre ökensandstenstrappa +Desert Sandstone Slab=Ökensandstensplatta +Desert Sandstone Brick Stair=Ökensandstentegeltrappa +Inner Desert Sandstone Brick Stair=Inre ökensandstentegeltrappa +Outer Desert Sandstone Brick Stair=Yttre ökensandstentegeltrappa +Desert Sandstone Brick Slab=Ökensandstentegelplatta +Desert Sandstone Block Stair=Ökensandstentegeltrappa +Inner Desert Sandstone Block Stair=Inre ökensandstentegeltrappa +Outer Desert Sandstone Block Stair=Yttre ökensandstentegeltrappa +Desert Sandstone Block Slab=Ökensandstentegelplatta +Silver Sandstone Stair=Silversandstenstrappa +Inner Silver Sandstone Stair=Inre silversandstenstrappa +Outer Silver Sandstone Stair=Yttre silversandstenstrappa +Silver Sandstone Slab=Silversandstenstrappa +Silver Sandstone Brick Stair=Silversandstenstegeltrappa +Inner Silver Sandstone Brick Stair=Inre silversandstenstegeltrappa +Outer Silver Sandstone Brick Stair=Yttre silversandstenstegeltrappa +Silver Sandstone Brick Slab=Silversandstenstegelplatta +Silver Sandstone Block Stair=Silversandstenblockstrappa +Inner Silver Sandstone Block Stair=Inre silversandstenblockstrappa +Outer Silver Sandstone Block Stair=Yttre silversandstenblockstrappa +Silver Sandstone Block Slab=Silversandstenblocksplatta +Obsidian Stair=Obsidiantrappa +Inner Obsidian Stair=Inre obsidiantrappa +Outer Obsidian Stair=Yttre obsidiantrappa +Obsidian Slab=Obsidianplatta +Obsidian Brick Stair=Obsidiantegeltrappa +Inner Obsidian Brick Stair=Inre obsidiantegeltrappa +Outer Obsidian Brick Stair=Yttre obsidiantegeltrappa +Obsidian Brick Slab=Obsidiantegelplatta +Obsidian Block Stair=Obsidianblocktrappa +Inner Obsidian Block Stair=Inre Obsidianblocktrappa +Outer Obsidian Block Stair=Yttre Obsidianblocktrappa +Obsidian Block Slab=Obsidianblockplatta +Brick Stair=Tegeltrappa +Inner Brick Stair=Inre tegeltrappa +Outer Brick Stair=Yttre tegeltrappa +Brick Slab=Tegelplatta +Steel Block Stair=Ståltrappa +Inner Steel Block Stair=Inre ståltrappa +Outer Steel Block Stair=Yttre ståltrappa +Steel Block Slab=Stålplatta +Tin Block Stair=Tenntrappa +Inner Tin Block Stair=Inre tenntrappa +Outer Tin Block Stair=Yttre tenntrappa +Tin Block Slab=Tennplatta +Copper Block Stair=Koppartrappa +Inner Copper Block Stair=Inre koppartrappa +Outer Copper Block Stair=Yttre koppartrappa +Copper Block Slab=Kopparplatta +Bronze Block Stair=Bronstrappa +Inner Bronze Block Stair=Inre bronstrappa +Outer Bronze Block Stair=Yttre bronstrappa +Bronze Block Slab=Bronsplatta +Gold Block Stair=Guldtrappa +Inner Gold Block Stair=Inre guldtrappa +Outer Gold Block Stair=Yttre guldtrappa +Gold Block Slab=Guldplatta +Ice Stair=Istrappa +Inner Ice Stair=Inre istrappa +Outer Ice Stair=Yttre istrappa +Ice Slab=Isplatta +Snow Block Stair=Snöblockstrappa +Inner Snow Block Stair=Inre snöblockstrappa +Outer Snow Block Stair=Yttre snöblockstrappa +Snow Block Slab=Snöblocksplatta diff --git a/data/games/garage/mods/stairs/locale/stairs.uk.tr b/data/games/garage/mods/stairs/locale/stairs.uk.tr new file mode 100644 index 0000000..bf729a0 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.uk.tr @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair=Скляна сходинка +Glass Slab=Скляна плита +Inner Glass Stair=Кутова скляна сходинка (внутрішній кут) +Outer Glass Stair=Кутова скляна сходинка (зовнішній кут) +Obsidian Glass Stair=Сходинка з обсидіанового скла +Obsidian Glass Slab=Плита з обсидіанового скла +Inner Obsidian Glass Stair=Кутова сходинка з обсидіанового скла (внутрішній кут) +Outer Obsidian Glass Stair=Кутова сходинка з обсидіанового скла (зовнішній кут) +Wooden Stair=Дерев'яна сходинка +Inner Wooden Stair=Кутова дерев'яна сходинка (внутрішній кут) +Outer Wooden Stair=Кутова дерев'яна сходинка (зовнішній кут) +Wooden Slab=Дерев'яна плита +Jungle Wood Stair=Сходинка з тропічного дерева +Inner Jungle Wood Stair=Кутова сходинка з тропічного дерева (внутрішній кут) +Outer Jungle Wood Stair=Кутова сходинка з тропічного дерева (зовнішній кут) +Jungle Wood Slab=Плита з тропічного дерева +Pine Wood Stair=Соснова сходинка +Inner Pine Wood Stair=Кутова соснова сходинка (внутрішній кут) +Outer Pine Wood Stair=Кутова соснова сходинка (зовнішній кут) +Pine Wood Slab=Соснова плита +Acacia Wood Stair=Акацієва сходинка +Inner Acacia Wood Stair=Кутова акацієва сходинка (внутрішній кут) +Outer Acacia Wood Stair=Кутова акацієва сходинка (зовнішній кут) +Acacia Wood Slab=Акацієва плита +Aspen Wood Stair=Осикова сходинка +Inner Aspen Wood Stair=Кутова осикова сходинка (внутрішній кут) +Outer Aspen Wood Stair=Кутова осикова сходинка (зовнішній кут) +Aspen Wood Slab=Осикова плита +Stone Stair=Кам'яна сходинка +Inner Stone Stair=Кутова кам'яна сходинка (внутрішній кут) +Outer Stone Stair=Кутова кам'яна сходинка (зовнішній кут) +Stone Slab=Кам'яна плита +Cobblestone Stair=Круглякова сходинка +Inner Cobblestone Stair=Кутова круглякова сходинка (внутрішній кут) +Outer Cobblestone Stair=Кутова круглякова сходинка (зовнішній кут) +Cobblestone Slab=Круглякова плита +Mossy Cobblestone Stair=Сходинка з моховитого кругляку +Inner Mossy Cobblestone Stair=Кутова сходинка з моховитого кругляку (внутрішній кут) +Outer Mossy Cobblestone Stair=Кутова сходинка з моховитого кругляку (зовнішній кут) +Mossy Cobblestone Slab=Плита з моховитого кругляку +Stone Brick Stair=Сходинка з кам'яної цегли +Inner Stone Brick Stair=Кутова сходинка з кам'яної цегли (внутрішній кут) +Outer Stone Brick Stair=Кутова сходинка з кам'яної цегли (зовнішній кут) +Stone Brick Slab=Плита з кам'яної цегли +Stone Block Stair=Сходинка з блоку каменю +Inner Stone Block Stair=Кутова сходинка з блоку каменю (внутрішній кут) +Outer Stone Block Stair=Кутова сходинка з блоку каменю (зовнішній кут) +Stone Block Slab=Плита з блоку каменю +Desert Stone Stair=Сходинка з пустельного каменю +Inner Desert Stone Stair=Кутова сходинка з пустельного каменю (внутрішній кут) +Outer Desert Stone Stair=Кутова сходинка з пустельного каменю (зовнішній кут) +Desert Stone Slab=Плита з пустельного каменю +Desert Cobblestone Stair=Сходинка з пустельного кругляку +Inner Desert Cobblestone Stair=Кутова сходинка з пустельного кругляку (внутрішній кут) +Outer Desert Cobblestone Stair=Кутова сходинка з пустельного кругляку (зовнішній кут) +Desert Cobblestone Slab=Плита з пустельного кругляку +Desert Stone Brick Stair=Сходинка з цегли з пустельного каменю +Inner Desert Stone Brick Stair=Кутова сходинка з цегли з пустельного каменю (внутрішній кут) +Outer Desert Stone Brick Stair=Кутова сходинка з цегли з пустельного каменю (зовнішній кут) +Desert Stone Brick Slab=Плита з цегли з пустельного каменю +Desert Stone Block Stair=Сходинка з блоку пустельного каменю +Inner Desert Stone Block Stair=Кутова сходинка з блоку пустельного каменю (внутрішній кут) +Outer Desert Stone Block Stair=Кутова сходинка з блоку пустельного каменю (зовнішній кут) +Desert Stone Block Slab=Плита з блоку пустельного каменю +Sandstone Stair=Пісковикова сходинка +Inner Sandstone Stair=Кутова пісковикова сходинка (внутрішній кут) +Outer Sandstone Stair=Кутова пісковикова сходинка (зовнішній кут) +Sandstone Slab=Пісковикова плита +Sandstone Brick Stair=Сходинка з пісковикової цегли +Inner Sandstone Brick Stair=Кутова сходинка з пісковикової цегли (внутрішній кут) +Outer Sandstone Brick Stair=Кутова сходинка з пісковикової цегли (зовнішній кут) +Sandstone Brick Slab=Плита з пісковикової цегли +Sandstone Block Stair=Сходинка з блоку пісковику +Inner Sandstone Block Stair=Кутова сходинка з блоку пісковику (внутрішній кут) +Outer Sandstone Block Stair=Кутова сходинка з блоку пісковику (зовнішній кут) +Sandstone Block Slab=Плита з блоку пісковику +Desert Sandstone Stair=Сходинка з пустельного пісковику +Inner Desert Sandstone Stair=Кутова сходинка з пустельного пісковику (внутрішній кут) +Outer Desert Sandstone Stair=Кутова сходинка з пустельного пісковику (зовнішній кут) +Desert Sandstone Slab=Плита з пустельного пісковику +Desert Sandstone Brick Stair=Сходинка з цегли з пустельного пісковику +Inner Desert Sandstone Brick Stair=Кутова сходинка з цегли з пустельного пісковику (внутрішній кут) +Outer Desert Sandstone Brick Stair=Кутова сходинка з цегли з пустельного пісковику (зовнішній кут) +Desert Sandstone Brick Slab=Плита з цегли з пустельного пісковику +Desert Sandstone Block Stair=Сходинка з блоку пустельного пісковику +Inner Desert Sandstone Block Stair=Кутова сходинка з блоку пустельного пісковику (внутрішній кут) +Outer Desert Sandstone Block Stair=Кутова сходинка з блоку пустельного пісковику (зовнішній кут) +Desert Sandstone Block Slab=Плита з блоку пустельного пісковику +Silver Sandstone Stair=Сходинка зі срібного пісковику +Inner Silver Sandstone Stair=Кутова сходинка зі срібного пісковику (внутрішній кут) +Outer Silver Sandstone Stair=Кутова сходинка зі срібного пісковику (зовнішній кут) +Silver Sandstone Slab=Плита зі срібного пісковику +Silver Sandstone Brick Stair=Сходинка з цегли зі срібного пісковику +Inner Silver Sandstone Brick Stair=Кутова сходинка з цегли зі срібного пісковику (внутрішній кут) +Outer Silver Sandstone Brick Stair=Кутова сходинка з цегли зі срібного пісковику (зовнішній кут) +Silver Sandstone Brick Slab=Плита з цегли зі срібного пісковику +Silver Sandstone Block Stair=Сходинка з блоку срібного пісковику +Inner Silver Sandstone Block Stair=Кутова сходинка з блоку срібного пісковику (внутрішній кут) +Outer Silver Sandstone Block Stair=Кутова сходинка з блоку срібного пісковику (зовнішній кут) +Silver Sandstone Block Slab=Плита з блоку срібного пісковику +Obsidian Stair=Обсидіанова сходинка +Inner Obsidian Stair=Кутова обсидіанова сходинка (внутрішній кут) +Outer Obsidian Stair=Кутова обсидіанова сходинка (зовнішній кут) +Obsidian Slab=Обсидіанова плита +Obsidian Brick Stair=Сходинка з обсидіанової цегли +Inner Obsidian Brick Stair=Кутова сходинка з обсидіанової цегли (внутрішній кут) +Outer Obsidian Brick Stair=Кутова сходинка з обсидіанової цегли (зовнішній кут) +Obsidian Brick Slab=Плита з обсидіанової цегли +Obsidian Block Stair=Сходинка з блоку обсидіану +Inner Obsidian Block Stair=Кутова сходинка з блоку обсидіану (внутрішній кут) +Outer Obsidian Block Stair=Кутова сходинка з блоку обсидіану (зовнішній кут) +Obsidian Block Slab=Плита з блоку обсидіану +Brick Stair=Цегляна сходинка +Inner Brick Stair=Кутова цегляна сходинка (внутрішній кут) +Outer Brick Stair=Кутова цегляна сходинка (зовнішній кут) +Brick Slab=Цегляна плита +Steel Block Stair=Сходинка з блоку сталі +Inner Steel Block Stair=Кутова сходинка з блоку сталі (внутрішній кут) +Outer Steel Block Stair=Кутова сходинка з блоку сталі (зовнішній кут) +Steel Block Slab=Плита з блоку сталі +Tin Block Stair=Сходинка з блоку олова +Inner Tin Block Stair=Кутова сходинка з блоку олова (внутрішній кут) +Outer Tin Block Stair=Кутова сходинка з блоку олова (зовнішній кут) +Tin Block Slab=Плита з блоку олова +Copper Block Stair=Сходинка з блоку міді +Inner Copper Block Stair=Кутова сходинка з блоку міді (внутрішній кут) +Outer Copper Block Stair=Кутова сходинка з блоку міді (зовнішній кут) +Copper Block Slab=Плита з блоку міді +Bronze Block Stair=Сходинка з блоку бронзи +Inner Bronze Block Stair=Кутова сходинка з блоку бронзи (внутрішній кут) +Outer Bronze Block Stair=Кутова сходинка з блоку бронзи (зовнішній кут) +Bronze Block Slab=Плита з блоку бронзи +Gold Block Stair=Сходинка з блоку золота +Inner Gold Block Stair=Кутова сходинка з блоку золота (внутрішній кут) +Outer Gold Block Stair=Кутова сходинка з блоку золота (зовнішній кут) +Gold Block Slab=Плита з блоку золота +Ice Stair=Крижана сходинка +Inner Ice Stair=Кутова крижана сходинка (внутрішній кут) +Outer Ice Stair=Кутова крижана сходинка (зовнішній кут) +Ice Slab=Крижана плита +Snow Block Stair=Сходинка з блоку снігу +Inner Snow Block Stair=Кутова сходинка з блоку снігу (внутрішній кут) +Outer Snow Block Stair=Кутова сходинка з блоку снігу (зовнішній кут) +Snow Block Slab=Плита з блоку снігу diff --git a/data/games/garage/mods/stairs/locale/stairs.zh_CN.tr b/data/games/garage/mods/stairs/locale/stairs.zh_CN.tr new file mode 100644 index 0000000..e37ebcb --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.zh_CN.tr @@ -0,0 +1,153 @@ +# textdomain: stairs +Glass Stair=玻璃楼梯 +Glass Slab=玻璃台阶 +Inner Glass Stair=玻璃楼梯(内) +Outer Glass Stair=玻璃楼梯(外) +Obsidian Glass Stair=黑曜石玻璃楼梯 +Obsidian Glass Slab=黑曜石玻璃台阶 +Inner Obsidian Glass Stair=黑曜石玻璃楼梯(内) +Outer Obsidian Glass Stair=黑曜石玻璃楼梯(外) +Wooden Stair=木楼梯 +Inner Wooden Stair=木楼梯(内) +Outer Wooden Stair=木楼梯(外) +Wooden Slab=木台阶 +Jungle Wood Stair=丛林木楼梯 +Inner Jungle Wood Stair=丛林木楼梯(内) +Outer Jungle Wood Stair=丛林木楼梯(外) +Jungle Wood Slab=丛林木台阶 +Pine Wood Stair=松木楼梯 +Inner Pine Wood Stair=松木楼梯(内) +Outer Pine Wood Stair=松木楼梯(外) +Pine Wood Slab=松木台阶 +Acacia Wood Stair=金合欢木楼梯 +Inner Acacia Wood Stair=金合欢木楼梯(内) +Outer Acacia Wood Stair=金合欢木楼梯(外) +Acacia Wood Slab=金合欢木台阶 +Aspen Wood Stair=白杨木楼梯 +Inner Aspen Wood Stair=白杨木楼梯(内) +Outer Aspen Wood Stair=白杨木楼梯(外) +Aspen Wood Slab=白杨木台阶 +Stone Stair=石楼梯 +Inner Stone Stair=石楼梯(内) +Outer Stone Stair=石楼梯(外) +Stone Slab=石台阶 +Cobblestone Stair=鹅卵石楼梯 +Inner Cobblestone Stair=鹅卵石楼梯(内) +Outer Cobblestone Stair=鹅卵石楼梯(外) +Cobblestone Slab=鹅卵石台阶 +Mossy Cobblestone Stair=苔藓覆盖的鹅卵石楼梯 +Inner Mossy Cobblestone Stair=苔藓覆盖的鹅卵石楼梯(内) +Outer Mossy Cobblestone Stair=苔藓覆盖的鹅卵石楼梯(外) +Mossy Cobblestone Slab=苔藓覆盖的鹅卵石台阶 +Stone Brick Stair=石砖楼梯 +Inner Stone Brick Stair=石砖楼梯(内) +Outer Stone Brick Stair=石砖楼梯(外) +Stone Brick Slab=石砖台阶 +Stone Block Stair=石块楼梯 +Inner Stone Block Stair=石块楼梯(内) +Outer Stone Block Stair=石块楼梯(外) +Stone Block Slab=石块台阶 +Desert Stone Stair=沙漠石楼梯 +Inner Desert Stone Stair=沙漠石楼梯(内) +Outer Desert Stone Stair=沙漠石楼梯(外) +Desert Stone Slab=沙漠石台阶 +Desert Cobblestone Stair=沙漠鹅卵石楼梯 +Inner Desert Cobblestone Stair=沙漠鹅卵石楼梯(内) +Outer Desert Cobblestone Stair=沙漠鹅卵石楼梯(外) +Desert Cobblestone Slab=沙漠鹅卵石台阶 +Desert Stone Brick Stair=沙漠石砖楼梯 +Inner Desert Stone Brick Stair=沙漠石砖楼梯(内) +Outer Desert Stone Brick Stair=沙漠石砖楼梯(外) +Desert Stone Brick Slab=沙漠石砖台阶 +Desert Stone Block Stair=沙漠石块楼梯 +Inner Desert Stone Block Stair=沙漠石块楼梯(内) +Outer Desert Stone Block Stair=沙漠石块楼梯(外) +Desert Stone Block Slab=沙漠石块台阶 +Sandstone Stair=沙石楼梯 +Inner Sandstone Stair=沙石楼梯(内) +Outer Sandstone Stair=沙石楼梯(外) +Sandstone Slab=沙石台阶 +Sandstone Brick Stair=沙石砖楼梯 +Inner Sandstone Brick Stair=沙石砖楼梯(内) +Outer Sandstone Brick Stair=沙石砖楼梯(外) +Sandstone Brick Slab=沙石砖台阶 +Sandstone Block Stair=沙石块楼梯 +Inner Sandstone Block Stair=沙石块楼梯(内) +Outer Sandstone Block Stair=沙石块楼梯(外) +Sandstone Block Slab=沙石块台阶 +Desert Sandstone Stair=沙漠沙石楼梯 +Inner Desert Sandstone Stair=沙漠沙石楼梯(内) +Outer Desert Sandstone Stair=沙漠沙石楼梯(外) +Desert Sandstone Slab=沙漠沙石台阶 +Desert Sandstone Brick Stair=沙漠沙石砖楼梯 +Inner Desert Sandstone Brick Stair=沙漠沙石砖楼梯(内) +Outer Desert Sandstone Brick Stair=沙漠沙石砖楼梯(外) +Desert Sandstone Brick Slab=沙漠沙石砖台阶 +Desert Sandstone Block Stair=沙漠沙石块楼梯 +Inner Desert Sandstone Block Stair=沙漠沙石块楼梯(内) +Outer Desert Sandstone Block Stair=沙漠沙石块楼梯(外) +Desert Sandstone Block Slab=沙漠沙石块台阶 +Silver Sandstone Stair=银沙石楼梯 +Inner Silver Sandstone Stair=银沙石楼梯(内) +Outer Silver Sandstone Stair=银沙石楼梯(外) +Silver Sandstone Slab=银沙石台阶 +Silver Sandstone Brick Stair=银沙石砖楼梯 +Inner Silver Sandstone Brick Stair=银沙石砖楼梯(内) +Outer Silver Sandstone Brick Stair=银沙石砖楼梯(外) +Silver Sandstone Brick Slab=银沙石砖台阶 +Silver Sandstone Block Stair=银沙石块楼梯 +Inner Silver Sandstone Block Stair=银沙石块楼梯(内) +Outer Silver Sandstone Block Stair=银沙石块楼梯(外) +Silver Sandstone Block Slab=银沙石块台阶 +Obsidian Stair=黑曜石楼梯 +Inner Obsidian Stair=黑曜石楼梯(内) +Outer Obsidian Stair=黑曜石楼梯(外) +Obsidian Slab=黑曜石台阶 +Obsidian Brick Stair=黑曜石砖楼梯 +Inner Obsidian Brick Stair=黑曜石砖楼梯(内) +Outer Obsidian Brick Stair=黑曜石砖楼梯(外) +Obsidian Brick Slab=黑曜石砖台阶 +Obsidian Block Stair=黑曜石块楼梯 +Inner Obsidian Block Stair=黑曜石块楼梯(内) +Outer Obsidian Block Stair=黑曜石块楼梯(外) +Obsidian Block Slab=黑曜石块台阶 +Brick Stair=砖楼梯 +Inner Brick Stair=砖楼梯(内) +Outer Brick Stair=砖楼梯(外) +Brick Slab=砖台阶 +Steel Block Stair=铁块楼梯 +Inner Steel Block Stair=铁块楼梯(内) +Outer Steel Block Stair=铁块楼梯(外) +Steel Block Slab=铁块台阶 +Tin Block Stair=锡块楼梯 +Inner Tin Block Stair=锡块楼梯(内) +Outer Tin Block Stair=锡块楼梯(外) +Tin Block Slab=锡块台阶 +Copper Block Stair=铜块楼梯 +Inner Copper Block Stair=铜块楼梯(内) +Outer Copper Block Stair=铜块楼梯(外) +Copper Block Slab=铜块台阶 +Bronze Block Stair=青铜块楼梯 +Inner Bronze Block Stair=青铜块楼梯(内) +Outer Bronze Block Stair=青铜块楼梯(外) +Bronze Block Slab=青铜块台阶 +Gold Block Stair=金块楼梯 +Inner Gold Block Stair=金块楼梯(内) +Outer Gold Block Stair=金块楼梯(外) +Gold Block Slab=金块台阶 +Ice Stair=冰楼梯 +Inner Ice Stair=冰块楼梯(内) +Outer Ice Stair=冰块楼梯(外) +Ice Slab=冰台阶 +Snow Block Stair=雪块楼梯 +Inner Snow Block Stair=雪块楼梯(内) +Outer Snow Block Stair=雪块楼梯(外) +Snow Block Slab=雪块台阶 + + +##### not used anymore ##### + +Blue Stained Stair=蓝木楼梯 +Inner Blue Stained Stair=蓝木楼梯(内) +Outer Blue Stained Stair=蓝木楼梯(外) +Blue Stained Slab=蓝木台阶 diff --git a/data/games/garage/mods/stairs/locale/stairs.zh_TW.tr b/data/games/garage/mods/stairs/locale/stairs.zh_TW.tr new file mode 100644 index 0000000..eaed61f --- /dev/null +++ b/data/games/garage/mods/stairs/locale/stairs.zh_TW.tr @@ -0,0 +1,153 @@ +# textdomain: stairs +Glass Stair=玻璃樓梯 +Glass Slab=玻璃臺階 +Inner Glass Stair=玻璃樓梯(內) +Outer Glass Stair=玻璃樓梯(外) +Obsidian Glass Stair=黑曜石玻璃樓梯 +Obsidian Glass Slab=黑曜石玻璃臺階 +Inner Obsidian Glass Stair=黑曜石玻璃樓梯(內) +Outer Obsidian Glass Stair=黑曜石玻璃樓梯(外) +Wooden Stair=木製樓梯 +Inner Wooden Stair=木樓梯(內) +Outer Wooden Stair=木樓梯(外) +Wooden Slab=木製臺階 +Jungle Wood Stair=叢林木樓梯 +Inner Jungle Wood Stair=叢林木樓梯(內) +Outer Jungle Wood Stair=叢林木樓梯(外) +Jungle Wood Slab=叢林木臺階 +Pine Wood Stair=松木樓梯 +Inner Pine Wood Stair=松木樓梯(內) +Outer Pine Wood Stair=松木樓梯(外) +Pine Wood Slab=松木臺階 +Acacia Wood Stair=金合歡木樓梯 +Inner Acacia Wood Stair=金合歡木樓梯(內) +Outer Acacia Wood Stair=金合歡木樓梯(外) +Acacia Wood Slab=金合歡木臺階 +Aspen Wood Stair=白楊木樓梯 +Inner Aspen Wood Stair=白楊木樓梯(內) +Outer Aspen Wood Stair=白楊木樓梯(外) +Aspen Wood Slab=白楊木臺階 +Stone Stair=石樓梯 +Inner Stone Stair=石樓梯(內) +Outer Stone Stair=石樓梯(外) +Stone Slab=石臺階 +Cobblestone Stair=圓石樓梯 +Inner Cobblestone Stair=圓石樓梯(內) +Outer Cobblestone Stair=圓石樓梯(外) +Cobblestone Slab=圓石臺階 +Mossy Cobblestone Stair=苔石樓梯 +Inner Mossy Cobblestone Stair=苔石樓梯(內) +Outer Mossy Cobblestone Stair=苔石樓梯(外) +Mossy Cobblestone Slab=苔石臺階 +Stone Brick Stair=石磚樓梯 +Inner Stone Brick Stair=石磚樓梯(內) +Outer Stone Brick Stair=石磚樓梯(外) +Stone Brick Slab=石磚臺階 +Stone Block Stair=石塊樓梯 +Inner Stone Block Stair=石塊樓梯(內) +Outer Stone Block Stair=石塊樓梯(外) +Stone Block Slab=石塊臺階 +Desert Stone Stair=沙漠石樓梯 +Inner Desert Stone Stair=沙漠石樓梯(內) +Outer Desert Stone Stair=沙漠石樓梯(外) +Desert Stone Slab=沙漠石臺階 +Desert Cobblestone Stair=沙漠圓石樓梯 +Inner Desert Cobblestone Stair=沙漠圓石樓梯(內) +Outer Desert Cobblestone Stair=沙漠圓石樓梯(外) +Desert Cobblestone Slab=沙漠圓石臺階 +Desert Stone Brick Stair=沙漠石磚樓梯 +Inner Desert Stone Brick Stair=沙漠石磚樓梯(內) +Outer Desert Stone Brick Stair=沙漠石磚樓梯(外) +Desert Stone Brick Slab=沙漠石磚臺階 +Desert Stone Block Stair=沙漠石塊樓梯 +Inner Desert Stone Block Stair=沙漠石塊樓梯(內) +Outer Desert Stone Block Stair=沙漠石塊樓梯(外) +Desert Stone Block Slab=沙漠石塊臺階 +Sandstone Stair=沙石樓梯 +Inner Sandstone Stair=沙石樓梯(內) +Outer Sandstone Stair=沙石樓梯(外) +Sandstone Slab=沙石臺階 +Sandstone Brick Stair=沙石磚樓梯 +Inner Sandstone Brick Stair=沙石磚樓梯(內) +Outer Sandstone Brick Stair=沙石磚樓梯(外) +Sandstone Brick Slab=沙石磚臺階 +Sandstone Block Stair=沙石塊樓梯 +Inner Sandstone Block Stair=沙石塊樓梯(內) +Outer Sandstone Block Stair=沙石塊樓梯(外) +Sandstone Block Slab=沙石塊臺階 +Desert Sandstone Stair=沙漠沙石樓梯 +Inner Desert Sandstone Stair=沙漠沙石樓梯(內) +Outer Desert Sandstone Stair=沙漠沙石樓梯(外) +Desert Sandstone Slab=沙漠沙石臺階 +Desert Sandstone Brick Stair=沙漠沙石磚樓梯 +Inner Desert Sandstone Brick Stair=沙漠沙石磚樓梯(內) +Outer Desert Sandstone Brick Stair=沙漠沙石磚樓梯(外) +Desert Sandstone Brick Slab=沙漠沙石磚臺階 +Desert Sandstone Block Stair=沙漠沙石塊樓梯 +Inner Desert Sandstone Block Stair=沙漠沙石塊樓梯(內) +Outer Desert Sandstone Block Stair=沙漠沙石塊樓梯(外) +Desert Sandstone Block Slab=沙漠沙石塊臺階 +Silver Sandstone Stair=銀沙石樓梯 +Inner Silver Sandstone Stair=銀沙石樓梯(內) +Outer Silver Sandstone Stair=銀沙石樓梯(外) +Silver Sandstone Slab=銀沙石臺階 +Silver Sandstone Brick Stair=銀沙石磚樓梯 +Inner Silver Sandstone Brick Stair=銀沙石磚樓梯(內) +Outer Silver Sandstone Brick Stair=銀沙石磚樓梯(外) +Silver Sandstone Brick Slab=銀沙石磚臺階 +Silver Sandstone Block Stair=銀沙石塊樓梯 +Inner Silver Sandstone Block Stair=銀沙石塊樓梯(內) +Outer Silver Sandstone Block Stair=銀沙石塊樓梯(外) +Silver Sandstone Block Slab=銀沙石塊臺階 +Obsidian Stair=黑曜石樓梯 +Inner Obsidian Stair=黑曜石樓梯(內) +Outer Obsidian Stair=黑曜石樓梯(外) +Obsidian Slab=黑曜石臺階 +Obsidian Brick Stair=黑曜石磚樓梯 +Inner Obsidian Brick Stair=黑曜石磚樓梯(內) +Outer Obsidian Brick Stair=黑曜石磚樓梯(外) +Obsidian Brick Slab=黑曜石磚臺階 +Obsidian Block Stair=黑曜石塊樓梯 +Inner Obsidian Block Stair=黑曜石塊樓梯(內) +Outer Obsidian Block Stair=黑曜石塊樓梯(外) +Obsidian Block Slab=黑曜石塊臺階 +Brick Stair=磚樓梯 +Inner Brick Stair=磚樓梯(內) +Outer Brick Stair=磚樓梯(外) +Brick Slab=磚制臺階 +Steel Block Stair=鐵塊樓梯 +Inner Steel Block Stair=鐵塊樓梯(內) +Outer Steel Block Stair=鐵塊樓梯(外) +Steel Block Slab=鐵塊臺階 +Tin Block Stair=錫塊樓梯 +Inner Tin Block Stair=錫塊樓梯(內) +Outer Tin Block Stair=錫塊樓梯(外) +Tin Block Slab=錫塊臺階 +Copper Block Stair=銅塊樓梯 +Inner Copper Block Stair=銅塊樓梯(內) +Outer Copper Block Stair=銅塊樓梯(外) +Copper Block Slab=銅塊臺階 +Bronze Block Stair=青銅塊樓梯 +Inner Bronze Block Stair=青銅塊樓梯(內) +Outer Bronze Block Stair=青銅塊樓梯(外) +Bronze Block Slab=青銅塊臺階 +Gold Block Stair=金塊樓梯 +Inner Gold Block Stair=金塊樓梯(內) +Outer Gold Block Stair=金塊樓梯(外) +Gold Block Slab=金塊臺階 +Ice Stair=冰階梯 +Inner Ice Stair=冰塊樓梯(內) +Outer Ice Stair=冰塊樓梯(外) +Ice Slab=冰臺階 +Snow Block Stair=雪塊樓梯 +Inner Snow Block Stair=雪塊樓梯(內) +Outer Snow Block Stair=雪塊樓梯(外) +Snow Block Slab=雪塊臺階 + + +##### not used anymore ##### + +Blue Stained Stair=藍木樓梯 +Inner Blue Stained Stair=藍木樓梯(內) +Outer Blue Stained Stair=藍木樓梯(外) +Blue Stained Slab=藍木臺階 diff --git a/data/games/garage/mods/stairs/locale/template.txt b/data/games/garage/mods/stairs/locale/template.txt new file mode 100644 index 0000000..ca2c865 --- /dev/null +++ b/data/games/garage/mods/stairs/locale/template.txt @@ -0,0 +1,145 @@ +# textdomain: stairs +Glass Stair= +Glass Slab= +Inner Glass Stair= +Outer Glass Stair= +Obsidian Glass Stair= +Obsidian Glass Slab= +Inner Obsidian Glass Stair= +Outer Obsidian Glass Stair= +Wooden Stair= +Inner Wooden Stair= +Outer Wooden Stair= +Wooden Slab= +Jungle Wood Stair= +Inner Jungle Wood Stair= +Outer Jungle Wood Stair= +Jungle Wood Slab= +Pine Wood Stair= +Inner Pine Wood Stair= +Outer Pine Wood Stair= +Pine Wood Slab= +Acacia Wood Stair= +Inner Acacia Wood Stair= +Outer Acacia Wood Stair= +Acacia Wood Slab= +Aspen Wood Stair= +Inner Aspen Wood Stair= +Outer Aspen Wood Stair= +Aspen Wood Slab= +Stone Stair= +Inner Stone Stair= +Outer Stone Stair= +Stone Slab= +Cobblestone Stair= +Inner Cobblestone Stair= +Outer Cobblestone Stair= +Cobblestone Slab= +Mossy Cobblestone Stair= +Inner Mossy Cobblestone Stair= +Outer Mossy Cobblestone Stair= +Mossy Cobblestone Slab= +Stone Brick Stair= +Inner Stone Brick Stair= +Outer Stone Brick Stair= +Stone Brick Slab= +Stone Block Stair= +Inner Stone Block Stair= +Outer Stone Block Stair= +Stone Block Slab= +Desert Stone Stair= +Inner Desert Stone Stair= +Outer Desert Stone Stair= +Desert Stone Slab= +Desert Cobblestone Stair= +Inner Desert Cobblestone Stair= +Outer Desert Cobblestone Stair= +Desert Cobblestone Slab= +Desert Stone Brick Stair= +Inner Desert Stone Brick Stair= +Outer Desert Stone Brick Stair= +Desert Stone Brick Slab= +Desert Stone Block Stair= +Inner Desert Stone Block Stair= +Outer Desert Stone Block Stair= +Desert Stone Block Slab= +Sandstone Stair= +Inner Sandstone Stair= +Outer Sandstone Stair= +Sandstone Slab= +Sandstone Brick Stair= +Inner Sandstone Brick Stair= +Outer Sandstone Brick Stair= +Sandstone Brick Slab= +Sandstone Block Stair= +Inner Sandstone Block Stair= +Outer Sandstone Block Stair= +Sandstone Block Slab= +Desert Sandstone Stair= +Inner Desert Sandstone Stair= +Outer Desert Sandstone Stair= +Desert Sandstone Slab= +Desert Sandstone Brick Stair= +Inner Desert Sandstone Brick Stair= +Outer Desert Sandstone Brick Stair= +Desert Sandstone Brick Slab= +Desert Sandstone Block Stair= +Inner Desert Sandstone Block Stair= +Outer Desert Sandstone Block Stair= +Desert Sandstone Block Slab= +Silver Sandstone Stair= +Inner Silver Sandstone Stair= +Outer Silver Sandstone Stair= +Silver Sandstone Slab= +Silver Sandstone Brick Stair= +Inner Silver Sandstone Brick Stair= +Outer Silver Sandstone Brick Stair= +Silver Sandstone Brick Slab= +Silver Sandstone Block Stair= +Inner Silver Sandstone Block Stair= +Outer Silver Sandstone Block Stair= +Silver Sandstone Block Slab= +Obsidian Stair= +Inner Obsidian Stair= +Outer Obsidian Stair= +Obsidian Slab= +Obsidian Brick Stair= +Inner Obsidian Brick Stair= +Outer Obsidian Brick Stair= +Obsidian Brick Slab= +Obsidian Block Stair= +Inner Obsidian Block Stair= +Outer Obsidian Block Stair= +Obsidian Block Slab= +Brick Stair= +Inner Brick Stair= +Outer Brick Stair= +Brick Slab= +Steel Block Stair= +Inner Steel Block Stair= +Outer Steel Block Stair= +Steel Block Slab= +Tin Block Stair= +Inner Tin Block Stair= +Outer Tin Block Stair= +Tin Block Slab= +Copper Block Stair= +Inner Copper Block Stair= +Outer Copper Block Stair= +Copper Block Slab= +Bronze Block Stair= +Inner Bronze Block Stair= +Outer Bronze Block Stair= +Bronze Block Slab= +Gold Block Stair= +Inner Gold Block Stair= +Outer Gold Block Stair= +Gold Block Slab= +Ice Stair= +Inner Ice Stair= +Outer Ice Stair= +Ice Slab= +Snow Block Stair= +Inner Snow Block Stair= +Outer Snow Block Stair= +Snow Block Slab= diff --git a/data/games/garage/mods/stairs/mod.conf b/data/games/garage/mods/stairs/mod.conf index 724bff8..7548fa7 100644 --- a/data/games/garage/mods/stairs/mod.conf +++ b/data/games/garage/mods/stairs/mod.conf @@ -1,3 +1,3 @@ name = stairs -description = Adds stairs and slabs -depends = basenodes +description = Minetest Game mod: stairs +depends = default diff --git a/data/games/garage/mods/stairs/textures/stairs_glass_outer_stairside.png b/data/games/garage/mods/stairs/textures/stairs_glass_outer_stairside.png new file mode 100644 index 0000000..9b298c8 Binary files /dev/null and b/data/games/garage/mods/stairs/textures/stairs_glass_outer_stairside.png differ diff --git a/data/games/garage/mods/stairs/textures/stairs_glass_split.png b/data/games/garage/mods/stairs/textures/stairs_glass_split.png new file mode 100644 index 0000000..6287959 Binary files /dev/null and b/data/games/garage/mods/stairs/textures/stairs_glass_split.png differ diff --git a/data/games/garage/mods/stairs/textures/stairs_glass_stairside.png b/data/games/garage/mods/stairs/textures/stairs_glass_stairside.png new file mode 100644 index 0000000..c424294 Binary files /dev/null and b/data/games/garage/mods/stairs/textures/stairs_glass_stairside.png differ diff --git a/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_outer_stairside.png b/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_outer_stairside.png new file mode 100644 index 0000000..0098f68 Binary files /dev/null and b/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_outer_stairside.png differ diff --git a/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_split.png b/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_split.png new file mode 100644 index 0000000..7647b9b Binary files /dev/null and b/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_split.png differ diff --git a/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_stairside.png b/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_stairside.png new file mode 100644 index 0000000..40b1754 Binary files /dev/null and b/data/games/garage/mods/stairs/textures/stairs_obsidian_glass_stairside.png differ diff --git a/data/games/garage/mods/testabms/README.md b/data/games/garage/mods/testabms/README.md deleted file mode 100644 index 60fa6d6..0000000 --- a/data/games/garage/mods/testabms/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Test ABMs - -This mod contains a nodes and related ABM actions. -By placing these nodes, you can test basic ABM behaviours. - -There are separate tests for ABM `chance`, `interval`, `min_y`, `max_y`, `neighbor` and `without_neighbor` fields. diff --git a/data/games/garage/mods/testabms/after_node.lua b/data/games/garage/mods/testabms/after_node.lua deleted file mode 100644 index fa2b3ab..0000000 --- a/data/games/garage/mods/testabms/after_node.lua +++ /dev/null @@ -1,12 +0,0 @@ - -local S = core.get_translator("testnodes") - --- After ABM node -core.register_node("testabms:after_abm", { - description = S("After ABM processed node."), - drawtype = "normal", - tiles = { "testabms_after_node.png" }, - - groups = { dig_immediate = 3 }, -}) - diff --git a/data/games/garage/mods/testabms/chances.lua b/data/games/garage/mods/testabms/chances.lua deleted file mode 100644 index a84e752..0000000 --- a/data/games/garage/mods/testabms/chances.lua +++ /dev/null @@ -1,56 +0,0 @@ --- test ABMs with different chances - -local S = core.get_translator("testnodes") - --- ABM chance 5 node -core.register_node("testabms:chance_5", { - description = S("Node for test ABM chance_5"), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", "Waiting for ABM testabms:chance_5") - end, -}) - -core.register_abm({ - label = "testabms:chance_5", - nodenames = "testabms:chance_5", - interval = 10, - chance = 5, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", "ABM testabsm:chance_5 changed this node.") - end -}) - --- ABM chance 20 node -core.register_node("testabms:chance_20", { - description = S("Node for test ABM chance_20"), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", "Waiting for ABM testabms:chance_20") - end, -}) - -core.register_abm({ - label = "testabms:chance_20", - nodenames = "testabms:chance_20", - interval = 10, - chance = 20, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", "ABM testabsm:chance_20 changed this node.") - end -}) - diff --git a/data/games/garage/mods/testabms/init.lua b/data/games/garage/mods/testabms/init.lua deleted file mode 100644 index 8bf4975..0000000 --- a/data/games/garage/mods/testabms/init.lua +++ /dev/null @@ -1,7 +0,0 @@ -local path = core.get_modpath(core.get_current_modname()) - -dofile(path.."/after_node.lua") -dofile(path.."/chances.lua") -dofile(path.."/intervals.lua") -dofile(path.."/min_max.lua") -dofile(path.."/neighbors.lua") diff --git a/data/games/garage/mods/testabms/intervals.lua b/data/games/garage/mods/testabms/intervals.lua deleted file mode 100644 index 9284065..0000000 --- a/data/games/garage/mods/testabms/intervals.lua +++ /dev/null @@ -1,56 +0,0 @@ --- test ABMs with different interval - -local S = core.get_translator("testnodes") - --- ABM inteval 1 node -core.register_node("testabms:interval_1", { - description = S("Node for test ABM interval_1"), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", "Waiting for ABM testabms:interval_1") - end, -}) - -core.register_abm({ - label = "testabms:interval_1", - nodenames = "testabms:interval_1", - interval = 1, - chance = 1, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", "ABM testabsm:interval_1 changed this node.") - end -}) - --- ABM interval 60 node -core.register_node("testabms:interval_60", { - description = S("Node for test ABM interval_60"), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", "Waiting for ABM testabms:interval_60") - end, -}) - -core.register_abm({ - label = "testabms:interval_60", - nodenames = "testabms:interval_60", - interval = 60, - chance = 1, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", "ABM testabsm:interval_60 changed this node.") - end -}) - diff --git a/data/games/garage/mods/testabms/min_max.lua b/data/games/garage/mods/testabms/min_max.lua deleted file mode 100644 index b5df4e4..0000000 --- a/data/games/garage/mods/testabms/min_max.lua +++ /dev/null @@ -1,58 +0,0 @@ --- test ABMs with min_y and max_y - -local S = core.get_translator("testnodes") - --- ABM min_y node -core.register_node("testabms:min_y", { - description = S("Node for test ABM min_y."), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", "Waiting for ABM testabms:min_y at y "..pos.y.." with min_y = 0") - end, -}) - -core.register_abm({ - label = "testabms:min_y", - nodenames = "testabms:min_y", - interval = 10, - chance = 1, - min_y = 0, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", "ABM testabsm:min_y changed this node.") - end -}) - --- ABM max_y node -core.register_node("testabms:max_y", { - description = S("Node for test ABM max_y."), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", "Waiting for ABM testabms:max_y at y "..pos.y.." with max_y = 0") - end, -}) - -core.register_abm({ - label = "testabms:max_y", - nodenames = "testabms:max_y", - interval = 10, - chance = 1, - max_y = 0, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", "ABM testabsm:max_y changed this node.") - end -}) - diff --git a/data/games/garage/mods/testabms/mod.conf b/data/games/garage/mods/testabms/mod.conf deleted file mode 100644 index ad74cd2..0000000 --- a/data/games/garage/mods/testabms/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testabms -description = Contains some nodes for test ABMs. diff --git a/data/games/garage/mods/testabms/neighbors.lua b/data/games/garage/mods/testabms/neighbors.lua deleted file mode 100644 index 0ce21c2..0000000 --- a/data/games/garage/mods/testabms/neighbors.lua +++ /dev/null @@ -1,99 +0,0 @@ --- test ABMs with neighbor and without_neighbor - -local S = core.get_translator("testnodes") - --- ABM required neighbor -core.register_node("testabms:required_neighbor", { - description = S("Node for test ABM required_neighbor.") .. "\n" - .. S("Sensitive neighbor node is testnodes:normal."), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", - "Waiting for ABM testabms:required_neighbor " - .. "(normal drawtype testnode sensitive)") - end, -}) - -core.register_abm({ - label = "testabms:required_neighbor", - nodenames = "testabms:required_neighbor", - neighbors = {"testnodes:normal"}, - interval = 1, - chance = 1, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", - "ABM testabsm:required_neighbor changed this node.") - end -}) - --- ABM missing neighbor node -core.register_node("testabms:missing_neighbor", { - description = S("Node for test ABM missing_neighbor.") .. "\n" - .. S("Sensitive neighbor node is testnodes:normal."), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", - "Waiting for ABM testabms:missing_neighbor" - .. " (normal drawtype testnode sensitive)") - end, -}) - -core.register_abm({ - label = "testabms:missing_neighbor", - nodenames = "testabms:missing_neighbor", - without_neighbors = {"testnodes:normal"}, - interval = 1, - chance = 1, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", - "ABM testabsm:missing_neighbor changed this node.") - end -}) - --- ABM required and missing neighbor node -core.register_node("testabms:required_missing_neighbor", { - description = S("Node for test ABM required_missing_neighbor.") .. "\n" - .. S("Sensitive neighbor nodes are testnodes:normal and testnodes:glasslike."), - drawtype = "normal", - tiles = { "testabms_wait_node.png" }, - - groups = { dig_immediate = 3 }, - - on_construct = function (pos) - local meta = core.get_meta(pos) - meta:set_string("infotext", - "Waiting for ABM testabms:required_missing_neighbor" - .. " (wint normal drawtype testnode and no glasslike" - .. " drawtype testnode sensitive)") - end, -}) - -core.register_abm({ - label = "testabms:required_missing_neighbor", - nodenames = "testabms:required_missing_neighbor", - neighbors = {"testnodes:normal"}, - without_neighbors = {"testnodes:glasslike"}, - interval = 1, - chance = 1, - action = function (pos) - core.swap_node(pos, {name="testabms:after_abm"}) - local meta = core.get_meta(pos) - meta:set_string("infotext", - "ABM testabsm:required_missing_neighbor changed this node.") - end -}) - diff --git a/data/games/garage/mods/testabms/textures/testabms_after_node.png b/data/games/garage/mods/testabms/textures/testabms_after_node.png deleted file mode 100644 index dab8759..0000000 Binary files a/data/games/garage/mods/testabms/textures/testabms_after_node.png and /dev/null differ diff --git a/data/games/garage/mods/testabms/textures/testabms_wait_node.png b/data/games/garage/mods/testabms/textures/testabms_wait_node.png deleted file mode 100644 index a9bd9a3..0000000 Binary files a/data/games/garage/mods/testabms/textures/testabms_wait_node.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/armor.lua b/data/games/garage/mods/testentities/armor.lua deleted file mode 100644 index 95351ab..0000000 --- a/data/games/garage/mods/testentities/armor.lua +++ /dev/null @@ -1,61 +0,0 @@ --- Armorball: Test entity for testing armor groups --- Rightclick to change armor group - -local phasearmor = { - [0]={icy=100}, - [1]={fiery=100}, - [2]={icy=100, fiery=100}, - [3]={fleshy=-100}, - [4]={fleshy=1}, - [5]={fleshy=10}, - [6]={fleshy=50}, - [7]={fleshy=100}, - [8]={fleshy=200}, - [9]={fleshy=1000}, - [10]={fleshy=32767}, - [11]={immortal=1}, - [12]={punch_operable=1}, -} -local max_phase = 12 - -core.register_entity("testentities:armorball", { - initial_properties = { - hp_max = 20, - physical = false, - collisionbox = {-0.4,-0.4,-0.4, 0.4,0.4,0.4}, - visual = "sprite", - visual_size = {x=1, y=1}, - textures = {"testentities_armorball.png"}, - spritediv = {x=1, y=max_phase+1}, - initial_sprite_basepos = {x=0, y=0}, - }, - - _phase = 7, - - on_activate = function(self, staticdata) - core.log("action", "[testentities] armorball.on_activate") - self.object:set_armor_groups(phasearmor[self._phase]) - self.object:set_sprite({x=0, y=self._phase}) - end, - - on_rightclick = function(self, clicker) - -- Change armor group and sprite - self._phase = self._phase + 1 - if self._phase >= max_phase + 1 then - self._phase = 0 - end - self.object:set_sprite({x=0, y=self._phase}) - self.object:set_armor_groups(phasearmor[self._phase]) - end, - - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) - if not puncher then - return - end - local name = puncher:get_player_name() - if not name then - return - end - core.chat_send_player(name, "time_from_last_punch="..string.format("%.3f", time_from_last_punch).."; damage="..tostring(damage)) - end, -}) diff --git a/data/games/garage/mods/testentities/init.lua b/data/games/garage/mods/testentities/init.lua deleted file mode 100644 index 4ad8557..0000000 --- a/data/games/garage/mods/testentities/init.lua +++ /dev/null @@ -1,5 +0,0 @@ -dofile(core.get_modpath("testentities").."/visuals.lua") -dofile(core.get_modpath("testentities").."/observers.lua") -dofile(core.get_modpath("testentities").."/selectionbox.lua") -dofile(core.get_modpath("testentities").."/armor.lua") -dofile(core.get_modpath("testentities").."/pointable.lua") diff --git a/data/games/garage/mods/testentities/mod.conf b/data/games/garage/mods/testentities/mod.conf deleted file mode 100644 index 7a8cb5a..0000000 --- a/data/games/garage/mods/testentities/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testentities -description = Example entities for testing diff --git a/data/games/garage/mods/testentities/models/LICENSE.txt b/data/games/garage/mods/testentities/models/LICENSE.txt deleted file mode 100644 index 4317d68..0000000 --- a/data/games/garage/mods/testentities/models/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Original model by MirceaKitsune (CC BY-SA 3.0). -Various alterations and fixes by kilbith, sofar, xunto, Rogier-5, TeTpaAka, Desour, -stujones11, An0n3m0us (CC BY-SA 3.0): - testentities_sam.b3d - -Jordach (CC BY-SA 3.0): - testentities_sam.png diff --git a/data/games/garage/mods/testentities/observers.lua b/data/games/garage/mods/testentities/observers.lua deleted file mode 100644 index c7e95df..0000000 --- a/data/games/garage/mods/testentities/observers.lua +++ /dev/null @@ -1,37 +0,0 @@ -local function player_names_excluding(exclude_player_name) - local player_names = {} - for _, player in ipairs(core.get_connected_players()) do - player_names[player:get_player_name()] = true - end - player_names[exclude_player_name] = nil - return player_names -end - -core.register_entity("testentities:observable", { - initial_properties = { - visual = "sprite", - textures = { "testentities_sprite.png" }, - static_save = false, - infotext = "Punch to set observers to anyone but you" - }, - on_activate = function(self) - self.object:set_armor_groups({punch_operable = 1}) - assert(self.object:get_observers() == nil) - -- Using a value of `false` in the table should error. - assert(not pcall(self.object, self.object.set_observers, self.object, {test = false})) - end, - on_punch = function(self, puncher) - local puncher_name = puncher:get_player_name() - local observers = player_names_excluding(puncher_name) - self.object:set_observers(observers) - local got_observers = self.object:get_observers() - for name in pairs(observers) do - assert(got_observers[name]) - end - for name in pairs(got_observers) do - assert(observers[name]) - end - self.object:set_properties({infotext = "Excluding " .. puncher_name}) - return true - end -}) diff --git a/data/games/garage/mods/testentities/pointable.lua b/data/games/garage/mods/testentities/pointable.lua deleted file mode 100644 index e23dcc5..0000000 --- a/data/games/garage/mods/testentities/pointable.lua +++ /dev/null @@ -1,23 +0,0 @@ --- Pointability test Entities - --- Register wrapper for compactness -local function register_pointable_testentity(name, pointable) - local texture = "testnodes_"..name..".png" - core.register_entity("testentities:"..name, { - initial_properties = { - visual = "cube", - visual_size = {x = 0.6, y = 0.6, z = 0.6}, - textures = { - texture, texture, texture, texture, texture, texture - }, - pointable = pointable, - }, - on_activate = function(self) - self.object:set_armor_groups({[name.."_test"] = 1}) - end - }) -end - -register_pointable_testentity("pointable", true) -register_pointable_testentity("not_pointable", false) -register_pointable_testentity("blocking_pointable", "blocking") diff --git a/data/games/garage/mods/testentities/selectionbox.lua b/data/games/garage/mods/testentities/selectionbox.lua deleted file mode 100644 index 8885a2a..0000000 --- a/data/games/garage/mods/testentities/selectionbox.lua +++ /dev/null @@ -1,96 +0,0 @@ -local function color(hex) - return ("blank.png^[noalpha^[colorize:#%06X:255"):format(hex) -end - -local function random_color() - return color(math.random(0, 0xFFFFFF)) -end - -local function random_rotation() - return 2 * math.pi * vector.new(math.random(), math.random(), math.random()) -end - -local active_selectionbox_entities = 0 -- count active entities - -core.register_entity("testentities:selectionbox", { - initial_properties = { - visual = "cube", - infotext = "Punch to randomize rotation, rightclick to toggle rotation" - }, - on_activate = function(self) - active_selectionbox_entities = active_selectionbox_entities + 1 - - local w, h, l = math.random(), math.random(), math.random() - self.object:set_properties({ - textures = {random_color(), random_color(), random_color(), random_color(), random_color(), random_color()}, - selectionbox = {rotate = true, -w/2, -h/2, -l/2, w/2, h/2, l/2}, - visual_size = vector.new(w, h, l), - automatic_rotate = 2 * math.pi * (math.random() - 0.5) - }) - assert(self.object:get_properties().selectionbox.rotate) - self.object:set_armor_groups({punch_operable = 1}) - self.object:set_rotation(random_rotation()) - end, - on_deactivate = function() - active_selectionbox_entities = active_selectionbox_entities - 1 - end, - on_punch = function(self) - self.object:set_rotation(random_rotation()) - end, - on_rightclick = function(self) - self.object:set_properties({ - automatic_rotate = self.object:get_properties().automatic_rotate == 0 and 2 * math.pi * (math.random() - 0.5) or 0 - }) - end -}) - -local hud_ids = {} -core.register_globalstep(function() - if active_selectionbox_entities == 0 then - return - end - - for _, player in pairs(core.get_connected_players()) do - local offset = player:get_eye_offset() - offset.y = offset.y + player:get_properties().eye_height - local pos1 = vector.add(player:get_pos(), offset) - local raycast = core.raycast(pos1, vector.add(pos1, vector.multiply(player:get_look_dir(), 10)), true, false) - local pointed_thing = raycast() - if pointed_thing.ref == player then - pointed_thing = raycast() - end - local remove_hud_element = true - local pname = player:get_player_name() - local hud_id = hud_ids[pname] - if pointed_thing and pointed_thing.type == "object" then - local ent = pointed_thing.ref:get_luaentity() - if ent and ent.name == "testentities:selectionbox" then - hud_ids[pname] = hud_id or player:hud_add({ - type = "text", -- See HUD element types - position = {x=0.5, y=0.5}, - text = "X", - number = 0xFF0000, - alignment = {x=0, y=0}, - }) - local shade = math.random(0, 0xFF) - core.add_particle({ - -- Random shade of red for the intersection point - texture = color(0x10000 * shade), - pos = pointed_thing.intersection_point, - size = 0.1 - }) - core.add_particle({ - -- Same shade of green for the corresponding intersection normal - texture = color(0x100 * shade), - pos = vector.add(pointed_thing.intersection_point, pointed_thing.intersection_normal * 0.1), - size = 0.1 - }) - remove_hud_element = false - end - end - if remove_hud_element and hud_id then - player:hud_remove(hud_id) - hud_ids[pname] = nil - end - end -end) diff --git a/data/games/garage/mods/testentities/textures/testentities_armorball.png b/data/games/garage/mods/testentities/textures/testentities_armorball.png deleted file mode 100644 index 566dbcf..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_armorball.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_cube1.png b/data/games/garage/mods/testentities/textures/testentities_cube1.png deleted file mode 100644 index c667e42..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_cube1.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_cube2.png b/data/games/garage/mods/testentities/textures/testentities_cube2.png deleted file mode 100644 index 4818234..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_cube2.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_cube3.png b/data/games/garage/mods/testentities/textures/testentities_cube3.png deleted file mode 100644 index 03b5daa..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_cube3.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_cube4.png b/data/games/garage/mods/testentities/textures/testentities_cube4.png deleted file mode 100644 index 6392048..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_cube4.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_cube5.png b/data/games/garage/mods/testentities/textures/testentities_cube5.png deleted file mode 100644 index d8acdf0..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_cube5.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_cube6.png b/data/games/garage/mods/testentities/textures/testentities_cube6.png deleted file mode 100644 index 5f81a64..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_cube6.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_dungeon_master.png b/data/games/garage/mods/testentities/textures/testentities_dungeon_master.png deleted file mode 100644 index 1e31077..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_dungeon_master.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_sprite.png b/data/games/garage/mods/testentities/textures/testentities_sprite.png deleted file mode 100644 index a4b0196..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_sprite.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_upright_sprite1.png b/data/games/garage/mods/testentities/textures/testentities_upright_sprite1.png deleted file mode 100644 index 6242511..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_upright_sprite1.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/textures/testentities_upright_sprite2.png b/data/games/garage/mods/testentities/textures/testentities_upright_sprite2.png deleted file mode 100644 index a79a760..0000000 Binary files a/data/games/garage/mods/testentities/textures/testentities_upright_sprite2.png and /dev/null differ diff --git a/data/games/garage/mods/testentities/visuals.lua b/data/games/garage/mods/testentities/visuals.lua deleted file mode 100644 index b61b5e8..0000000 --- a/data/games/garage/mods/testentities/visuals.lua +++ /dev/null @@ -1,150 +0,0 @@ --- Minimal test entities to test visuals - -core.register_entity("testentities:sprite", { - initial_properties = { - visual = "sprite", - textures = { "testentities_sprite.png" }, - }, -}) - -core.register_entity("testentities:upright_sprite", { - initial_properties = { - visual = "upright_sprite", - textures = { - "testentities_upright_sprite1.png", - "testentities_upright_sprite2.png", - }, - }, -}) - -core.register_entity("testentities:cube", { - initial_properties = { - visual = "cube", - textures = { - "testentities_cube1.png", - "testentities_cube2.png", - "testentities_cube3.png", - "testentities_cube4.png", - "testentities_cube5.png", - "testentities_cube6.png", - }, - }, -}) - -core.register_entity("testentities:item", { - initial_properties = { - visual = "item", - wield_item = "testnodes:normal", - }, -}) - -core.register_entity("testentities:wielditem", { - initial_properties = { - visual = "wielditem", - wield_item = "testnodes:normal", - }, -}) - -core.register_entity("testentities:mesh", { - initial_properties = { - visual = "mesh", - mesh = "testnodes_pyramid.obj", - textures = { - "testnodes_mesh_stripes2.png" - }, - }, -}) - -core.register_entity("testentities:mesh_unshaded", { - initial_properties = { - visual = "mesh", - mesh = "testnodes_pyramid.obj", - textures = { - "testnodes_mesh_stripes2.png" - }, - shaded = false, - }, -}) - -core.register_entity("testentities:sam", { - initial_properties = { - visual = "mesh", - mesh = "testentities_sam.b3d", - textures = { - "testentities_sam.png" - }, - }, - on_activate = function(self) - self.object:set_animation({x = 0, y = 219}, 30, 0, true) - end, -}) - --- Advanced visual tests - --- An entity for testing animated and yaw-modulated sprites -core.register_entity("testentities:yawsprite", { - initial_properties = { - selectionbox = {-0.3, -0.5, -0.3, 0.3, 0.3, 0.3}, - visual = "sprite", - visual_size = {x=0.6666, y=1}, - textures = {"testentities_dungeon_master.png^[makealpha:128,0,0^[makealpha:128,128,0"}, - spritediv = {x=6, y=5}, - initial_sprite_basepos = {x=0, y=0}, - }, - on_activate = function(self, staticdata) - self.object:set_sprite({x=0, y=0}, 3, 0.5, true) - end, -}) - --- An entity for testing animated upright sprites -core.register_entity("testentities:upright_animated", { - initial_properties = { - visual = "upright_sprite", - textures = {"testnodes_anim.png"}, - spritediv = {x = 1, y = 4}, - }, - on_activate = function(self) - self.object:set_sprite({x=0, y=0}, 4, 1.0, false) - end, -}) - -core.register_entity("testentities:nametag", { - initial_properties = { - visual = "sprite", - textures = { "testentities_sprite.png" }, - }, - - on_activate = function(self, staticdata) - if staticdata ~= "" then - local data = core.deserialize(staticdata) - self.color = data.color - self.bgcolor = data.bgcolor - else - self.color = { - r = math.random(0, 255), - g = math.random(0, 255), - b = math.random(0, 255), - } - - if math.random(0, 10) > 5 then - self.bgcolor = { - r = math.random(0, 255), - g = math.random(0, 255), - b = math.random(0, 255), - a = math.random(0, 255), - } - end - end - - assert(self.color) - self.object:set_properties({ - nametag = tostring(math.random(1000, 10000)), - nametag_color = self.color, - nametag_bgcolor = self.bgcolor, - }) - end, - - get_staticdata = function(self) - return core.serialize({ color = self.color, bgcolor = self.bgcolor }) - end, -}) diff --git a/data/games/garage/mods/testfood/init.lua b/data/games/garage/mods/testfood/init.lua deleted file mode 100644 index 0a264a3..0000000 --- a/data/games/garage/mods/testfood/init.lua +++ /dev/null @@ -1,35 +0,0 @@ -local S = core.get_translator("testfood") - -core.register_craftitem("testfood:good1", { - description = S("Good Food (+1)").."\n".. - S("Punch: Eat"), - inventory_image = "testfood_good.png", - on_use = core.item_eat(1), -}) -core.register_craftitem("testfood:good5", { - description = S("Good Food (+5)").."\n".. - S("Punch: Eat"), - inventory_image = "testfood_good2.png", - on_use = core.item_eat(5), -}) - -core.register_craftitem("testfood:bad1", { - description = S("Bad Food (-1)").."\n".. - S("Punch: Eat"), - inventory_image = "testfood_bad.png", - on_use = core.item_eat(-1), -}) -core.register_craftitem("testfood:bad5", { - description = S("Bad Food (-5)").."\n".. - S("Punch: Eat"), - inventory_image = "testfood_bad2.png", - on_use = core.item_eat(-5), -}) - -core.register_craftitem("testfood:replace1", { - description = S("Replacing Food (+1)").."\n".. - S("Punch: Eat and replace with 'Good Food (+1)'"), - inventory_image = "testfood_replace.png", - on_use = core.item_eat(1, "testfood:good1"), -}) - diff --git a/data/games/garage/mods/testfood/mod.conf b/data/games/garage/mods/testfood/mod.conf deleted file mode 100644 index 7bff21b..0000000 --- a/data/games/garage/mods/testfood/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testfood -description = For testing food items diff --git a/data/games/garage/mods/testfood/textures/testfood_bad.png b/data/games/garage/mods/testfood/textures/testfood_bad.png deleted file mode 100644 index 6e92514..0000000 Binary files a/data/games/garage/mods/testfood/textures/testfood_bad.png and /dev/null differ diff --git a/data/games/garage/mods/testfood/textures/testfood_bad2.png b/data/games/garage/mods/testfood/textures/testfood_bad2.png deleted file mode 100644 index 22b5678..0000000 Binary files a/data/games/garage/mods/testfood/textures/testfood_bad2.png and /dev/null differ diff --git a/data/games/garage/mods/testfood/textures/testfood_good.png b/data/games/garage/mods/testfood/textures/testfood_good.png deleted file mode 100644 index 31df7f5..0000000 Binary files a/data/games/garage/mods/testfood/textures/testfood_good.png and /dev/null differ diff --git a/data/games/garage/mods/testfood/textures/testfood_good2.png b/data/games/garage/mods/testfood/textures/testfood_good2.png deleted file mode 100644 index e43dda2..0000000 Binary files a/data/games/garage/mods/testfood/textures/testfood_good2.png and /dev/null differ diff --git a/data/games/garage/mods/testfood/textures/testfood_replace.png b/data/games/garage/mods/testfood/textures/testfood_replace.png deleted file mode 100644 index 1ef6876..0000000 Binary files a/data/games/garage/mods/testfood/textures/testfood_replace.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/LICENSE.txt b/data/games/garage/mods/testformspec/LICENSE.txt deleted file mode 100644 index 07696cc..0000000 --- a/data/games/garage/mods/testformspec/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -License of media files ----------------------- -Content imported from minetest_game. - - -BlockMen (CC BY-SA 3.0) - default_chest_front.png - default_chest_lock.png - default_chest_side.png - default_chest_top.png - -stujones11 (CC BY-SA 3.0) -An0n3m0us (CC BY-SA 3.0) - testformspec_character.b3d diff --git a/data/games/garage/mods/testformspec/callbacks.lua b/data/games/garage/mods/testformspec/callbacks.lua deleted file mode 100644 index a4df232..0000000 --- a/data/games/garage/mods/testformspec/callbacks.lua +++ /dev/null @@ -1,51 +0,0 @@ -local callback_test = 0 - -local out = function(player, formname, fields, number) - local snum = "" - if number then - snum = " "..number - end - local msg = "Formspec callback"..snum..": player="..player:get_player_name()..", formname=\""..tostring(formname).."\", fields="..dump(fields) - core.chat_send_player(player:get_player_name(), msg) - core.log("action", msg) -end - -core.register_on_player_receive_fields(function(player, formname, fields) - if callback_test == 1 then - out(player, formname, fields) - elseif callback_test == 2 then - out(player, formname, fields, 1) - end -end) -core.register_on_player_receive_fields(function(player, formname, fields) - if callback_test == 2 then - out(player, formname, fields, 2) - return true -- Disable the first callback - end -end) -core.register_on_player_receive_fields(function(player, formname, fields) - if callback_test == 2 then - out(player, formname, fields, 3) - end -end) - -core.register_chatcommand("test_formspec_callbacks", { - params = "[ 0 | 1 | 2 ]", - description = "Test: Change formspec callbacks testing mode", - func = function(name, param) - local mode = tonumber(param) - if not mode then - callback_test = (callback_test + 1 % 3) - else - callback_test = mode - end - if callback_test == 1 then - core.chat_send_player(name, "Formspec callback test mode 1 enabled: Logging only") - elseif callback_test == 2 then - core.chat_send_player(name, "Formspec callback test mode 2 enabled: Three callbacks, disable pre-registered callbacks") - else - callback_test = 0 - core.chat_send_player(name, "Formspec callback test disabled!") - end - end -}) diff --git a/data/games/garage/mods/testformspec/dummy_items.lua b/data/games/garage/mods/testformspec/dummy_items.lua deleted file mode 100644 index 50fb989..0000000 --- a/data/games/garage/mods/testformspec/dummy_items.lua +++ /dev/null @@ -1,14 +0,0 @@ --- This code adds dummy items that are supposed to be used in formspecs --- for testing item_image formspec elements. - -core.register_node("testformspec:node", { - description = "Formspec Test Node", - tiles = { "testformspec_node.png" }, - groups = { dig_immediate = 3, dummy = 1 }, -}) - -core.register_craftitem("testformspec:item", { - description = "Formspec Test Item", - inventory_image = "testformspec_item.png", - groups = { dummy = 1 }, -}) diff --git a/data/games/garage/mods/testformspec/formspec.lua b/data/games/garage/mods/testformspec/formspec.lua deleted file mode 100644 index 29014f1..0000000 --- a/data/games/garage/mods/testformspec/formspec.lua +++ /dev/null @@ -1,591 +0,0 @@ -local color = core.colorize - --- \208\176 is a cyrillic small a -local unsafe_url = core.formspec_escape("https://u:p@wikipedi\208\176.org:1233/heIIoll?a=b#c") - -local clip_fs = [[ - style_type[label,button,image_button,item_image_button, - tabheader,scrollbar,table,animated_image - ,field,textarea,checkbox,dropdown;noclip=%c] - - label[0,0;A clipping test] - button_url[0,1;3,0.8;clip_button;A clipping test;]] .. unsafe_url .. [[] - image_button[0,2;3,0.8;testformspec_button_image.png;clip_image_button;A clipping test] - item_image_button[0,3;3,0.8;testformspec:item;clip_item_image_button;A clipping test] - tabheader[0,4.7;3,0.63;clip_tabheader;Clip,Test,Text,Tabs;1;false;false] - field[0,5;3,0.8;clip_field;Title;] - textarea[0,6;3,1;clip_textarea;Title;] - checkbox[0,7.5;clip_checkbox;This is a test;true] - dropdown[0,8;3,0.8;clip_dropdown;Select An Item,One,Two,Three,Four,Five;1] - scrollbar[0,9;3,0.8;horizontal;clip_scrollbar;3] - tablecolumns[text;text] - table[0,10;3,1;clip_table;one,two,three,four;1] - animated_image[-0.5,11;4.5,1;clip_animated_image;testformspec_animation.png;4;100] -]] - -local tabheaders_fs = [[ - tabheader[0,0;10,0.63;tabs_opaque;Opaque,Without,Border;1;false;false] - tabheader[0,1;10,0.63;tabs_opaque_border;Opaque,With,Border;1;false;true] - tabheader[0,2;10,0.63;tabs_transparent;Transparent,Without,Border;1;true;false] - tabheader[0,3;10,0.63;tabs_transparent_border;Transparent,With,Border;1;true;true] - tabheader[0,4;tabs_default;Default,Tabs;1] - tabheader[0,6;10,0.5;tabs_size1;Height=0.5;1;false;false] - tabheader[2,6;10,0.75;tabs_size1;Height=0.75;1;false;false] - tabheader[4,6;10,1;tabs_size2;Height=1;1;false;false] - tabheader[6,6;10,1.25;tabs_size2;Height=1.25;1;false;false] - tabheader[8,6;10,1.5;tabs_size2;Height=1.5;1;false;false] -]] - -local inv_style_fs = [[ - style_type[list;noclip=true] - list[current_player;main;-0.75,0.75;2,2] - - real_coordinates[false] - list[current_player;main;1.5,0;3,2] - real_coordinates[true] - - real_coordinates[false] - style_type[list;size=1.1;spacing=0.1] - list[current_player;main;5,0;3,2] - real_coordinates[true] - - style_type[list;size=.001;spacing=0] - list[current_player;main;7,3.5;8,4] - - box[3,3.5;1,1;#000000] - box[5,3.5;1,1;#000000] - box[4,4.5;1,1;#000000] - box[3,5.5;1,1;#000000] - box[5,5.5;1,1;#000000] - style_type[list;spacing=.25,.125;size=.75,.875] - list[current_player;main;3,3.5;3,3] - - style_type[list;spacing=0;size=1.1] - list[current_player;main;.5,7;8,4] -]] - --- Some textures from textures/base/pack and Devtest, with many different sizes --- and aspect ratios. -local image_column = "image,0=logo.png,1=crack_anylength.png^[invert:rgb,2=checkbox_16.png," .. - "3=checkbox_32.png,4=checkbox_64.png,5=default_lava.png," .. - "6=progress_bar.png,7=progress_bar_bg.png" -local words = { - "esciunt", "repudiandae", "repellat", "voluptatem", "autem", "vitae", "et", - "minima", "quasi", "facere", "nihil", "ea", "nemo", "rem", "non", "eos", - "laudantium", "eveniet", "veritatis", -} - -local reseed = math.random(2^31-1) -math.randomseed(1337) - -local table_content = {} -for i = 1, 100 do - table.insert(table_content, words[math.random(#words)]) - table.insert(table_content, words[math.random(#words)]) - table.insert(table_content, words[math.random(#words)]) - table.insert(table_content, math.random(0, 7)) - table.insert(table_content, math.random(0, 7)) - table.insert(table_content, math.random(0, 7)) - table.insert(table_content, words[math.random(#words)]) -end - -math.randomseed(reseed) - -local table_fs = table.concat({ - "tablecolumns[text,align=left;text,align=right;text,align=center;", - image_column, ",align=left;", - image_column, ",align=right;", - image_column, ",align=center;text,align=right]", - "table[0,0;17,12;the_table;", table.concat(table_content, ","), ";1]" -}) - -local hypertext_basic = [[A hypertext element -Normal test -This is a normal text. - -style test - - . - - -Tag test -normal -mono -bold -italic -underlined -big -bigger -left -
center
-right -justify. Here comes a blind text: Lorem testum dolor sit amet consecutor celeron fiftifahivus e shadoninia e smalus jokus anrus relsocutoti rubenwardus. Erasputinus hara holisti dominus wusi. Grumarinsti erltusmuate ol fortitusti fla flo, blani burki e sfani fahif. Ultae ratii, e megus gigae don anonimus. Grinus dimondus krockus e nore. Endus finalus nowus comus endus o blindus tekstus. - -Custom tag test - - - - - -color=green -Action: color=green -Action: hovercolor=yellow -Action URL: open URL -size=24 -font=mono -color=green font=mono size=24 - -action test -action - -img test -Normal: - -width=48 height=48: - -float=left: - -float=right: - - -item test -Normal: - -width=48 height=48 - -angle=30,0,0: - -angle=0,30,0: - -angle=0,0,30: - -rotate=yes: - -rotate=100,0,0: - -rotate=0,100,0: - -rotate=0,0,100: - -rotate=50,75,100: - -angle=-30,-45,90 rotate=100,150,-50: -]] - -local hypertext_global = [[ - -This is a test of the global tag. The parameters are: -background=gray margin=20 valign=bottom halign=right color=pink hovercolor=purple size=12 font=mono -action]] - -local hypertext_fs = "hypertext[0,0;11,9;hypertext;"..core.formspec_escape(hypertext_basic).."]".. - "hypertext[0,9.5;11,2.5;hypertext;"..core.formspec_escape(hypertext_global).."]" - -local style_fs = [[ - style[one_btn1;bgcolor=red;textcolor=yellow;bgcolor_hovered=orange; - bgcolor_pressed=purple] - button_url_exit[0,0;2.5,0.8;one_btn1;Button;]] .. unsafe_url .. [[] - - style[one_btn2;border=false;textcolor=cyan] ]].. - "button[0,1.05;2.5,0.8;one_btn2;Text " .. color("#FF0", "Yellow") .. [[] - - style[one_btn3;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png; - bgimg_pressed=testformspec_pressed.png] - button[0,2.1;1,1;one_btn3;Border] - - style[one_btn4;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png; - bgimg_pressed=testformspec_pressed.png;border=false] - button[1.25,2.1;1,1;one_btn4;NoBor] - - style[one_btn5;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png; - bgimg_pressed=testformspec_pressed.png;border=false;alpha=false] - button[0,3.35;1,1;one_btn5;Alph] - - style[one_btn6;border=true] - image_button[0,4.6;1,1;testformspec_button_image.png;one_btn6;Border] - - style[one_btn7;border=false] - image_button[1.25,4.6;1,1;testformspec_button_image.png;one_btn7;NoBor] - - style[one_btn8;border=false] - image_button[0,5.85;1,1;testformspec_button_image.png;one_btn8;Border;false;true;testformspec_pressed.png] - - style[one_btn9;border=true] - image_button[1.25,5.85;1,1;testformspec_button_image.png;one_btn9;NoBor;false;false;testformspec_pressed.png] - - style[one_btn10;alpha=false] - image_button[0,7.1;1,1;testformspec_button_image.png;one_btn10;NoAlpha] - - style[one_btn11;alpha=true] - image_button[1.25,7.1;1,1;testformspec_button_image.png;one_btn11;Alpha] - - style[one_btn12;border=true] - item_image_button[0,8.35;1,1;testformspec:item;one_btn12;Border] - - style[one_btn13;border=false] - item_image_button[1.25,8.35;1,1;testformspec:item;one_btn13;NoBor] - - style[one_btn14;border=false;bgimg=testformspec_bg.png;fgimg=testformspec_button_image.png] - style[one_btn14:hovered;bgimg=testformspec_bg_hovered.png;fgimg=testformspec_hovered.png;textcolor=yellow] - style[one_btn14:pressed;bgimg=testformspec_bg_pressed.png;fgimg=testformspec_pressed.png;textcolor=blue] - style[one_btn14:hovered+pressed;textcolor=purple] - style[one_btn14:focused;textcolor=red] - image_button[0,9.6;1,1;testformspec_button_image.png;one_btn14;Bg] - - style[one_btn15;border=false;bgcolor=#1cc;bgimg=testformspec_bg.png;bgimg_hovered=testformspec_bg_hovered.png;bgimg_pressed=testformspec_bg_pressed.png] - item_image_button[1.25,9.6;1,1;testformspec:item;one_btn15;Bg] - - style[one_btn16;border=false;bgimg=testformspec_bg_9slice.png;bgimg_middle=4,6;padding=5,7;fgimg=testformspec_bg.png;fgimg_middle=1] - style[one_btn16:hovered;bgimg=testformspec_bg_9slice_hovered.png;fgimg=testformspec_bg_hovered.png] - style[one_btn16:pressed;bgimg=testformspec_bg_9slice_pressed.png;fgimg=testformspec_bg_pressed.png] - style[one_btn16:focused;bgimg=testformspec_bg_9slice_focused.png;fgimg=testformspec_bg_focused.png] - image_button[2.5,9.6;2,1;;one_btn16;9-Slice Bg] - - - container[2.75,0] - - style[one_tb1;textcolor=Yellow] - tabheader[0,3;2.5,0.63;one_tb1;Yellow,Text,Tabs;1;false;false] - - style[one_f1;textcolor=yellow] - field[0,4.25;2.5,0.8;one_f1;Field One;Yellow Text] - - style[one_f2;border=false;textcolor=cyan] - field[0,5.75;2.5,0.8;one_f2;Field Two;Borderless Cyan Text] - - style[one_f3;textcolor=yellow] - textarea[0,7.025;2.5,0.8;one_f3;Label;]] .. - core.formspec_escape("Yellow Text\nLine two") .. [[ ] - - style[one_f4;border=false;textcolor=cyan] - textarea[0,8.324999999999999;2.5,0.8;one_f4;Label;]] .. - core.formspec_escape("Borderless Cyan Text\nLine two") .. [[ ] - - container_end[] -]] - -local scroll_fs = - "button[8.5,1;4,1;outside;Outside of container]".. - "box[1,1;8,6;#00aa]".. - "scroll_container[1,1;8,6;scrbar;vertical]".. - "button[0,1;1,1;lorem;Lorem]".. - "animated_image[0,1;4.5,1;clip_animated_image;testformspec_animation.png;4;100]" .. - "button[0,10;1,1;ipsum;Ipsum]".. - "pwdfield[2,2;1,1;lorem2;Lorem]".. - "list[current_player;main;4,4;1,5;]".. - "box[2,5;3,2;#ffff00]".. - "image[1,10;3,2;testformspec_item.png]".. - "image[3,1;testformspec_item.png]".. - "item_image[2,6;3,2;testformspec:node]".. - "label[2,15;bla Bli\nfoo bar]".. - "item_image_button[2,3;1,1;testformspec:node;itemimagebutton;ItemImageButton]".. - "tooltip[0,11;3,2;Buz;#f00;#000]".. - "box[0,11;3,2;#00ff00]".. - "hypertext[3,13;3,3;;" .. hypertext_basic .. "]" .. - "hypertext[3,17;3,3;;Hypertext with no scrollbar\\; the scroll container should scroll.]" .. - "textarea[3,21;3,1;textarea;;More scroll within scroll]" .. - "container[0,18]".. - "box[1,2;3,2;#0a0a]".. - "scroll_container[1,2;3,2;scrbar2;horizontal;0.06]".. - "button[0,0;6,1;butnest;Nest]".. - "label[10,0.5;nest]".. - "scroll_container_end[]".. - "scrollbar[1,0;3.5,0.3;horizontal;scrbar2;0]".. - "container_end[]".. - "dropdown[0,6;2;hmdrpdwn;apple,bulb;1]".. - "image_button[0,4;2,2;testformspec_button_image.png;imagebutton;bbbbtt;false;true;testformspec_pressed.png]".. - "box[1,22.5;4,1;#a00a]".. - "scroll_container_end[]".. - "scrollbaroptions[max=170]".. -- lowest seen pos is: 0.1*170+6=23 (factor*max+height) - "scrollbar[7.5,0;0.3,4;vertical;scrbar;0]".. - "scrollbar[8,0;0.3,4;vertical;scrbarhmmm;0]".. - "dropdown[0,6;2;hmdrpdwnnn;Outside,of,container;1]".. - "scroll_container[0,8;10,4;scrbar420;vertical;0.1;2]".. - "button[0.5,0.5;10,1;;Container with padding=2]".. - "list[current_player;main;0,5;8,4;]".. - "scroll_container_end[]".. - "scrollbar[10.1,8;0.5,4;vertical;scrbar420;0]".. - -- Buttons for scale comparison - "button[11,8;1,1;;0]".. - "button[11,9;1,1;;1]".. - "button[11,10;1,1;;2]".. - "button[11,11;1,1;;3]".. - "button[11,12;1,1;;4]" - ---style_type[label;textcolor=green] ---label[0,0;Green] ---style_type[label;textcolor=blue] ---label[0,1;Blue] ---style_type[label;textcolor=;border=true] ---label[1.2,0;Border] ---style_type[label;border=true;bgcolor=red] ---label[1.2,1;Background] ---style_type[label;border=;bgcolor=] ---label[0.75,2;Reset] - -local window = { - sizex = 12, - sizey = 13, - positionx = 0.5, - positiony = 0.5, - anchorx = 0.5, - anchory = 0.5, - paddingx = 0.05, - paddingy = 0.05 -} - -local pages = { - -- Real Coordinates - [[ - formspec_version[3] - size[12,13] - image_button[0,0;1,1;logo.png;rc_image_button_1x1;1x1] - image_button[1,0;2,2;logo.png;rc_image_button_2x2;2x2] - button[0,2;1,1;rc_button_1x1;1x1] - button[1,2;2,2;rc_button_2x2;2x2] - item_image[0,4;1,1;air] - item_image[1,4;2,2;air] - item_image_button[0,6;1,1;testformspec:node;rc_item_image_button_1x1;1x1] - item_image_button[1,6;2,2;testformspec:node;rc_item_image_button_2x2;2x2] - field[3,.5;3,.5;rc_field;Field;text] - pwdfield[6,.5;3,1;rc_pwdfield;Password Field] - field[3,1;3,1;;Read-Only Field;text] - textarea[3,2;3,.5;rc_textarea_small;Textarea;text] - textarea[6,2;3,2;rc_textarea_big;Textarea;text\nmore text] - textarea[3,3;3,1;;Read-Only Textarea;text\nmore text] - textlist[3,4;3,2;rc_textlist;Textlist,Perfect Coordinates;1;false] - tableoptions[highlight=#ABCDEF75;background=#00000055;border=false] - table[6,4;3,2;rc_table;Table,Cool Stuff,Foo,Bar;2] - dropdown[3,6;3,1;rc_dropdown_small;This,is,a,dropdown;1] - dropdown[6,6;3,2;rc_dropdown_big;I,am,a,bigger,dropdown;5] - image[0,8;3,2;ignore.png] - box[3,7;3,1;#00A3FF] - checkbox[3,8;rc_checkbox_1;Check me!;false] - checkbox[3,9;rc_checkbox_2;Uncheck me now!;true] - scrollbar[0,11.5;11.5,.5;horizontal;rc_scrollbar_horizontal;500] - scrollbar[11.5,0;.5,11.5;vertical;rc_scrollbar_vertical;0] - list[current_player;main;6,8;3,2;1] - button[9,0;2.5,1;rc_empty_button_1;] - button[9,1;2.5,1;rc_empty_button_2;] - button[9,2;2.5,1;rc_empty_button_3;] ]].. - "label[9,0.5;This is a label.\nLine\nLine\nLine\nEnd]".. - [[button[9,3;1,1;rc_empty_button_4;] - vertlabel[9,4;VERT] - label[10,3;HORIZ] - tabheader[8,0;6,0.65;rc_tabheader;Tab 1,Tab 2,Tab 3,Secrets;1;false;false] - ]], - -- Style - - "formspec_version[3]size[12,13]" .. - ("label[0.375,0.375;Styled - %s %s]"):format( - color("#F00", "red text"), - color("#77FF00CC", "green text")) .. - "label[6.375,0.375;Unstyled]" .. - "box[0,0.75;12,0.1;#999]" .. - "box[6,0.85;0.1,11.15;#999]" .. - "container[0.375,1.225]" .. - style_fs .. - "container_end[]container[6.375,1.225]" .. - style_fs:gsub("one_", "two_"):gsub("style%[[^%]]+%]", ""):gsub("style_type%[[^%]]+%]", "") .. - "container_end[]", - - -- Noclip - "formspec_version[3]size[12,13]" .. - "label[0.1,0.5;Clip]" .. - "container[-2.5,1]" .. clip_fs:gsub("%%c", "false") .. "container_end[]" .. - "label[11,0.5;Noclip]" .. - "container[11.5,1]" .. clip_fs:gsub("%%c", "true") .. "container_end[]", - - -- Table - "size[18,13]real_coordinates[true]" .. - "container[0.5,0.5]" .. table_fs.. "container_end[]", - - -- Hypertext - "size[12,13]real_coordinates[true]" .. - "container[0.5,0.5]" .. hypertext_fs .. "container_end[]", - - -- Tabheaders - "size[12,13]real_coordinates[true]" .. - "container[0.5,1.5]" .. tabheaders_fs .. "container_end[]", - - -- Inv - "size[12,13]real_coordinates[true]" .. inv_style_fs, - - -- Window - function() - return "formspec_version[3]" .. - string.format("size[%s,%s]position[%s,%s]anchor[%s,%s]padding[%s,%s]", - window.sizex, window.sizey, window.positionx, window.positiony, - window.anchorx, window.anchory, window.paddingx, window.paddingy) .. - string.format("field[0.5,0.5;2.5,0.5;sizex;X Size;%s]field[3.5,0.5;2.5,0.5;sizey;Y Size;%s]" .. - "field[0.5,1.5;2.5,0.5;positionx;X Position;%s]field[3.5,1.5;2.5,0.5;positiony;Y Position;%s]" .. - "field[0.5,2.5;2.5,0.5;anchorx;X Anchor;%s]field[3.5,2.5;2.5,0.5;anchory;Y Anchor;%s]" .. - "field[0.5,3.5;2.5,0.5;paddingx;X Padding;%s]field[3.5,3.5;2.5,0.5;paddingy;Y Padding;%s]" .. - "button[2,4.5;2.5,0.5;submit_window;Submit]", - window.sizex, window.sizey, window.positionx, window.positiony, - window.anchorx, window.anchory, window.paddingx, window.paddingy) .. - "field_close_on_enter[sizex;false]field_close_on_enter[sizey;false]" .. - "field_close_on_enter[positionx;false]field_close_on_enter[positiony;false]" .. - "field_close_on_enter[anchorx;false]field_close_on_enter[anchory;false]" .. - "field_close_on_enter[paddingx;false]field_close_on_enter[paddingy;false]" - end, - - -- Animation - [[ - formspec_version[6] - size[12,13] - animated_image[0.5,0.5;1,1;;testformspec_animation.png;4;100] - animated_image[0.5,1.75;1,1;;testformspec_animation.jpg;4;100] - animated_image[1.75,0.5;1,1;;testformspec_animation.png;100;100] - animated_image[3,0.5;1,1;ani_img_1;testformspec_animation.png;4;1000] - image[0.5,3;1,1;testformspec_bg.png;1] - animated_image[0.5,4.25;1,1;;[combine:16x48:0,0=testformspec_bg.png:0,16=testformspec_bg_hovered.png:0,32=testformspec_bg_pressed.png;3;250;1;1] - image[0.5,5.5;2,1;testformspec_9slice.png;16,0,-16,-16] - animated_image[2.75,5.5;1.5,0.5;;[combine:300x140:0,0=testformspec_9slice.png:0,70=(testformspec_9slice.png^[transformFX);2;500;1;16,0,-16,-16] - button[4.25,0.5;1,1;ani_btn_1;Current -Number] - animated_image[3,1.75;1,1;ani_img_2;testformspec_animation.png;4;1000;2] - button[4.25,1.75;1,1;ani_btn_2;Current -Number] - animated_image[3,3;1,1;;testformspec_animation.png;4;0] - animated_image[3,4.25;1,1;;testformspec_animation.png;4;0;3] - animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100] - animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100] - - ]], - - -- Model - [[ - formspec_version[3] - size[12,13] - style[m1;bgcolor=black] - style[m2;bgcolor=black] - label[5,1;all defaults] - label[5,5.1;angle = 0, 180 -continuous = false -mouse control = false -frame loop range = 0,30] - label[5,9.2;continuous = true -mouse control = true] - model[0.5,0.1;4,4;m1;testformspec_character.b3d;testformspec_character.png] - model[0.5,4.2;4,4;m2;testformspec_character.b3d;testformspec_character.png;0,180;false;false;0,30] - model[0.5,8.3;4,4;m3;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true] - ]], - - -- Scroll containers - "formspec_version[7]size[12,13]" .. - scroll_fs, - - -- Sound - [[ - formspec_version[3] - size[12,13] - style[snd_btn;sound=soundstuff_mono] - style[snd_ibtn;sound=soundstuff_mono] - style[snd_drp;sound=soundstuff_mono] - style[snd_chk;sound=soundstuff_mono] - style[snd_tab;sound=soundstuff_mono] - button[0.5,0.5;2,1;snd_btn;Sound] - image_button[0.5,2;2,1;testformspec_item.png;snd_ibtn;Sound] - dropdown[0.5,4;4;snd_drp;Sound,Two,Three;] - checkbox[0.5,5.5.5;snd_chk;Sound;] - tabheader[0.5,7;8,0.65;snd_tab;Soundtab1,Soundtab2,Soundtab3;1;false;false] - ]], - - -- Background - [[ - formspec_version[3] - size[12,13] - box[0,0;12,13;#f0f1] - background[0,0;0,0;testformspec_bg.png;true] - box[3.9,2.9;6.2,4.2;#d00f] - scroll_container[4,3;6,4;scrbar;vertical] - background9[1,0.5;0,0;testformspec_bg_9slice.png;true;4,6] - label[0,0.2;Backgrounds are not be applied to scroll containers,] - label[0,0.5;but to the whole form.] - scroll_container_end[] - scrollbar[3.5,3;0.3,4;vertical;scrbar;0] - container[2,11] - box[-0.1,0.5;3.2,1;#fff5] - background[0,0;2,3;testformspec_bg.png;false] - background9[1,0;2,3;testformspec_bg_9slice.png;false;4,6] - container_end[] - ]], - - -- Unsized - [[ - formspec_version[3] - background9[0,0;0,0;testformspec_bg_9slice.png;true;4,6] - background[1,1;0,0;testformspec_bg.png;true] - ]], -} - -local page_id = 2 -local function show_test_formspec(pname) - local page = pages[page_id] - if type(page) == "function" then - page = page() - end - - local fs = page .. "tabheader[0,0;11,0.65;maintabs;Real Coord,Styles,Noclip,Table,Hypertext,Tabs,Invs,Window,Anim,Model,ScrollC,Sound,Background,Unsized;" .. page_id .. ";false;false]" - - core.show_formspec(pname, "testformspec:formspec", fs) -end - -core.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "testformspec:formspec" then - return false - end - - if fields.maintabs then - page_id = tonumber(fields.maintabs) - show_test_formspec(player:get_player_name()) - return true - end - - if fields.ani_img_1 and fields.ani_btn_1 then - core.chat_send_player(player:get_player_name(), "ani_img_1 = " .. tostring(fields.ani_img_1)) - return true - elseif fields.ani_img_2 and fields.ani_btn_2 then - core.chat_send_player(player:get_player_name(), "ani_img_2 = " .. tostring(fields.ani_img_2)) - return true - end - - if fields.hypertext then - core.chat_send_player(player:get_player_name(), "Hypertext action received: " .. tostring(fields.hypertext)) - return true - end - - for name, value in pairs(fields) do - if window[name] then - print(name, window[name]) - local num_val = tonumber(value) or 0 - - if name == "sizex" and num_val < 4 then - num_val = 6.5 - elseif name == "sizey" and num_val < 5 then - num_val = 5.5 - end - - window[name] = num_val - print(name, window[name]) - end - end - - if fields.submit_window then - show_test_formspec(player:get_player_name()) - end -end) - -core.register_chatcommand("test_formspec", { - params = "", - description = "Open the test formspec", - func = function(name) - if not core.get_player_by_name(name) then - return false, "You need to be online!" - end - - show_test_formspec(name) - return true - end, -}) diff --git a/data/games/garage/mods/testformspec/init.lua b/data/games/garage/mods/testformspec/init.lua deleted file mode 100644 index ef1a841..0000000 --- a/data/games/garage/mods/testformspec/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -dofile(core.get_modpath("testformspec").."/dummy_items.lua") -dofile(core.get_modpath("testformspec").."/formspec.lua") -dofile(core.get_modpath("testformspec").."/callbacks.lua") diff --git a/data/games/garage/mods/testformspec/mod.conf b/data/games/garage/mods/testformspec/mod.conf deleted file mode 100644 index 00eac30..0000000 --- a/data/games/garage/mods/testformspec/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testformspec -description = Contains an example formspec to test all the features of formspecs diff --git a/data/games/garage/mods/testformspec/models/testformspec_character.b3d b/data/games/garage/mods/testformspec/models/testformspec_character.b3d deleted file mode 100644 index 8edbaf6..0000000 Binary files a/data/games/garage/mods/testformspec/models/testformspec_character.b3d and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_9slice.png b/data/games/garage/mods/testformspec/textures/testformspec_9slice.png deleted file mode 100644 index e36a8be..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_9slice.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_animation.jpg b/data/games/garage/mods/testformspec/textures/testformspec_animation.jpg deleted file mode 100644 index b98ca26..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_animation.jpg and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_animation.png b/data/games/garage/mods/testformspec/textures/testformspec_animation.png deleted file mode 100644 index b972e5d..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_animation.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg.png b/data/games/garage/mods/testformspec/textures/testformspec_bg.png deleted file mode 100644 index cd1e509..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice.png b/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice.png deleted file mode 100644 index 34433ac..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_focused.png b/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_focused.png deleted file mode 100644 index 2f52dd9..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_focused.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_hovered.png b/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_hovered.png deleted file mode 100644 index 01c2dc7..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_hovered.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_pressed.png b/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_pressed.png deleted file mode 100644 index 0cbac75..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg_9slice_pressed.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg_focused.png b/data/games/garage/mods/testformspec/textures/testformspec_bg_focused.png deleted file mode 100644 index 6b47ae6..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg_focused.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg_hovered.png b/data/games/garage/mods/testformspec/textures/testformspec_bg_hovered.png deleted file mode 100644 index 3ebbb98..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg_hovered.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_bg_pressed.png b/data/games/garage/mods/testformspec/textures/testformspec_bg_pressed.png deleted file mode 100644 index 2fb5fc2..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_bg_pressed.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_button_image.png b/data/games/garage/mods/testformspec/textures/testformspec_button_image.png deleted file mode 100644 index 75c438a..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_button_image.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_character.png b/data/games/garage/mods/testformspec/textures/testformspec_character.png deleted file mode 100644 index 0502178..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_character.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_hovered.png b/data/games/garage/mods/testformspec/textures/testformspec_hovered.png deleted file mode 100644 index 3ccad30..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_hovered.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_item.png b/data/games/garage/mods/testformspec/textures/testformspec_item.png deleted file mode 100644 index 4fd823b..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_item.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_node.png b/data/games/garage/mods/testformspec/textures/testformspec_node.png deleted file mode 100644 index c107f28..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_node.png and /dev/null differ diff --git a/data/games/garage/mods/testformspec/textures/testformspec_pressed.png b/data/games/garage/mods/testformspec/textures/testformspec_pressed.png deleted file mode 100644 index 45c504f..0000000 Binary files a/data/games/garage/mods/testformspec/textures/testformspec_pressed.png and /dev/null differ diff --git a/data/games/garage/mods/testfullscreenfs/init.lua b/data/games/garage/mods/testfullscreenfs/init.lua deleted file mode 100644 index 1b84033..0000000 --- a/data/games/garage/mods/testfullscreenfs/init.lua +++ /dev/null @@ -1,71 +0,0 @@ -local function window_info_equal(a, b) - return - -- size - a.size.x == b.size.x and a.size.y == b.size.y and - -- real_gui_scaling, real_hud_scaling - a.real_gui_scaling == b.real_gui_scaling and - a.real_hud_scaling == b.real_hud_scaling and - -- max_formspec_size - a.max_formspec_size.x == b.max_formspec_size.x and - a.max_formspec_size.y == b.max_formspec_size.y and - -- touch_controls - a.touch_controls == b.touch_controls -end - -local last_window_info = {} - -local function show_fullscreen_fs(name, window) - print(dump(window)) - - local size = window.max_formspec_size - local touch_text = window.touch_controls and "Touch controls enabled" or - "Touch controls disabled" - local fs = { - "formspec_version[4]", - ("size[%f,%f]"):format(size.x, size.y), - "padding[0,0]", - "bgcolor[;true]", - ("button[%f,%f;1,1;%s;%s]"):format(0, 0, "tl", "TL"), - ("button[%f,%f;1,1;%s;%s]"):format(size.x - 1, 0, "tr", "TR"), - ("button[%f,%f;1,1;%s;%s]"):format(size.x - 1, size.y - 1, "br", "BR"), - ("button[%f,%f;1,1;%s;%s]"):format(0, size.y - 1, "bl", "BL"), - - ("label[%f,%f;%s]"):format(size.x / 2, size.y / 2, "Fullscreen"), - ("label[%f,%f;%s]"):format(size.x / 2, size.y / 2 + 1, touch_text), - } - - core.show_formspec(name, "testfullscreenfs:fs", table.concat(fs)) - core.chat_send_player(name, ("Calculated size of %f, %f"):format(size.x, size.y)) - last_window_info[name] = window -end - -core.register_chatcommand("testfullscreenfs", { - func = function(name) - local window = core.get_player_window_information(name) - if not window then - return false, "Unable to get window info" - end - - show_fullscreen_fs(name, window) - return true - end, -}) - -core.register_globalstep(function() - for name, last_window in pairs(last_window_info) do - local window = core.get_player_window_information(name) - if window and not window_info_equal(last_window, window) then - show_fullscreen_fs(name, window) - end - end -end) - -core.register_on_player_receive_fields(function(player, formname, fields) - if formname == "testfullscreenfs:fs" and fields.quit then - last_window_info[player:get_player_name()] = nil - end -end) - -core.register_on_leaveplayer(function(player) - last_window_info[player:get_player_name()] = nil -end) diff --git a/data/games/garage/mods/testfullscreenfs/mod.conf b/data/games/garage/mods/testfullscreenfs/mod.conf deleted file mode 100644 index 68e7a10..0000000 --- a/data/games/garage/mods/testfullscreenfs/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testfullscreenfs -description = Test mod to use core.get_player_window_information() diff --git a/data/games/garage/mods/testhud/init.lua b/data/games/garage/mods/testhud/init.lua deleted file mode 100644 index 0512345..0000000 --- a/data/games/garage/mods/testhud/init.lua +++ /dev/null @@ -1,393 +0,0 @@ -local player_font_huds = {} - -local font_states = { - {0, "Normal font"}, - {1, "Bold font"}, - {2, "Italic font"}, - {3, "Bold and italic font"}, - {4, "Monospace font"}, - {5, "Bold and monospace font"}, - {7, "ZOMG all the font styles"}, - {7, "Colors test! " .. core.colorize("green", "Green") .. - core.colorize("red", "\nRed") .. " END"}, -} - - -local font_default_def = { - type = "text", - position = {x = 0.5, y = 0.5}, - scale = {x = 2, y = 2}, - alignment = { x = 0, y = 0 }, - number = 0xFFFFFF, -} - -local function add_font_hud(player, state) - local def = table.copy(font_default_def) - local statetbl = font_states[state] - def.offset = {x = 0, y = 32 * state} - def.style = statetbl[1] - def.text = statetbl[2] - return player:hud_add(def) -end - -local font_etime = 0 -local font_state = 0 - -core.register_globalstep(function(dtime) - font_etime = font_etime + dtime - if font_etime < 1 then - return - end - font_etime = 0 - for _, player in ipairs(core.get_connected_players()) do - local huds = player_font_huds[player:get_player_name()] - if huds then - for i, hud_id in ipairs(huds) do - local statetbl = font_states[(font_state + i) % #font_states + 1] - player:hud_change(hud_id, "style", statetbl[1]) - player:hud_change(hud_id, "text", statetbl[2]) - end - end - end - font_state = font_state + 1 -end) - -core.register_chatcommand("hudfonts", { - params = "[]", - description = "Show/Hide some text on the HUD with various font options", - func = function(name, param) - local player = core.get_player_by_name(name) - local param = tonumber(param) or 0 - param = math.min(math.max(param, 1), #font_states) - if player_font_huds[name] == nil then - player_font_huds[name] = {} - for i = 1, param do - table.insert(player_font_huds[name], add_font_hud(player, i)) - end - core.chat_send_player(name, ("%d text HUD element(s) added."):format(param)) - else - local huds = player_font_huds[name] - if huds then - for _, hud_id in ipairs(huds) do - player:hud_remove(hud_id) - end - core.chat_send_player(name, "All text HUD elements removed.") - end - player_font_huds[name] = nil - end - return true - end, -}) - --- Testing waypoint capabilities - -local player_waypoints = {} -core.register_chatcommand("hudwaypoints", { - params = "[ add | add_change | remove ]", - description = "Create HUD waypoints at your position for testing (add: Add waypoints and change them after 0.5s (default). add_change: Add waypoints and change immediately. remove: Remove all waypoints)", - func = function(name, params) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - if params == "remove" then - if player_waypoints[name] then - for i=1, #player_waypoints[name] do - player:hud_remove(player_waypoints[name][i]) - end - player_waypoints[name] = {} - end - return true, "All waypoint HUD elements removed." - end - if not (params == "add_change" or params == "add" or params == "") then - -- Incorrect syntax - return false - end - local regular = player:hud_add { - type = "waypoint", - name = "regular waypoint", - text = "m", - number = 0xFFFFFF, - world_pos = vector.add(player:get_pos(), {x = 0, y = 1.5, z = 0}) - } - local reduced_precision = player:hud_add { - type = "waypoint", - name = "imprecise waypoint", - text = "m (0.1 steps, precision = 10)", - precision = 10, - number = 0xFFFFFF, - world_pos = vector.add(player:get_pos(), {x = 0, y = 1, z = 0}) - } - local hidden_distance = player:hud_add { - type = "waypoint", - name = "waypoint with hidden distance", - text = "this text is hidden as well (precision = 0)", - precision = 0, - number = 0xFFFFFF, - world_pos = vector.add(player:get_pos(), {x = 0, y = 0.5, z = 0}) - } - local function change(chplayer) - if not (chplayer and chplayer:is_player()) then - return - end - if regular then - chplayer:hud_change(regular, "world_pos", vector.add(player:get_pos(), {x = 0, y = 3, z = 0})) - chplayer:hud_change(regular, "number", 0xFF0000) - end - if reduced_precision then - chplayer:hud_change(reduced_precision, "precision", 2) - chplayer:hud_change(reduced_precision, "text", "m (0.5 steps, precision = 2)") - chplayer:hud_change(reduced_precision, "number", 0xFFFF00) - end - if hidden_distance then - chplayer:hud_change(hidden_distance, "number", 0x0000FF) - end - core.chat_send_player(chplayer:get_player_name(), "Waypoints changed.") - end - if params == "add_change" then - -- change immediate - change(player) - else - core.after(0.5, change, player) - end - local image_waypoint = player:hud_add { - type = "image_waypoint", - text = "testhud_waypoint.png", - world_pos = player:get_pos(), - -- 20% of screen width, 3x image height - scale = {x = -20, y = 3}, - offset = {x = 0, y = -32} - } - if not player_waypoints[name] then - player_waypoints[name] = {} - end - if regular then - table.insert(player_waypoints[name], regular) - end - if reduced_precision then - table.insert(player_waypoints[name], reduced_precision) - end - if hidden_distance then - table.insert(player_waypoints[name], hidden_distance) - end - if image_waypoint then - table.insert(player_waypoints[name], image_waypoint) - end - regular = regular or "error" - reduced_precision = reduced_precision or "error" - hidden_distance = hidden_distance or "error" - image_waypoint = image_waypoint or "error" - return true, "Waypoints added. IDs: regular: " .. regular .. ", reduced precision: " .. reduced_precision .. - ", hidden distance: " .. hidden_distance .. ", image waypoint: " .. image_waypoint - end -}) - -core.register_on_joinplayer(function(player) - player:set_properties({zoom_fov = 15}) -end) - -core.register_chatcommand("zoomfov", { - params = "[]", - description = "Set or display your zoom_fov", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - if param == "" then - local fov = player:get_properties().zoom_fov - return true, "zoom_fov = "..tostring(fov) - end - local fov = tonumber(param) - if not fov then - return false, "Missing or incorrect zoom_fov parameter!" - end - player:set_properties({zoom_fov = fov}) - fov = player:get_properties().zoom_fov - return true, "zoom_fov = "..tostring(fov) - end, -}) - --- Hotbars - -local hud_hotbar_defs = { - { - type = "hotbar", - position = {x=0.2, y=0.5}, - direction = 0, - alignment = {x=1, y=-1}, - }, - { - type = "hotbar", - position = {x=0.2, y=0.5}, - direction = 2, - alignment = {x=1, y=1}, - }, - { - type = "hotbar", - position = {x=0.7, y=0.5}, - direction = 0, - offset = {x=140, y=20}, - alignment = {x=-1, y=-1}, - }, - { - type = "hotbar", - position = {x=0.7, y=0.5}, - direction = 2, - offset = {x=140, y=20}, - alignment = {x=-1, y=1}, - }, -} - - -local player_hud_hotbars= {} -core.register_chatcommand("hudhotbars", { - description = "Shows some test Lua HUD elements of type hotbar. " .. - "(add: Adds elements (default). remove: Removes elements)", - params = "[ add | remove ]", - func = function(name, params) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - - local id_table = player_hud_hotbars[name] - if not id_table then - id_table = {} - player_hud_hotbars[name] = id_table - end - - if params == "remove" then - for _, id in ipairs(id_table) do - player:hud_remove(id) - end - return true, "Hotbars removed." - end - - -- params == "add" or default - for _, def in ipairs(hud_hotbar_defs) do - table.insert(id_table, player:hud_add(def)) - end - return true, #hud_hotbar_defs .." Hotbars added." - end -}) - --- Inventories - -local hud_inventory_defs = { - { - type = "inventory", - position = {x=0.2, y=0.5}, - direction = 0, - text = "main", - number = 4, - item = 2, - }, - { - type = "inventory", - position = {x=0.2, y=0.5}, - direction = 2, - text = "main", - number = 4, - item = 2, - }, - { - type = "inventory", - position = {x=0.7, y=0.5}, - direction = 1, - text = "main", - number = 4, - item = 2, - }, - { - type = "inventory", - position = {x=0.7, y=0.5}, - direction = 3, - text = "main", - number = 4, - item = 2, - }, -} - -local player_hud_inventories= {} -core.register_chatcommand("hudinventories", { - description = "Shows some test Lua HUD elements of type inventory. (add: Adds elements (default). remove: Removes elements)", - params = "[ add | remove ]", - func = function(name, params) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - - local id_table = player_hud_inventories[name] - if not id_table then - id_table = {} - player_hud_inventories[name] = id_table - end - - if params == "remove" then - for _, id in ipairs(id_table) do - player:hud_remove(id) - end - return true, "HUD Inventories removed." - end - - -- params == "add" or default - for _, def in ipairs(hud_inventory_defs) do - table.insert(id_table, player:hud_add(def)) - end - return true, #hud_inventory_defs .." HUD Inventories added." - end -}) - - -core.register_on_leaveplayer(function(player) - local playername = player:get_player_name() - player_font_huds[playername] = nil - player_waypoints[playername] = nil - player_hud_hotbars[playername] = nil - player_hud_inventories[playername] = nil -end) - -core.register_chatcommand("hudprint", { - description = "Writes all used Lua HUD elements into chat.", - func = function(name, params) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - - local s = "HUD elements:" - for k, elem in pairs(player:hud_get_all()) do - local ename = dump(elem.name) - local etype = dump(elem.type) - local epos = "{x="..elem.position.x..", y="..elem.position.y.."}" - s = s.."\n["..k.."] type = "..etype.." | name = "..ename.." | pos = ".. epos - end - - return true, s - end -}) - -local hud_flags = {"hotbar", "healthbar", "crosshair", "wielditem", "breathbar", - "minimap", "minimap_radar", "basic_debug", "chat"} - -core.register_chatcommand("hudtoggleflag", { - description = "Toggles a hud flag.", - params = "[ ".. table.concat(hud_flags, " | ") .." ]", - func = function(name, params) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - - local flags = player:hud_get_flags() - if flags[params] == nil then - return false, "Unknown hud flag." - end - - flags[params] = not flags[params] - player:hud_set_flags(flags) - return true, "Flag \"".. params .."\" set to ".. tostring(flags[params]) .. "." - end -}) diff --git a/data/games/garage/mods/testhud/mod.conf b/data/games/garage/mods/testhud/mod.conf deleted file mode 100644 index ed9f65c..0000000 --- a/data/games/garage/mods/testhud/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testhud -description = For testing HUD functionality diff --git a/data/games/garage/mods/testhud/textures/testhud_waypoint.png b/data/games/garage/mods/testhud/textures/testhud_waypoint.png deleted file mode 100644 index f9f1308..0000000 Binary files a/data/games/garage/mods/testhud/textures/testhud_waypoint.png and /dev/null differ diff --git a/data/games/garage/mods/testitems/init.lua b/data/games/garage/mods/testitems/init.lua deleted file mode 100644 index 12da2ad..0000000 --- a/data/games/garage/mods/testitems/init.lua +++ /dev/null @@ -1,107 +0,0 @@ -local S = core.get_translator("testitems") - --- --- Texture overlays for items --- - --- For the global overlay color test -local GLOBAL_COLOR_ARG = "orange" - --- Punch handler to set random color with "color" argument in item metadata -local overlay_on_use = function(itemstack, user, pointed_thing) - local meta = itemstack:get_meta() - local color = math.random(0x0, 0xFFFFFF) - local colorstr = string.format("#%06x", color) - meta:set_string("color", colorstr) - core.log("action", "[testitems] Color of "..itemstack:get_name().." changed to "..colorstr) - return itemstack -end --- Place handler to clear item metadata color -local overlay_on_place = function(itemstack, user, pointed_thing) - local meta = itemstack:get_meta() - meta:set_string("color", "") - return itemstack -end - -core.register_craftitem("testitems:overlay_meta", { - description = S("Texture Overlay Test Item, Meta Color") .. "\n" .. - S("Image must be a square with rainbow cross (inventory and wield)") .. "\n" .. - S("Item meta color must only change square color") .. "\n" .. - S("Punch: Set random color") .. "\n" .. - S("Place: Clear color"), - -- Base texture: A grayscale square (can be colorized) - inventory_image = "testitems_overlay_base.png", - wield_image = "testitems_overlay_base.png", - -- Overlay: A rainbow cross (NOT to be colorized!) - inventory_overlay = "testitems_overlay_overlay.png", - wield_overlay = "testitems_overlay_overlay.png", - - on_use = overlay_on_use, - on_place = overlay_on_place, - on_secondary_use = overlay_on_place, -}) - -core.register_craftitem("testitems:overlay_global", { - description = S("Texture Overlay Test Item, Global Color") .. "\n" .. - S("Image must be an orange square with rainbow cross (inventory and wield)"), - -- Base texture: A grayscale square (to be colorized) - inventory_image = "testitems_overlay_base.png", - wield_image = "testitems_overlay_base.png", - -- Overlay: A rainbow cross (NOT to be colorized!) - inventory_overlay = "testitems_overlay_overlay.png", - wield_overlay = "testitems_overlay_overlay.png", - color = GLOBAL_COLOR_ARG, -}) - -core.register_craftitem("testitems:image_meta", { - description = S("Image Override Meta Test Item"), - inventory_image = "default_apple.png", - wield_image = "basetools_icesword.png", - - on_use = function(itemstack, player) - local meta = itemstack:get_meta() - local state = meta:get_int("state") - state = (state + 1) % 5 - meta:set_int("state", state) - core.chat_send_player(player:get_player_name(), "State " .. state) - - if state == 0 then - meta:set_string("inventory_image", "") - meta:set_string("wield_image", "") - meta:set_string("inventory_overlay", "") - meta:set_string("wield_overlay", "") - meta:set_string("wield_scale", "") - elseif state == 1 then - meta:set_string("inventory_image", "default_tree.png") - meta:set_string("wield_image", "basetools_firesword.png") - elseif state == 2 then - meta:set_string("inventory_image", "default_apple.png^testitems_overridden.png") - meta:set_string("wield_image", "basetools_icesword.png^testitems_overridden.png") - elseif state == 3 then - meta:set_string("inventory_image", "default_tree.png") - meta:set_string("wield_image", "basetools_firesword.png") - meta:set_string("inventory_overlay", "default_apple.png") - meta:set_string("wield_overlay", "default_apple.png") - elseif state == 4 then - local scale = vector.new(0.5, 0.5, 0.5) - meta:set_string("wield_scale", scale:to_string()) - end - - return itemstack - end, -}) - -core.register_craftitem("testitems:telescope_stick", { - description = S("Telescope Stick (Increases range on use.)"), - inventory_image = "testitems_telescope_stick.png", - on_use = function(itemstack, player) - local meta = itemstack:get_meta() - local range = meta:get_float("range") + 1.2 - if range > 10 then - range = 0 - end - meta:set_float("range", range) - core.chat_send_player(player:get_player_name(), "Telescope Stick range set to "..range) - return itemstack - end, -}) diff --git a/data/games/garage/mods/testitems/mod.conf b/data/games/garage/mods/testitems/mod.conf deleted file mode 100644 index f91febe..0000000 --- a/data/games/garage/mods/testitems/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testitems -description = Test mod to test misc. items that are neither tools nor nodes diff --git a/data/games/garage/mods/testitems/textures/testitems_overlay_base.png b/data/games/garage/mods/testitems/textures/testitems_overlay_base.png deleted file mode 100644 index f473623..0000000 Binary files a/data/games/garage/mods/testitems/textures/testitems_overlay_base.png and /dev/null differ diff --git a/data/games/garage/mods/testitems/textures/testitems_overlay_overlay.png b/data/games/garage/mods/testitems/textures/testitems_overlay_overlay.png deleted file mode 100644 index 75a7d9f..0000000 Binary files a/data/games/garage/mods/testitems/textures/testitems_overlay_overlay.png and /dev/null differ diff --git a/data/games/garage/mods/testitems/textures/testitems_overridden.png b/data/games/garage/mods/testitems/textures/testitems_overridden.png deleted file mode 100644 index 08d3e70..0000000 Binary files a/data/games/garage/mods/testitems/textures/testitems_overridden.png and /dev/null differ diff --git a/data/games/garage/mods/testitems/textures/testitems_telescope_stick.png b/data/games/garage/mods/testitems/textures/testitems_telescope_stick.png deleted file mode 100644 index 88d004c..0000000 Binary files a/data/games/garage/mods/testitems/textures/testitems_telescope_stick.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/README.md b/data/games/garage/mods/testnodes/README.md deleted file mode 100644 index 13ed972..0000000 --- a/data/games/garage/mods/testnodes/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Test Nodes - -This mod contains a bunch of basic nodes to test development stuff. -Most nodes are kept as minimal as possible in order to show off one particular feature of the engine, to make testing stuff easier. - -This mod includes tests for: - -* drawtypes -* paramtype2's -* node properties such as damage, drowning, falling, etc. -* other random stuff diff --git a/data/games/garage/mods/testnodes/commands.lua b/data/games/garage/mods/testnodes/commands.lua deleted file mode 100644 index 946df50..0000000 --- a/data/games/garage/mods/testnodes/commands.lua +++ /dev/null @@ -1,139 +0,0 @@ --- Add chat command to place all the nodes in DevTest - -local function advance_pos(pos, start_pos, advance_z) - if advance_z then - pos.z = pos.z + 2 - pos.x = start_pos.x - else - pos.x = pos.x + 2 - end - if pos.x > 30900 or pos.x - start_pos.x > 46 then - pos.x = start_pos.x - pos.z = pos.z + 2 - end - if pos.z > 30900 then - -- We ran out of space! Aborting - aborted = true - return false - end - return pos -end - -local function place_nodes(param) - local nodes = param.nodes - local name = param.name - local pos = param.pos - local start_pos = param.start_pos - table.sort(nodes) - core.chat_send_player(name, "Placing nodes …") - local nodes_placed = 0 - local aborted = false - for n=1, #nodes do - local itemstring = nodes[n] - local def = core.registered_nodes[itemstring] - local p2_max = 0 - if param.param ~= "no_param2" then - -- Also test the param2 values of the nodes - -- ... but we only use permissible param2 values - if def.paramtype2 == "wallmounted" then - p2_max = 5 - elseif def.paramtype2 == "facedir" then - p2_max = 23 - elseif def.paramtype2 == "4dir" then - p2_max = 3 - elseif def.paramtype2 == "glasslikeliquidlevel" then - p2_max = 63 - elseif def.paramtype2 == "meshoptions" and def.drawtype == "plantlike" then - p2_max = 63 - elseif def.paramtype2 == "leveled" then - p2_max = 127 - elseif def.paramtype2 == "degrotate" and (def.drawtype == "plantlike" or def.drawtype == "mesh") then - p2_max = 239 - elseif def.paramtype2 == "colorfacedir" or - def.paramtype2 == "colorwallmounted" or - def.paramtype2 == "colordegrotate" or - def.paramtype2 == "color4dir" or - def.paramtype2 == "color" then - p2_max = 255 - end - end - for p2 = 0, p2_max do - -- Skip undefined param2 values - if not ((def.paramtype2 == "meshoptions" and p2 % 8 > 4) or - (def.paramtype2 == "colorwallmounted" and p2 % 8 > 5) or - ((def.paramtype2 == "colorfacedir" or def.paramtype2 == "colordegrotate") - and p2 % 32 > 23)) then - - core.set_node(pos, { name = itemstring, param2 = p2 }) - nodes_placed = nodes_placed + 1 - pos = advance_pos(pos, start_pos) - if not pos then - aborted = true - break - end - end - end - if aborted then - break - end - end - if aborted then - core.chat_send_player(name, "Not all nodes could be placed, please move further away from the world boundary. Nodes placed: "..nodes_placed) - end - core.chat_send_player(name, "Nodes placed: "..nodes_placed..".") -end - -local function after_emerge(blockpos, action, calls_remaining, param) - if calls_remaining == 0 then - place_nodes(param) - end -end - -core.register_chatcommand("test_place_nodes", { - params = "[ no_param2 ]", - description = "Test: Place all nodes (except dummy and callback nodes) and optionally their permissible param2 variants", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local pos = vector.floor(player:get_pos()) - pos.x = math.ceil(pos.x + 3) - pos.z = math.ceil(pos.z + 3) - pos.y = math.ceil(pos.y + 1) - local start_pos = table.copy(pos) - if pos.x > 30800 then - return false, "Too close to world boundary (+X). Please move to X < 30800." - end - if pos.z > 30800 then - return false, "Too close to world boundary (+Z). Please move to Z < 30800." - end - - local aborted = false - local nodes = {} - local emerge_estimate = 0 - for itemstring, def in pairs(core.registered_nodes) do - if itemstring ~= "ignore" and - -- Skip callback test and dummy nodes - -- to avoid clutter and chat spam - core.get_item_group(itemstring, "callback_test") == 0 and - core.get_item_group(itemstring, "dummy") == 0 then - table.insert(nodes, itemstring) - if def.paramtype2 == 0 then - emerge_estimate = emerge_estimate + 1 - else - emerge_estimate = emerge_estimate + 255 - end - end - end - -- Emerge area to make sure that all nodes are being placed. - -- Note we will emerge much more than we need to (overestimation), - -- the estimation code could be improved performance-wise … - local length = 16 + math.ceil(emerge_estimate / 24) * 2 - core.emerge_area(start_pos, - { x = start_pos.x + 46, y = start_pos.y, z = start_pos.z + length }, - after_emerge, { nodes = nodes, name = name, pos = pos, start_pos = start_pos, param = param }) - return true, "Emerging area …" - end, -}) - diff --git a/data/games/garage/mods/testnodes/drawtypes.lua b/data/games/garage/mods/testnodes/drawtypes.lua deleted file mode 100644 index 95dae96..0000000 --- a/data/games/garage/mods/testnodes/drawtypes.lua +++ /dev/null @@ -1,727 +0,0 @@ ---[[ Drawtype Test: This file tests out and provides examples for -all drawtypes in Luanti. It is attempted to keep the node -definitions as simple and minimal as possible to keep -side-effects to a minimum. - -How to read the node definitions: -There are two parts which are separated by 2 newlines: -The first part contains the things that are more or less essential -for defining the drawtype (except description, which is -at the top for readability). -The second part (after the 2 newlines) contains stuff that are -unrelated to the drawtype, stuff that is mostly there to make -testing this node easier and more convenient. -]] - -local S = core.get_translator("testnodes") - --- A regular cube -core.register_node("testnodes:normal", { - description = S("\"normal\" Drawtype Test Node").."\n".. - S("Opaque texture"), - drawtype = "normal", - tiles = { "testnodes_normal.png" }, - - groups = { dig_immediate = 3 }, -}) - --- Standard glasslike node -core.register_node("testnodes:glasslike", { - description = S("\"glasslike\" Drawtype Test Node").."\n".. - S("Transparent node with hidden backfaces"), - drawtype = "glasslike", - paramtype = "light", - tiles = { "testnodes_glasslike.png" }, - - groups = { dig_immediate = 3 }, -}) - --- Glasslike framed with the two textures (normal and "detail") -core.register_node("testnodes:glasslike_framed", { - description = S("\"glasslike_framed\" Drawtype Test Node").."\n".. - S("Transparent node with hidden backfaces").."\n".. - S("Frame connects to neighbors"), - drawtype = "glasslike_framed", - paramtype = "light", - tiles = { - "testnodes_glasslike_framed.png", - "testnodes_glasslike_detail.png", - }, - - - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - --- Like the one above, but without the "detail" texture (texture 2). --- This node was added to see how the engine behaves when the "detail" texture --- is missing. -core.register_node("testnodes:glasslike_framed_no_detail", { - description = S("\"glasslike_framed\" Drawtype without Detail Test Node").."\n".. - S("Transparent node with hidden backfaces").."\n".. - S("Frame connects to neighbors, but the 'detail' tile is not used"), - drawtype = "glasslike_framed", - paramtype = "light", - tiles = { "testnodes_glasslike_framed2.png" }, - - - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - - -core.register_node("testnodes:glasslike_framed_optional", { - description = S("\"glasslike_framed_optional\" Drawtype Test Node").."\n".. - S("Transparent node with hidden backfaces").."\n".. - S("Frame connects if 'connected_glass' setting is true"), - drawtype = "glasslike_framed_optional", - paramtype = "light", - tiles = { - "testnodes_glasslike_framed_optional.png", - "testnodes_glasslike_detail.png", - }, - - - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - - - -core.register_node("testnodes:allfaces", { - description = S("\"allfaces\" Drawtype Test Node").."\n".. - S("Transparent node with visible internal backfaces"), - drawtype = "allfaces", - paramtype = "light", - tiles = { "testnodes_allfaces.png" }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:allfaces_6", { - description = S("\"allfaces 6 Textures\" Drawtype Test Node").."\n".. - S("Transparent node with visible internal backfaces"), - drawtype = "allfaces", - paramtype = "light", - tiles = { - "testnodes_allfaces.png^[colorize:red", - "testnodes_allfaces.png^[colorize:orange", - "testnodes_allfaces.png^[colorize:yellow", - "testnodes_allfaces.png^[colorize:green", - "testnodes_allfaces.png^[colorize:blue", - "testnodes_allfaces.png^[colorize:purple" - }, - - groups = { dig_immediate = 3 }, -}) - -local allfaces_optional_tooltip = "".. - S("Rendering depends on 'leaves_style' setting:").."\n".. - S("* 'fancy': transparent with visible internal backfaces").."\n".. - S("* 'simple': transparent with hidden backfaces").."\n".. - S("* 'opaque': opaque") - -core.register_node("testnodes:allfaces_optional", { - description = S("\"allfaces_optional\" Drawtype Test Node").."\n".. - allfaces_optional_tooltip, - drawtype = "allfaces_optional", - paramtype = "light", - tiles = { "testnodes_allfaces_optional.png" }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:allfaces_optional_waving", { - description = S("Waving \"allfaces_optional\" Drawtype Test Node").."\n".. - allfaces_optional_tooltip.."\n".. - S("Waves if waving leaves are enabled by client"), - drawtype = "allfaces_optional", - paramtype = "light", - tiles = { "testnodes_allfaces_optional.png^[brighten" }, - waving = 2, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:firelike", { - description = S("\"firelike\" Drawtype Test Node").."\n".. - S("Changes shape based on neighbors"), - drawtype = "firelike", - paramtype = "light", - tiles = { "testnodes_firelike.png" }, - - - walkable = false, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:fencelike", { - description = S("\"fencelike\" Drawtype Test Node").."\n".. - S("Connects to neighbors"), - drawtype = "fencelike", - paramtype = "light", - tiles = { "testnodes_fencelike.png" }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:torchlike", { - description = S("Floor \"torchlike\" Drawtype Test Node").."\n".. - S("Always on floor"), - drawtype = "torchlike", - paramtype = "light", - tiles = { "testnodes_torchlike_floor.png^[colorize:#FF0000:64" }, - - - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:torchlike_wallmounted", { - description = S("Wallmounted \"torchlike\" Drawtype Test Node").."\n".. - S("param2 = wallmounted rotation (0..7)"), - drawtype = "torchlike", - paramtype = "light", - paramtype2 = "wallmounted", - tiles = { - "testnodes_torchlike_floor.png", - "testnodes_torchlike_ceiling.png", - "testnodes_torchlike_wall.png", - }, - - - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:torchlike_wallmounted_rot", { - description = S("Wallmounted Rotatable Torchlike Drawtype Test Node"), - drawtype = "torchlike", - paramtype = "light", - paramtype2 = "wallmounted", - wallmounted_rotate_vertical = true, - tiles = { - "testnodes_torchlike_floor.png^[colorize:#FFFF00:40", - "testnodes_torchlike_ceiling.png^[colorize:#FFFF00:40", - "testnodes_torchlike_wall.png^[colorize:#FFFF00:40", - }, - - - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:signlike", { - description = S("Floor \"signlike\" Drawtype Test Node").."\n".. - S("Always on floor"), - drawtype = "signlike", - paramtype = "light", - tiles = { "testnodes_signlike.png^[colorize:#FF0000:64" }, - - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:signlike_wallmounted", { - description = S("Wallmounted \"signlike\" Drawtype Test Node").."\n".. - S("param2 = wallmounted rotation (0..7)"), - drawtype = "signlike", - paramtype = "light", - paramtype2 = "wallmounted", - tiles = { "testnodes_signlike.png" }, - - - walkable = false, - groups = { dig_immediate = 3 }, - sunlight_propagates = true, -}) - -core.register_node("testnodes:signlike_rot", { - description = S("Wallmounted Rotatable Signlike Drawtype Test Node"), - drawtype = "signlike", - paramtype = "light", - paramtype2 = "wallmounted", - wallmounted_rotate_vertical = true, - tiles = { "testnodes_signlike.png^[colorize:#FFFF00:40" }, - - - walkable = false, - groups = { dig_immediate = 3 }, - sunlight_propagates = true, -}) - - - -core.register_node("testnodes:plantlike", { - description = S("\"plantlike\" Drawtype Test Node"), - drawtype = "plantlike", - paramtype = "light", - tiles = { "testnodes_plantlike.png" }, - - - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:plantlike_waving", { - description = S("Waving \"plantlike\" Drawtype Test Node").."\n".. - S("Waves if waving plants are enabled by client"), - drawtype = "plantlike", - paramtype = "light", - tiles = { "testnodes_plantlike_waving.png" }, - waving = 1, - - - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:plantlike_wallmounted", { - description = S("Wallmounted \"plantlike\" Drawtype Test Node").."\n".. - S("param2 = wallmounted rotation (0..7)"), - drawtype = "plantlike", - paramtype = "light", - paramtype2 = "wallmounted", - tiles = { "testnodes_plantlike_wallmounted.png" }, - leveled = 1, - - - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - - --- param2 will rotate -local function rotate_on_rightclick(pos, node, clicker) - local def = core.registered_nodes[node.name] - local aux1 = clicker:get_player_control().aux1 - - local deg, deg_max - local color, color_mult = 0, 0 - if def.paramtype2 == "degrotate" then - deg = node.param2 - deg_max = 240 - elseif def.paramtype2 == "colordegrotate" then - -- MSB [3x color, 5x rotation] LSB - deg = node.param2 % 2^5 - deg_max = 24 - color_mult = 2^5 - color = math.floor(node.param2 / color_mult) - end - - deg = (deg + (aux1 and 10 or 1)) % deg_max - node.param2 = color * color_mult + deg - core.swap_node(pos, node) - core.chat_send_player(clicker:get_player_name(), - "Rotation is now " .. deg .. " / " .. deg_max) -end - -core.register_node("testnodes:plantlike_degrotate", { - description = S("Degrotate \"plantlike\" Drawtype Test Node").."\n".. - S("param2 = horizontal rotation (0..239)"), - drawtype = "plantlike", - paramtype = "light", - paramtype2 = "degrotate", - tiles = { "testnodes_plantlike_degrotate.png" }, - - on_rightclick = rotate_on_rightclick, - place_param2 = 7, - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:mesh_degrotate", { - description = S("Degrotate \"mesh\" Drawtype Test Node").."\n".. - S("param2 = horizontal rotation (0..239)"), - drawtype = "mesh", - paramtype = "light", - paramtype2 = "degrotate", - mesh = "testnodes_ocorner.obj", - tiles = { "testnodes_mesh_stripes7.png" }, - - on_rightclick = rotate_on_rightclick, - place_param2 = 10, -- 15° - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:mesh_colordegrotate", { - description = S("Colordegrotate \"mesh\" Drawtype Test Node").."\n".. - S("param2 = color + horizontal rotation (0..23, 32..55, ...)"), - drawtype = "mesh", - paramtype = "light", - paramtype2 = "colordegrotate", - palette = "testnodes_palette_facedir.png", - mesh = "testnodes_ocorner.obj", - tiles = { "testnodes_mesh_stripes8.png" }, - - on_rightclick = rotate_on_rightclick, - -- color index 1, 1 step (=15°) rotated - place_param2 = 1 * 2^5 + 1, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - --- param2 will change height -core.register_node("testnodes:plantlike_leveled", { - description = S("Leveled \"plantlike\" Drawtype Test Node").."\n".. - S("param2 = height (0..255)"), - drawtype = "plantlike", - paramtype = "light", - paramtype2 = "leveled", - tiles = { - { name = "testnodes_plantlike_leveled.png", tileable_vertical = true }, - }, - - - -- We set a default param2 here only for convenience, to make the "plant" visible after placement - place_param2 = 8, - walkable = false, - sunlight_propagates = true, - groups = { dig_immediate = 3 }, -}) - --- param2 changes shape -core.register_node("testnodes:plantlike_meshoptions", { - description = S("Meshoptions \"plantlike\" Drawtype Test Node").."\n".. - S("param2 = plant shape"), - drawtype = "plantlike", - paramtype = "light", - paramtype2 = "meshoptions", - tiles = { "testnodes_plantlike_meshoptions.png" }, - - - walkable = false, - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:plantlike_rooted", { - description = S("\"rooted_plantlike\" Drawtype Test Node"), - drawtype = "plantlike_rooted", - paramtype = "light", - tiles = { "testnodes_plantlike_rooted_base.png" }, - special_tiles = { "testnodes_plantlike_rooted.png" }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:plantlike_rooted_wallmounted", { - description = S("Wallmounted \"rooted_plantlike\" Drawtype Test Node").."\n".. - S("param2 = wallmounted rotation (0..7)"), - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "wallmounted", - tiles = { - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base_side_wallmounted.png" }, - special_tiles = { "testnodes_plantlike_rooted_wallmounted.png" }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:plantlike_rooted_waving", { - description = S("Waving \"rooted_plantlike\" Drawtype Test Node").."\n".. - S("Waves if waving plants are enabled by client"), - drawtype = "plantlike_rooted", - paramtype = "light", - tiles = { - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base_side_waving.png", - }, - special_tiles = { "testnodes_plantlike_rooted_waving.png" }, - waving = 1, - - groups = { dig_immediate = 3 }, -}) - --- param2 changes height -core.register_node("testnodes:plantlike_rooted_leveled", { - description = S("Leveled \"rooted_plantlike\" Drawtype Test Node").."\n".. - S("param2 = height (0..255)"), - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "leveled", - tiles = { - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base_side_leveled.png", - }, - special_tiles = { - { name = "testnodes_plantlike_rooted_leveled.png", tileable_vertical = true }, - }, - - - -- We set a default param2 here only for convenience, to make the "plant" visible after placement - place_param2 = 8, - groups = { dig_immediate = 3 }, -}) - --- param2 changes shape -core.register_node("testnodes:plantlike_rooted_meshoptions", { - description = S("Meshoptions \"rooted_plantlike\" Drawtype Test Node").."\n".. - S("param2 = plant shape"), - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - tiles = { - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base_side_meshoptions.png", - }, - special_tiles = { - "testnodes_plantlike_rooted_meshoptions.png", - }, - - groups = { dig_immediate = 3 }, -}) - --- param2 changes rotation -core.register_node("testnodes:plantlike_rooted_degrotate", { - description = S("Degrotate \"rooted_plantlike\" Drawtype Test Node").."\n".. - S("param2 = horizontal rotation (0..239)"), - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "degrotate", - tiles = { - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base.png", - "testnodes_plantlike_rooted_base_side_degrotate.png", - }, - special_tiles = { - "testnodes_plantlike_rooted_degrotate.png", - }, - - groups = { dig_immediate = 3 }, -}) - --- Demonstrative liquid nodes, source and flowing form. --- DRAWTYPE ONLY, NO LIQUID PHYSICS! --- Liquid ranges 0 to 8 -for r = 0, 8 do - core.register_node("testnodes:liquid_"..r, { - description = S("\"liquid\" Drawtype Test Node, Range @1", r).."\n".. - S("Drawtype only; all liquid physics are disabled"), - drawtype = "liquid", - paramtype = "light", - tiles = { - "testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", - }, - special_tiles = { - {name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false}, - {name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=true}, - }, - use_texture_alpha = "blend", - - - walkable = false, - liquid_range = r, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquid_flowing_"..r, - liquid_alternative_source = "testnodes:liquid_"..r, - groups = { dig_immediate = 3 }, - }) - core.register_node("testnodes:liquid_flowing_"..r, { - description = S("\"flowingliquid\" Drawtype Test Node, Range @1", r).."\n".. - S("Drawtype only; all liquid physics are disabled").."\n".. - S("param2 = flowing liquid level"), - drawtype = "flowingliquid", - paramtype = "light", - paramtype2 = "flowingliquid", - tiles = { - "testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", - }, - special_tiles = { - {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false}, - {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false}, - }, - use_texture_alpha = "blend", - - - walkable = false, - liquid_range = r, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquid_flowing_"..r, - liquid_alternative_source = "testnodes:liquid_"..r, - groups = { dig_immediate = 3 }, - }) - -end - --- Waving liquid test (drawtype only) -core.register_node("testnodes:liquid_waving", { - description = S("Waving \"liquid\" Drawtype Test Node").."\n".. - S("Drawtype only; all liquid physics are disabled").."\n".. - S("Waves if waving liquids are enabled by client"), - drawtype = "liquid", - paramtype = "light", - tiles = { - "testnodes_liquidsource.png^[colorize:#0000FF:127", - }, - special_tiles = { - {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=false}, - {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=true}, - }, - use_texture_alpha = "blend", - waving = 3, - - - walkable = false, - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquid_flowing_waving", - liquid_alternative_source = "testnodes:liquid_waving", - groups = { dig_immediate = 3 }, -}) -core.register_node("testnodes:liquid_flowing_waving", { - description = S("Waving \"flowingliquid\" Drawtype Test Node").."\n".. - S("Drawtype only; all liquid physics are disabled").."\n".. - S("param2 = flowing liquid level").."\n".. - S("Waves if waving liquids are enabled by client"), - drawtype = "flowingliquid", - paramtype = "light", - paramtype2 = "flowingliquid", - tiles = { - "testnodes_liquidflowing.png^[colorize:#0000FF:127", - }, - special_tiles = { - {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false}, - {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false}, - }, - use_texture_alpha = "blend", - waving = 3, - - - walkable = false, - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquid_flowing_waving", - liquid_alternative_source = "testnodes:liquid_waving", - groups = { dig_immediate = 3 }, -}) - --- Invisible node -core.register_node("testnodes:airlike", { - description = S("\"airlike\" Drawtype Test Node").."\n".. - S("Invisible node").."\n".. - S("Inventory/wield image = no_texture_airlike.png"), - drawtype = "airlike", - paramtype = "light", - -- inventory/wield images are left empty to make sure the 'no texture' - -- fallback for airlike nodes is working properly. - - - walkable = false, - groups = { dig_immediate = 3 }, - sunlight_propagates = true, -}) - --- param2 changes liquid height -core.register_node("testnodes:glassliquid", { - description = S("\"glasslike_framed\" Drawtype with Liquid Test Node").."\n".. - S("param2 = liquid level (0..63)"), - drawtype = "glasslike_framed", - paramtype = "light", - paramtype2 = "glasslikeliquidlevel", - tiles = { - "testnodes_glasslikeliquid.png", - }, - special_tiles = { - "testnodes_liquid.png", - }, - - groups = { dig_immediate = 3 }, -}) - --- Adding many raillike examples, primarily to demonstrate the behavior of --- "raillike groups". Nodes of the same type (rail, groupless, line, street) --- should connect to nodes of the same "rail type" (=same shape, different --- color) only. -local rails = { - { "rail", {"testnodes_rail_straight.png", "testnodes_rail_curved.png", "testnodes_rail_t_junction.png", "testnodes_rail_crossing.png"}, S("Connects to rails")}, - { "line", {"testnodes_line_straight.png", "testnodes_line_curved.png", "testnodes_line_t_junction.png", "testnodes_line_crossing.png"}, S("Connects to lines")}, - { "street", {"testnodes_street_straight.png", "testnodes_street_curved.png", "testnodes_street_t_junction.png", "testnodes_street_crossing.png"}, S("Connects to streets")}, - -- the "groupless" nodes are nodes in which the "connect_to_raillike" group is not set - { "groupless", {"testnodes_rail2_straight.png", "testnodes_rail2_curved.png", "testnodes_rail2_t_junction.png", "testnodes_rail2_crossing.png"}, S("Connects to 'groupless' rails") }, -} -local colors = { "", "cyan", "red" } - -for r=1, #rails do - local id = rails[r][1] - local tiles = rails[r][2] - local tt = rails[r][3] - local raillike_group - if id ~= "groupless" then - raillike_group = core.raillike_group(id) - end - for c=1, #colors do - local color - if colors[c] ~= "" then - color = colors[c] - end - core.register_node("testnodes:raillike_"..id..c, { - description = S("\"raillike\" Drawtype Test Node: @1 @2", id, c).."\n".. - tt, - drawtype = "raillike", - paramtype = "light", - tiles = tiles, - groups = { connect_to_raillike = raillike_group, dig_immediate = 3 }, - - - color = color, - selection_box = { - type = "fixed", - fixed = {{-0.5, -0.5, -0.5, 0.5, -0.4, 0.5}}, - }, - sunlight_propagates = true, - walkable = false, - }) - end -end - - - --- Add visual_scale variants of previous nodes for half and double size -local scale = function(subname, append) - local original = "testnodes:"..subname - local def = table.copy(core.registered_items[original]) - local orig_desc - if append and type(append) == "string" then - orig_desc = ItemStack(original):get_short_description() - orig_desc = orig_desc .. "\n" .. append - elseif append ~= false then - orig_desc = ItemStack(original):get_description() - else - orig_desc = ItemStack(original):get_short_description() - end - def.visual_scale = 2.0 - def.description = S("Double-sized @1", orig_desc) - core.register_node("testnodes:"..subname.."_double", def) - def = table.copy(core.registered_items[original]) - def.visual_scale = 0.5 - def.description = S("Half-sized @1", orig_desc) - core.register_node("testnodes:"..subname.."_half", def) -end - -local allfaces_newsize_tt = "".. - S("Rendering depends on 'leaves_style' setting:").."\n".. - S("* 'fancy'/'simple': transparent").."\n".. - S("* 'opaque': opaque") - -scale("allfaces", S("Transparent node")) -scale("allfaces_optional", allfaces_newsize_tt) -scale("allfaces_optional_waving", allfaces_newsize_tt .. "\n" .. S("Waving if waving leaves are enabled by client")) -scale("plantlike") -scale("plantlike_wallmounted") -scale("torchlike_wallmounted") -scale("signlike_wallmounted") -scale("firelike") diff --git a/data/games/garage/mods/testnodes/init.lua b/data/games/garage/mods/testnodes/init.lua deleted file mode 100644 index 49a45e0..0000000 --- a/data/games/garage/mods/testnodes/init.lua +++ /dev/null @@ -1,13 +0,0 @@ -local path = core.get_modpath(core.get_current_modname()) - -dofile(path.."/drawtypes.lua") -dofile(path.."/meshes.lua") -dofile(path.."/nodeboxes.lua") -dofile(path.."/param2.lua") -dofile(path.."/performance_test_nodes.lua") -dofile(path.."/properties.lua") -dofile(path.."/liquids.lua") -dofile(path.."/light.lua") -dofile(path.."/textures.lua") -dofile(path.."/overlays.lua") -dofile(path.."/commands.lua") diff --git a/data/games/garage/mods/testnodes/light.lua b/data/games/garage/mods/testnodes/light.lua deleted file mode 100644 index 0f1ccb7..0000000 --- a/data/games/garage/mods/testnodes/light.lua +++ /dev/null @@ -1,50 +0,0 @@ --- Test Nodes: Light test - -local S = core.get_translator("testnodes") - --- All possible light levels -for i=1, core.LIGHT_MAX do - core.register_node("testnodes:light"..string.format("%02d", i), { - description = S("Light Source (@1)", i), - paramtype = "light", - light_source = i, - - - tiles ={"testnodes_light_"..i..".png"}, - drawtype = "glasslike", - walkable = false, - sunlight_propagates = true, - is_ground_content = false, - groups = {dig_immediate=3}, - }) -end - --- Lets light through, but not sunlight, leading to a --- reduction in light level when light passes through -core.register_node("testnodes:sunlight_filter", { - description = S("Sunlight Filter") .."\n".. - S("Lets light through, but weakens sunlight"), - paramtype = "light", - - - drawtype = "glasslike", - tiles = { - "testnodes_sunlight_filter.png", - }, - groups = { dig_immediate = 3 }, -}) - --- Lets light and sunlight through without obstruction -core.register_node("testnodes:sunlight_propagator", { - description = S("Sunlight Propagator") .."\n".. - S("Lets all light through"), - paramtype = "light", - sunlight_propagates = true, - - - drawtype = "glasslike", - tiles = { - "testnodes_sunlight_filter.png^[brighten", - }, - groups = { dig_immediate = 3 }, -}) diff --git a/data/games/garage/mods/testnodes/liquids.lua b/data/games/garage/mods/testnodes/liquids.lua deleted file mode 100644 index 130b2a7..0000000 --- a/data/games/garage/mods/testnodes/liquids.lua +++ /dev/null @@ -1,157 +0,0 @@ --- Add liquids for ranges and viscosity levels 0-8 - -for d=0, 8 do - local tt_normal - if d == 0 then - tt_normal = "\n".."Swimmable, renewable liquid" - else - tt_normal = "\n".."Swimmable, spreading, renewable liquid" - end - core.register_node("testnodes:rliquid_"..d, { - description = "Test Liquid Source, Range "..d.. - tt_normal .. "\n" .. "(falling & floating node)", - drawtype = "liquid", - tiles = {"testnodes_liquidsource_r"..d..".png"}, - special_tiles = { - {name = "testnodes_liquidsource_r"..d..".png", backface_culling = false}, - {name = "testnodes_liquidsource_r"..d..".png", backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - walkable = false, - buildable_to = true, - is_ground_content = false, - liquidtype = "source", - liquid_alternative_flowing = "testnodes:rliquid_flowing_"..d, - liquid_alternative_source = "testnodes:rliquid_"..d, - liquid_range = d, - -- Also use these nodes to test falling, floating liquid source nodes - groups = {float = 1, falling_node = 1}, - }) - - core.register_node("testnodes:rliquid_flowing_"..d, { - description = "Flowing Test Liquid, Range "..d.. - tt_normal, - drawtype = "flowingliquid", - tiles = {"testnodes_liquidflowing_r"..d..".png"}, - special_tiles = { - {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, - {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - buildable_to = true, - is_ground_content = false, - liquidtype = "flowing", - liquid_alternative_flowing = "testnodes:rliquid_flowing_"..d, - liquid_alternative_source = "testnodes:rliquid_"..d, - liquid_range = d, - }) - - if d <= 7 then - - local tt_reduced = "" - if d > 0 then - tt_reduced = "\n".."Reduced swimming/spreading speed" - end - - local mod = "^[colorize:#000000:127" - core.register_node("testnodes:vliquid_"..d, { - description = "Test Liquid Source, Viscosity/Resistance "..d.."\n".. - "Swimmable, spreading, renewable liquid".. - tt_reduced, - drawtype = "liquid", - tiles = {"testnodes_liquidsource_r"..d..".png"..mod}, - special_tiles = { - {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false}, - {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - walkable = false, - buildable_to = true, - is_ground_content = false, - liquidtype = "source", - liquid_alternative_flowing = "testnodes:vliquid_flowing_"..d, - liquid_alternative_source = "testnodes:vliquid_"..d, - liquid_viscosity = d, - }) - - core.register_node("testnodes:vliquid_flowing_"..d, { - description = "Flowing Test Liquid, Viscosity/Resistance "..d.."\n".. - "Swimmable, spreading, renewable liquid".. - tt_reduced, - drawtype = "flowingliquid", - tiles = {"testnodes_liquidflowing_r"..d..".png"..mod}, - special_tiles = { - {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, - {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - buildable_to = true, - is_ground_content = false, - liquidtype = "flowing", - liquid_alternative_flowing = "testnodes:vliquid_flowing_"..d, - liquid_alternative_source = "testnodes:vliquid_"..d, - liquid_viscosity = d, - }) - - mod = "^[colorize:#000000:192" - local v = 4 - core.register_node("testnodes:vrliquid_"..d, { - description = "Test Liquid Source, Viscosity "..v..", Resistance "..d.."\n".. - "Swimmable, spreading, renewable liquid".. - tt_reduced, - drawtype = "liquid", - tiles = {"testnodes_liquidsource_r"..d..".png"..mod}, - special_tiles = { - {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false}, - {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - liquidtype = "source", - liquid_alternative_flowing = "testnodes:vrliquid_flowing_"..d, - liquid_alternative_source = "testnodes:vrliquid_"..d, - liquid_viscosity = v, - move_resistance = d, - }) - - core.register_node("testnodes:vrliquid_flowing_"..d, { - description = "Flowing Test Liquid, Viscosity "..v..", Resistance "..d.."\n".. - "Swimmable, spreading, renewable liquid".. - tt_reduced, - drawtype = "flowingliquid", - tiles = {"testnodes_liquidflowing_r"..d..".png"..mod}, - special_tiles = { - {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, - {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - liquidtype = "flowing", - liquid_alternative_flowing = "testnodes:vrliquid_flowing_"..d, - liquid_alternative_source = "testnodes:vrliquid_"..d, - liquid_viscosity = v, - move_resistance = d, - }) - - end - -end diff --git a/data/games/garage/mods/testnodes/meshes.lua b/data/games/garage/mods/testnodes/meshes.lua deleted file mode 100644 index 4fafa8a..0000000 --- a/data/games/garage/mods/testnodes/meshes.lua +++ /dev/null @@ -1,179 +0,0 @@ --- Meshes - -local S = core.get_translator("testnodes") - -local ocorner_cbox = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, - {-0.5, -0.25, -0.25, 0.25, 0, 0.5}, - {-0.5, 0, 0, 0, 0.25, 0.5}, - {-0.5, 0.25, 0.25, -0.25, 0.5, 0.5} - } -} - -local tall_pyr_cbox = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }, - { -0.375, -0.25, -0.375, 0.375, 0, 0.375}, - { -0.25, 0, -0.25, 0.25, 0.25, 0.25}, - { -0.125, 0.25, -0.125, 0.125, 0.5, 0.125} - } -} - --- Normal mesh -core.register_node("testnodes:mesh", { - description = S("Mesh Test Node"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes2.png"}, - paramtype = "light", - collision_box = tall_pyr_cbox, - - groups = {dig_immediate=3}, -}) - --- Facedir mesh: outer corner slope -core.register_node("testnodes:mesh_facedir", { - description = S("Facedir Mesh Test Node").."\n".. - S("param2 = facedir rotation (0..23)"), - drawtype = "mesh", - mesh = "testnodes_ocorner.obj", - tiles = {"testnodes_mesh_stripes.png"}, - paramtype = "light", - paramtype2 = "facedir", - collision_box = ocorner_cbox, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:mesh_colorfacedir", { - description = S("Color Facedir Mesh Test Node").."\n".. - S("param2 = color + facedir rotation (0..23, 32..55, ...)"), - drawtype = "mesh", - mesh = "testnodes_ocorner.obj", - tiles = {"testnodes_mesh_stripes3.png"}, - paramtype = "light", - paramtype2 = "colorfacedir", - palette = "testnodes_palette_facedir.png", - collision_box = ocorner_cbox, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:mesh_4dir", { - description = S("4dir Mesh Test Node").."\n".. - S("param2 = 4dir rotation (0..3)"), - drawtype = "mesh", - mesh = "testnodes_ocorner.obj", - tiles = {"testnodes_mesh_stripes5.png"}, - paramtype = "light", - paramtype2 = "4dir", - collision_box = ocorner_cbox, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:mesh_color4dir", { - description = S("Color 4dir Mesh Test Node").."\n".. - S("param2 = color + 4dir rotation (0..255)"), - drawtype = "mesh", - mesh = "testnodes_ocorner.obj", - tiles = {"testnodes_mesh_stripes6.png"}, - paramtype = "light", - paramtype2 = "color4dir", - palette = "testnodes_palette_4dir.png", - collision_box = ocorner_cbox, - - groups = {dig_immediate=3}, -}) - --- Wallmounted mesh: pyramid -core.register_node("testnodes:mesh_wallmounted", { - description = S("Wallmounted Mesh Test Node").."\n".. - S("param2 = wallmounted rotation (0..7)"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes9.png"}, - paramtype = "light", - paramtype2 = "wallmounted", - collision_box = tall_pyr_cbox, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:mesh_colorwallmounted", { - description = S("Color Wallmounted Mesh Test Node").."\n".. - S("param2 = color + wallmounted rotation (0..7, 8..15, ...)"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes10.png"}, - paramtype = "light", - paramtype2 = "colorwallmounted", - palette = "testnodes_palette_wallmounted.png", - collision_box = tall_pyr_cbox, - - groups = {dig_immediate=3}, -}) - - -core.register_node("testnodes:mesh_double", { - description = S("Double-sized Mesh Test Node"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes2.png"}, - paramtype = "light", - collision_box = tall_pyr_cbox, - visual_scale = 2, - - groups = {dig_immediate=3}, -}) -core.register_node("testnodes:mesh_half", { - description = S("Half-sized Mesh Test Node"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes2.png"}, - paramtype = "light", - collision_box = tall_pyr_cbox, - visual_scale = 0.5, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:mesh_waving1", { - description = S("Plantlike-waving Mesh Test Node").."\n".. - S("Waves if waving plants are enabled by client"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes4.png^[multiply:#B0FFB0"}, - paramtype = "light", - collision_box = tall_pyr_cbox, - waving = 1, - - groups = {dig_immediate=3}, -}) -core.register_node("testnodes:mesh_waving2", { - description = S("Leaflike-waving Mesh Test Node").."\n".. - S("Waves if waving leaves are enabled by client"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes4.png^[multiply:#FFFFB0"}, - paramtype = "light", - collision_box = tall_pyr_cbox, - waving = 2, - - groups = {dig_immediate=3}, -}) -core.register_node("testnodes:mesh_waving3", { - description = S("Liquidlike-waving Mesh Test Node").."\n".. - S("Waves if waving liquids are enabled by client"), - drawtype = "mesh", - mesh = "testnodes_pyramid.obj", - tiles = {"testnodes_mesh_stripes4.png^[multiply:#B0B0FF"}, - paramtype = "light", - collision_box = tall_pyr_cbox, - waving = 3, - - groups = {dig_immediate=3}, -}) diff --git a/data/games/garage/mods/testnodes/mod.conf b/data/games/garage/mods/testnodes/mod.conf deleted file mode 100644 index d894c34..0000000 --- a/data/games/garage/mods/testnodes/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = testnodes -description = Contains a bunch of basic example nodes for demonstrative purposes, development and testing -depends = stairs diff --git a/data/games/garage/mods/testnodes/models/testnodes_marble_glass.obj b/data/games/garage/mods/testnodes/models/testnodes_marble_glass.obj deleted file mode 100644 index 5acd93e..0000000 --- a/data/games/garage/mods/testnodes/models/testnodes_marble_glass.obj +++ /dev/null @@ -1,1619 +0,0 @@ -# Blender 3.3.1 -# www.blender.org -o Cube -v 0.323728 0.323728 -0.323728 -v 0.323728 -0.323728 -0.323728 -v 0.323728 0.323728 0.323728 -v 0.323728 -0.323728 0.323728 -v -0.323728 0.323728 -0.323728 -v -0.323728 -0.323728 -0.323728 -v -0.323728 0.323728 0.323728 -v -0.323728 -0.323728 0.323728 -v -0.396318 -0.396318 0.000000 -v 0.000000 -0.396318 -0.396318 -v 0.396318 0.000000 -0.396318 -v -0.396318 0.000000 0.396318 -v 0.396318 0.000000 0.396318 -v -0.396318 0.000000 -0.396318 -v 0.000000 0.396318 0.396318 -v 0.396318 0.396318 0.000000 -v 0.000000 -0.396318 0.396318 -v -0.396318 0.396318 0.000000 -v 0.000000 0.396318 -0.396318 -v 0.396318 -0.396318 0.000000 -v 0.000000 0.561355 -0.000000 -v 0.000000 0.000000 0.561355 -v -0.561355 0.000000 0.000000 -v 0.000000 -0.561355 -0.000000 -v 0.561355 0.000000 -0.000000 -v -0.000000 0.000000 -0.561355 -v -0.378043 -0.378043 -0.169966 -v -0.378043 -0.378043 0.169966 -v 0.169966 -0.378043 -0.378043 -v -0.169966 -0.378043 -0.378043 -v 0.378043 0.169966 -0.378043 -v 0.378043 -0.169966 -0.378043 -v -0.378043 -0.169966 0.378043 -v -0.378043 0.169966 0.378043 -v 0.378043 0.169966 0.378043 -v 0.378043 -0.169966 0.378043 -v -0.378043 0.169966 -0.378043 -v -0.378043 -0.169966 -0.378043 -v 0.169966 0.378043 0.378043 -v -0.169966 0.378043 0.378043 -v 0.378043 0.378043 -0.169966 -v 0.378043 0.378043 0.169966 -v -0.169966 -0.378043 0.378043 -v 0.169966 -0.378043 0.378043 -v -0.378043 0.378043 0.169966 -v -0.378043 0.378043 -0.169966 -v -0.169966 0.378043 -0.378043 -v 0.169966 0.378043 -0.378043 -v 0.378043 -0.378043 0.169966 -v 0.378043 -0.378043 -0.169966 -v 0.000000 0.518474 -0.214562 -v -0.214562 0.518474 -0.000000 -v 0.000000 0.518474 0.214562 -v 0.214562 0.518474 -0.000000 -v 0.214562 0.000000 0.518474 -v 0.000000 0.214562 0.518474 -v -0.214562 0.000000 0.518474 -v 0.000000 -0.214562 0.518474 -v -0.518474 0.000000 0.214562 -v -0.518474 0.214562 0.000000 -v -0.518474 0.000000 -0.214562 -v -0.518474 -0.214562 0.000000 -v 0.000000 -0.518474 -0.214562 -v 0.214562 -0.518474 -0.000000 -v 0.000000 -0.518474 0.214562 -v -0.214562 -0.518474 -0.000000 -v 0.518474 0.000000 -0.214562 -v 0.518474 0.214562 -0.000000 -v 0.518474 0.000000 0.214562 -v 0.518474 -0.214562 -0.000000 -v -0.214562 0.000000 -0.518474 -v -0.000000 0.214562 -0.518474 -v 0.214562 0.000000 -0.518474 -v -0.000000 -0.214562 -0.518474 -v 0.205792 0.479498 -0.205792 -v -0.205792 0.479498 -0.205792 -v -0.205792 0.479498 0.205792 -v 0.205792 0.479498 0.205792 -v 0.205792 -0.205792 0.479498 -v 0.205792 0.205792 0.479498 -v -0.205792 0.205792 0.479498 -v -0.205792 -0.205792 0.479498 -v -0.479498 -0.205792 0.205792 -v -0.479498 0.205792 0.205792 -v -0.479498 0.205792 -0.205792 -v -0.479498 -0.205792 -0.205792 -v -0.205792 -0.479498 -0.205792 -v 0.205792 -0.479498 -0.205792 -v 0.205792 -0.479498 0.205792 -v -0.205792 -0.479498 0.205792 -v 0.479498 -0.205792 -0.205792 -v 0.479498 0.205792 -0.205792 -v 0.479498 0.205792 0.205792 -v 0.479498 -0.205792 0.205792 -v -0.205792 -0.205792 -0.479498 -v -0.205792 0.205792 -0.479498 -v 0.205792 0.205792 -0.479498 -v 0.205792 -0.205792 -0.479498 -v -0.355165 -0.355165 -0.249858 -v -0.391777 -0.391777 -0.085992 -v -0.391777 -0.391777 0.085992 -v -0.355165 -0.355165 0.249858 -v 0.249858 -0.355165 -0.355165 -v 0.085992 -0.391777 -0.391777 -v -0.085992 -0.391777 -0.391777 -v -0.249858 -0.355165 -0.355165 -v 0.355165 0.249858 -0.355165 -v 0.391777 0.085992 -0.391777 -v 0.391777 -0.085992 -0.391777 -v 0.355165 -0.249858 -0.355165 -v -0.355165 -0.249858 0.355165 -v -0.391777 -0.085992 0.391777 -v -0.391777 0.085992 0.391777 -v -0.355165 0.249858 0.355165 -v 0.355165 0.249858 0.355165 -v 0.391777 0.085992 0.391777 -v 0.391777 -0.085992 0.391777 -v 0.355165 -0.249858 0.355165 -v -0.355165 0.249858 -0.355165 -v -0.391777 0.085992 -0.391777 -v -0.391777 -0.085992 -0.391777 -v -0.355165 -0.249858 -0.355165 -v 0.249858 0.355165 0.355165 -v 0.085992 0.391777 0.391777 -v -0.085992 0.391777 0.391777 -v -0.249858 0.355165 0.355165 -v 0.355165 0.355165 -0.249858 -v 0.391777 0.391777 -0.085992 -v 0.391777 0.391777 0.085992 -v 0.355165 0.355165 0.249858 -v -0.249858 -0.355165 0.355165 -v -0.085992 -0.391777 0.391777 -v 0.085992 -0.391777 0.391777 -v 0.249858 -0.355165 0.355165 -v -0.355165 0.355165 0.249858 -v -0.391777 0.391777 0.085992 -v -0.391777 0.391777 -0.085992 -v -0.355165 0.355165 -0.249858 -v -0.249858 0.355165 -0.355165 -v -0.085992 0.391777 -0.391777 -v 0.085992 0.391777 -0.391777 -v 0.249858 0.355165 -0.355165 -v 0.355165 -0.355165 0.249858 -v 0.391777 -0.391777 0.085992 -v 0.391777 -0.391777 -0.085992 -v 0.355165 -0.355165 -0.249858 -v 0.000000 0.466551 -0.311553 -v 0.000000 0.550455 -0.109376 -v -0.311553 0.466551 0.000000 -v -0.109376 0.550455 0.000000 -v 0.000000 0.466551 0.311553 -v 0.000000 0.550455 0.109376 -v 0.311553 0.466551 0.000000 -v 0.109376 0.550455 0.000000 -v 0.311553 0.000000 0.466551 -v 0.109376 0.000000 0.550455 -v 0.000000 0.311553 0.466551 -v 0.000000 0.109376 0.550455 -v -0.311553 0.000000 0.466551 -v -0.109376 0.000000 0.550455 -v 0.000000 -0.311553 0.466551 -v 0.000000 -0.109376 0.550455 -v -0.466551 0.000000 0.311553 -v -0.550455 0.000000 0.109376 -v -0.466551 0.311553 0.000000 -v -0.550455 0.109376 0.000000 -v -0.466551 0.000000 -0.311553 -v -0.550455 0.000000 -0.109376 -v -0.466551 -0.311553 0.000000 -v -0.550455 -0.109376 0.000000 -v 0.000000 -0.466551 -0.311553 -v 0.000000 -0.550455 -0.109376 -v 0.311553 -0.466551 0.000000 -v 0.109376 -0.550455 0.000000 -v 0.000000 -0.466551 0.311553 -v 0.000000 -0.550455 0.109376 -v -0.311553 -0.466551 0.000000 -v -0.109376 -0.550455 0.000000 -v 0.466551 0.000000 -0.311553 -v 0.550455 0.000000 -0.109376 -v 0.466551 0.311553 0.000000 -v 0.550455 0.109376 0.000000 -v 0.466551 0.000000 0.311553 -v 0.550455 0.000000 0.109376 -v 0.466551 -0.311553 0.000000 -v 0.550455 -0.109376 0.000000 -v -0.311553 0.000000 -0.466551 -v -0.109376 0.000000 -0.550455 -v 0.000000 0.311553 -0.466551 -v 0.000000 0.109376 -0.550455 -v 0.311553 0.000000 -0.466551 -v 0.109376 0.000000 -0.550455 -v 0.000000 -0.311553 -0.466551 -v 0.000000 -0.109376 -0.550455 -v 0.190929 0.435731 -0.296656 -v 0.104690 0.507685 -0.213841 -v 0.213841 0.507685 -0.104690 -v 0.296656 0.435731 -0.190929 -v -0.190929 0.435731 -0.296656 -v -0.296656 0.435731 -0.190929 -v -0.213841 0.507685 -0.104690 -v -0.104690 0.507685 -0.213841 -v -0.213841 0.507685 0.104690 -v -0.296656 0.435731 0.190929 -v -0.190929 0.435731 0.296656 -v -0.104690 0.507685 0.213841 -v 0.213841 0.507685 0.104690 -v 0.104690 0.507685 0.213841 -v 0.190929 0.435731 0.296656 -v 0.296656 0.435731 0.190929 -v 0.296656 -0.190929 0.435731 -v 0.213841 -0.104690 0.507685 -v 0.104690 -0.213841 0.507685 -v 0.190929 -0.296656 0.435731 -v 0.296656 0.190929 0.435731 -v 0.190929 0.296656 0.435731 -v 0.104690 0.213841 0.507685 -v 0.213841 0.104690 0.507685 -v -0.104690 0.213841 0.507685 -v -0.190929 0.296656 0.435731 -v -0.296656 0.190929 0.435731 -v -0.213841 0.104690 0.507685 -v -0.104690 -0.213841 0.507685 -v -0.213841 -0.104690 0.507685 -v -0.296656 -0.190929 0.435731 -v -0.190929 -0.296656 0.435731 -v -0.435731 -0.190929 0.296656 -v -0.507685 -0.104690 0.213841 -v -0.507685 -0.213841 0.104690 -v -0.435731 -0.296656 0.190929 -v -0.435731 0.190929 0.296656 -v -0.435731 0.296656 0.190929 -v -0.507685 0.213841 0.104690 -v -0.507685 0.104690 0.213841 -v -0.507685 0.213841 -0.104690 -v -0.435731 0.296656 -0.190929 -v -0.435731 0.190929 -0.296656 -v -0.507685 0.104690 -0.213841 -v -0.507685 -0.213841 -0.104690 -v -0.507685 -0.104690 -0.213841 -v -0.435731 -0.190929 -0.296656 -v -0.435731 -0.296656 -0.190929 -v -0.190929 -0.435731 -0.296656 -v -0.104690 -0.507685 -0.213841 -v -0.213841 -0.507685 -0.104690 -v -0.296656 -0.435731 -0.190929 -v 0.190929 -0.435731 -0.296656 -v 0.296656 -0.435731 -0.190929 -v 0.213841 -0.507685 -0.104690 -v 0.104690 -0.507685 -0.213841 -v 0.213841 -0.507685 0.104690 -v 0.296656 -0.435731 0.190929 -v 0.190929 -0.435731 0.296656 -v 0.104690 -0.507685 0.213841 -v -0.213841 -0.507685 0.104690 -v -0.104690 -0.507685 0.213841 -v -0.190929 -0.435731 0.296656 -v -0.296656 -0.435731 0.190929 -v 0.435731 -0.190929 -0.296656 -v 0.507685 -0.104690 -0.213841 -v 0.507685 -0.213841 -0.104690 -v 0.435731 -0.296656 -0.190929 -v 0.435731 0.190929 -0.296656 -v 0.435731 0.296656 -0.190929 -v 0.507685 0.213841 -0.104690 -v 0.507685 0.104690 -0.213841 -v 0.507685 0.213841 0.104690 -v 0.435731 0.296656 0.190929 -v 0.435731 0.190929 0.296656 -v 0.507685 0.104690 0.213841 -v 0.507685 -0.213841 0.104690 -v 0.507685 -0.104690 0.213841 -v 0.435731 -0.190929 0.296656 -v 0.435731 -0.296656 0.190929 -v -0.296656 -0.190929 -0.435731 -v -0.213841 -0.104690 -0.507685 -v -0.104690 -0.213841 -0.507685 -v -0.190929 -0.296656 -0.435731 -v -0.296656 0.190929 -0.435731 -v -0.190929 0.296656 -0.435731 -v -0.104690 0.213841 -0.507685 -v -0.213841 0.104690 -0.507685 -v 0.104690 0.213841 -0.507685 -v 0.190929 0.296656 -0.435731 -v 0.296656 0.190929 -0.435731 -v 0.213841 0.104690 -0.507685 -v 0.104690 -0.213841 -0.507685 -v 0.213841 -0.104690 -0.507685 -v 0.296656 -0.190929 -0.435731 -v 0.190929 -0.296656 -0.435731 -v 0.277006 0.400861 -0.277006 -v 0.097104 0.458010 -0.308740 -v 0.109074 0.539153 -0.109074 -v 0.308740 0.458010 -0.097104 -v -0.097104 0.458010 -0.308740 -v -0.277006 0.400861 -0.277006 -v -0.308740 0.458010 -0.097104 -v -0.109074 0.539153 -0.109074 -v -0.109074 0.539153 0.109074 -v -0.308740 0.458010 0.097104 -v -0.277006 0.400861 0.277006 -v -0.097104 0.458010 0.308740 -v 0.308740 0.458010 0.097104 -v 0.109074 0.539153 0.109074 -v 0.097104 0.458010 0.308740 -v 0.277006 0.400861 0.277006 -v 0.277006 -0.277006 0.400861 -v 0.308740 -0.097104 0.458010 -v 0.109074 -0.109074 0.539153 -v 0.097104 -0.308740 0.458010 -v 0.308740 0.097104 0.458010 -v 0.277006 0.277006 0.400861 -v 0.097104 0.308740 0.458010 -v 0.109074 0.109074 0.539153 -v -0.109074 0.109074 0.539153 -v -0.097104 0.308740 0.458010 -v -0.277006 0.277006 0.400861 -v -0.308740 0.097104 0.458010 -v -0.097104 -0.308740 0.458010 -v -0.109074 -0.109074 0.539153 -v -0.308740 -0.097104 0.458010 -v -0.277006 -0.277006 0.400861 -v -0.400861 -0.277006 0.277006 -v -0.458010 -0.097104 0.308740 -v -0.539153 -0.109074 0.109074 -v -0.458010 -0.308740 0.097104 -v -0.458010 0.097104 0.308740 -v -0.400861 0.277006 0.277006 -v -0.458010 0.308740 0.097104 -v -0.539153 0.109074 0.109074 -v -0.539153 0.109074 -0.109074 -v -0.458010 0.308740 -0.097104 -v -0.400861 0.277006 -0.277006 -v -0.458010 0.097104 -0.308740 -v -0.458010 -0.308740 -0.097104 -v -0.539153 -0.109074 -0.109074 -v -0.458010 -0.097104 -0.308740 -v -0.400861 -0.277006 -0.277006 -v -0.277006 -0.400861 -0.277006 -v -0.097104 -0.458010 -0.308740 -v -0.109074 -0.539153 -0.109074 -v -0.308740 -0.458010 -0.097104 -v 0.097104 -0.458010 -0.308740 -v 0.277006 -0.400861 -0.277006 -v 0.308740 -0.458010 -0.097104 -v 0.109074 -0.539153 -0.109074 -v 0.109074 -0.539153 0.109074 -v 0.308740 -0.458010 0.097104 -v 0.277006 -0.400861 0.277006 -v 0.097104 -0.458010 0.308740 -v -0.308740 -0.458010 0.097104 -v -0.109074 -0.539153 0.109074 -v -0.097104 -0.458010 0.308740 -v -0.277006 -0.400861 0.277006 -v 0.400861 -0.277006 -0.277006 -v 0.458010 -0.097104 -0.308740 -v 0.539153 -0.109074 -0.109074 -v 0.458010 -0.308740 -0.097104 -v 0.458010 0.097104 -0.308740 -v 0.400861 0.277006 -0.277006 -v 0.458010 0.308740 -0.097104 -v 0.539153 0.109074 -0.109074 -v 0.539153 0.109074 0.109074 -v 0.458010 0.308740 0.097104 -v 0.400861 0.277006 0.277006 -v 0.458010 0.097104 0.308740 -v 0.458010 -0.308740 0.097104 -v 0.539153 -0.109074 0.109074 -v 0.458010 -0.097104 0.308740 -v 0.400861 -0.277006 0.277006 -v -0.277006 -0.277006 -0.400861 -v -0.308740 -0.097104 -0.458010 -v -0.109074 -0.109074 -0.539153 -v -0.097104 -0.308740 -0.458010 -v -0.308740 0.097104 -0.458010 -v -0.277006 0.277006 -0.400861 -v -0.097104 0.308740 -0.458010 -v -0.109074 0.109074 -0.539153 -v 0.109074 0.109074 -0.539153 -v 0.097104 0.308740 -0.458010 -v 0.277006 0.277006 -0.400861 -v 0.308740 0.097104 -0.458010 -v 0.097104 -0.308740 -0.458010 -v 0.109074 -0.109074 -0.539153 -v 0.308740 -0.097104 -0.458010 -v 0.277006 -0.277006 -0.400861 -vn 0.5774 0.5774 -0.5774 -vn 0.4530 0.6304 -0.6304 -vn 0.4902 0.7207 -0.4902 -vn 0.6304 0.6304 -0.4530 -vn 0.3090 0.6725 -0.6725 -vn 0.3371 0.7812 -0.5254 -vn 0.3638 0.8575 -0.3638 -vn 0.5254 0.7812 -0.3371 -vn 0.6725 0.6725 -0.3090 -vn 0.1560 0.6984 -0.6984 -vn 0.1715 0.8189 -0.5477 -vn -0.0000 0.7071 -0.7071 -vn -0.0000 0.8326 -0.5539 -vn -0.0000 0.9246 -0.3809 -vn 0.1869 0.9066 -0.3783 -vn 0.1950 0.9612 -0.1950 -vn 0.3783 0.9066 -0.1869 -vn -0.0000 0.9806 -0.1961 -vn -0.0000 1.0000 -0.0000 -vn 0.1961 0.9806 -0.0000 -vn 0.3809 0.9246 -0.0000 -vn 0.5477 0.8189 -0.1715 -vn 0.6984 0.6984 -0.1560 -vn 0.5539 0.8326 -0.0000 -vn 0.7071 0.7071 -0.0000 -vn -0.1560 0.6984 -0.6984 -vn -0.1715 0.8189 -0.5477 -vn -0.3090 0.6725 -0.6725 -vn -0.3371 0.7812 -0.5254 -vn -0.3638 0.8575 -0.3638 -vn -0.1869 0.9066 -0.3783 -vn -0.4530 0.6304 -0.6304 -vn -0.4902 0.7207 -0.4902 -vn -0.5774 0.5774 -0.5774 -vn -0.6304 0.6304 -0.4530 -vn -0.6725 0.6725 -0.3090 -vn -0.5254 0.7812 -0.3371 -vn -0.5477 0.8189 -0.1715 -vn -0.3783 0.9066 -0.1869 -vn -0.6984 0.6984 -0.1560 -vn -0.7071 0.7071 -0.0000 -vn -0.5539 0.8326 -0.0000 -vn -0.3809 0.9246 -0.0000 -vn -0.1950 0.9612 -0.1950 -vn -0.1961 0.9806 -0.0000 -vn -0.1950 0.9612 0.1950 -vn -0.0000 0.9806 0.1961 -vn -0.3783 0.9066 0.1869 -vn -0.3638 0.8575 0.3638 -vn -0.1869 0.9066 0.3783 -vn -0.0000 0.9246 0.3809 -vn -0.5477 0.8189 0.1715 -vn -0.6984 0.6984 0.1560 -vn -0.6725 0.6725 0.3090 -vn -0.5254 0.7812 0.3371 -vn -0.4902 0.7207 0.4902 -vn -0.3371 0.7812 0.5254 -vn -0.6304 0.6304 0.4530 -vn -0.5774 0.5774 0.5774 -vn -0.4530 0.6304 0.6304 -vn -0.3090 0.6725 0.6725 -vn -0.1715 0.8189 0.5477 -vn -0.0000 0.8326 0.5539 -vn -0.1560 0.6984 0.6984 -vn -0.0000 0.7071 0.7071 -vn 0.5477 0.8189 0.1715 -vn 0.6984 0.6984 0.1560 -vn 0.3783 0.9066 0.1869 -vn 0.3638 0.8575 0.3638 -vn 0.5254 0.7812 0.3371 -vn 0.6725 0.6725 0.3090 -vn 0.1950 0.9612 0.1950 -vn 0.1869 0.9066 0.3783 -vn 0.1715 0.8189 0.5477 -vn 0.3371 0.7812 0.5254 -vn 0.1560 0.6984 0.6984 -vn 0.3090 0.6725 0.6725 -vn 0.4902 0.7207 0.4902 -vn 0.6304 0.6304 0.4530 -vn 0.4530 0.6304 0.6304 -vn 0.5774 0.5774 0.5774 -vn 0.5774 -0.5774 0.5774 -vn 0.6304 -0.4530 0.6304 -vn 0.4902 -0.4902 0.7207 -vn 0.4530 -0.6304 0.6304 -vn 0.6725 -0.3090 0.6725 -vn 0.5254 -0.3371 0.7812 -vn 0.3638 -0.3638 0.8575 -vn 0.3371 -0.5254 0.7812 -vn 0.3090 -0.6725 0.6725 -vn 0.6984 -0.1560 0.6984 -vn 0.5477 -0.1715 0.8189 -vn 0.7071 -0.0000 0.7071 -vn 0.5539 -0.0000 0.8326 -vn 0.3809 -0.0000 0.9246 -vn 0.3783 -0.1869 0.9066 -vn 0.1950 -0.1950 0.9612 -vn 0.1869 -0.3783 0.9066 -vn 0.1961 -0.0000 0.9806 -vn -0.0000 -0.0000 1.0000 -vn -0.0000 -0.1961 0.9806 -vn -0.0000 -0.3809 0.9246 -vn 0.1715 -0.5477 0.8189 -vn 0.1560 -0.6984 0.6984 -vn -0.0000 -0.5539 0.8326 -vn -0.0000 -0.7071 0.7071 -vn 0.6984 0.1560 0.6984 -vn 0.5477 0.1715 0.8189 -vn 0.6725 0.3090 0.6725 -vn 0.5254 0.3371 0.7812 -vn 0.3638 0.3638 0.8575 -vn 0.3783 0.1869 0.9066 -vn 0.6304 0.4530 0.6304 -vn 0.4902 0.4902 0.7207 -vn 0.3371 0.5254 0.7812 -vn 0.1715 0.5477 0.8189 -vn 0.1869 0.3783 0.9066 -vn -0.0000 0.5539 0.8326 -vn -0.0000 0.3809 0.9246 -vn 0.1950 0.1950 0.9612 -vn -0.0000 0.1961 0.9806 -vn -0.1950 0.1950 0.9612 -vn -0.1961 -0.0000 0.9806 -vn -0.1869 0.3783 0.9066 -vn -0.3638 0.3638 0.8575 -vn -0.3783 0.1869 0.9066 -vn -0.3809 -0.0000 0.9246 -vn -0.1715 0.5477 0.8189 -vn -0.3371 0.5254 0.7812 -vn -0.4902 0.4902 0.7207 -vn -0.5254 0.3371 0.7812 -vn -0.6304 0.4530 0.6304 -vn -0.6725 0.3090 0.6725 -vn -0.5477 0.1715 0.8189 -vn -0.5539 -0.0000 0.8326 -vn -0.6984 0.1560 0.6984 -vn -0.7071 -0.0000 0.7071 -vn -0.1715 -0.5477 0.8189 -vn -0.1560 -0.6984 0.6984 -vn -0.1869 -0.3783 0.9066 -vn -0.3638 -0.3638 0.8575 -vn -0.3371 -0.5254 0.7812 -vn -0.3090 -0.6725 0.6725 -vn -0.1950 -0.1950 0.9612 -vn -0.3783 -0.1869 0.9066 -vn -0.5477 -0.1715 0.8189 -vn -0.5254 -0.3371 0.7812 -vn -0.6984 -0.1560 0.6984 -vn -0.6725 -0.3090 0.6725 -vn -0.4902 -0.4902 0.7207 -vn -0.4530 -0.6304 0.6304 -vn -0.6304 -0.4530 0.6304 -vn -0.5774 -0.5774 0.5774 -vn -0.7207 -0.4902 0.4902 -vn -0.6304 -0.6304 0.4530 -vn -0.7812 -0.3371 0.5254 -vn -0.8575 -0.3638 0.3638 -vn -0.7812 -0.5254 0.3371 -vn -0.6725 -0.6725 0.3090 -vn -0.8189 -0.1715 0.5477 -vn -0.8326 -0.0000 0.5539 -vn -0.9246 -0.0000 0.3809 -vn -0.9066 -0.1869 0.3783 -vn -0.9612 -0.1950 0.1950 -vn -0.9066 -0.3783 0.1869 -vn -0.9806 -0.0000 0.1961 -vn -1.0000 -0.0000 -0.0000 -vn -0.9806 -0.1961 -0.0000 -vn -0.9246 -0.3809 -0.0000 -vn -0.8189 -0.5477 0.1715 -vn -0.6984 -0.6984 0.1560 -vn -0.8326 -0.5539 -0.0000 -vn -0.7071 -0.7071 -0.0000 -vn -0.8189 0.1715 0.5477 -vn -0.7812 0.3371 0.5254 -vn -0.8575 0.3638 0.3638 -vn -0.9066 0.1869 0.3783 -vn -0.7207 0.4902 0.4902 -vn -0.7812 0.5254 0.3371 -vn -0.8189 0.5477 0.1715 -vn -0.9066 0.3783 0.1869 -vn -0.8326 0.5539 -0.0000 -vn -0.9246 0.3809 -0.0000 -vn -0.9612 0.1950 0.1950 -vn -0.9806 0.1961 -0.0000 -vn -0.9612 0.1950 -0.1950 -vn -0.9806 -0.0000 -0.1961 -vn -0.9066 0.3783 -0.1869 -vn -0.8575 0.3638 -0.3638 -vn -0.9066 0.1869 -0.3783 -vn -0.9246 -0.0000 -0.3809 -vn -0.8189 0.5477 -0.1715 -vn -0.7812 0.5254 -0.3371 -vn -0.7207 0.4902 -0.4902 -vn -0.7812 0.3371 -0.5254 -vn -0.6304 0.4530 -0.6304 -vn -0.6725 0.3090 -0.6725 -vn -0.8189 0.1715 -0.5477 -vn -0.8326 -0.0000 -0.5539 -vn -0.6984 0.1560 -0.6984 -vn -0.7071 -0.0000 -0.7071 -vn -0.8189 -0.5477 -0.1715 -vn -0.6984 -0.6984 -0.1560 -vn -0.9066 -0.3783 -0.1869 -vn -0.8575 -0.3638 -0.3638 -vn -0.7812 -0.5254 -0.3371 -vn -0.6725 -0.6725 -0.3090 -vn -0.9612 -0.1950 -0.1950 -vn -0.9066 -0.1869 -0.3783 -vn -0.8189 -0.1715 -0.5477 -vn -0.7812 -0.3371 -0.5254 -vn -0.6984 -0.1560 -0.6984 -vn -0.6725 -0.3090 -0.6725 -vn -0.7207 -0.4902 -0.4902 -vn -0.6304 -0.6304 -0.4530 -vn -0.6304 -0.4530 -0.6304 -vn -0.5774 -0.5774 -0.5774 -vn -0.4530 -0.6304 -0.6304 -vn -0.4902 -0.7207 -0.4902 -vn -0.3090 -0.6725 -0.6725 -vn -0.3371 -0.7812 -0.5254 -vn -0.3638 -0.8575 -0.3638 -vn -0.5254 -0.7812 -0.3371 -vn -0.1560 -0.6984 -0.6984 -vn -0.1715 -0.8189 -0.5477 -vn -0.0000 -0.7071 -0.7071 -vn -0.0000 -0.8326 -0.5539 -vn -0.0000 -0.9246 -0.3809 -vn -0.1869 -0.9066 -0.3783 -vn -0.1950 -0.9612 -0.1950 -vn -0.3783 -0.9066 -0.1869 -vn -0.0000 -0.9806 -0.1961 -vn -0.0000 -1.0000 -0.0000 -vn -0.1961 -0.9806 -0.0000 -vn -0.3809 -0.9246 -0.0000 -vn -0.5477 -0.8189 -0.1715 -vn -0.5539 -0.8326 -0.0000 -vn 0.1560 -0.6984 -0.6984 -vn 0.1715 -0.8189 -0.5477 -vn 0.3090 -0.6725 -0.6725 -vn 0.3371 -0.7812 -0.5254 -vn 0.3638 -0.8575 -0.3638 -vn 0.1869 -0.9066 -0.3783 -vn 0.4530 -0.6304 -0.6304 -vn 0.4902 -0.7207 -0.4902 -vn 0.5774 -0.5774 -0.5774 -vn 0.6304 -0.6304 -0.4530 -vn 0.6725 -0.6725 -0.3090 -vn 0.5254 -0.7812 -0.3371 -vn 0.5477 -0.8189 -0.1715 -vn 0.3783 -0.9066 -0.1869 -vn 0.6984 -0.6984 -0.1560 -vn 0.7071 -0.7071 -0.0000 -vn 0.5539 -0.8326 -0.0000 -vn 0.3809 -0.9246 -0.0000 -vn 0.1950 -0.9612 -0.1950 -vn 0.1961 -0.9806 -0.0000 -vn 0.1950 -0.9612 0.1950 -vn -0.0000 -0.9806 0.1961 -vn 0.3783 -0.9066 0.1869 -vn 0.3638 -0.8575 0.3638 -vn 0.1869 -0.9066 0.3783 -vn -0.0000 -0.9246 0.3809 -vn 0.5477 -0.8189 0.1715 -vn 0.6984 -0.6984 0.1560 -vn 0.6725 -0.6725 0.3090 -vn 0.5254 -0.7812 0.3371 -vn 0.4902 -0.7207 0.4902 -vn 0.3371 -0.7812 0.5254 -vn 0.6304 -0.6304 0.4530 -vn 0.1715 -0.8189 0.5477 -vn -0.0000 -0.8326 0.5539 -vn -0.5477 -0.8189 0.1715 -vn -0.3783 -0.9066 0.1869 -vn -0.3638 -0.8575 0.3638 -vn -0.5254 -0.7812 0.3371 -vn -0.1950 -0.9612 0.1950 -vn -0.1869 -0.9066 0.3783 -vn -0.1715 -0.8189 0.5477 -vn -0.3371 -0.7812 0.5254 -vn -0.4902 -0.7207 0.4902 -vn 0.6304 -0.4530 -0.6304 -vn 0.7207 -0.4902 -0.4902 -vn 0.6725 -0.3090 -0.6725 -vn 0.7812 -0.3371 -0.5254 -vn 0.8575 -0.3638 -0.3638 -vn 0.7812 -0.5254 -0.3371 -vn 0.6984 -0.1560 -0.6984 -vn 0.8189 -0.1715 -0.5477 -vn 0.7071 -0.0000 -0.7071 -vn 0.8326 -0.0000 -0.5539 -vn 0.9246 -0.0000 -0.3809 -vn 0.9066 -0.1869 -0.3783 -vn 0.9612 -0.1950 -0.1950 -vn 0.9066 -0.3783 -0.1869 -vn 0.9806 -0.0000 -0.1961 -vn 1.0000 -0.0000 -0.0000 -vn 0.9806 -0.1961 -0.0000 -vn 0.9246 -0.3809 -0.0000 -vn 0.8189 -0.5477 -0.1715 -vn 0.8326 -0.5539 -0.0000 -vn 0.6984 0.1560 -0.6984 -vn 0.8189 0.1715 -0.5477 -vn 0.6725 0.3090 -0.6725 -vn 0.7812 0.3371 -0.5254 -vn 0.8575 0.3638 -0.3638 -vn 0.9066 0.1869 -0.3783 -vn 0.6304 0.4530 -0.6304 -vn 0.7207 0.4902 -0.4902 -vn 0.7812 0.5254 -0.3371 -vn 0.8189 0.5477 -0.1715 -vn 0.9066 0.3783 -0.1869 -vn 0.8326 0.5539 -0.0000 -vn 0.9246 0.3809 -0.0000 -vn 0.9612 0.1950 -0.1950 -vn 0.9806 0.1961 -0.0000 -vn 0.9612 0.1950 0.1950 -vn 0.9806 -0.0000 0.1961 -vn 0.9066 0.3783 0.1869 -vn 0.8575 0.3638 0.3638 -vn 0.9066 0.1869 0.3783 -vn 0.9246 -0.0000 0.3809 -vn 0.8189 0.5477 0.1715 -vn 0.7812 0.5254 0.3371 -vn 0.7207 0.4902 0.4902 -vn 0.7812 0.3371 0.5254 -vn 0.8189 0.1715 0.5477 -vn 0.8326 -0.0000 0.5539 -vn 0.8189 -0.5477 0.1715 -vn 0.9066 -0.3783 0.1869 -vn 0.8575 -0.3638 0.3638 -vn 0.7812 -0.5254 0.3371 -vn 0.9612 -0.1950 0.1950 -vn 0.9066 -0.1869 0.3783 -vn 0.8189 -0.1715 0.5477 -vn 0.7812 -0.3371 0.5254 -vn 0.7207 -0.4902 0.4902 -vn -0.4902 -0.4902 -0.7207 -vn -0.5254 -0.3371 -0.7812 -vn -0.3638 -0.3638 -0.8575 -vn -0.3371 -0.5254 -0.7812 -vn -0.5477 -0.1715 -0.8189 -vn -0.5539 -0.0000 -0.8326 -vn -0.3809 -0.0000 -0.9246 -vn -0.3783 -0.1869 -0.9066 -vn -0.1950 -0.1950 -0.9612 -vn -0.1869 -0.3783 -0.9066 -vn -0.1961 -0.0000 -0.9806 -vn -0.0000 -0.0000 -1.0000 -vn -0.0000 -0.1961 -0.9806 -vn -0.0000 -0.3809 -0.9246 -vn -0.1715 -0.5477 -0.8189 -vn -0.0000 -0.5539 -0.8326 -vn -0.5477 0.1715 -0.8189 -vn -0.5254 0.3371 -0.7812 -vn -0.3638 0.3638 -0.8575 -vn -0.3783 0.1869 -0.9066 -vn -0.4902 0.4902 -0.7207 -vn -0.3371 0.5254 -0.7812 -vn -0.1715 0.5477 -0.8189 -vn -0.1869 0.3783 -0.9066 -vn -0.0000 0.5539 -0.8326 -vn -0.0000 0.3809 -0.9246 -vn -0.1950 0.1950 -0.9612 -vn -0.0000 0.1961 -0.9806 -vn 0.1950 0.1950 -0.9612 -vn 0.1961 -0.0000 -0.9806 -vn 0.1869 0.3783 -0.9066 -vn 0.3638 0.3638 -0.8575 -vn 0.3783 0.1869 -0.9066 -vn 0.3809 -0.0000 -0.9246 -vn 0.1715 0.5477 -0.8189 -vn 0.3371 0.5254 -0.7812 -vn 0.4902 0.4902 -0.7207 -vn 0.5254 0.3371 -0.7812 -vn 0.5477 0.1715 -0.8189 -vn 0.5539 -0.0000 -0.8326 -vn 0.1715 -0.5477 -0.8189 -vn 0.1869 -0.3783 -0.9066 -vn 0.3638 -0.3638 -0.8575 -vn 0.3371 -0.5254 -0.7812 -vn 0.1950 -0.1950 -0.9612 -vn 0.3783 -0.1869 -0.9066 -vn 0.5477 -0.1715 -0.8189 -vn 0.5254 -0.3371 -0.7812 -vn 0.4902 -0.4902 -0.7207 -vt 0.500000 1.000000 -vt 1.000000 0.500000 -vt -0.000000 0.500000 -vt 0.500000 1.000000 -vt 1.000000 0.000000 -vt -0.000000 0.000000 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.000000 -vt -0.000000 1.000000 -vt 0.500000 0.500000 -vt 1.000000 1.000000 -vt 0.500000 0.000000 -vt -0.000000 0.500000 -vt 1.000000 0.500000 -vt -0.000000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.750000 0.000000 -vt 1.000000 0.750000 -vt 0.750000 1.000000 -vt 0.250000 0.000000 -vt 1.000000 0.250000 -vt -0.000000 0.250000 -vt -0.000000 0.250000 -vt 1.000000 0.250000 -vt 0.500000 0.250000 -vt 0.500000 0.250000 -vt 0.250000 0.500000 -vt 0.500000 0.750000 -vt 0.750000 0.500000 -vt 0.250000 0.000000 -vt 0.750000 0.500000 -vt -0.000000 0.750000 -vt 0.750000 0.500000 -vt 0.250000 1.000000 -vt 0.250000 0.500000 -vt 0.500000 0.750000 -vt 0.750000 0.000000 -vt 0.250000 0.750001 -vt 0.250000 0.250000 -vt 0.750000 0.250000 -vt 0.750000 0.750000 -vt 0.750000 0.250000 -vt 0.250000 0.250000 -vt 0.625000 0.000000 -vt 1.000000 0.875000 -vt 0.875000 0.000000 -vt 1.000000 0.625000 -vt 0.625000 1.000000 -vt 0.125000 0.000000 -vt 0.875000 1.000000 -vt 0.375000 0.000000 -vt 1.000000 0.375000 -vt -0.000000 0.375000 -vt 1.000000 0.125000 -vt -0.000000 0.125000 -vt -0.000000 0.125000 -vt 1.000000 0.125000 -vt -0.000000 0.375000 -vt 1.000000 0.375000 -vt 0.500000 0.375000 -vt 0.500000 0.125000 -vt 0.500000 0.375000 -vt 0.500000 0.125000 -vt 0.375000 0.500000 -vt 0.125000 0.500000 -vt 0.500000 0.875000 -vt 0.875000 0.500000 -vt 0.500000 0.625000 -vt 0.625000 0.500000 -vt 0.125000 0.000000 -vt 0.875000 0.500000 -vt 0.375000 -0.000000 -vt 0.625000 0.500000 -vt -0.000000 0.625000 -vt 0.875000 0.500000 -vt -0.000000 0.875000 -vt 0.625000 0.500000 -vt 0.125000 1.000000 -vt 0.375000 0.500000 -vt 0.375000 1.000000 -vt 0.125000 0.500000 -vt 0.500000 0.625000 -vt 0.625000 0.000000 -vt 0.500000 0.875000 -vt 0.875000 0.000000 -vt 0.250000 0.875000 -vt 0.125000 0.750000 -vt 0.250000 0.625000 -vt 0.375000 0.750000 -vt 0.375000 0.250000 -vt 0.250000 0.375000 -vt 0.125000 0.250000 -vt 0.250000 0.125000 -vt 0.875000 0.250000 -vt 0.750000 0.375000 -vt 0.625000 0.250000 -vt 0.750000 0.125000 -vt 0.750000 0.875000 -vt 0.625000 0.750000 -vt 0.750000 0.625000 -vt 0.875000 0.750000 -vt 0.875000 0.250000 -vt 0.750000 0.375000 -vt 0.625000 0.250000 -vt 0.750000 0.125000 -vt 0.375000 0.250000 -vt 0.250000 0.375000 -vt 0.125000 0.250000 -vt 0.250000 0.125000 -vt 0.375000 0.875000 -vt 0.125000 0.875000 -vt 0.125000 0.625000 -vt 0.375000 0.625000 -vt 0.375000 0.125000 -vt 0.375000 0.375000 -vt 0.125000 0.375000 -vt 0.125000 0.125000 -vt 0.875000 0.125000 -vt 0.875000 0.375000 -vt 0.625000 0.375000 -vt 0.625000 0.125000 -vt 0.875000 0.875000 -vt 0.625000 0.875000 -vt 0.625000 0.625000 -vt 0.875000 0.625000 -vt 0.875000 0.125000 -vt 0.875000 0.375000 -vt 0.625000 0.375000 -vt 0.625000 0.125000 -vt 0.375000 0.125000 -vt 0.375000 0.375000 -vt 0.125000 0.375000 -vt 0.125000 0.125000 -vt 0.562500 0.000000 -vt 1.000000 0.937500 -vt 0.687500 0.000000 -vt 1.000000 0.812500 -vt 0.812500 0.000000 -vt 1.000000 0.687500 -vt 0.937500 0.000000 -vt 1.000000 0.562500 -vt 0.562500 1.000000 -vt 0.062500 0.000000 -vt 0.687500 1.000000 -vt 0.187500 0.000000 -vt 0.812500 1.000000 -vt 0.312500 0.000000 -vt 0.937500 1.000000 -vt 0.437500 0.000000 -vt 1.000000 0.437500 -vt -0.000000 0.437500 -vt 1.000000 0.312500 -vt -0.000000 0.312500 -vt 1.000000 0.187500 -vt -0.000000 0.187500 -vt 1.000000 0.062500 -vt -0.000000 0.062500 -vt -0.000000 0.062500 -vt 1.000000 0.062500 -vt -0.000000 0.187500 -vt 1.000000 0.187500 -vt -0.000000 0.312500 -vt 1.000000 0.312500 -vt -0.000000 0.437500 -vt 1.000000 0.437500 -vt 0.500000 0.437500 -vt 0.500000 0.312500 -vt 0.500000 0.187500 -vt 0.500000 0.062500 -vt 0.500000 0.437500 -vt 0.500000 0.312500 -vt 0.500000 0.187500 -vt 0.500000 0.062500 -vt 0.437500 0.500000 -vt 0.312500 0.500000 -vt 0.187500 0.500000 -vt 0.062500 0.500000 -vt 0.500000 0.937500 -vt 0.937500 0.500000 -vt 0.500000 0.812500 -vt 0.812500 0.500000 -vt 0.500000 0.687500 -vt 0.687500 0.500000 -vt 0.500000 0.562500 -vt 0.562500 0.500000 -vt 0.062500 0.000000 -vt 0.937500 0.500000 -vt 0.187500 0.000000 -vt 0.812500 0.500000 -vt 0.312500 -0.000000 -vt 0.687500 0.500000 -vt 0.437500 0.000000 -vt 0.562500 0.500000 -vt -0.000000 0.562500 -vt 0.937500 0.500000 -vt -0.000000 0.687500 -vt 0.812500 0.500000 -vt -0.000000 0.812500 -vt 0.687500 0.500000 -vt -0.000000 0.937500 -vt 0.562500 0.500000 -vt 0.062500 1.000000 -vt 0.437500 0.500000 -vt 0.187500 1.000000 -vt 0.312500 0.500000 -vt 0.312500 1.000000 -vt 0.187500 0.500000 -vt 0.437500 1.000000 -vt 0.062500 0.500000 -vt 0.500000 0.562500 -vt 0.562500 0.000000 -vt 0.500000 0.687500 -vt 0.687500 0.000000 -vt 0.500000 0.812500 -vt 0.812500 0.000000 -vt 0.500000 0.937500 -vt 0.937500 0.000000 -vt 0.250000 0.937500 -vt 0.250000 0.812501 -vt 0.062500 0.750000 -vt 0.187500 0.750001 -vt 0.250000 0.562500 -vt 0.250000 0.687500 -vt 0.437500 0.750000 -vt 0.312500 0.750001 -vt 0.437500 0.250000 -vt 0.312500 0.250000 -vt 0.250000 0.437500 -vt 0.250000 0.312500 -vt 0.062500 0.250000 -vt 0.187500 0.250000 -vt 0.250000 0.062500 -vt 0.250000 0.187500 -vt 0.937500 0.250000 -vt 0.812500 0.250000 -vt 0.750000 0.437500 -vt 0.750000 0.312500 -vt 0.562500 0.250000 -vt 0.687500 0.250000 -vt 0.750000 0.062500 -vt 0.750000 0.187500 -vt 0.750000 0.937500 -vt 0.750000 0.812500 -vt 0.562500 0.750000 -vt 0.687500 0.750000 -vt 0.750000 0.562500 -vt 0.750000 0.687500 -vt 0.937500 0.750000 -vt 0.812500 0.750000 -vt 0.937500 0.250000 -vt 0.812500 0.250000 -vt 0.750000 0.437500 -vt 0.750000 0.312500 -vt 0.562500 0.250000 -vt 0.687500 0.250000 -vt 0.750000 0.062500 -vt 0.750000 0.187500 -vt 0.437500 0.250000 -vt 0.312500 0.250000 -vt 0.250000 0.437500 -vt 0.250000 0.312500 -vt 0.062500 0.250000 -vt 0.187500 0.250000 -vt 0.250000 0.062500 -vt 0.250000 0.187500 -vt 0.375000 0.937500 -vt 0.312500 0.875000 -vt 0.375000 0.812500 -vt 0.437500 0.875000 -vt 0.125000 0.937500 -vt 0.062500 0.875000 -vt 0.125000 0.812500 -vt 0.187500 0.875000 -vt 0.125000 0.687500 -vt 0.062500 0.625000 -vt 0.125000 0.562500 -vt 0.187500 0.625000 -vt 0.375000 0.687500 -vt 0.312500 0.625000 -vt 0.375000 0.562500 -vt 0.437500 0.625000 -vt 0.437500 0.125000 -vt 0.375000 0.187500 -vt 0.312500 0.125000 -vt 0.375000 0.062500 -vt 0.437500 0.375000 -vt 0.375000 0.437500 -vt 0.312500 0.375000 -vt 0.375000 0.312500 -vt 0.187500 0.375000 -vt 0.125000 0.437500 -vt 0.062500 0.375000 -vt 0.125000 0.312500 -vt 0.187500 0.125000 -vt 0.125000 0.187500 -vt 0.062500 0.125000 -vt 0.125000 0.062500 -vt 0.937500 0.125000 -vt 0.875000 0.187500 -vt 0.812500 0.125000 -vt 0.875000 0.062500 -vt 0.937500 0.375000 -vt 0.875000 0.437500 -vt 0.812500 0.375000 -vt 0.875000 0.312500 -vt 0.687500 0.375000 -vt 0.625000 0.437500 -vt 0.562500 0.375000 -vt 0.625000 0.312500 -vt 0.687500 0.125000 -vt 0.625000 0.187500 -vt 0.562500 0.125000 -vt 0.625000 0.062500 -vt 0.875000 0.937500 -vt 0.812500 0.875000 -vt 0.875000 0.812500 -vt 0.937500 0.875000 -vt 0.625000 0.937500 -vt 0.562500 0.875000 -vt 0.625000 0.812500 -vt 0.687500 0.875000 -vt 0.625000 0.687500 -vt 0.562500 0.625000 -vt 0.625000 0.562500 -vt 0.687500 0.625000 -vt 0.875000 0.687500 -vt 0.812500 0.625000 -vt 0.875000 0.562500 -vt 0.937500 0.625000 -vt 0.937500 0.125000 -vt 0.875000 0.187500 -vt 0.812500 0.125000 -vt 0.875000 0.062500 -vt 0.937500 0.375000 -vt 0.875000 0.437500 -vt 0.812500 0.375000 -vt 0.875000 0.312500 -vt 0.687500 0.375000 -vt 0.625000 0.437500 -vt 0.562500 0.375000 -vt 0.625000 0.312500 -vt 0.687500 0.125000 -vt 0.625000 0.187500 -vt 0.562500 0.125000 -vt 0.625000 0.062500 -vt 0.437500 0.125000 -vt 0.375000 0.187500 -vt 0.312500 0.125000 -vt 0.375000 0.062500 -vt 0.437500 0.375000 -vt 0.375000 0.437500 -vt 0.312500 0.375000 -vt 0.375000 0.312500 -vt 0.187500 0.375000 -vt 0.125000 0.437500 -vt 0.062500 0.375000 -vt 0.125000 0.312500 -vt 0.187500 0.125000 -vt 0.125000 0.187500 -vt 0.062500 0.125000 -vt 0.125000 0.062500 -vt 0.437500 0.937500 -vt 0.312500 0.937500 -vt 0.312500 0.812500 -vt 0.437500 0.812500 -vt 0.187500 0.937500 -vt 0.062500 0.937500 -vt 0.062500 0.812500 -vt 0.187500 0.812501 -vt 0.187500 0.687500 -vt 0.062500 0.687500 -vt 0.062500 0.562500 -vt 0.187500 0.562500 -vt 0.437500 0.687500 -vt 0.312500 0.687500 -vt 0.312500 0.562500 -vt 0.437500 0.562500 -vt 0.437500 0.062500 -vt 0.437500 0.187500 -vt 0.312500 0.187500 -vt 0.312500 0.062500 -vt 0.437500 0.312500 -vt 0.437500 0.437500 -vt 0.312500 0.437500 -vt 0.312500 0.312500 -vt 0.187500 0.312500 -vt 0.187500 0.437500 -vt 0.062500 0.437500 -vt 0.062500 0.312500 -vt 0.187500 0.062500 -vt 0.187500 0.187500 -vt 0.062500 0.187500 -vt 0.062500 0.062500 -vt 0.937500 0.062500 -vt 0.937500 0.187500 -vt 0.812500 0.187500 -vt 0.812500 0.062500 -vt 0.937500 0.312500 -vt 0.937500 0.437500 -vt 0.812500 0.437500 -vt 0.812500 0.312500 -vt 0.687500 0.312500 -vt 0.687500 0.437500 -vt 0.562500 0.437500 -vt 0.562500 0.312500 -vt 0.687500 0.062500 -vt 0.687500 0.187500 -vt 0.562500 0.187500 -vt 0.562500 0.062500 -vt 0.937500 0.937500 -vt 0.812500 0.937500 -vt 0.812500 0.812500 -vt 0.937500 0.812500 -vt 0.687500 0.937500 -vt 0.562500 0.937500 -vt 0.562500 0.812500 -vt 0.687500 0.812500 -vt 0.687500 0.687500 -vt 0.562500 0.687500 -vt 0.562500 0.562500 -vt 0.687500 0.562500 -vt 0.937500 0.687500 -vt 0.812500 0.687500 -vt 0.812500 0.562500 -vt 0.937500 0.562500 -vt 0.937500 0.062500 -vt 0.937500 0.187500 -vt 0.812500 0.187500 -vt 0.812500 0.062500 -vt 0.937500 0.312500 -vt 0.937500 0.437500 -vt 0.812500 0.437500 -vt 0.812500 0.312500 -vt 0.687500 0.312500 -vt 0.687500 0.437500 -vt 0.562500 0.437500 -vt 0.562500 0.312500 -vt 0.687500 0.062500 -vt 0.687500 0.187500 -vt 0.562500 0.187500 -vt 0.562500 0.062500 -vt 0.437500 0.062500 -vt 0.437500 0.187500 -vt 0.312500 0.187500 -vt 0.312500 0.062500 -vt 0.437500 0.312500 -vt 0.437500 0.437500 -vt 0.312500 0.437500 -vt 0.312500 0.312500 -vt 0.187500 0.312500 -vt 0.187500 0.437500 -vt 0.062500 0.437500 -vt 0.062500 0.312500 -vt 0.187500 0.062500 -vt 0.187500 0.187500 -vt 0.062500 0.187500 -vt 0.062500 0.062500 -s 1 -f 1/1/1 142/210/2 291/364/3 127/180/4 -f 142/210/2 48/82/5 195/268/6 291/364/3 -f 291/364/3 195/268/6 75/112/7 198/271/8 -f 127/180/4 291/364/3 198/271/8 41/68/9 -f 48/82/5 141/208/10 292/365/11 195/268/6 -f 141/208/10 19/36/12 147/220/13 292/365/11 -f 292/365/11 147/220/13 51/88/14 196/269/15 -f 195/268/6 292/365/11 196/269/15 75/112/7 -f 75/112/7 196/269/15 293/366/16 197/270/17 -f 196/269/15 51/88/14 148/221/18 293/366/16 -f 293/366/16 148/221/18 21/40/19 154/227/20 -f 197/270/17 293/366/16 154/227/20 54/91/21 -f 41/68/9 198/271/8 294/367/22 128/182/23 -f 198/271/8 75/112/7 197/270/17 294/367/22 -f 294/367/22 197/270/17 54/91/21 153/226/24 -f 128/182/23 294/367/22 153/226/24 16/30/25 -f 19/36/12 140/206/26 295/368/27 147/220/13 -f 140/206/26 47/80/28 199/272/29 295/368/27 -f 295/368/27 199/272/29 76/113/30 202/275/31 -f 147/220/13 295/368/27 202/275/31 51/88/14 -f 47/80/28 139/204/32 296/369/33 199/272/29 -f 139/204/32 5/10/34 138/202/35 296/369/33 -f 296/369/33 138/202/35 46/78/36 200/273/37 -f 199/272/29 296/369/33 200/273/37 76/113/30 -f 76/113/30 200/273/37 297/370/38 201/274/39 -f 200/273/37 46/78/36 137/200/40 297/370/38 -f 297/370/38 137/200/40 18/34/41 149/222/42 -f 201/274/39 297/370/38 149/222/42 52/89/43 -f 51/88/14 202/275/31 298/371/44 148/221/18 -f 202/275/31 76/113/30 201/274/39 298/371/44 -f 298/371/44 201/274/39 52/89/43 150/223/45 -f 148/221/18 298/371/44 150/223/45 21/40/19 -f 21/40/19 150/223/45 299/372/46 152/225/47 -f 150/223/45 52/89/43 203/276/48 299/372/46 -f 299/372/46 203/276/48 77/114/49 206/279/50 -f 152/225/47 299/372/46 206/279/50 53/90/51 -f 52/89/43 149/222/42 300/373/52 203/276/48 -f 149/222/42 18/34/41 136/198/53 300/373/52 -f 300/373/52 136/198/53 45/76/54 204/277/55 -f 203/276/48 300/373/52 204/277/55 77/114/49 -f 77/114/49 204/277/55 301/374/56 205/278/57 -f 204/277/55 45/76/54 135/196/58 301/374/56 -f 301/374/56 135/196/58 7/14/59 126/179/60 -f 205/278/57 301/374/56 126/179/60 40/67/61 -f 53/90/51 206/279/50 302/375/62 151/224/63 -f 206/279/50 77/114/49 205/278/57 302/375/62 -f 302/375/62 205/278/57 40/67/61 125/178/64 -f 151/224/63 302/375/62 125/178/64 15/29/65 -f 16/30/25 153/226/24 303/376/66 129/184/67 -f 153/226/24 54/91/21 207/280/68 303/376/66 -f 303/376/66 207/280/68 78/115/69 210/283/70 -f 129/184/67 303/376/66 210/283/70 42/70/71 -f 54/91/21 154/227/20 304/377/72 207/280/68 -f 154/227/20 21/40/19 152/225/47 304/377/72 -f 304/377/72 152/225/47 53/90/51 208/281/73 -f 207/280/68 304/377/72 208/281/73 78/115/69 -f 78/115/69 208/281/73 305/378/74 209/282/75 -f 208/281/73 53/90/51 151/224/63 305/378/74 -f 305/378/74 151/224/63 15/29/65 124/177/76 -f 209/282/75 305/378/74 124/177/76 39/66/77 -f 42/70/71 210/283/70 306/379/78 130/186/79 -f 210/283/70 78/115/69 209/282/75 306/379/78 -f 306/379/78 209/282/75 39/66/77 123/176/80 -f 130/186/79 306/379/78 123/176/80 3/7/81 -f 4/9/82 118/171/83 307/380/84 134/194/85 -f 118/171/83 36/63/86 211/284/87 307/380/84 -f 307/380/84 211/284/87 79/116/88 214/287/89 -f 134/194/85 307/380/84 214/287/89 44/74/90 -f 36/63/86 117/170/91 308/381/92 211/284/87 -f 117/170/91 13/27/93 155/228/94 308/381/92 -f 308/381/92 155/228/94 55/92/95 212/285/96 -f 211/284/87 308/381/92 212/285/96 79/116/88 -f 79/116/88 212/285/96 309/382/97 213/286/98 -f 212/285/96 55/92/95 156/229/99 309/382/97 -f 309/382/97 156/229/99 22/41/100 162/235/101 -f 213/286/98 309/382/97 162/235/101 58/95/102 -f 44/74/90 214/287/89 310/383/103 133/192/104 -f 214/287/89 79/116/88 213/286/98 310/383/103 -f 310/383/103 213/286/98 58/95/102 161/234/105 -f 133/192/104 310/383/103 161/234/105 17/32/106 -f 13/27/93 116/169/107 311/384/108 155/228/94 -f 116/169/107 35/62/109 215/288/110 311/384/108 -f 311/384/108 215/288/110 80/117/111 218/291/112 -f 155/228/94 311/384/108 218/291/112 55/92/95 -f 35/62/109 115/168/113 312/385/114 215/288/110 -f 115/168/113 3/7/81 123/176/80 312/385/114 -f 312/385/114 123/176/80 39/66/77 216/289/115 -f 215/288/110 312/385/114 216/289/115 80/117/111 -f 80/117/111 216/289/115 313/386/116 217/290/117 -f 216/289/115 39/66/77 124/177/76 313/386/116 -f 313/386/116 124/177/76 15/29/65 157/230/118 -f 217/290/117 313/386/116 157/230/118 56/93/119 -f 55/92/95 218/291/112 314/387/120 156/229/99 -f 218/291/112 80/117/111 217/290/117 314/387/120 -f 314/387/120 217/290/117 56/93/119 158/231/121 -f 156/229/99 314/387/120 158/231/121 22/41/100 -f 22/41/100 158/231/121 315/388/122 160/233/123 -f 158/231/121 56/93/119 219/292/124 315/388/122 -f 315/388/122 219/292/124 81/118/125 222/295/126 -f 160/233/123 315/388/122 222/295/126 57/94/127 -f 56/93/119 157/230/118 316/389/128 219/292/124 -f 157/230/118 15/29/65 125/178/64 316/389/128 -f 316/389/128 125/178/64 40/67/61 220/293/129 -f 219/292/124 316/389/128 220/293/129 81/118/125 -f 81/118/125 220/293/129 317/390/130 221/294/131 -f 220/293/129 40/67/61 126/179/60 317/390/130 -f 317/390/130 126/179/60 7/14/59 114/166/132 -f 221/294/131 317/390/130 114/166/132 34/60/133 -f 57/94/127 222/295/126 318/391/134 159/232/135 -f 222/295/126 81/118/125 221/294/131 318/391/134 -f 318/391/134 221/294/131 34/60/133 113/164/136 -f 159/232/135 318/391/134 113/164/136 12/25/137 -f 17/32/106 161/234/105 319/392/138 132/190/139 -f 161/234/105 58/95/102 223/296/140 319/392/138 -f 319/392/138 223/296/140 82/119/141 226/299/142 -f 132/190/139 319/392/138 226/299/142 43/72/143 -f 58/95/102 162/235/101 320/393/144 223/296/140 -f 162/235/101 22/41/100 160/233/123 320/393/144 -f 320/393/144 160/233/123 57/94/127 224/297/145 -f 223/296/140 320/393/144 224/297/145 82/119/141 -f 82/119/141 224/297/145 321/394/146 225/298/147 -f 224/297/145 57/94/127 159/232/135 321/394/146 -f 321/394/146 159/232/135 12/25/137 112/162/148 -f 225/298/147 321/394/146 112/162/148 33/58/149 -f 43/72/143 226/299/142 322/395/150 131/188/151 -f 226/299/142 82/119/141 225/298/147 322/395/150 -f 322/395/150 225/298/147 33/58/149 111/160/152 -f 131/188/151 322/395/150 111/160/152 8/16/153 -f 8/17/153 111/161/152 323/396/154 102/142/155 -f 111/161/152 33/59/149 227/300/156 323/396/154 -f 323/396/154 227/300/156 83/120/157 230/303/158 -f 102/142/155 323/396/154 230/303/158 28/48/159 -f 33/59/149 112/163/148 324/397/160 227/300/156 -f 112/163/148 12/26/137 163/236/161 324/397/160 -f 324/397/160 163/236/161 59/96/162 228/301/163 -f 227/300/156 324/397/160 228/301/163 83/120/157 -f 83/120/157 228/301/163 325/398/164 229/302/165 -f 228/301/163 59/96/162 164/237/166 325/398/164 -f 325/398/164 164/237/166 23/42/167 170/243/168 -f 229/302/165 325/398/164 170/243/168 62/99/169 -f 28/48/159 230/303/158 326/399/170 101/140/171 -f 230/303/158 83/120/157 229/302/165 326/399/170 -f 326/399/170 229/302/165 62/99/169 169/242/172 -f 101/140/171 326/399/170 169/242/172 9/19/173 -f 12/26/137 113/165/136 327/400/174 163/236/161 -f 113/165/136 34/61/133 231/304/175 327/400/174 -f 327/400/174 231/304/175 84/121/176 234/307/177 -f 163/236/161 327/400/174 234/307/177 59/96/162 -f 34/61/133 114/167/132 328/401/178 231/304/175 -f 114/167/132 7/15/59 135/197/58 328/401/178 -f 328/401/178 135/197/58 45/77/54 232/305/179 -f 231/304/175 328/401/178 232/305/179 84/121/176 -f 84/121/176 232/305/179 329/402/180 233/306/181 -f 232/305/179 45/77/54 136/199/53 329/402/180 -f 329/402/180 136/199/53 18/35/41 165/238/182 -f 233/306/181 329/402/180 165/238/182 60/97/183 -f 59/96/162 234/307/177 330/403/184 164/237/166 -f 234/307/177 84/121/176 233/306/181 330/403/184 -f 330/403/184 233/306/181 60/97/183 166/239/185 -f 164/237/166 330/403/184 166/239/185 23/42/167 -f 23/42/167 166/239/185 331/404/186 168/241/187 -f 166/239/185 60/97/183 235/308/188 331/404/186 -f 331/404/186 235/308/188 85/122/189 238/311/190 -f 168/241/187 331/404/186 238/311/190 61/98/191 -f 60/97/183 165/238/182 332/405/192 235/308/188 -f 165/238/182 18/35/41 137/201/40 332/405/192 -f 332/405/192 137/201/40 46/79/36 236/309/193 -f 235/308/188 332/405/192 236/309/193 85/122/189 -f 85/122/189 236/309/193 333/406/194 237/310/195 -f 236/309/193 46/79/36 138/203/35 333/406/194 -f 333/406/194 138/203/35 5/11/34 119/172/196 -f 237/310/195 333/406/194 119/172/196 37/64/197 -f 61/98/191 238/311/190 334/407/198 167/240/199 -f 238/311/190 85/122/189 237/310/195 334/407/198 -f 334/407/198 237/310/195 37/64/197 120/173/200 -f 167/240/199 334/407/198 120/173/200 14/28/201 -f 9/19/173 169/242/172 335/408/202 100/138/203 -f 169/242/172 62/99/169 239/312/204 335/408/202 -f 335/408/202 239/312/204 86/123/205 242/315/206 -f 100/138/203 335/408/202 242/315/206 27/46/207 -f 62/99/169 170/243/168 336/409/208 239/312/204 -f 170/243/168 23/42/167 168/241/187 336/409/208 -f 336/409/208 168/241/187 61/98/191 240/313/209 -f 239/312/204 336/409/208 240/313/209 86/123/205 -f 86/123/205 240/313/209 337/410/210 241/314/211 -f 240/313/209 61/98/191 167/240/199 337/410/210 -f 337/410/210 167/240/199 14/28/201 121/174/212 -f 241/314/211 337/410/210 121/174/212 38/65/213 -f 27/46/207 242/315/206 338/411/214 99/136/215 -f 242/315/206 86/123/205 241/314/211 338/411/214 -f 338/411/214 241/314/211 38/65/213 122/175/216 -f 99/136/215 338/411/214 122/175/216 6/13/217 -f 6/12/217 106/150/218 339/412/219 99/137/215 -f 106/150/218 30/52/220 243/316/221 339/412/219 -f 339/412/219 243/316/221 87/124/222 246/319/223 -f 99/137/215 339/412/219 246/319/223 27/47/207 -f 30/52/220 105/148/224 340/413/225 243/316/221 -f 105/148/224 10/21/226 171/244/227 340/413/225 -f 340/413/225 171/244/227 63/100/228 244/317/229 -f 243/316/221 340/413/225 244/317/229 87/124/222 -f 87/124/222 244/317/229 341/414/230 245/318/231 -f 244/317/229 63/100/228 172/245/232 341/414/230 -f 341/414/230 172/245/232 24/43/233 178/251/234 -f 245/318/231 341/414/230 178/251/234 66/103/235 -f 27/47/207 246/319/223 342/415/236 100/139/203 -f 246/319/223 87/124/222 245/318/231 342/415/236 -f 342/415/236 245/318/231 66/103/235 177/250/237 -f 100/139/203 342/415/236 177/250/237 9/20/173 -f 10/21/226 104/146/238 343/416/239 171/244/227 -f 104/146/238 29/50/240 247/320/241 343/416/239 -f 343/416/239 247/320/241 88/125/242 250/323/243 -f 171/244/227 343/416/239 250/323/243 63/100/228 -f 29/50/240 103/144/244 344/417/245 247/320/241 -f 103/144/244 2/4/246 146/218/247 344/417/245 -f 344/417/245 146/218/247 50/86/248 248/321/249 -f 247/320/241 344/417/245 248/321/249 88/125/242 -f 88/125/242 248/321/249 345/418/250 249/322/251 -f 248/321/249 50/86/248 145/216/252 345/418/250 -f 345/418/250 145/216/252 20/38/253 173/246/254 -f 249/322/251 345/418/250 173/246/254 64/101/255 -f 63/100/228 250/323/243 346/419/256 172/245/232 -f 250/323/243 88/125/242 249/322/251 346/419/256 -f 346/419/256 249/322/251 64/101/255 174/247/257 -f 172/245/232 346/419/256 174/247/257 24/43/233 -f 24/43/233 174/247/257 347/420/258 176/249/259 -f 174/247/257 64/101/255 251/324/260 347/420/258 -f 347/420/258 251/324/260 89/126/261 254/327/262 -f 176/249/259 347/420/258 254/327/262 65/102/263 -f 64/101/255 173/246/254 348/421/264 251/324/260 -f 173/246/254 20/38/253 144/214/265 348/421/264 -f 348/421/264 144/214/265 49/84/266 252/325/267 -f 251/324/260 348/421/264 252/325/267 89/126/261 -f 89/126/261 252/325/267 349/422/268 253/326/269 -f 252/325/267 49/84/266 143/212/270 349/422/268 -f 349/422/268 143/212/270 4/8/82 134/195/85 -f 253/326/269 349/422/268 134/195/85 44/75/90 -f 65/102/263 254/327/262 350/423/271 175/248/272 -f 254/327/262 89/126/261 253/326/269 350/423/271 -f 350/423/271 253/326/269 44/75/90 133/193/104 -f 175/248/272 350/423/271 133/193/104 17/33/106 -f 9/20/173 177/250/237 351/424/273 101/141/171 -f 177/250/237 66/103/235 255/328/274 351/424/273 -f 351/424/273 255/328/274 90/127/275 258/331/276 -f 101/141/171 351/424/273 258/331/276 28/49/159 -f 66/103/235 178/251/234 352/425/277 255/328/274 -f 178/251/234 24/43/233 176/249/259 352/425/277 -f 352/425/277 176/249/259 65/102/263 256/329/278 -f 255/328/274 352/425/277 256/329/278 90/127/275 -f 90/127/275 256/329/278 353/426/279 257/330/280 -f 256/329/278 65/102/263 175/248/272 353/426/279 -f 353/426/279 175/248/272 17/33/106 132/191/139 -f 257/330/280 353/426/279 132/191/139 43/73/143 -f 28/49/159 258/331/276 354/427/281 102/143/155 -f 258/331/276 90/127/275 257/330/280 354/427/281 -f 354/427/281 257/330/280 43/73/143 131/189/151 -f 102/143/155 354/427/281 131/189/151 8/18/153 -f 2/5/246 110/158/282 355/428/283 146/219/247 -f 110/158/282 32/56/284 259/332/285 355/428/283 -f 355/428/283 259/332/285 91/128/286 262/335/287 -f 146/219/247 355/428/283 262/335/287 50/87/248 -f 32/56/284 109/156/288 356/429/289 259/332/285 -f 109/156/288 11/23/290 179/252/291 356/429/289 -f 356/429/289 179/252/291 67/104/292 260/333/293 -f 259/332/285 356/429/289 260/333/293 91/128/286 -f 91/128/286 260/333/293 357/430/294 261/334/295 -f 260/333/293 67/104/292 180/253/296 357/430/294 -f 357/430/294 180/253/296 25/44/297 186/259/298 -f 261/334/295 357/430/294 186/259/298 70/107/299 -f 50/87/248 262/335/287 358/431/300 145/217/252 -f 262/335/287 91/128/286 261/334/295 358/431/300 -f 358/431/300 261/334/295 70/107/299 185/258/301 -f 145/217/252 358/431/300 185/258/301 20/39/253 -f 11/23/290 108/154/302 359/432/303 179/252/291 -f 108/154/302 31/54/304 263/336/305 359/432/303 -f 359/432/303 263/336/305 92/129/306 266/339/307 -f 179/252/291 359/432/303 266/339/307 67/104/292 -f 31/54/304 107/152/308 360/433/309 263/336/305 -f 107/152/308 1/2/1 127/181/4 360/433/309 -f 360/433/309 127/181/4 41/69/9 264/337/310 -f 263/336/305 360/433/309 264/337/310 92/129/306 -f 92/129/306 264/337/310 361/434/311 265/338/312 -f 264/337/310 41/69/9 128/183/23 361/434/311 -f 361/434/311 128/183/23 16/31/25 181/254/313 -f 265/338/312 361/434/311 181/254/313 68/105/314 -f 67/104/292 266/339/307 362/435/315 180/253/296 -f 266/339/307 92/129/306 265/338/312 362/435/315 -f 362/435/315 265/338/312 68/105/314 182/255/316 -f 180/253/296 362/435/315 182/255/316 25/44/297 -f 25/44/297 182/255/316 363/436/317 184/257/318 -f 182/255/316 68/105/314 267/340/319 363/436/317 -f 363/436/317 267/340/319 93/130/320 270/343/321 -f 184/257/318 363/436/317 270/343/321 69/106/322 -f 68/105/314 181/254/313 364/437/323 267/340/319 -f 181/254/313 16/31/25 129/185/67 364/437/323 -f 364/437/323 129/185/67 42/71/71 268/341/324 -f 267/340/319 364/437/323 268/341/324 93/130/320 -f 93/130/320 268/341/324 365/438/325 269/342/326 -f 268/341/324 42/71/71 130/187/79 365/438/325 -f 365/438/325 130/187/79 3/7/81 115/168/113 -f 269/342/326 365/438/325 115/168/113 35/62/109 -f 69/106/322 270/343/321 366/439/327 183/256/328 -f 270/343/321 93/130/320 269/342/326 366/439/327 -f 366/439/327 269/342/326 35/62/109 116/169/107 -f 183/256/328 366/439/327 116/169/107 13/27/93 -f 20/39/253 185/258/301 367/440/329 144/215/265 -f 185/258/301 70/107/299 271/344/330 367/440/329 -f 367/440/329 271/344/330 94/131/331 274/347/332 -f 144/215/265 367/440/329 274/347/332 49/85/266 -f 70/107/299 186/259/298 368/441/333 271/344/330 -f 186/259/298 25/44/297 184/257/318 368/441/333 -f 368/441/333 184/257/318 69/106/322 272/345/334 -f 271/344/330 368/441/333 272/345/334 94/131/331 -f 94/131/331 272/345/334 369/442/335 273/346/336 -f 272/345/334 69/106/322 183/256/328 369/442/335 -f 369/442/335 183/256/328 13/27/93 117/170/91 -f 273/346/336 369/442/335 117/170/91 36/63/86 -f 49/85/266 274/347/332 370/443/337 143/213/270 -f 274/347/332 94/131/331 273/346/336 370/443/337 -f 370/443/337 273/346/336 36/63/86 118/171/83 -f 143/213/270 370/443/337 118/171/83 4/9/82 -f 6/13/217 122/175/216 371/444/338 106/151/218 -f 122/175/216 38/65/213 275/348/339 371/444/338 -f 371/444/338 275/348/339 95/132/340 278/351/341 -f 106/151/218 371/444/338 278/351/341 30/53/220 -f 38/65/213 121/174/212 372/445/342 275/348/339 -f 121/174/212 14/28/201 187/260/343 372/445/342 -f 372/445/342 187/260/343 71/108/344 276/349/345 -f 275/348/339 372/445/342 276/349/345 95/132/340 -f 95/132/340 276/349/345 373/446/346 277/350/347 -f 276/349/345 71/108/344 188/261/348 373/446/346 -f 373/446/346 188/261/348 26/45/349 194/267/350 -f 277/350/347 373/446/346 194/267/350 74/111/351 -f 30/53/220 278/351/341 374/447/352 105/149/224 -f 278/351/341 95/132/340 277/350/347 374/447/352 -f 374/447/352 277/350/347 74/111/351 193/266/353 -f 105/149/224 374/447/352 193/266/353 10/22/226 -f 14/28/201 120/173/200 375/448/354 187/260/343 -f 120/173/200 37/64/197 279/352/355 375/448/354 -f 375/448/354 279/352/355 96/133/356 282/355/357 -f 187/260/343 375/448/354 282/355/357 71/108/344 -f 37/64/197 119/172/196 376/449/358 279/352/355 -f 119/172/196 5/11/34 139/205/32 376/449/358 -f 376/449/358 139/205/32 47/81/28 280/353/359 -f 279/352/355 376/449/358 280/353/359 96/133/356 -f 96/133/356 280/353/359 377/450/360 281/354/361 -f 280/353/359 47/81/28 140/207/26 377/450/360 -f 377/450/360 140/207/26 19/37/12 189/262/362 -f 281/354/361 377/450/360 189/262/362 72/109/363 -f 71/108/344 282/355/357 378/451/364 188/261/348 -f 282/355/357 96/133/356 281/354/361 378/451/364 -f 378/451/364 281/354/361 72/109/363 190/263/365 -f 188/261/348 378/451/364 190/263/365 26/45/349 -f 26/45/349 190/263/365 379/452/366 192/265/367 -f 190/263/365 72/109/363 283/356/368 379/452/366 -f 379/452/366 283/356/368 97/134/369 286/359/370 -f 192/265/367 379/452/366 286/359/370 73/110/371 -f 72/109/363 189/262/362 380/453/372 283/356/368 -f 189/262/362 19/37/12 141/209/10 380/453/372 -f 380/453/372 141/209/10 48/83/5 284/357/373 -f 283/356/368 380/453/372 284/357/373 97/134/369 -f 97/134/369 284/357/373 381/454/374 285/358/375 -f 284/357/373 48/83/5 142/211/2 381/454/374 -f 381/454/374 142/211/2 1/3/1 107/153/308 -f 285/358/375 381/454/374 107/153/308 31/55/304 -f 73/110/371 286/359/370 382/455/376 191/264/377 -f 286/359/370 97/134/369 285/358/375 382/455/376 -f 382/455/376 285/358/375 31/55/304 108/155/302 -f 191/264/377 382/455/376 108/155/302 11/24/290 -f 10/22/226 193/266/353 383/456/378 104/147/238 -f 193/266/353 74/111/351 287/360/379 383/456/378 -f 383/456/378 287/360/379 98/135/380 290/363/381 -f 104/147/238 383/456/378 290/363/381 29/51/240 -f 74/111/351 194/267/350 384/457/382 287/360/379 -f 194/267/350 26/45/349 192/265/367 384/457/382 -f 384/457/382 192/265/367 73/110/371 288/361/383 -f 287/360/379 384/457/382 288/361/383 98/135/380 -f 98/135/380 288/361/383 385/458/384 289/362/385 -f 288/361/383 73/110/371 191/264/377 385/458/384 -f 385/458/384 191/264/377 11/24/290 109/157/288 -f 289/362/385 385/458/384 109/157/288 32/57/284 -f 29/51/240 290/363/381 386/459/386 103/145/244 -f 290/363/381 98/135/380 289/362/385 386/459/386 -f 386/459/386 289/362/385 32/57/284 110/159/282 -f 103/145/244 386/459/386 110/159/282 2/6/246 diff --git a/data/games/garage/mods/testnodes/models/testnodes_marble_metal.obj b/data/games/garage/mods/testnodes/models/testnodes_marble_metal.obj deleted file mode 100644 index c3bc70c..0000000 --- a/data/games/garage/mods/testnodes/models/testnodes_marble_metal.obj +++ /dev/null @@ -1,2470 +0,0 @@ -# Blender 3.3.1 -# www.blender.org -o Sphere -v 0.000000 0.465623 -0.311119 -v 0.000000 0.395980 -0.395980 -v 0.000000 0.214303 -0.517373 -v 0.000000 0.109251 -0.549240 -v 0.000000 0.000000 -0.560000 -v 0.000000 -0.109251 -0.549240 -v 0.000000 -0.214303 -0.517373 -v 0.000000 -0.311119 -0.465623 -v 0.000000 -0.465623 -0.311119 -v 0.021314 0.549240 -0.107151 -v 0.041808 0.517373 -0.210185 -v 0.060696 0.465623 -0.305141 -v 0.077252 0.395980 -0.388371 -v 0.090839 0.311119 -0.456676 -v 0.100934 0.214303 -0.507431 -v 0.107151 0.109251 -0.538686 -v 0.109251 0.000000 -0.549240 -v 0.107151 -0.109251 -0.538686 -v 0.100934 -0.214303 -0.507431 -v 0.090839 -0.311119 -0.456676 -v 0.077252 -0.395980 -0.388371 -v 0.060696 -0.465623 -0.305141 -v 0.041808 -0.517373 -0.210185 -v 0.021314 -0.549240 -0.107151 -v 0.041808 0.549240 -0.100934 -v 0.082010 0.517373 -0.197990 -v 0.119060 0.465623 -0.287437 -v 0.151535 0.395980 -0.365838 -v 0.178186 0.311119 -0.430180 -v 0.197990 0.214303 -0.477990 -v 0.210185 0.109251 -0.507431 -v 0.214303 0.000000 -0.517373 -v 0.210185 -0.109251 -0.507431 -v 0.197990 -0.214303 -0.477990 -v 0.178186 -0.311119 -0.430180 -v 0.151535 -0.395980 -0.365838 -v 0.119060 -0.465623 -0.287437 -v 0.082010 -0.517373 -0.197990 -v 0.041808 -0.549240 -0.100934 -v 0.060696 0.549240 -0.090839 -v 0.119060 0.517373 -0.178186 -v 0.172849 0.465623 -0.258686 -v 0.219995 0.395980 -0.329245 -v 0.258686 0.311119 -0.387151 -v 0.287437 0.214303 -0.430180 -v 0.305141 0.109251 -0.456676 -v 0.311119 0.000000 -0.465623 -v 0.305141 -0.109251 -0.456676 -v 0.287437 -0.214303 -0.430180 -v 0.258686 -0.311119 -0.387151 -v 0.219995 -0.395980 -0.329245 -v 0.172849 -0.465623 -0.258686 -v 0.119060 -0.517373 -0.178186 -v 0.060696 -0.549240 -0.090839 -v 0.000000 -0.560000 0.000000 -v 0.077252 0.549240 -0.077252 -v 0.151535 0.517373 -0.151535 -v 0.219995 0.465623 -0.219995 -v 0.280000 0.395980 -0.280000 -v 0.329245 0.311119 -0.329245 -v 0.365838 0.214303 -0.365838 -v 0.388371 0.109251 -0.388371 -v 0.395980 0.000000 -0.395980 -v 0.388371 -0.109251 -0.388371 -v 0.365838 -0.214303 -0.365838 -v 0.329245 -0.311119 -0.329245 -v 0.280000 -0.395980 -0.280000 -v 0.219995 -0.465623 -0.219995 -v 0.151535 -0.517373 -0.151535 -v 0.077252 -0.549240 -0.077252 -v 0.090839 0.549240 -0.060696 -v 0.178186 0.517373 -0.119060 -v 0.258686 0.465623 -0.172849 -v 0.329245 0.395980 -0.219995 -v 0.387151 0.311119 -0.258686 -v 0.430180 0.214303 -0.287437 -v 0.456676 0.109251 -0.305141 -v 0.465623 0.000000 -0.311119 -v 0.456676 -0.109251 -0.305141 -v 0.430180 -0.214303 -0.287437 -v 0.387151 -0.311119 -0.258686 -v 0.329245 -0.395980 -0.219995 -v 0.258686 -0.465623 -0.172849 -v 0.178186 -0.517373 -0.119060 -v 0.090839 -0.549240 -0.060696 -v 0.100934 0.549240 -0.041808 -v 0.197990 0.517373 -0.082010 -v 0.287437 0.465623 -0.119060 -v 0.365838 0.395980 -0.151535 -v 0.430179 0.311119 -0.178186 -v 0.477990 0.214303 -0.197990 -v 0.507431 0.109251 -0.210185 -v 0.517372 0.000000 -0.214303 -v 0.507431 -0.109251 -0.210185 -v 0.477990 -0.214303 -0.197990 -v 0.430179 -0.311119 -0.178186 -v 0.365838 -0.395980 -0.151535 -v 0.287437 -0.465623 -0.119060 -v 0.197990 -0.517373 -0.082010 -v 0.100934 -0.549240 -0.041808 -v 0.107151 0.549240 -0.021314 -v 0.210185 0.517373 -0.041808 -v 0.305141 0.465623 -0.060696 -v 0.388371 0.395980 -0.077252 -v 0.456676 0.311119 -0.090838 -v 0.507431 0.214303 -0.100934 -v 0.538686 0.109251 -0.107151 -v 0.549240 0.000000 -0.109251 -v 0.538686 -0.109251 -0.107151 -v 0.507431 -0.214303 -0.100934 -v 0.456676 -0.311119 -0.090838 -v 0.388371 -0.395980 -0.077252 -v 0.305141 -0.465623 -0.060696 -v 0.210185 -0.517373 -0.041808 -v 0.107151 -0.549240 -0.021314 -v 0.109251 0.549240 0.000000 -v 0.214303 0.517373 0.000000 -v 0.311119 0.465623 0.000000 -v 0.395980 0.395980 0.000000 -v 0.465623 0.311119 0.000000 -v 0.517372 0.214303 0.000000 -v 0.549240 0.109251 0.000000 -v 0.560000 0.000000 -0.000000 -v 0.549240 -0.109251 0.000000 -v 0.517372 -0.214303 0.000000 -v 0.465623 -0.311119 0.000000 -v 0.395980 -0.395980 0.000000 -v 0.311119 -0.465623 0.000000 -v 0.214303 -0.517373 0.000000 -v 0.109251 -0.549240 0.000000 -v 0.107151 0.549240 0.021314 -v 0.210185 0.517373 0.041808 -v 0.305141 0.465623 0.060696 -v 0.388371 0.395980 0.077252 -v 0.456676 0.311119 0.090839 -v 0.507431 0.214303 0.100934 -v 0.538686 0.109251 0.107151 -v 0.549240 0.000000 0.109251 -v 0.538686 -0.109251 0.107151 -v 0.507431 -0.214303 0.100934 -v 0.456676 -0.311119 0.090839 -v 0.388371 -0.395980 0.077252 -v 0.305141 -0.465623 0.060696 -v 0.210185 -0.517373 0.041808 -v 0.107151 -0.549240 0.021314 -v 0.100934 0.549240 0.041808 -v 0.197990 0.517373 0.082010 -v 0.287437 0.465623 0.119060 -v 0.365838 0.395980 0.151535 -v 0.430179 0.311119 0.178186 -v 0.477990 0.214303 0.197990 -v 0.507431 0.109251 0.210185 -v 0.517372 0.000000 0.214303 -v 0.507431 -0.109251 0.210185 -v 0.477990 -0.214303 0.197990 -v 0.430179 -0.311119 0.178186 -v 0.365838 -0.395980 0.151535 -v 0.287437 -0.465623 0.119060 -v 0.197990 -0.517373 0.082010 -v 0.100934 -0.549240 0.041808 -v 0.090839 0.549240 0.060696 -v 0.178186 0.517373 0.119060 -v 0.258686 0.465623 0.172849 -v 0.329245 0.395980 0.219995 -v 0.387151 0.311119 0.258686 -v 0.430179 0.214303 0.287437 -v 0.456676 0.109251 0.305141 -v 0.465623 0.000000 0.311119 -v 0.456676 -0.109251 0.305141 -v 0.430179 -0.214303 0.287437 -v 0.387151 -0.311119 0.258686 -v 0.329245 -0.395980 0.219995 -v 0.258686 -0.465623 0.172849 -v 0.178186 -0.517373 0.119060 -v 0.090839 -0.549240 0.060696 -v 0.077252 0.549240 0.077252 -v 0.151535 0.517373 0.151535 -v 0.219995 0.465623 0.219995 -v 0.280000 0.395980 0.280000 -v 0.329245 0.311119 0.329245 -v 0.365838 0.214303 0.365838 -v 0.388371 0.109251 0.388371 -v 0.395980 0.000000 0.395980 -v 0.388371 -0.109251 0.388371 -v 0.365838 -0.214303 0.365838 -v 0.329245 -0.311119 0.329245 -v 0.280000 -0.395980 0.280000 -v 0.219995 -0.465623 0.219995 -v 0.151535 -0.517373 0.151535 -v 0.077252 -0.549240 0.077252 -v 0.060696 0.549240 0.090839 -v 0.119060 0.517373 0.178186 -v 0.172849 0.465623 0.258686 -v 0.219995 0.395980 0.329245 -v 0.258686 0.311119 0.387151 -v 0.287437 0.214303 0.430179 -v 0.305141 0.109251 0.456676 -v 0.311119 0.000000 0.465623 -v 0.305141 -0.109251 0.456676 -v 0.287437 -0.214303 0.430179 -v 0.258686 -0.311119 0.387151 -v 0.219995 -0.395980 0.329245 -v 0.172849 -0.465623 0.258686 -v 0.119060 -0.517373 0.178186 -v 0.060696 -0.549240 0.090839 -v 0.041808 0.549240 0.100934 -v 0.082010 0.517373 0.197990 -v 0.119060 0.465623 0.287437 -v 0.151535 0.395980 0.365838 -v 0.178186 0.311119 0.430179 -v 0.197990 0.214303 0.477990 -v 0.210185 0.109251 0.507431 -v 0.214303 0.000000 0.517372 -v 0.210185 -0.109251 0.507431 -v 0.197990 -0.214303 0.477990 -v 0.178186 -0.311119 0.430179 -v 0.151535 -0.395980 0.365838 -v 0.119060 -0.465623 0.287437 -v 0.082010 -0.517373 0.197990 -v 0.041808 -0.549240 0.100934 -v 0.021314 0.549240 0.107151 -v 0.041808 0.517373 0.210185 -v 0.060696 0.465623 0.305141 -v 0.077252 0.395980 0.388371 -v 0.090838 0.311119 0.456676 -v 0.100934 0.214303 0.507431 -v 0.107151 0.109251 0.538686 -v 0.109251 0.000000 0.549240 -v 0.107151 -0.109251 0.538686 -v 0.100934 -0.214303 0.507431 -v 0.090838 -0.311119 0.456676 -v 0.077252 -0.395980 0.388371 -v 0.060696 -0.465623 0.305141 -v 0.041808 -0.517373 0.210185 -v 0.021314 -0.549240 0.107151 -v -0.000000 0.549240 0.109251 -v -0.000000 0.517373 0.214303 -v -0.000000 0.465623 0.311119 -v 0.000000 0.395980 0.395980 -v -0.000000 0.311119 0.465623 -v -0.000000 0.214303 0.517372 -v -0.000000 0.109251 0.549240 -v -0.000000 0.000000 0.560000 -v -0.000000 -0.109251 0.549240 -v -0.000000 -0.214303 0.517372 -v -0.000000 -0.311119 0.465623 -v 0.000000 -0.395980 0.395980 -v -0.000000 -0.465623 0.311119 -v -0.000000 -0.517373 0.214303 -v -0.000000 -0.549240 0.109251 -v 0.000000 0.560000 0.000000 -v -0.021314 0.549240 0.107151 -v -0.041808 0.517373 0.210185 -v -0.060696 0.465623 0.305141 -v -0.077252 0.395980 0.388371 -v -0.090839 0.311119 0.456676 -v -0.100934 0.214303 0.507431 -v -0.107151 0.109251 0.538686 -v -0.109251 0.000000 0.549240 -v -0.107151 -0.109251 0.538686 -v -0.100934 -0.214303 0.507431 -v -0.090839 -0.311119 0.456676 -v -0.077252 -0.395980 0.388371 -v -0.060696 -0.465623 0.305141 -v -0.041808 -0.517373 0.210185 -v -0.021314 -0.549240 0.107151 -v -0.041808 0.549240 0.100934 -v -0.082010 0.517373 0.197990 -v -0.119060 0.465623 0.287437 -v -0.151535 0.395980 0.365838 -v -0.178186 0.311119 0.430179 -v -0.197990 0.214303 0.477990 -v -0.210185 0.109251 0.507431 -v -0.214303 0.000000 0.517372 -v -0.210185 -0.109251 0.507431 -v -0.197990 -0.214303 0.477990 -v -0.178186 -0.311119 0.430179 -v -0.151535 -0.395980 0.365838 -v -0.119060 -0.465623 0.287437 -v -0.082010 -0.517373 0.197990 -v -0.041808 -0.549240 0.100934 -v -0.060696 0.549240 0.090838 -v -0.119060 0.517373 0.178186 -v -0.172849 0.465623 0.258686 -v -0.219995 0.395980 0.329245 -v -0.258686 0.311119 0.387151 -v -0.287437 0.214303 0.430179 -v -0.305141 0.109251 0.456676 -v -0.311119 0.000000 0.465623 -v -0.305141 -0.109251 0.456676 -v -0.287437 -0.214303 0.430179 -v -0.258686 -0.311119 0.387151 -v -0.219995 -0.395980 0.329245 -v -0.172849 -0.465623 0.258686 -v -0.119060 -0.517373 0.178186 -v -0.060696 -0.549240 0.090838 -v -0.077252 0.549240 0.077252 -v -0.151535 0.517373 0.151535 -v -0.219995 0.465623 0.219994 -v -0.280000 0.395980 0.280000 -v -0.329245 0.311119 0.329245 -v -0.365838 0.214303 0.365837 -v -0.388371 0.109251 0.388371 -v -0.395980 0.000000 0.395980 -v -0.388371 -0.109251 0.388371 -v -0.365838 -0.214303 0.365837 -v -0.329245 -0.311119 0.329245 -v -0.280000 -0.395980 0.280000 -v -0.219995 -0.465623 0.219994 -v -0.151535 -0.517373 0.151535 -v -0.077252 -0.549240 0.077252 -v -0.090838 0.549240 0.060696 -v -0.178186 0.517373 0.119060 -v -0.258686 0.465623 0.172849 -v -0.329245 0.395980 0.219995 -v -0.387151 0.311119 0.258686 -v -0.430179 0.214303 0.287437 -v -0.456676 0.109251 0.305141 -v -0.465623 0.000000 0.311119 -v -0.456676 -0.109251 0.305141 -v -0.430179 -0.214303 0.287437 -v -0.387151 -0.311119 0.258686 -v -0.329245 -0.395980 0.219995 -v -0.258686 -0.465623 0.172849 -v -0.178186 -0.517373 0.119060 -v -0.090838 -0.549240 0.060696 -v -0.100934 0.549240 0.041808 -v -0.197990 0.517373 0.082010 -v -0.287437 0.465623 0.119060 -v -0.365838 0.395980 0.151535 -v -0.430179 0.311119 0.178186 -v -0.477990 0.214303 0.197990 -v -0.507431 0.109251 0.210185 -v -0.517372 0.000000 0.214303 -v -0.507431 -0.109251 0.210185 -v -0.477990 -0.214303 0.197990 -v -0.430179 -0.311119 0.178186 -v -0.365838 -0.395980 0.151535 -v -0.287437 -0.465623 0.119060 -v -0.197990 -0.517373 0.082010 -v -0.100934 -0.549240 0.041808 -v -0.107151 0.549240 0.021314 -v -0.210185 0.517373 0.041808 -v -0.305141 0.465623 0.060696 -v -0.388371 0.395980 0.077252 -v -0.456676 0.311119 0.090838 -v -0.507431 0.214303 0.100934 -v -0.538686 0.109251 0.107151 -v -0.549240 0.000000 0.109251 -v -0.538686 -0.109251 0.107151 -v -0.507431 -0.214303 0.100934 -v -0.456676 -0.311119 0.090838 -v -0.388371 -0.395980 0.077252 -v -0.305141 -0.465623 0.060696 -v -0.210185 -0.517373 0.041808 -v -0.107151 -0.549240 0.021314 -v -0.109251 0.549240 -0.000000 -v -0.214303 0.517373 -0.000000 -v -0.311119 0.465623 -0.000000 -v -0.395980 0.395980 -0.000000 -v -0.465623 0.311119 -0.000000 -v -0.517372 0.214303 -0.000000 -v -0.549240 0.109251 -0.000000 -v -0.560000 0.000000 -0.000000 -v -0.549240 -0.109251 -0.000000 -v -0.517372 -0.214303 -0.000000 -v -0.465623 -0.311119 -0.000000 -v -0.395980 -0.395980 -0.000000 -v -0.311119 -0.465623 -0.000000 -v -0.214303 -0.517373 -0.000000 -v -0.109251 -0.549240 -0.000000 -v -0.107151 0.549240 -0.021314 -v -0.210185 0.517373 -0.041808 -v -0.305141 0.465623 -0.060696 -v -0.388371 0.395980 -0.077252 -v -0.456676 0.311119 -0.090839 -v -0.507431 0.214303 -0.100934 -v -0.538686 0.109251 -0.107151 -v -0.549240 0.000000 -0.109251 -v -0.538686 -0.109251 -0.107151 -v -0.507431 -0.214303 -0.100934 -v -0.456676 -0.311119 -0.090839 -v -0.388371 -0.395980 -0.077252 -v -0.305141 -0.465623 -0.060696 -v -0.210185 -0.517373 -0.041808 -v -0.107151 -0.549240 -0.021314 -v -0.100934 0.549240 -0.041808 -v -0.197990 0.517373 -0.082010 -v -0.287437 0.465623 -0.119060 -v -0.365837 0.395980 -0.151535 -v -0.430179 0.311119 -0.178186 -v -0.477990 0.214303 -0.197990 -v -0.507431 0.109251 -0.210185 -v -0.517372 0.000000 -0.214303 -v -0.507431 -0.109251 -0.210185 -v -0.477990 -0.214303 -0.197990 -v -0.430179 -0.311119 -0.178186 -v -0.365837 -0.395980 -0.151535 -v -0.287437 -0.465623 -0.119060 -v -0.197990 -0.517373 -0.082010 -v -0.100934 -0.549240 -0.041808 -v -0.090838 0.549240 -0.060696 -v -0.178186 0.517373 -0.119060 -v -0.258686 0.465623 -0.172849 -v -0.329245 0.395980 -0.219995 -v -0.387151 0.311119 -0.258686 -v -0.430179 0.214303 -0.287437 -v -0.456676 0.109251 -0.305141 -v -0.465623 0.000000 -0.311119 -v -0.456676 -0.109251 -0.305141 -v -0.430179 -0.214303 -0.287437 -v -0.387151 -0.311119 -0.258686 -v -0.329245 -0.395980 -0.219995 -v -0.258686 -0.465623 -0.172849 -v -0.178186 -0.517373 -0.119060 -v -0.090838 -0.549240 -0.060696 -v -0.077252 0.549240 -0.077252 -v -0.151535 0.517373 -0.151535 -v -0.219994 0.465623 -0.219994 -v -0.280000 0.395980 -0.280000 -v -0.329245 0.311119 -0.329245 -v -0.365837 0.214303 -0.365838 -v -0.388371 0.109251 -0.388371 -v -0.395980 0.000000 -0.395980 -v -0.388371 -0.109251 -0.388371 -v -0.365837 -0.214303 -0.365838 -v -0.329245 -0.311119 -0.329245 -v -0.280000 -0.395980 -0.280000 -v -0.219994 -0.465623 -0.219994 -v -0.151535 -0.517373 -0.151535 -v -0.077252 -0.549240 -0.077252 -v -0.060696 0.549240 -0.090838 -v -0.119060 0.517373 -0.178186 -v -0.172848 0.465623 -0.258686 -v -0.219994 0.395980 -0.329245 -v -0.258686 0.311119 -0.387151 -v -0.287437 0.214303 -0.430179 -v -0.305141 0.109251 -0.456676 -v -0.311119 0.000000 -0.465623 -v -0.305141 -0.109251 -0.456676 -v -0.287437 -0.214303 -0.430179 -v -0.258686 -0.311119 -0.387151 -v -0.219994 -0.395980 -0.329245 -v -0.172848 -0.465623 -0.258686 -v -0.119060 -0.517373 -0.178186 -v -0.060696 -0.549240 -0.090838 -v -0.041808 0.549240 -0.100934 -v -0.082010 0.517373 -0.197990 -v -0.119060 0.465623 -0.287437 -v -0.151535 0.395980 -0.365837 -v -0.178186 0.311119 -0.430179 -v -0.197990 0.214303 -0.477990 -v -0.210185 0.109251 -0.507431 -v -0.214303 0.000000 -0.517372 -v -0.210185 -0.109251 -0.507431 -v -0.197990 -0.214303 -0.477990 -v -0.178186 -0.311119 -0.430179 -v -0.151535 -0.395980 -0.365837 -v -0.119060 -0.465623 -0.287437 -v -0.082010 -0.517373 -0.197990 -v -0.041808 -0.549240 -0.100934 -v -0.021314 0.549240 -0.107151 -v -0.041808 0.517373 -0.210185 -v -0.060696 0.465623 -0.305141 -v -0.077252 0.395980 -0.388371 -v -0.090838 0.311119 -0.456676 -v -0.100934 0.214303 -0.507431 -v -0.107151 0.109251 -0.538686 -v -0.109250 0.000000 -0.549240 -v -0.107151 -0.109251 -0.538686 -v -0.100934 -0.214303 -0.507431 -v -0.090838 -0.311119 -0.456676 -v -0.077252 -0.395980 -0.388371 -v -0.060696 -0.465623 -0.305141 -v -0.041808 -0.517373 -0.210185 -v -0.021314 -0.549240 -0.107151 -v 0.000000 0.549240 -0.109250 -v 0.000000 0.517373 -0.214303 -v 0.000000 0.311119 -0.465623 -v 0.000000 -0.395980 -0.395980 -v 0.000000 -0.517373 -0.214303 -v 0.000000 -0.549240 -0.109250 -vn -0.0000 -0.8286 -0.5598 -vn 0.0757 -0.9217 -0.3804 -vn -0.0000 -0.9217 -0.3879 -vn -0.0000 0.1939 -0.9810 -vn 0.1804 0.3805 -0.9070 -vn 0.1914 0.1939 -0.9622 -vn 0.0392 -0.9796 -0.1971 -vn -0.0000 -0.9796 -0.2010 -vn -0.0000 -0.0000 -1.0000 -vn 0.1951 -0.0000 -0.9808 -vn -0.0000 0.9796 -0.2010 -vn -0.0000 1.0000 -0.0000 -vn 0.0392 0.9796 -0.1971 -vn -0.0000 -1.0000 -0.0000 -vn 0.1914 -0.1939 -0.9622 -vn -0.0000 -0.1939 -0.9810 -vn -0.0000 0.9217 -0.3879 -vn 0.0757 0.9217 -0.3804 -vn 0.1804 -0.3805 -0.9070 -vn -0.0000 -0.3805 -0.9248 -vn -0.0000 0.8286 -0.5598 -vn 0.1092 0.8286 -0.5490 -vn 0.1626 -0.5528 -0.8173 -vn -0.0000 -0.5528 -0.8333 -vn -0.0000 0.7041 -0.7101 -vn 0.1385 0.7041 -0.6965 -vn 0.1385 -0.7041 -0.6965 -vn -0.0000 -0.7041 -0.7101 -vn -0.0000 0.5528 -0.8333 -vn 0.1626 0.5528 -0.8173 -vn 0.1092 -0.8286 -0.5490 -vn -0.0000 0.3805 -0.9248 -vn 0.2142 -0.8286 -0.5172 -vn 0.3189 0.5528 -0.7699 -vn 0.3539 0.3805 -0.8544 -vn 0.1484 -0.9217 -0.3584 -vn 0.3754 0.1939 -0.9063 -vn 0.0769 -0.9796 -0.1857 -vn 0.3827 -0.0000 -0.9239 -vn 0.0769 0.9796 -0.1857 -vn 0.3754 -0.1939 -0.9063 -vn 0.1484 0.9217 -0.3584 -vn 0.3539 -0.3805 -0.8544 -vn 0.2142 0.8286 -0.5172 -vn 0.3189 -0.5528 -0.7699 -vn 0.2718 0.7041 -0.6561 -vn 0.2718 -0.7041 -0.6561 -vn 0.1117 0.9796 -0.1671 -vn 0.2155 0.9217 -0.3225 -vn 0.5138 -0.3805 -0.7689 -vn 0.3110 0.8286 -0.4654 -vn 0.4630 -0.5528 -0.6929 -vn 0.3945 0.7041 -0.5905 -vn 0.3945 -0.7041 -0.5905 -vn 0.4630 0.5528 -0.6929 -vn 0.3110 -0.8286 -0.4654 -vn 0.5138 0.3805 -0.7689 -vn 0.2155 -0.9217 -0.3225 -vn 0.5450 0.1939 -0.8157 -vn 0.1117 -0.9796 -0.1671 -vn 0.5556 -0.0000 -0.8315 -vn 0.5450 -0.1939 -0.8157 -vn 0.5893 0.5528 -0.5893 -vn 0.6539 0.3805 -0.6539 -vn 0.2743 -0.9217 -0.2743 -vn 0.6937 0.1939 -0.6937 -vn 0.1421 -0.9796 -0.1421 -vn 0.7071 -0.0000 -0.7071 -vn 0.1421 0.9796 -0.1421 -vn 0.6937 -0.1939 -0.6937 -vn 0.2743 0.9217 -0.2743 -vn 0.6539 -0.3805 -0.6539 -vn 0.3958 0.8286 -0.3958 -vn 0.5893 -0.5528 -0.5893 -vn 0.5021 0.7041 -0.5021 -vn 0.5021 -0.7041 -0.5021 -vn 0.3958 -0.8286 -0.3958 -vn 0.7689 -0.3805 -0.5138 -vn 0.3225 0.9217 -0.2155 -vn 0.4654 0.8286 -0.3110 -vn 0.6929 -0.5528 -0.4630 -vn 0.5905 0.7041 -0.3945 -vn 0.5905 -0.7041 -0.3945 -vn 0.6929 0.5528 -0.4630 -vn 0.4654 -0.8286 -0.3110 -vn 0.7689 0.3805 -0.5138 -vn 0.3225 -0.9217 -0.2155 -vn 0.8157 0.1939 -0.5450 -vn 0.1671 -0.9796 -0.1117 -vn 0.8315 -0.0000 -0.5556 -vn 0.1671 0.9796 -0.1117 -vn 0.8157 -0.1939 -0.5450 -vn 0.3584 -0.9217 -0.1484 -vn 0.8544 0.3805 -0.3539 -vn 0.9063 0.1939 -0.3754 -vn 0.1857 -0.9796 -0.0769 -vn 0.9239 -0.0000 -0.3827 -vn 0.1857 0.9796 -0.0769 -vn 0.9063 -0.1939 -0.3754 -vn 0.3584 0.9217 -0.1484 -vn 0.8544 -0.3805 -0.3539 -vn 0.5172 0.8286 -0.2142 -vn 0.7699 -0.5528 -0.3189 -vn 0.6561 0.7041 -0.2718 -vn 0.6561 -0.7041 -0.2718 -vn 0.7699 0.5528 -0.3189 -vn 0.5172 -0.8286 -0.2142 -vn 0.8173 -0.5528 -0.1626 -vn 0.5490 0.8286 -0.1092 -vn 0.6965 0.7041 -0.1385 -vn 0.6965 -0.7041 -0.1385 -vn 0.8173 0.5528 -0.1626 -vn 0.5490 -0.8286 -0.1092 -vn 0.9070 0.3805 -0.1804 -vn 0.3804 -0.9217 -0.0757 -vn 0.9622 0.1939 -0.1914 -vn 0.1971 -0.9796 -0.0392 -vn 0.9808 -0.0000 -0.1951 -vn 0.1971 0.9796 -0.0392 -vn 0.9622 -0.1939 -0.1914 -vn 0.3804 0.9217 -0.0757 -vn 0.9070 -0.3805 -0.1804 -vn 0.2010 -0.9796 -0.0000 -vn 0.9810 0.1939 -0.0000 -vn 1.0000 -0.0000 -0.0000 -vn 0.2010 0.9796 -0.0000 -vn 0.9810 -0.1939 -0.0000 -vn 0.3879 0.9217 -0.0000 -vn 0.9248 -0.3805 -0.0000 -vn 0.5598 0.8286 -0.0000 -vn 0.8333 -0.5528 -0.0000 -vn 0.7101 0.7041 -0.0000 -vn 0.7101 -0.7041 -0.0000 -vn 0.8333 0.5528 -0.0000 -vn 0.5598 -0.8286 -0.0000 -vn 0.9248 0.3805 -0.0000 -vn 0.3879 -0.9217 -0.0000 -vn 0.6965 0.7041 0.1385 -vn 0.8173 -0.5528 0.1626 -vn 0.6965 -0.7041 0.1385 -vn 0.8173 0.5528 0.1626 -vn 0.5490 -0.8286 0.1092 -vn 0.9070 0.3805 0.1804 -vn 0.3804 -0.9217 0.0757 -vn 0.9622 0.1939 0.1914 -vn 0.1971 -0.9796 0.0392 -vn 0.9808 -0.0000 0.1951 -vn 0.1971 0.9796 0.0392 -vn 0.9622 -0.1939 0.1914 -vn 0.3804 0.9217 0.0757 -vn 0.9070 -0.3805 0.1804 -vn 0.5490 0.8286 0.1092 -vn 0.9239 -0.0000 0.3827 -vn 0.1857 0.9796 0.0769 -vn 0.1857 -0.9796 0.0769 -vn 0.9063 -0.1939 0.3754 -vn 0.3584 0.9217 0.1484 -vn 0.8544 -0.3805 0.3539 -vn 0.5172 0.8286 0.2142 -vn 0.7699 -0.5528 0.3189 -vn 0.6561 0.7041 0.2718 -vn 0.6561 -0.7041 0.2718 -vn 0.7699 0.5528 0.3189 -vn 0.5172 -0.8286 0.2142 -vn 0.8544 0.3805 0.3539 -vn 0.3584 -0.9217 0.1484 -vn 0.9063 0.1939 0.3754 -vn 0.6929 -0.5528 0.4630 -vn 0.5905 -0.7041 0.3945 -vn 0.6929 0.5528 0.4630 -vn 0.4654 -0.8286 0.3110 -vn 0.7689 0.3805 0.5138 -vn 0.3225 -0.9217 0.2155 -vn 0.8157 0.1939 0.5450 -vn 0.1671 -0.9796 0.1117 -vn 0.8315 -0.0000 0.5556 -vn 0.1671 0.9796 0.1117 -vn 0.8157 -0.1939 0.5450 -vn 0.3225 0.9217 0.2155 -vn 0.7689 -0.3805 0.5138 -vn 0.4654 0.8286 0.3110 -vn 0.5905 0.7041 0.3945 -vn 0.1421 0.9796 0.1421 -vn 0.1421 -0.9796 0.1421 -vn 0.7071 -0.0000 0.7071 -vn 0.6937 -0.1939 0.6937 -vn 0.2743 0.9217 0.2743 -vn 0.6539 -0.3805 0.6539 -vn 0.3958 0.8286 0.3958 -vn 0.5893 -0.5528 0.5893 -vn 0.5021 0.7041 0.5021 -vn 0.5021 -0.7041 0.5021 -vn 0.5893 0.5528 0.5893 -vn 0.3958 -0.8286 0.3958 -vn 0.6539 0.3805 0.6539 -vn 0.2743 -0.9217 0.2743 -vn 0.6937 0.1939 0.6937 -vn 0.4630 0.5528 0.6929 -vn 0.3945 -0.7041 0.5905 -vn 0.3110 -0.8286 0.4654 -vn 0.5138 0.3805 0.7689 -vn 0.2155 -0.9217 0.3225 -vn 0.5450 0.1939 0.8157 -vn 0.1117 -0.9796 0.1671 -vn 0.5556 -0.0000 0.8315 -vn 0.1117 0.9796 0.1671 -vn 0.5450 -0.1939 0.8157 -vn 0.2155 0.9217 0.3225 -vn 0.5138 -0.3805 0.7689 -vn 0.3110 0.8286 0.4654 -vn 0.4630 -0.5528 0.6929 -vn 0.3945 0.7041 0.5905 -vn 0.3827 -0.0000 0.9239 -vn 0.3754 -0.1939 0.9063 -vn 0.1484 0.9217 0.3584 -vn 0.3539 -0.3805 0.8544 -vn 0.2142 0.8286 0.5172 -vn 0.3189 -0.5528 0.7699 -vn 0.2718 0.7041 0.6561 -vn 0.2718 -0.7041 0.6561 -vn 0.3189 0.5528 0.7699 -vn 0.2142 -0.8286 0.5172 -vn 0.3539 0.3805 0.8544 -vn 0.1484 -0.9217 0.3584 -vn 0.3754 0.1939 0.9063 -vn 0.0769 -0.9796 0.1857 -vn 0.0769 0.9796 0.1857 -vn 0.1385 -0.7041 0.6965 -vn 0.1092 -0.8286 0.5490 -vn 0.1804 0.3805 0.9070 -vn 0.0757 -0.9217 0.3804 -vn 0.1914 0.1939 0.9622 -vn 0.0392 -0.9796 0.1971 -vn 0.1951 -0.0000 0.9808 -vn 0.0392 0.9796 0.1971 -vn 0.1914 -0.1939 0.9622 -vn 0.0757 0.9217 0.3804 -vn 0.1804 -0.3805 0.9070 -vn 0.1092 0.8286 0.5490 -vn 0.1626 -0.5528 0.8173 -vn 0.1385 0.7041 0.6965 -vn 0.1626 0.5528 0.8173 -vn -0.0000 -0.1939 0.9810 -vn -0.0000 -0.3805 0.9248 -vn -0.0000 0.8286 0.5598 -vn -0.0000 -0.5528 0.8333 -vn -0.0000 0.7041 0.7101 -vn -0.0000 -0.7041 0.7101 -vn -0.0000 0.5528 0.8333 -vn -0.0000 -0.8286 0.5598 -vn -0.0000 0.3805 0.9248 -vn -0.0000 -0.9217 0.3879 -vn -0.0000 0.1939 0.9810 -vn -0.0000 -0.9796 0.2010 -vn -0.0000 -0.0000 1.0000 -vn -0.0000 0.9796 0.2010 -vn -0.0000 0.9217 0.3879 -vn -0.0757 -0.9217 0.3804 -vn -0.1804 0.3805 0.9070 -vn -0.1914 0.1939 0.9622 -vn -0.0392 -0.9796 0.1971 -vn -0.1951 -0.0000 0.9808 -vn -0.0392 0.9796 0.1971 -vn -0.1914 -0.1939 0.9622 -vn -0.0757 0.9217 0.3804 -vn -0.1804 -0.3805 0.9070 -vn -0.1092 0.8286 0.5490 -vn -0.1626 -0.5528 0.8173 -vn -0.1385 0.7041 0.6965 -vn -0.1385 -0.7041 0.6965 -vn -0.1626 0.5528 0.8173 -vn -0.1092 -0.8286 0.5490 -vn -0.1484 0.9217 0.3584 -vn -0.2142 0.8286 0.5172 -vn -0.3189 -0.5528 0.7699 -vn -0.2718 0.7041 0.6561 -vn -0.2718 -0.7041 0.6561 -vn -0.3189 0.5528 0.7699 -vn -0.2142 -0.8286 0.5172 -vn -0.3539 0.3805 0.8544 -vn -0.1484 -0.9217 0.3584 -vn -0.3754 0.1939 0.9063 -vn -0.0769 -0.9796 0.1857 -vn -0.3827 -0.0000 0.9239 -vn -0.0769 0.9796 0.1857 -vn -0.3754 -0.1939 0.9063 -vn -0.3539 -0.3805 0.8544 -vn -0.5138 0.3805 0.7689 -vn -0.5450 0.1939 0.8157 -vn -0.1117 -0.9796 0.1671 -vn -0.5556 -0.0000 0.8315 -vn -0.1117 0.9796 0.1671 -vn -0.5450 -0.1939 0.8157 -vn -0.2155 0.9217 0.3225 -vn -0.5138 -0.3805 0.7689 -vn -0.3110 0.8286 0.4654 -vn -0.4630 -0.5528 0.6929 -vn -0.3945 0.7041 0.5905 -vn -0.3945 -0.7041 0.5905 -vn -0.4630 0.5528 0.6929 -vn -0.3110 -0.8286 0.4654 -vn -0.2155 -0.9217 0.3225 -vn -0.5893 -0.5528 0.5893 -vn -0.3958 0.8286 0.3958 -vn -0.5021 0.7041 0.5021 -vn -0.5021 -0.7041 0.5021 -vn -0.5893 0.5528 0.5893 -vn -0.3958 -0.8286 0.3958 -vn -0.6539 0.3805 0.6539 -vn -0.2743 -0.9217 0.2743 -vn -0.6937 0.1939 0.6937 -vn -0.1421 -0.9796 0.1421 -vn -0.7071 -0.0000 0.7071 -vn -0.1421 0.9796 0.1421 -vn -0.6937 -0.1939 0.6937 -vn -0.2743 0.9217 0.2743 -vn -0.6539 -0.3805 0.6539 -vn -0.1671 -0.9796 0.1117 -vn -0.8157 0.1939 0.5450 -vn -0.8315 -0.0000 0.5556 -vn -0.1671 0.9796 0.1117 -vn -0.8157 -0.1939 0.5450 -vn -0.3225 0.9217 0.2155 -vn -0.7689 -0.3805 0.5138 -vn -0.4654 0.8286 0.3110 -vn -0.6929 -0.5528 0.4630 -vn -0.5905 0.7041 0.3945 -vn -0.5905 -0.7041 0.3945 -vn -0.6929 0.5528 0.4630 -vn -0.4654 -0.8286 0.3110 -vn -0.7689 0.3805 0.5138 -vn -0.3225 -0.9217 0.2155 -vn -0.5172 0.8286 0.2142 -vn -0.6561 0.7041 0.2718 -vn -0.6561 -0.7041 0.2718 -vn -0.7699 0.5528 0.3189 -vn -0.5172 -0.8286 0.2142 -vn -0.8544 0.3805 0.3539 -vn -0.3584 -0.9217 0.1484 -vn -0.9063 0.1939 0.3754 -vn -0.1857 -0.9796 0.0769 -vn -0.9239 -0.0000 0.3827 -vn -0.1857 0.9796 0.0769 -vn -0.9063 -0.1939 0.3754 -vn -0.3584 0.9217 0.1484 -vn -0.8544 -0.3805 0.3539 -vn -0.7699 -0.5528 0.3189 -vn -0.9622 0.1939 0.1914 -vn -0.9808 -0.0000 0.1951 -vn -0.1971 0.9796 0.0392 -vn -0.1971 -0.9796 0.0392 -vn -0.9622 -0.1939 0.1914 -vn -0.3804 0.9217 0.0757 -vn -0.9070 -0.3805 0.1804 -vn -0.5490 0.8286 0.1092 -vn -0.8173 -0.5528 0.1626 -vn -0.6965 0.7041 0.1385 -vn -0.6965 -0.7041 0.1385 -vn -0.8173 0.5528 0.1626 -vn -0.5490 -0.8286 0.1092 -vn -0.9070 0.3805 0.1804 -vn -0.3804 -0.9217 0.0757 -vn -0.7101 -0.7041 -0.0000 -vn -0.7101 0.7041 -0.0000 -vn -0.8333 0.5528 -0.0000 -vn -0.5598 -0.8286 -0.0000 -vn -0.9248 0.3805 -0.0000 -vn -0.3879 -0.9217 -0.0000 -vn -0.9810 0.1939 -0.0000 -vn -0.2010 -0.9796 -0.0000 -vn -1.0000 -0.0000 -0.0000 -vn -0.2010 0.9796 -0.0000 -vn -0.9810 -0.1939 -0.0000 -vn -0.3879 0.9217 -0.0000 -vn -0.9248 -0.3805 -0.0000 -vn -0.5598 0.8286 -0.0000 -vn -0.8333 -0.5528 -0.0000 -vn -0.1971 -0.9796 -0.0392 -vn -0.9808 -0.0000 -0.1951 -vn -0.9622 -0.1939 -0.1914 -vn -0.3804 0.9217 -0.0757 -vn -0.9070 -0.3805 -0.1804 -vn -0.5490 0.8286 -0.1092 -vn -0.8173 -0.5528 -0.1626 -vn -0.6965 0.7041 -0.1385 -vn -0.6965 -0.7041 -0.1385 -vn -0.8173 0.5528 -0.1626 -vn -0.5490 -0.8286 -0.1092 -vn -0.9070 0.3805 -0.1804 -vn -0.3804 -0.9217 -0.0757 -vn -0.9622 0.1939 -0.1914 -vn -0.1971 0.9796 -0.0392 -vn -0.6561 -0.7041 -0.2718 -vn -0.5172 -0.8286 -0.2142 -vn -0.8544 0.3805 -0.3539 -vn -0.3584 -0.9217 -0.1484 -vn -0.9063 0.1939 -0.3754 -vn -0.1857 -0.9796 -0.0769 -vn -0.9239 -0.0000 -0.3827 -vn -0.1857 0.9796 -0.0769 -vn -0.9063 -0.1939 -0.3754 -vn -0.3584 0.9217 -0.1484 -vn -0.8544 -0.3805 -0.3539 -vn -0.5172 0.8286 -0.2142 -vn -0.7699 -0.5528 -0.3189 -vn -0.6561 0.7041 -0.2718 -vn -0.7699 0.5528 -0.3189 -vn -0.3225 0.9217 -0.2155 -vn -0.8157 -0.1939 -0.5450 -vn -0.7689 -0.3805 -0.5138 -vn -0.4654 0.8286 -0.3110 -vn -0.6929 -0.5528 -0.4630 -vn -0.5905 0.7041 -0.3945 -vn -0.5905 -0.7041 -0.3945 -vn -0.6929 0.5528 -0.4630 -vn -0.4654 -0.8286 -0.3110 -vn -0.7689 0.3805 -0.5138 -vn -0.3225 -0.9217 -0.2155 -vn -0.8157 0.1939 -0.5450 -vn -0.1671 -0.9796 -0.1117 -vn -0.8315 -0.0000 -0.5556 -vn -0.1671 0.9796 -0.1117 -vn -0.6539 0.3805 -0.6539 -vn -0.3958 -0.8286 -0.3958 -vn -0.2743 -0.9217 -0.2743 -vn -0.6937 0.1939 -0.6937 -vn -0.1421 -0.9796 -0.1421 -vn -0.7071 -0.0000 -0.7071 -vn -0.1421 0.9796 -0.1421 -vn -0.6937 -0.1939 -0.6937 -vn -0.2743 0.9217 -0.2743 -vn -0.6539 -0.3805 -0.6539 -vn -0.3958 0.8286 -0.3958 -vn -0.5893 -0.5528 -0.5893 -vn -0.5021 0.7041 -0.5021 -vn -0.5021 -0.7041 -0.5021 -vn -0.5893 0.5528 -0.5893 -vn -0.5450 -0.1939 -0.8157 -vn -0.5138 -0.3805 -0.7689 -vn -0.3110 0.8286 -0.4654 -vn -0.4630 -0.5528 -0.6929 -vn -0.3945 0.7041 -0.5905 -vn -0.3945 -0.7041 -0.5905 -vn -0.4630 0.5528 -0.6929 -vn -0.3110 -0.8286 -0.4654 -vn -0.5138 0.3805 -0.7689 -vn -0.2155 -0.9217 -0.3225 -vn -0.5450 0.1939 -0.8157 -vn -0.1117 -0.9796 -0.1671 -vn -0.5556 -0.0000 -0.8315 -vn -0.1117 0.9796 -0.1671 -vn -0.2155 0.9217 -0.3225 -vn -0.2142 -0.8286 -0.5172 -vn -0.1484 -0.9217 -0.3584 -vn -0.3754 0.1939 -0.9063 -vn -0.0769 -0.9796 -0.1857 -vn -0.3827 -0.0000 -0.9239 -vn -0.0769 0.9796 -0.1857 -vn -0.3754 -0.1939 -0.9063 -vn -0.1484 0.9217 -0.3584 -vn -0.3539 -0.3805 -0.8544 -vn -0.2142 0.8286 -0.5172 -vn -0.3189 -0.5528 -0.7699 -vn -0.2718 0.7041 -0.6561 -vn -0.2718 -0.7041 -0.6561 -vn -0.3189 0.5528 -0.7699 -vn -0.3539 0.3805 -0.8544 -vn -0.1092 0.8286 -0.5490 -vn -0.1804 -0.3805 -0.9070 -vn -0.1626 -0.5528 -0.8173 -vn -0.1385 0.7041 -0.6965 -vn -0.1385 -0.7041 -0.6965 -vn -0.1626 0.5528 -0.8173 -vn -0.1092 -0.8286 -0.5490 -vn -0.1804 0.3805 -0.9070 -vn -0.0757 -0.9217 -0.3804 -vn -0.1914 0.1939 -0.9622 -vn -0.0392 -0.9796 -0.1971 -vn -0.1951 -0.0000 -0.9808 -vn -0.0392 0.9796 -0.1971 -vn -0.1914 -0.1939 -0.9622 -vn -0.0757 0.9217 -0.3804 -vt 0.500000 0.812500 -vt 0.500000 0.750000 -vt 0.500000 0.625000 -vt 0.500000 0.562500 -vt 0.500000 0.500000 -vt 0.500000 0.437500 -vt 0.500000 0.375000 -vt 0.500000 0.312500 -vt 0.500000 0.187500 -vt 0.437500 0.937500 -vt 0.437500 0.875000 -vt 0.437500 0.812500 -vt 0.437500 0.750000 -vt 0.437500 0.687500 -vt 0.437500 0.625000 -vt 0.437500 0.562500 -vt 0.437500 0.500000 -vt 0.437500 0.437500 -vt 0.437500 0.375000 -vt 0.437500 0.312500 -vt 0.437500 0.250000 -vt 0.437500 0.187500 -vt 0.437500 0.125000 -vt 0.437500 0.062500 -vt 0.375000 0.937500 -vt 0.375000 0.875000 -vt 0.375000 0.812500 -vt 0.375000 0.750000 -vt 0.375000 0.687500 -vt 0.375000 0.625000 -vt 0.375000 0.562500 -vt 0.375000 0.500000 -vt 0.375000 0.437500 -vt 0.375000 0.375000 -vt 0.375000 0.312500 -vt 0.375000 0.250000 -vt 0.375000 0.187500 -vt 0.375000 0.125000 -vt 0.375000 0.062500 -vt 0.312500 0.937500 -vt 0.312500 0.875000 -vt 0.312500 0.812500 -vt 0.312500 0.750000 -vt 0.312500 0.687500 -vt 0.312500 0.625000 -vt 0.312500 0.562500 -vt 0.312500 0.500000 -vt 0.312500 0.437500 -vt 0.312500 0.375000 -vt 0.312500 0.312500 -vt 0.312500 0.250000 -vt 0.312500 0.187500 -vt 0.312500 0.125000 -vt 0.312500 0.062500 -vt 0.468750 0.000000 -vt 0.406250 0.000000 -vt 0.343750 0.000000 -vt 0.281250 0.000000 -vt 0.218750 0.000000 -vt 0.156250 0.000000 -vt 0.093750 0.000000 -vt 0.031250 0.000000 -vt 0.968750 0.000000 -vt 0.906250 0.000000 -vt 0.843750 0.000000 -vt 0.781250 0.000000 -vt 0.718750 0.000000 -vt 0.656250 0.000000 -vt 0.593750 0.000000 -vt 0.531250 0.000000 -vt 0.250000 0.937500 -vt 0.250000 0.875000 -vt 0.250000 0.812500 -vt 0.250000 0.750000 -vt 0.250000 0.687500 -vt 0.250000 0.625000 -vt 0.250000 0.562500 -vt 0.250000 0.500000 -vt 0.250000 0.437500 -vt 0.250000 0.375000 -vt 0.250000 0.312500 -vt 0.250000 0.250000 -vt 0.250000 0.187500 -vt 0.250000 0.125000 -vt 0.250000 0.062500 -vt 0.187500 0.937500 -vt 0.187500 0.875000 -vt 0.187500 0.812500 -vt 0.187500 0.750000 -vt 0.187500 0.687500 -vt 0.187500 0.625000 -vt 0.187500 0.562500 -vt 0.187500 0.500000 -vt 0.187500 0.437500 -vt 0.187500 0.375000 -vt 0.187500 0.312500 -vt 0.187500 0.250000 -vt 0.187500 0.187500 -vt 0.187500 0.125000 -vt 0.187500 0.062500 -vt 0.125000 0.937500 -vt 0.125000 0.875000 -vt 0.125000 0.812500 -vt 0.125000 0.750000 -vt 0.125000 0.687500 -vt 0.125000 0.625000 -vt 0.125000 0.562500 -vt 0.125000 0.500000 -vt 0.125000 0.437500 -vt 0.125000 0.375000 -vt 0.125000 0.312500 -vt 0.125000 0.250000 -vt 0.125000 0.187500 -vt 0.125000 0.125000 -vt 0.125000 0.062500 -vt 0.062500 0.937500 -vt 0.062500 0.875000 -vt 0.062500 0.812500 -vt 0.062500 0.750000 -vt 0.062500 0.687500 -vt 0.062500 0.625000 -vt 0.062500 0.562500 -vt 0.062500 0.500000 -vt 0.062500 0.437500 -vt 0.062500 0.375000 -vt 0.062500 0.312500 -vt 0.062500 0.250000 -vt 0.062500 0.187500 -vt 0.062500 0.125000 -vt 0.062500 0.062500 -vt 0.000000 0.937500 -vt 1.000000 0.937500 -vt -0.000000 0.875000 -vt 1.000000 0.875000 -vt 0.000000 0.812500 -vt 1.000000 0.812500 -vt 0.000000 0.750000 -vt 1.000000 0.750000 -vt 0.000000 0.687500 -vt 1.000000 0.687500 -vt 0.000000 0.625000 -vt 1.000000 0.625000 -vt 0.000000 0.562500 -vt 1.000000 0.562500 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 1.000000 0.437500 -vt 0.000000 0.437500 -vt 1.000000 0.375000 -vt 0.000000 0.375000 -vt 1.000000 0.312500 -vt 0.000000 0.312500 -vt 1.000000 0.250000 -vt 0.000000 0.250000 -vt 1.000000 0.187500 -vt 0.000000 0.187500 -vt 1.000000 0.125000 -vt -0.000000 0.125000 -vt 1.000000 0.062500 -vt 0.000000 0.062500 -vt 0.937500 0.937500 -vt 0.937500 0.875000 -vt 0.937500 0.812500 -vt 0.937500 0.750000 -vt 0.937500 0.687500 -vt 0.937500 0.625000 -vt 0.937500 0.562500 -vt 0.937500 0.500000 -vt 0.937500 0.437500 -vt 0.937500 0.375000 -vt 0.937500 0.312500 -vt 0.937500 0.250000 -vt 0.937500 0.187500 -vt 0.937500 0.125000 -vt 0.937500 0.062500 -vt 0.875000 0.937500 -vt 0.875000 0.875000 -vt 0.875000 0.812500 -vt 0.875000 0.750000 -vt 0.875000 0.687500 -vt 0.875000 0.625000 -vt 0.875000 0.562500 -vt 0.875000 0.500000 -vt 0.875000 0.437500 -vt 0.875000 0.375000 -vt 0.875000 0.312500 -vt 0.875000 0.250000 -vt 0.875000 0.187500 -vt 0.875000 0.125000 -vt 0.875000 0.062500 -vt 0.812500 0.937500 -vt 0.812500 0.875000 -vt 0.812500 0.812500 -vt 0.812500 0.750000 -vt 0.812500 0.687500 -vt 0.812500 0.625000 -vt 0.812500 0.562500 -vt 0.812500 0.500000 -vt 0.812500 0.437500 -vt 0.812500 0.375000 -vt 0.812500 0.312500 -vt 0.812500 0.250000 -vt 0.812500 0.187500 -vt 0.812500 0.125000 -vt 0.812500 0.062500 -vt 0.750000 0.937500 -vt 0.750000 0.875000 -vt 0.750000 0.812500 -vt 0.750000 0.750000 -vt 0.750000 0.687500 -vt 0.750000 0.625000 -vt 0.750000 0.562500 -vt 0.750000 0.500000 -vt 0.750000 0.437500 -vt 0.750000 0.375000 -vt 0.750000 0.312500 -vt 0.750000 0.250000 -vt 0.750000 0.187500 -vt 0.750000 0.125000 -vt 0.750000 0.062500 -vt 0.687500 0.937500 -vt 0.687500 0.875000 -vt 0.687500 0.812500 -vt 0.687500 0.750000 -vt 0.687500 0.687500 -vt 0.687500 0.625000 -vt 0.687500 0.562500 -vt 0.687500 0.500000 -vt 0.687500 0.437500 -vt 0.687500 0.375000 -vt 0.687500 0.312500 -vt 0.687500 0.250000 -vt 0.687500 0.187500 -vt 0.687500 0.125000 -vt 0.687500 0.062500 -vt 0.625000 0.937500 -vt 0.625000 0.875000 -vt 0.625000 0.812500 -vt 0.625000 0.750000 -vt 0.625000 0.687500 -vt 0.625000 0.625000 -vt 0.625000 0.562500 -vt 0.625000 0.500000 -vt 0.625000 0.437500 -vt 0.625000 0.375000 -vt 0.625000 0.312500 -vt 0.625000 0.250000 -vt 0.625000 0.187500 -vt 0.625000 0.125000 -vt 0.625000 0.062500 -vt 0.562500 0.937500 -vt 0.562500 0.875000 -vt 0.562500 0.812500 -vt 0.562500 0.750000 -vt 0.562500 0.687500 -vt 0.562500 0.625000 -vt 0.562500 0.562500 -vt 0.562500 0.500000 -vt 0.562500 0.437500 -vt 0.562500 0.375000 -vt 0.562500 0.312500 -vt 0.562500 0.250000 -vt 0.562500 0.187500 -vt 0.562500 0.125000 -vt 0.562500 0.062500 -vt 0.500000 0.937500 -vt 0.500000 0.875000 -vt 0.500000 0.812500 -vt 0.500000 0.750000 -vt 0.500000 0.687500 -vt 0.500000 0.625000 -vt 0.500000 0.562500 -vt 0.500000 0.500000 -vt 0.500000 0.437500 -vt 0.500000 0.375000 -vt 0.500000 0.312500 -vt 0.500000 0.250000 -vt 0.500000 0.187500 -vt 0.500000 0.125000 -vt 0.500000 0.062500 -vt 0.468750 1.000000 -vt 0.406250 1.000000 -vt 0.343750 1.000000 -vt 0.281250 1.000000 -vt 0.218750 1.000000 -vt 0.156250 1.000000 -vt 0.093750 1.000000 -vt 0.031250 1.000000 -vt 0.968750 1.000000 -vt 0.906250 1.000000 -vt 0.843750 1.000000 -vt 0.781250 1.000000 -vt 0.718750 1.000000 -vt 0.656250 1.000000 -vt 0.593750 1.000000 -vt 0.531250 1.000000 -vt 0.437500 0.937500 -vt 0.437500 0.875000 -vt 0.437500 0.812500 -vt 0.437500 0.750000 -vt 0.437500 0.687500 -vt 0.437500 0.625000 -vt 0.437500 0.562500 -vt 0.437500 0.500000 -vt 0.437500 0.437500 -vt 0.437500 0.375000 -vt 0.437500 0.312500 -vt 0.437500 0.250000 -vt 0.437500 0.187500 -vt 0.437500 0.125000 -vt 0.437500 0.062500 -vt 0.375000 0.937500 -vt 0.375000 0.875000 -vt 0.375000 0.812500 -vt 0.375000 0.750000 -vt 0.375000 0.687500 -vt 0.375000 0.625000 -vt 0.375000 0.562500 -vt 0.375000 0.500000 -vt 0.375000 0.437500 -vt 0.375000 0.375000 -vt 0.375000 0.312500 -vt 0.375000 0.250000 -vt 0.375000 0.187500 -vt 0.375000 0.125000 -vt 0.375000 0.062500 -vt 0.312500 0.937500 -vt 0.312500 0.875000 -vt 0.312500 0.812500 -vt 0.312500 0.750000 -vt 0.312500 0.687500 -vt 0.312500 0.625000 -vt 0.312500 0.562500 -vt 0.312500 0.500000 -vt 0.312500 0.437500 -vt 0.312500 0.375000 -vt 0.312500 0.312500 -vt 0.312500 0.250000 -vt 0.312500 0.187500 -vt 0.312500 0.125000 -vt 0.312500 0.062500 -vt 0.250000 0.937500 -vt 0.250000 0.875000 -vt 0.250000 0.812500 -vt 0.250000 0.750000 -vt 0.250000 0.687500 -vt 0.250000 0.625000 -vt 0.250000 0.562500 -vt 0.250000 0.500000 -vt 0.250000 0.437500 -vt 0.250000 0.375000 -vt 0.250000 0.312500 -vt 0.250000 0.250000 -vt 0.250000 0.187500 -vt 0.250000 0.125000 -vt 0.250000 0.062500 -vt 0.187500 0.937500 -vt 0.187500 0.875000 -vt 0.187500 0.812500 -vt 0.187500 0.750000 -vt 0.187500 0.687500 -vt 0.187500 0.625000 -vt 0.187500 0.562500 -vt 0.187500 0.500000 -vt 0.187500 0.437500 -vt 0.187500 0.375000 -vt 0.187500 0.312500 -vt 0.187500 0.250000 -vt 0.187500 0.187500 -vt 0.187500 0.125000 -vt 0.187500 0.062500 -vt 0.125000 0.937500 -vt 0.125000 0.875000 -vt 0.125000 0.812500 -vt 0.125000 0.750000 -vt 0.125000 0.687500 -vt 0.125000 0.625000 -vt 0.125000 0.562500 -vt 0.125000 0.500000 -vt 0.125000 0.437500 -vt 0.125000 0.375000 -vt 0.125000 0.312500 -vt 0.125000 0.250000 -vt 0.125000 0.187500 -vt 0.125000 0.125000 -vt 0.125000 0.062500 -vt 0.062500 0.937500 -vt 0.062500 0.875000 -vt 0.062500 0.812500 -vt 0.062500 0.750000 -vt 0.062500 0.687500 -vt 0.062500 0.625000 -vt 0.062500 0.562500 -vt 0.062500 0.500000 -vt 0.062500 0.437500 -vt 0.062500 0.375000 -vt 0.062500 0.312500 -vt 0.062500 0.250000 -vt 0.062500 0.187500 -vt 0.062500 0.125000 -vt 0.062500 0.062500 -vt 0.000000 0.937500 -vt 1.000000 0.937500 -vt 0.000000 0.875000 -vt 1.000000 0.875000 -vt 0.000000 0.812500 -vt 1.000000 0.812500 -vt 0.000000 0.750000 -vt 1.000000 0.750000 -vt 0.000000 0.687500 -vt 1.000000 0.687500 -vt 0.000000 0.625000 -vt 1.000000 0.625000 -vt 0.000000 0.562500 -vt 1.000000 0.562500 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 1.000000 0.437500 -vt 0.000000 0.437500 -vt 1.000000 0.375000 -vt 0.000000 0.375000 -vt 1.000000 0.312500 -vt 0.000000 0.312500 -vt 1.000000 0.250000 -vt 0.000000 0.250000 -vt 1.000000 0.187500 -vt 0.000000 0.187500 -vt 1.000000 0.125000 -vt 0.000000 0.125000 -vt 1.000000 0.062500 -vt 0.000000 0.062500 -vt 0.937500 0.937500 -vt 0.937500 0.875000 -vt 0.937500 0.812500 -vt 0.937500 0.750000 -vt 0.937500 0.687500 -vt 0.937500 0.625000 -vt 0.937500 0.562500 -vt 0.937500 0.500000 -vt 0.937500 0.437500 -vt 0.937500 0.375000 -vt 0.937500 0.312500 -vt 0.937500 0.250000 -vt 0.937500 0.187500 -vt 0.937500 0.125000 -vt 0.937500 0.062500 -vt 0.875000 0.937500 -vt 0.875000 0.875000 -vt 0.875000 0.812500 -vt 0.875000 0.750000 -vt 0.875000 0.687500 -vt 0.875000 0.625000 -vt 0.875000 0.562500 -vt 0.875000 0.500000 -vt 0.875000 0.437500 -vt 0.875000 0.375000 -vt 0.875000 0.312500 -vt 0.875000 0.250000 -vt 0.875000 0.187500 -vt 0.875000 0.125000 -vt 0.875000 0.062500 -vt 0.812500 0.937500 -vt 0.812500 0.875000 -vt 0.812500 0.812500 -vt 0.812500 0.750000 -vt 0.812500 0.687500 -vt 0.812500 0.625000 -vt 0.812500 0.562500 -vt 0.812500 0.500000 -vt 0.812500 0.437500 -vt 0.812500 0.375000 -vt 0.812500 0.312500 -vt 0.812500 0.250000 -vt 0.812500 0.187500 -vt 0.812500 0.125000 -vt 0.812500 0.062500 -vt 0.750000 0.937500 -vt 0.750000 0.875000 -vt 0.750000 0.812500 -vt 0.750000 0.750000 -vt 0.750000 0.687500 -vt 0.750000 0.625000 -vt 0.750000 0.562500 -vt 0.750000 0.500000 -vt 0.750000 0.437500 -vt 0.750000 0.375000 -vt 0.750000 0.312500 -vt 0.750000 0.250000 -vt 0.750000 0.187500 -vt 0.750000 0.125000 -vt 0.750000 0.062500 -vt 0.687500 0.937500 -vt 0.687500 0.875000 -vt 0.687500 0.812500 -vt 0.687500 0.750000 -vt 0.687500 0.687500 -vt 0.687500 0.625000 -vt 0.687500 0.562500 -vt 0.687500 0.500000 -vt 0.687500 0.437500 -vt 0.687500 0.375000 -vt 0.687500 0.312500 -vt 0.687500 0.250000 -vt 0.687500 0.187500 -vt 0.687500 0.125000 -vt 0.687500 0.062500 -vt 0.625000 0.937500 -vt 0.625000 0.875000 -vt 0.625000 0.812500 -vt 0.625000 0.750000 -vt 0.625000 0.687500 -vt 0.625000 0.625000 -vt 0.625000 0.562500 -vt 0.625000 0.500000 -vt 0.625000 0.437500 -vt 0.625000 0.375000 -vt 0.625000 0.312500 -vt 0.625000 0.250000 -vt 0.625000 0.187500 -vt 0.625000 0.125000 -vt 0.625000 0.062500 -vt 0.562500 0.937500 -vt 0.562500 0.875000 -vt 0.562500 0.812500 -vt 0.562500 0.750000 -vt 0.562500 0.687500 -vt 0.562500 0.625000 -vt 0.562500 0.562500 -vt 0.562500 0.500000 -vt 0.562500 0.437500 -vt 0.562500 0.375000 -vt 0.562500 0.312500 -vt 0.562500 0.250000 -vt 0.562500 0.187500 -vt 0.562500 0.125000 -vt 0.562500 0.062500 -vt 0.500000 0.937500 -vt 0.500000 0.875000 -vt 0.500000 0.687500 -vt 0.500000 0.250000 -vt 0.500000 0.125000 -vt 0.500000 0.062500 -s 1 -f 9/9/1 23/23/2 481/541/3 -f 4/4/4 15/15/5 16/16/6 -f 481/541/3 24/24/7 482/542/8 -f 5/5/9 16/16/6 17/17/10 -f 477/537/11 251/281/12 10/10/13 -f 55/55/14 482/542/8 24/24/7 -f 5/5/9 18/18/15 6/6/16 -f 478/538/17 10/10/13 11/11/18 -f 6/6/16 19/19/19 7/7/20 -f 1/1/21 11/11/18 12/12/22 -f 7/7/20 20/20/23 8/8/24 -f 2/2/25 12/12/22 13/13/26 -f 8/8/24 21/21/27 480/540/28 -f 479/539/29 13/13/26 14/14/30 -f 480/540/28 22/22/31 9/9/1 -f 3/3/32 14/14/30 15/15/5 -f 21/21/27 37/37/33 22/22/31 -f 15/15/5 29/29/34 30/30/35 -f 22/22/31 38/38/36 23/23/2 -f 16/16/6 30/30/35 31/31/37 -f 23/23/2 39/39/38 24/24/7 -f 17/17/10 31/31/37 32/32/39 -f 10/10/13 251/282/12 25/25/40 -f 55/56/14 24/24/7 39/39/38 -f 17/17/10 33/33/41 18/18/15 -f 11/11/18 25/25/40 26/26/42 -f 18/18/15 34/34/43 19/19/19 -f 12/12/22 26/26/42 27/27/44 -f 19/19/19 35/35/45 20/20/23 -f 13/13/26 27/27/44 28/28/46 -f 20/20/23 36/36/47 21/21/27 -f 14/14/30 28/28/46 29/29/34 -f 26/26/42 40/40/48 41/41/49 -f 33/33/41 49/49/50 34/34/43 -f 27/27/44 41/41/49 42/42/51 -f 34/34/43 50/50/52 35/35/45 -f 28/28/46 42/42/51 43/43/53 -f 35/35/45 51/51/54 36/36/47 -f 29/29/34 43/43/53 44/44/55 -f 36/36/47 52/52/56 37/37/33 -f 30/30/35 44/44/55 45/45/57 -f 37/37/33 53/53/58 38/38/36 -f 31/31/37 45/45/57 46/46/59 -f 38/38/36 54/54/60 39/39/38 -f 32/32/39 46/46/59 47/47/61 -f 25/25/40 251/283/12 40/40/48 -f 55/57/14 39/39/38 54/54/60 -f 32/32/39 48/48/62 33/33/41 -f 45/45/57 60/75/63 61/76/64 -f 52/52/56 69/84/65 53/53/58 -f 46/46/59 61/76/64 62/77/66 -f 53/53/58 70/85/67 54/54/60 -f 47/47/61 62/77/66 63/78/68 -f 40/40/48 251/284/12 56/71/69 -f 55/58/14 54/54/60 70/85/67 -f 47/47/61 64/79/70 48/48/62 -f 41/41/49 56/71/69 57/72/71 -f 48/48/62 65/80/72 49/49/50 -f 42/42/51 57/72/71 58/73/73 -f 49/49/50 66/81/74 50/50/52 -f 43/43/53 58/73/73 59/74/75 -f 50/50/52 67/82/76 51/51/54 -f 44/44/55 59/74/75 60/75/63 -f 51/51/54 68/83/77 52/52/56 -f 64/79/70 80/95/78 65/80/72 -f 58/73/73 72/87/79 73/88/80 -f 65/80/72 81/96/81 66/81/74 -f 59/74/75 73/88/80 74/89/82 -f 66/81/74 82/97/83 67/82/76 -f 60/75/63 74/89/82 75/90/84 -f 67/82/76 83/98/85 68/83/77 -f 61/76/64 75/90/84 76/91/86 -f 68/83/77 84/99/87 69/84/65 -f 62/77/66 76/91/86 77/92/88 -f 69/84/65 85/100/89 70/85/67 -f 63/78/68 77/92/88 78/93/90 -f 56/71/69 251/285/12 71/86/91 -f 55/59/14 70/85/67 85/100/89 -f 63/78/68 79/94/92 64/79/70 -f 57/72/71 71/86/91 72/87/79 -f 83/98/85 99/114/93 84/99/87 -f 77/92/88 91/106/94 92/107/95 -f 84/99/87 100/115/96 85/100/89 -f 78/93/90 92/107/95 93/108/97 -f 71/86/91 251/286/12 86/101/98 -f 55/60/14 85/100/89 100/115/96 -f 78/93/90 94/109/99 79/94/92 -f 72/87/79 86/101/98 87/102/100 -f 79/94/92 95/110/101 80/95/78 -f 73/88/80 87/102/100 88/103/102 -f 80/95/78 96/111/103 81/96/81 -f 74/89/82 88/103/102 89/104/104 -f 81/96/81 97/112/105 82/97/83 -f 75/90/84 89/104/104 90/105/106 -f 82/97/83 98/113/107 83/98/85 -f 76/91/86 90/105/106 91/106/94 -f 95/110/101 111/126/108 96/111/103 -f 89/104/104 103/118/109 104/119/110 -f 96/111/103 112/127/111 97/112/105 -f 90/105/106 104/119/110 105/120/112 -f 97/112/105 113/128/113 98/113/107 -f 91/106/94 105/120/112 106/121/114 -f 98/113/107 114/129/115 99/114/93 -f 92/107/95 106/121/114 107/122/116 -f 99/114/93 115/130/117 100/115/96 -f 93/108/97 107/122/116 108/123/118 -f 86/101/98 251/287/12 101/116/119 -f 55/61/14 100/115/96 115/130/117 -f 93/108/97 109/124/120 94/109/99 -f 87/102/100 101/116/119 102/117/121 -f 94/109/99 110/125/122 95/110/101 -f 88/103/102 102/117/121 103/118/109 -f 114/129/115 130/160/123 115/130/117 -f 108/123/118 122/143/124 123/146/125 -f 101/116/119 251/288/12 116/131/126 -f 55/62/14 115/130/117 130/160/123 -f 108/123/118 124/148/127 109/124/120 -f 102/117/121 116/131/126 117/133/128 -f 109/124/120 125/150/129 110/125/122 -f 103/118/109 117/133/128 118/135/130 -f 110/125/122 126/152/131 111/126/108 -f 104/119/110 118/135/130 119/137/132 -f 111/126/108 127/154/133 112/127/111 -f 105/120/112 119/137/132 120/139/134 -f 112/127/111 128/156/135 113/128/113 -f 106/121/114 120/139/134 121/141/136 -f 113/128/113 129/158/137 114/129/115 -f 107/122/116 121/141/136 122/143/124 -f 118/136/130 134/164/138 119/138/132 -f 127/153/133 141/171/139 142/172/140 -f 119/138/132 135/165/141 120/140/134 -f 128/155/135 142/172/140 143/173/142 -f 120/140/134 136/166/143 121/142/136 -f 129/157/137 143/173/142 144/174/144 -f 121/142/136 137/167/145 122/144/124 -f 130/159/123 144/174/144 145/175/146 -f 122/144/124 138/168/147 123/145/125 -f 116/132/126 251/289/12 131/161/148 -f 55/63/14 130/159/123 145/175/146 -f 124/147/127 138/168/147 139/169/149 -f 116/132/126 132/162/150 117/134/128 -f 125/149/129 139/169/149 140/170/151 -f 117/134/128 133/163/152 118/136/130 -f 126/151/131 140/170/151 141/171/139 -f 137/167/145 153/183/153 138/168/147 -f 131/161/148 251/290/12 146/176/154 -f 55/64/14 145/175/146 160/190/155 -f 139/169/149 153/183/153 154/184/156 -f 131/161/148 147/177/157 132/162/150 -f 140/170/151 154/184/156 155/185/158 -f 132/162/150 148/178/159 133/163/152 -f 141/171/139 155/185/158 156/186/160 -f 133/163/152 149/179/161 134/164/138 -f 142/172/140 156/186/160 157/187/162 -f 134/164/138 150/180/163 135/165/141 -f 143/173/142 157/187/162 158/188/164 -f 135/165/141 151/181/165 136/166/143 -f 144/174/144 158/188/164 159/189/166 -f 136/166/143 152/182/167 137/167/145 -f 145/175/146 159/189/166 160/190/155 -f 157/187/162 171/201/168 172/202/169 -f 149/179/161 165/195/170 150/180/163 -f 158/188/164 172/202/169 173/203/171 -f 150/180/163 166/196/172 151/181/165 -f 159/189/166 173/203/171 174/204/173 -f 151/181/165 167/197/174 152/182/167 -f 160/190/155 174/204/173 175/205/175 -f 152/182/167 168/198/176 153/183/153 -f 146/176/154 251/291/12 161/191/177 -f 55/65/14 160/190/155 175/205/175 -f 154/184/156 168/198/176 169/199/178 -f 146/176/154 162/192/179 147/177/157 -f 155/185/158 169/199/178 170/200/180 -f 147/177/157 163/193/181 148/178/159 -f 156/186/160 170/200/180 171/201/168 -f 148/178/159 164/194/182 149/179/161 -f 161/191/177 251/292/12 176/206/183 -f 55/66/14 175/205/175 190/220/184 -f 169/199/178 183/213/185 184/214/186 -f 161/191/177 177/207/187 162/192/179 -f 170/200/180 184/214/186 185/215/188 -f 162/192/179 178/208/189 163/193/181 -f 171/201/168 185/215/188 186/216/190 -f 163/193/181 179/209/191 164/194/182 -f 172/202/169 186/216/190 187/217/192 -f 164/194/182 180/210/193 165/195/170 -f 173/203/171 187/217/192 188/218/194 -f 165/195/170 181/211/195 166/196/172 -f 174/204/173 188/218/194 189/219/196 -f 166/196/172 182/212/197 167/197/174 -f 175/205/175 189/219/196 190/220/184 -f 167/197/174 183/213/185 168/198/176 -f 179/209/191 195/225/198 180/210/193 -f 188/218/194 202/232/199 203/233/200 -f 180/210/193 196/226/201 181/211/195 -f 189/219/196 203/233/200 204/234/202 -f 181/211/195 197/227/203 182/212/197 -f 190/220/184 204/234/202 205/235/204 -f 182/212/197 198/228/205 183/213/185 -f 176/206/183 251/293/12 191/221/206 -f 55/67/14 190/220/184 205/235/204 -f 184/214/186 198/228/205 199/229/207 -f 176/206/183 192/222/208 177/207/187 -f 185/215/188 199/229/207 200/230/209 -f 177/207/187 193/223/210 178/208/189 -f 186/216/190 200/230/209 201/231/211 -f 178/208/189 194/224/212 179/209/191 -f 187/217/192 201/231/211 202/232/199 -f 199/229/207 213/243/213 214/244/214 -f 191/221/206 207/237/215 192/222/208 -f 200/230/209 214/244/214 215/245/216 -f 192/222/208 208/238/217 193/223/210 -f 201/231/211 215/245/216 216/246/218 -f 193/223/210 209/239/219 194/224/212 -f 202/232/199 216/246/218 217/247/220 -f 194/224/212 210/240/221 195/225/198 -f 203/233/200 217/247/220 218/248/222 -f 195/225/198 211/241/223 196/226/201 -f 204/234/202 218/248/222 219/249/224 -f 196/226/201 212/242/225 197/227/203 -f 205/235/204 219/249/224 220/250/226 -f 197/227/203 213/243/213 198/228/205 -f 191/221/206 251/294/12 206/236/227 -f 55/68/14 205/235/204 220/250/226 -f 218/248/222 232/262/228 233/263/229 -f 210/240/221 226/256/230 211/241/223 -f 219/249/224 233/263/229 234/264/231 -f 211/241/223 227/257/232 212/242/225 -f 220/250/226 234/264/231 235/265/233 -f 212/242/225 228/258/234 213/243/213 -f 206/236/227 251/295/12 221/251/235 -f 55/69/14 220/250/226 235/265/233 -f 214/244/214 228/258/234 229/259/236 -f 206/236/227 222/252/237 207/237/215 -f 215/245/216 229/259/236 230/260/238 -f 207/237/215 223/253/239 208/238/217 -f 216/246/218 230/260/238 231/261/240 -f 208/238/217 224/254/241 209/239/219 -f 217/247/220 231/261/240 232/262/228 -f 209/239/219 225/255/242 210/240/221 -f 230/260/238 244/274/243 245/275/244 -f 222/252/237 238/268/245 223/253/239 -f 231/261/240 245/275/244 246/276/246 -f 223/253/239 239/269/247 224/254/241 -f 232/262/228 246/276/246 247/277/248 -f 224/254/241 240/270/249 225/255/242 -f 233/263/229 247/277/248 248/278/250 -f 225/255/242 241/271/251 226/256/230 -f 234/264/231 248/278/250 249/279/252 -f 226/256/230 242/272/253 227/257/232 -f 235/265/233 249/279/252 250/280/254 -f 227/257/232 243/273/255 228/258/234 -f 221/251/235 251/296/12 236/266/256 -f 55/70/14 235/265/233 250/280/254 -f 229/259/236 243/273/255 244/274/243 -f 221/251/235 237/267/257 222/252/237 -f 248/278/250 265/310/258 249/279/252 -f 242/272/253 257/302/259 258/303/260 -f 249/279/252 266/311/261 250/280/254 -f 243/273/255 258/303/260 259/304/262 -f 236/266/256 251/281/12 252/297/263 -f 55/55/14 250/280/254 266/311/261 -f 243/273/255 260/305/264 244/274/243 -f 237/267/257 252/297/263 253/298/265 -f 244/274/243 261/306/266 245/275/244 -f 238/268/245 253/298/265 254/299/267 -f 245/275/244 262/307/268 246/276/246 -f 239/269/247 254/299/267 255/300/269 -f 246/276/246 263/308/270 247/277/248 -f 240/270/249 255/300/269 256/301/271 -f 247/277/248 264/309/272 248/278/250 -f 241/271/251 256/301/271 257/302/259 -f 254/299/267 268/313/273 269/314/274 -f 261/306/266 277/322/275 262/307/268 -f 255/300/269 269/314/274 270/315/276 -f 262/307/268 278/323/277 263/308/270 -f 256/301/271 270/315/276 271/316/278 -f 263/308/270 279/324/279 264/309/272 -f 257/302/259 271/316/278 272/317/280 -f 264/309/272 280/325/281 265/310/258 -f 258/303/260 272/317/280 273/318/282 -f 265/310/258 281/326/283 266/311/261 -f 259/304/262 273/318/282 274/319/284 -f 252/297/263 251/282/12 267/312/285 -f 55/56/14 266/311/261 281/326/283 -f 259/304/262 275/320/286 260/305/264 -f 253/298/265 267/312/285 268/313/273 -f 260/305/264 276/321/287 261/306/266 -f 273/318/282 287/332/288 288/333/289 -f 280/325/281 296/341/290 281/326/283 -f 274/319/284 288/333/289 289/334/291 -f 267/312/285 251/283/12 282/327/292 -f 55/57/14 281/326/283 296/341/290 -f 274/319/284 290/335/293 275/320/286 -f 268/313/273 282/327/292 283/328/294 -f 275/320/286 291/336/295 276/321/287 -f 269/314/274 283/328/294 284/329/296 -f 276/321/287 292/337/297 277/322/275 -f 270/315/276 284/329/296 285/330/298 -f 277/322/275 293/338/299 278/323/277 -f 271/316/278 285/330/298 286/331/300 -f 278/323/277 294/339/301 279/324/279 -f 272/317/280 286/331/300 287/332/288 -f 279/324/279 295/340/302 280/325/281 -f 291/336/295 307/352/303 292/337/297 -f 285/330/298 299/344/304 300/345/305 -f 292/337/297 308/353/306 293/338/299 -f 286/331/300 300/345/305 301/346/307 -f 293/338/299 309/354/308 294/339/301 -f 287/332/288 301/346/307 302/347/309 -f 294/339/301 310/355/310 295/340/302 -f 288/333/289 302/347/309 303/348/311 -f 295/340/302 311/356/312 296/341/290 -f 289/334/291 303/348/311 304/349/313 -f 282/327/292 251/284/12 297/342/314 -f 55/58/14 296/341/290 311/356/312 -f 289/334/291 305/350/315 290/335/293 -f 283/328/294 297/342/314 298/343/316 -f 290/335/293 306/351/317 291/336/295 -f 284/329/296 298/343/316 299/344/304 -f 310/355/310 326/371/318 311/356/312 -f 304/349/313 318/363/319 319/364/320 -f 297/342/314 251/285/12 312/357/321 -f 55/59/14 311/356/312 326/371/318 -f 304/349/313 320/365/322 305/350/315 -f 298/343/316 312/357/321 313/358/323 -f 305/350/315 321/366/324 306/351/317 -f 299/344/304 313/358/323 314/359/325 -f 306/351/317 322/367/326 307/352/303 -f 300/345/305 314/359/325 315/360/327 -f 307/352/303 323/368/328 308/353/306 -f 301/346/307 315/360/327 316/361/329 -f 308/353/306 324/369/330 309/354/308 -f 302/347/309 316/361/329 317/362/331 -f 309/354/308 325/370/332 310/355/310 -f 303/348/311 317/362/331 318/363/319 -f 315/360/327 329/374/333 330/375/334 -f 322/367/326 338/383/335 323/368/328 -f 316/361/329 330/375/334 331/376/336 -f 323/368/328 339/384/337 324/369/330 -f 317/362/331 331/376/336 332/377/338 -f 324/369/330 340/385/339 325/370/332 -f 318/363/319 332/377/338 333/378/340 -f 325/370/332 341/386/341 326/371/318 -f 319/364/320 333/378/340 334/379/342 -f 312/357/321 251/286/12 327/372/343 -f 55/60/14 326/371/318 341/386/341 -f 319/364/320 335/380/344 320/365/322 -f 313/358/323 327/372/343 328/373/345 -f 320/365/322 336/381/346 321/366/324 -f 314/359/325 328/373/345 329/374/333 -f 321/366/324 337/382/347 322/367/326 -f 334/379/342 348/393/348 349/394/349 -f 327/372/343 251/287/12 342/387/350 -f 55/61/14 341/386/341 356/401/351 -f 334/379/342 350/395/352 335/380/344 -f 328/373/345 342/387/350 343/388/353 -f 335/380/344 351/396/354 336/381/346 -f 329/374/333 343/388/353 344/389/355 -f 336/381/346 352/397/356 337/382/347 -f 330/375/334 344/389/355 345/390/357 -f 337/382/347 353/398/358 338/383/335 -f 331/376/336 345/390/357 346/391/359 -f 338/383/335 354/399/360 339/384/337 -f 332/377/338 346/391/359 347/392/361 -f 339/384/337 355/400/362 340/385/339 -f 333/378/340 347/392/361 348/393/348 -f 340/385/339 356/401/351 341/386/341 -f 352/397/356 368/425/363 353/398/358 -f 346/391/359 360/408/364 361/410/365 -f 353/398/358 369/427/366 354/399/360 -f 347/392/361 361/410/365 362/412/367 -f 354/399/360 370/429/368 355/400/362 -f 348/393/348 362/412/367 363/414/369 -f 355/400/362 371/431/370 356/401/351 -f 349/394/349 363/414/369 364/417/371 -f 342/387/350 251/288/12 357/402/372 -f 55/62/14 356/401/351 371/431/370 -f 349/394/349 365/419/373 350/395/352 -f 343/388/353 357/402/372 358/404/374 -f 350/395/352 366/421/375 351/396/354 -f 344/389/355 358/404/374 359/406/376 -f 351/396/354 367/423/377 352/397/356 -f 345/390/357 359/406/376 360/408/364 -f 55/63/14 371/430/370 386/446/378 -f 365/418/373 379/439/379 380/440/380 -f 357/403/372 373/433/381 358/405/374 -f 366/420/375 380/440/380 381/441/382 -f 358/405/374 374/434/383 359/407/376 -f 367/422/377 381/441/382 382/442/384 -f 359/407/376 375/435/385 360/409/364 -f 368/424/363 382/442/384 383/443/386 -f 360/409/364 376/436/387 361/411/365 -f 369/426/366 383/443/386 384/444/388 -f 361/411/365 377/437/389 362/413/367 -f 370/428/368 384/444/388 385/445/390 -f 362/413/367 378/438/391 363/415/369 -f 371/430/370 385/445/390 386/446/378 -f 363/415/369 379/439/379 364/416/371 -f 357/403/372 251/289/12 372/432/392 -f 384/444/388 398/458/393 399/459/394 -f 376/436/387 392/452/395 377/437/389 -f 385/445/390 399/459/394 400/460/396 -f 377/437/389 393/453/397 378/438/391 -f 386/446/378 400/460/396 401/461/398 -f 378/438/391 394/454/399 379/439/379 -f 372/432/392 251/290/12 387/447/400 -f 55/64/14 386/446/378 401/461/398 -f 380/440/380 394/454/399 395/455/401 -f 372/432/392 388/448/402 373/433/381 -f 381/441/382 395/455/401 396/456/403 -f 373/433/381 389/449/404 374/434/383 -f 382/442/384 396/456/403 397/457/405 -f 374/434/383 390/450/406 375/435/385 -f 383/443/386 397/457/405 398/458/393 -f 375/435/385 391/451/407 376/436/387 -f 387/447/400 403/463/408 388/448/402 -f 396/456/403 410/470/409 411/471/410 -f 388/448/402 404/464/411 389/449/404 -f 397/457/405 411/471/410 412/472/412 -f 389/449/404 405/465/413 390/450/406 -f 398/458/393 412/472/412 413/473/414 -f 390/450/406 406/466/415 391/451/407 -f 399/459/394 413/473/414 414/474/416 -f 391/451/407 407/467/417 392/452/395 -f 400/460/396 414/474/416 415/475/418 -f 392/452/395 408/468/419 393/453/397 -f 401/461/398 415/475/418 416/476/420 -f 393/453/397 409/469/421 394/454/399 -f 387/447/400 251/291/12 402/462/422 -f 55/65/14 401/461/398 416/476/420 -f 395/455/401 409/469/421 410/470/409 -f 406/466/415 422/482/423 407/467/417 -f 415/475/418 429/489/424 430/490/425 -f 407/467/417 423/483/426 408/468/419 -f 416/476/420 430/490/425 431/491/427 -f 408/468/419 424/484/428 409/469/421 -f 402/462/422 251/292/12 417/477/429 -f 55/66/14 416/476/420 431/491/427 -f 410/470/409 424/484/428 425/485/430 -f 402/462/422 418/478/431 403/463/408 -f 411/471/410 425/485/430 426/486/432 -f 403/463/408 419/479/433 404/464/411 -f 412/472/412 426/486/432 427/487/434 -f 404/464/411 420/480/435 405/465/413 -f 413/473/414 427/487/434 428/488/436 -f 405/465/413 421/481/437 406/466/415 -f 414/474/416 428/488/436 429/489/424 -f 426/486/432 440/500/438 441/501/439 -f 418/478/431 434/494/440 419/479/433 -f 427/487/434 441/501/439 442/502/441 -f 419/479/433 435/495/442 420/480/435 -f 428/488/436 442/502/441 443/503/443 -f 420/480/435 436/496/444 421/481/437 -f 429/489/424 443/503/443 444/504/445 -f 421/481/437 437/497/446 422/482/423 -f 430/490/425 444/504/445 445/505/447 -f 422/482/423 438/498/448 423/483/426 -f 431/491/427 445/505/447 446/506/449 -f 423/483/426 439/499/450 424/484/428 -f 417/477/429 251/293/12 432/492/451 -f 55/67/14 431/491/427 446/506/449 -f 425/485/430 439/499/450 440/500/438 -f 417/477/429 433/493/452 418/478/431 -f 445/505/447 459/519/453 460/520/454 -f 437/497/446 453/513/455 438/498/448 -f 446/506/449 460/520/454 461/521/456 -f 438/498/448 454/514/457 439/499/450 -f 432/492/451 251/294/12 447/507/458 -f 55/68/14 446/506/449 461/521/456 -f 440/500/438 454/514/457 455/515/459 -f 432/492/451 448/508/460 433/493/452 -f 441/501/439 455/515/459 456/516/461 -f 433/493/452 449/509/462 434/494/440 -f 442/502/441 456/516/461 457/517/463 -f 434/494/440 450/510/464 435/495/442 -f 443/503/443 457/517/463 458/518/465 -f 435/495/442 451/511/466 436/496/444 -f 444/504/445 458/518/465 459/519/453 -f 436/496/444 452/512/467 437/497/446 -f 448/508/460 464/524/468 449/509/462 -f 457/517/463 471/531/469 472/532/470 -f 449/509/462 465/525/471 450/510/464 -f 458/518/465 472/532/470 473/533/472 -f 450/510/464 466/526/473 451/511/466 -f 459/519/453 473/533/472 474/534/474 -f 451/511/466 467/527/475 452/512/467 -f 460/520/454 474/534/474 475/535/476 -f 452/512/467 468/528/477 453/513/455 -f 461/521/456 475/535/476 476/536/478 -f 453/513/455 469/529/479 454/514/457 -f 447/507/458 251/295/12 462/522/480 -f 55/69/14 461/521/456 476/536/478 -f 455/515/459 469/529/479 470/530/481 -f 447/507/458 463/523/482 448/508/460 -f 456/516/461 470/530/481 471/531/469 -f 467/527/475 4/4/4 468/528/477 -f 476/536/478 481/541/3 482/542/8 -f 468/528/477 5/5/9 469/529/479 -f 462/522/480 251/296/12 477/537/11 -f 55/70/14 476/536/478 482/542/8 -f 470/530/481 5/5/9 6/6/16 -f 462/522/480 478/538/17 463/523/482 -f 471/531/469 6/6/16 7/7/20 -f 463/523/482 1/1/21 464/524/468 -f 472/532/470 7/7/20 8/8/24 -f 464/524/468 2/2/25 465/525/471 -f 473/533/472 8/8/24 480/540/28 -f 465/525/471 479/539/29 466/526/473 -f 474/534/474 480/540/28 9/9/1 -f 466/526/473 3/3/32 467/527/475 -f 475/535/476 9/9/1 481/541/3 -f 4/4/4 3/3/32 15/15/5 -f 5/5/9 4/4/4 16/16/6 -f 478/538/17 477/537/11 10/10/13 -f 1/1/21 478/538/17 11/11/18 -f 2/2/25 1/1/21 12/12/22 -f 479/539/29 2/2/25 13/13/26 -f 3/3/32 479/539/29 14/14/30 -f 15/15/5 14/14/30 29/29/34 -f 16/16/6 15/15/5 30/30/35 -f 17/17/10 16/16/6 31/31/37 -f 11/11/18 10/10/13 25/25/40 -f 12/12/22 11/11/18 26/26/42 -f 13/13/26 12/12/22 27/27/44 -f 14/14/30 13/13/26 28/28/46 -f 26/26/42 25/25/40 40/40/48 -f 27/27/44 26/26/42 41/41/49 -f 28/28/46 27/27/44 42/42/51 -f 29/29/34 28/28/46 43/43/53 -f 30/30/35 29/29/34 44/44/55 -f 31/31/37 30/30/35 45/45/57 -f 32/32/39 31/31/37 46/46/59 -f 45/45/57 44/44/55 60/75/63 -f 46/46/59 45/45/57 61/76/64 -f 47/47/61 46/46/59 62/77/66 -f 41/41/49 40/40/48 56/71/69 -f 42/42/51 41/41/49 57/72/71 -f 43/43/53 42/42/51 58/73/73 -f 44/44/55 43/43/53 59/74/75 -f 58/73/73 57/72/71 72/87/79 -f 59/74/75 58/73/73 73/88/80 -f 60/75/63 59/74/75 74/89/82 -f 61/76/64 60/75/63 75/90/84 -f 62/77/66 61/76/64 76/91/86 -f 63/78/68 62/77/66 77/92/88 -f 57/72/71 56/71/69 71/86/91 -f 77/92/88 76/91/86 91/106/94 -f 78/93/90 77/92/88 92/107/95 -f 72/87/79 71/86/91 86/101/98 -f 73/88/80 72/87/79 87/102/100 -f 74/89/82 73/88/80 88/103/102 -f 75/90/84 74/89/82 89/104/104 -f 76/91/86 75/90/84 90/105/106 -f 89/104/104 88/103/102 103/118/109 -f 90/105/106 89/104/104 104/119/110 -f 91/106/94 90/105/106 105/120/112 -f 92/107/95 91/106/94 106/121/114 -f 93/108/97 92/107/95 107/122/116 -f 87/102/100 86/101/98 101/116/119 -f 88/103/102 87/102/100 102/117/121 -f 108/123/118 107/122/116 122/143/124 -f 102/117/121 101/116/119 116/131/126 -f 103/118/109 102/117/121 117/133/128 -f 104/119/110 103/118/109 118/135/130 -f 105/120/112 104/119/110 119/137/132 -f 106/121/114 105/120/112 120/139/134 -f 107/122/116 106/121/114 121/141/136 -f 127/153/133 126/151/131 141/171/139 -f 128/155/135 127/153/133 142/172/140 -f 129/157/137 128/155/135 143/173/142 -f 130/159/123 129/157/137 144/174/144 -f 124/147/127 123/145/125 138/168/147 -f 125/149/129 124/147/127 139/169/149 -f 126/151/131 125/149/129 140/170/151 -f 139/169/149 138/168/147 153/183/153 -f 140/170/151 139/169/149 154/184/156 -f 141/171/139 140/170/151 155/185/158 -f 142/172/140 141/171/139 156/186/160 -f 143/173/142 142/172/140 157/187/162 -f 144/174/144 143/173/142 158/188/164 -f 145/175/146 144/174/144 159/189/166 -f 157/187/162 156/186/160 171/201/168 -f 158/188/164 157/187/162 172/202/169 -f 159/189/166 158/188/164 173/203/171 -f 160/190/155 159/189/166 174/204/173 -f 154/184/156 153/183/153 168/198/176 -f 155/185/158 154/184/156 169/199/178 -f 156/186/160 155/185/158 170/200/180 -f 169/199/178 168/198/176 183/213/185 -f 170/200/180 169/199/178 184/214/186 -f 171/201/168 170/200/180 185/215/188 -f 172/202/169 171/201/168 186/216/190 -f 173/203/171 172/202/169 187/217/192 -f 174/204/173 173/203/171 188/218/194 -f 175/205/175 174/204/173 189/219/196 -f 188/218/194 187/217/192 202/232/199 -f 189/219/196 188/218/194 203/233/200 -f 190/220/184 189/219/196 204/234/202 -f 184/214/186 183/213/185 198/228/205 -f 185/215/188 184/214/186 199/229/207 -f 186/216/190 185/215/188 200/230/209 -f 187/217/192 186/216/190 201/231/211 -f 199/229/207 198/228/205 213/243/213 -f 200/230/209 199/229/207 214/244/214 -f 201/231/211 200/230/209 215/245/216 -f 202/232/199 201/231/211 216/246/218 -f 203/233/200 202/232/199 217/247/220 -f 204/234/202 203/233/200 218/248/222 -f 205/235/204 204/234/202 219/249/224 -f 218/248/222 217/247/220 232/262/228 -f 219/249/224 218/248/222 233/263/229 -f 220/250/226 219/249/224 234/264/231 -f 214/244/214 213/243/213 228/258/234 -f 215/245/216 214/244/214 229/259/236 -f 216/246/218 215/245/216 230/260/238 -f 217/247/220 216/246/218 231/261/240 -f 230/260/238 229/259/236 244/274/243 -f 231/261/240 230/260/238 245/275/244 -f 232/262/228 231/261/240 246/276/246 -f 233/263/229 232/262/228 247/277/248 -f 234/264/231 233/263/229 248/278/250 -f 235/265/233 234/264/231 249/279/252 -f 229/259/236 228/258/234 243/273/255 -f 242/272/253 241/271/251 257/302/259 -f 243/273/255 242/272/253 258/303/260 -f 237/267/257 236/266/256 252/297/263 -f 238/268/245 237/267/257 253/298/265 -f 239/269/247 238/268/245 254/299/267 -f 240/270/249 239/269/247 255/300/269 -f 241/271/251 240/270/249 256/301/271 -f 254/299/267 253/298/265 268/313/273 -f 255/300/269 254/299/267 269/314/274 -f 256/301/271 255/300/269 270/315/276 -f 257/302/259 256/301/271 271/316/278 -f 258/303/260 257/302/259 272/317/280 -f 259/304/262 258/303/260 273/318/282 -f 253/298/265 252/297/263 267/312/285 -f 273/318/282 272/317/280 287/332/288 -f 274/319/284 273/318/282 288/333/289 -f 268/313/273 267/312/285 282/327/292 -f 269/314/274 268/313/273 283/328/294 -f 270/315/276 269/314/274 284/329/296 -f 271/316/278 270/315/276 285/330/298 -f 272/317/280 271/316/278 286/331/300 -f 285/330/298 284/329/296 299/344/304 -f 286/331/300 285/330/298 300/345/305 -f 287/332/288 286/331/300 301/346/307 -f 288/333/289 287/332/288 302/347/309 -f 289/334/291 288/333/289 303/348/311 -f 283/328/294 282/327/292 297/342/314 -f 284/329/296 283/328/294 298/343/316 -f 304/349/313 303/348/311 318/363/319 -f 298/343/316 297/342/314 312/357/321 -f 299/344/304 298/343/316 313/358/323 -f 300/345/305 299/344/304 314/359/325 -f 301/346/307 300/345/305 315/360/327 -f 302/347/309 301/346/307 316/361/329 -f 303/348/311 302/347/309 317/362/331 -f 315/360/327 314/359/325 329/374/333 -f 316/361/329 315/360/327 330/375/334 -f 317/362/331 316/361/329 331/376/336 -f 318/363/319 317/362/331 332/377/338 -f 319/364/320 318/363/319 333/378/340 -f 313/358/323 312/357/321 327/372/343 -f 314/359/325 313/358/323 328/373/345 -f 334/379/342 333/378/340 348/393/348 -f 328/373/345 327/372/343 342/387/350 -f 329/374/333 328/373/345 343/388/353 -f 330/375/334 329/374/333 344/389/355 -f 331/376/336 330/375/334 345/390/357 -f 332/377/338 331/376/336 346/391/359 -f 333/378/340 332/377/338 347/392/361 -f 346/391/359 345/390/357 360/408/364 -f 347/392/361 346/391/359 361/410/365 -f 348/393/348 347/392/361 362/412/367 -f 349/394/349 348/393/348 363/414/369 -f 343/388/353 342/387/350 357/402/372 -f 344/389/355 343/388/353 358/404/374 -f 345/390/357 344/389/355 359/406/376 -f 365/418/373 364/416/371 379/439/379 -f 366/420/375 365/418/373 380/440/380 -f 367/422/377 366/420/375 381/441/382 -f 368/424/363 367/422/377 382/442/384 -f 369/426/366 368/424/363 383/443/386 -f 370/428/368 369/426/366 384/444/388 -f 371/430/370 370/428/368 385/445/390 -f 384/444/388 383/443/386 398/458/393 -f 385/445/390 384/444/388 399/459/394 -f 386/446/378 385/445/390 400/460/396 -f 380/440/380 379/439/379 394/454/399 -f 381/441/382 380/440/380 395/455/401 -f 382/442/384 381/441/382 396/456/403 -f 383/443/386 382/442/384 397/457/405 -f 396/456/403 395/455/401 410/470/409 -f 397/457/405 396/456/403 411/471/410 -f 398/458/393 397/457/405 412/472/412 -f 399/459/394 398/458/393 413/473/414 -f 400/460/396 399/459/394 414/474/416 -f 401/461/398 400/460/396 415/475/418 -f 395/455/401 394/454/399 409/469/421 -f 415/475/418 414/474/416 429/489/424 -f 416/476/420 415/475/418 430/490/425 -f 410/470/409 409/469/421 424/484/428 -f 411/471/410 410/470/409 425/485/430 -f 412/472/412 411/471/410 426/486/432 -f 413/473/414 412/472/412 427/487/434 -f 414/474/416 413/473/414 428/488/436 -f 426/486/432 425/485/430 440/500/438 -f 427/487/434 426/486/432 441/501/439 -f 428/488/436 427/487/434 442/502/441 -f 429/489/424 428/488/436 443/503/443 -f 430/490/425 429/489/424 444/504/445 -f 431/491/427 430/490/425 445/505/447 -f 425/485/430 424/484/428 439/499/450 -f 445/505/447 444/504/445 459/519/453 -f 446/506/449 445/505/447 460/520/454 -f 440/500/438 439/499/450 454/514/457 -f 441/501/439 440/500/438 455/515/459 -f 442/502/441 441/501/439 456/516/461 -f 443/503/443 442/502/441 457/517/463 -f 444/504/445 443/503/443 458/518/465 -f 457/517/463 456/516/461 471/531/469 -f 458/518/465 457/517/463 472/532/470 -f 459/519/453 458/518/465 473/533/472 -f 460/520/454 459/519/453 474/534/474 -f 461/521/456 460/520/454 475/535/476 -f 455/515/459 454/514/457 469/529/479 -f 456/516/461 455/515/459 470/530/481 -f 476/536/478 475/535/476 481/541/3 -f 470/530/481 469/529/479 5/5/9 -f 471/531/469 470/530/481 6/6/16 -f 472/532/470 471/531/469 7/7/20 -f 473/533/472 472/532/470 8/8/24 -f 474/534/474 473/533/472 480/540/28 -f 475/535/476 474/534/474 9/9/1 -f 9/9/1 22/22/31 23/23/2 -f 481/541/3 23/23/2 24/24/7 -f 5/5/9 17/17/10 18/18/15 -f 6/6/16 18/18/15 19/19/19 -f 7/7/20 19/19/19 20/20/23 -f 8/8/24 20/20/23 21/21/27 -f 480/540/28 21/21/27 22/22/31 -f 21/21/27 36/36/47 37/37/33 -f 22/22/31 37/37/33 38/38/36 -f 23/23/2 38/38/36 39/39/38 -f 17/17/10 32/32/39 33/33/41 -f 18/18/15 33/33/41 34/34/43 -f 19/19/19 34/34/43 35/35/45 -f 20/20/23 35/35/45 36/36/47 -f 33/33/41 48/48/62 49/49/50 -f 34/34/43 49/49/50 50/50/52 -f 35/35/45 50/50/52 51/51/54 -f 36/36/47 51/51/54 52/52/56 -f 37/37/33 52/52/56 53/53/58 -f 38/38/36 53/53/58 54/54/60 -f 32/32/39 47/47/61 48/48/62 -f 52/52/56 68/83/77 69/84/65 -f 53/53/58 69/84/65 70/85/67 -f 47/47/61 63/78/68 64/79/70 -f 48/48/62 64/79/70 65/80/72 -f 49/49/50 65/80/72 66/81/74 -f 50/50/52 66/81/74 67/82/76 -f 51/51/54 67/82/76 68/83/77 -f 64/79/70 79/94/92 80/95/78 -f 65/80/72 80/95/78 81/96/81 -f 66/81/74 81/96/81 82/97/83 -f 67/82/76 82/97/83 83/98/85 -f 68/83/77 83/98/85 84/99/87 -f 69/84/65 84/99/87 85/100/89 -f 63/78/68 78/93/90 79/94/92 -f 83/98/85 98/113/107 99/114/93 -f 84/99/87 99/114/93 100/115/96 -f 78/93/90 93/108/97 94/109/99 -f 79/94/92 94/109/99 95/110/101 -f 80/95/78 95/110/101 96/111/103 -f 81/96/81 96/111/103 97/112/105 -f 82/97/83 97/112/105 98/113/107 -f 95/110/101 110/125/122 111/126/108 -f 96/111/103 111/126/108 112/127/111 -f 97/112/105 112/127/111 113/128/113 -f 98/113/107 113/128/113 114/129/115 -f 99/114/93 114/129/115 115/130/117 -f 93/108/97 108/123/118 109/124/120 -f 94/109/99 109/124/120 110/125/122 -f 114/129/115 129/158/137 130/160/123 -f 108/123/118 123/146/125 124/148/127 -f 109/124/120 124/148/127 125/150/129 -f 110/125/122 125/150/129 126/152/131 -f 111/126/108 126/152/131 127/154/133 -f 112/127/111 127/154/133 128/156/135 -f 113/128/113 128/156/135 129/158/137 -f 118/136/130 133/163/152 134/164/138 -f 119/138/132 134/164/138 135/165/141 -f 120/140/134 135/165/141 136/166/143 -f 121/142/136 136/166/143 137/167/145 -f 122/144/124 137/167/145 138/168/147 -f 116/132/126 131/161/148 132/162/150 -f 117/134/128 132/162/150 133/163/152 -f 137/167/145 152/182/167 153/183/153 -f 131/161/148 146/176/154 147/177/157 -f 132/162/150 147/177/157 148/178/159 -f 133/163/152 148/178/159 149/179/161 -f 134/164/138 149/179/161 150/180/163 -f 135/165/141 150/180/163 151/181/165 -f 136/166/143 151/181/165 152/182/167 -f 149/179/161 164/194/182 165/195/170 -f 150/180/163 165/195/170 166/196/172 -f 151/181/165 166/196/172 167/197/174 -f 152/182/167 167/197/174 168/198/176 -f 146/176/154 161/191/177 162/192/179 -f 147/177/157 162/192/179 163/193/181 -f 148/178/159 163/193/181 164/194/182 -f 161/191/177 176/206/183 177/207/187 -f 162/192/179 177/207/187 178/208/189 -f 163/193/181 178/208/189 179/209/191 -f 164/194/182 179/209/191 180/210/193 -f 165/195/170 180/210/193 181/211/195 -f 166/196/172 181/211/195 182/212/197 -f 167/197/174 182/212/197 183/213/185 -f 179/209/191 194/224/212 195/225/198 -f 180/210/193 195/225/198 196/226/201 -f 181/211/195 196/226/201 197/227/203 -f 182/212/197 197/227/203 198/228/205 -f 176/206/183 191/221/206 192/222/208 -f 177/207/187 192/222/208 193/223/210 -f 178/208/189 193/223/210 194/224/212 -f 191/221/206 206/236/227 207/237/215 -f 192/222/208 207/237/215 208/238/217 -f 193/223/210 208/238/217 209/239/219 -f 194/224/212 209/239/219 210/240/221 -f 195/225/198 210/240/221 211/241/223 -f 196/226/201 211/241/223 212/242/225 -f 197/227/203 212/242/225 213/243/213 -f 210/240/221 225/255/242 226/256/230 -f 211/241/223 226/256/230 227/257/232 -f 212/242/225 227/257/232 228/258/234 -f 206/236/227 221/251/235 222/252/237 -f 207/237/215 222/252/237 223/253/239 -f 208/238/217 223/253/239 224/254/241 -f 209/239/219 224/254/241 225/255/242 -f 222/252/237 237/267/257 238/268/245 -f 223/253/239 238/268/245 239/269/247 -f 224/254/241 239/269/247 240/270/249 -f 225/255/242 240/270/249 241/271/251 -f 226/256/230 241/271/251 242/272/253 -f 227/257/232 242/272/253 243/273/255 -f 221/251/235 236/266/256 237/267/257 -f 248/278/250 264/309/272 265/310/258 -f 249/279/252 265/310/258 266/311/261 -f 243/273/255 259/304/262 260/305/264 -f 244/274/243 260/305/264 261/306/266 -f 245/275/244 261/306/266 262/307/268 -f 246/276/246 262/307/268 263/308/270 -f 247/277/248 263/308/270 264/309/272 -f 261/306/266 276/321/287 277/322/275 -f 262/307/268 277/322/275 278/323/277 -f 263/308/270 278/323/277 279/324/279 -f 264/309/272 279/324/279 280/325/281 -f 265/310/258 280/325/281 281/326/283 -f 259/304/262 274/319/284 275/320/286 -f 260/305/264 275/320/286 276/321/287 -f 280/325/281 295/340/302 296/341/290 -f 274/319/284 289/334/291 290/335/293 -f 275/320/286 290/335/293 291/336/295 -f 276/321/287 291/336/295 292/337/297 -f 277/322/275 292/337/297 293/338/299 -f 278/323/277 293/338/299 294/339/301 -f 279/324/279 294/339/301 295/340/302 -f 291/336/295 306/351/317 307/352/303 -f 292/337/297 307/352/303 308/353/306 -f 293/338/299 308/353/306 309/354/308 -f 294/339/301 309/354/308 310/355/310 -f 295/340/302 310/355/310 311/356/312 -f 289/334/291 304/349/313 305/350/315 -f 290/335/293 305/350/315 306/351/317 -f 310/355/310 325/370/332 326/371/318 -f 304/349/313 319/364/320 320/365/322 -f 305/350/315 320/365/322 321/366/324 -f 306/351/317 321/366/324 322/367/326 -f 307/352/303 322/367/326 323/368/328 -f 308/353/306 323/368/328 324/369/330 -f 309/354/308 324/369/330 325/370/332 -f 322/367/326 337/382/347 338/383/335 -f 323/368/328 338/383/335 339/384/337 -f 324/369/330 339/384/337 340/385/339 -f 325/370/332 340/385/339 341/386/341 -f 319/364/320 334/379/342 335/380/344 -f 320/365/322 335/380/344 336/381/346 -f 321/366/324 336/381/346 337/382/347 -f 334/379/342 349/394/349 350/395/352 -f 335/380/344 350/395/352 351/396/354 -f 336/381/346 351/396/354 352/397/356 -f 337/382/347 352/397/356 353/398/358 -f 338/383/335 353/398/358 354/399/360 -f 339/384/337 354/399/360 355/400/362 -f 340/385/339 355/400/362 356/401/351 -f 352/397/356 367/423/377 368/425/363 -f 353/398/358 368/425/363 369/427/366 -f 354/399/360 369/427/366 370/429/368 -f 355/400/362 370/429/368 371/431/370 -f 349/394/349 364/417/371 365/419/373 -f 350/395/352 365/419/373 366/421/375 -f 351/396/354 366/421/375 367/423/377 -f 357/403/372 372/432/392 373/433/381 -f 358/405/374 373/433/381 374/434/383 -f 359/407/376 374/434/383 375/435/385 -f 360/409/364 375/435/385 376/436/387 -f 361/411/365 376/436/387 377/437/389 -f 362/413/367 377/437/389 378/438/391 -f 363/415/369 378/438/391 379/439/379 -f 376/436/387 391/451/407 392/452/395 -f 377/437/389 392/452/395 393/453/397 -f 378/438/391 393/453/397 394/454/399 -f 372/432/392 387/447/400 388/448/402 -f 373/433/381 388/448/402 389/449/404 -f 374/434/383 389/449/404 390/450/406 -f 375/435/385 390/450/406 391/451/407 -f 387/447/400 402/462/422 403/463/408 -f 388/448/402 403/463/408 404/464/411 -f 389/449/404 404/464/411 405/465/413 -f 390/450/406 405/465/413 406/466/415 -f 391/451/407 406/466/415 407/467/417 -f 392/452/395 407/467/417 408/468/419 -f 393/453/397 408/468/419 409/469/421 -f 406/466/415 421/481/437 422/482/423 -f 407/467/417 422/482/423 423/483/426 -f 408/468/419 423/483/426 424/484/428 -f 402/462/422 417/477/429 418/478/431 -f 403/463/408 418/478/431 419/479/433 -f 404/464/411 419/479/433 420/480/435 -f 405/465/413 420/480/435 421/481/437 -f 418/478/431 433/493/452 434/494/440 -f 419/479/433 434/494/440 435/495/442 -f 420/480/435 435/495/442 436/496/444 -f 421/481/437 436/496/444 437/497/446 -f 422/482/423 437/497/446 438/498/448 -f 423/483/426 438/498/448 439/499/450 -f 417/477/429 432/492/451 433/493/452 -f 437/497/446 452/512/467 453/513/455 -f 438/498/448 453/513/455 454/514/457 -f 432/492/451 447/507/458 448/508/460 -f 433/493/452 448/508/460 449/509/462 -f 434/494/440 449/509/462 450/510/464 -f 435/495/442 450/510/464 451/511/466 -f 436/496/444 451/511/466 452/512/467 -f 448/508/460 463/523/482 464/524/468 -f 449/509/462 464/524/468 465/525/471 -f 450/510/464 465/525/471 466/526/473 -f 451/511/466 466/526/473 467/527/475 -f 452/512/467 467/527/475 468/528/477 -f 453/513/455 468/528/477 469/529/479 -f 447/507/458 462/522/480 463/523/482 -f 467/527/475 3/3/32 4/4/4 -f 468/528/477 4/4/4 5/5/9 -f 462/522/480 477/537/11 478/538/17 -f 463/523/482 478/538/17 1/1/21 -f 464/524/468 1/1/21 2/2/25 -f 465/525/471 2/2/25 479/539/29 -f 466/526/473 479/539/29 3/3/32 diff --git a/data/games/garage/mods/testnodes/models/testnodes_ocorner.obj b/data/games/garage/mods/testnodes/models/testnodes_ocorner.obj deleted file mode 100644 index 231d705..0000000 --- a/data/games/garage/mods/testnodes/models/testnodes_ocorner.obj +++ /dev/null @@ -1,23 +0,0 @@ -# Blender v2.73 (sub 0) OBJ File: 'slope_test_ocorner_onetexture.blend' -# www.blender.org -o Cube_Cube.002 -v 0.500000 0.500000 0.500000 -v -0.500000 -0.500000 0.500000 -v 0.500000 -0.500000 0.500000 -v -0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 -0.500000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vn 0.000000 -1.000000 -0.000000 -vn 1.000000 0.000000 0.000000 -vn 0.000000 -0.000000 1.000000 -vn -0.707100 0.707100 0.000000 -vn 0.000000 0.707100 -0.707100 -s off -f 3/1/1 2/2/1 4/3/1 5/4/1 -f 1/2/2 3/3/2 5/4/2 -f 1/1/3 2/3/3 3/4/3 -f 1/1/4 4/3/4 2/4/4 -f 1/2/5 5/3/5 4/4/5 diff --git a/data/games/garage/mods/testnodes/models/testnodes_pyramid.obj b/data/games/garage/mods/testnodes/models/testnodes_pyramid.obj deleted file mode 100644 index b305af2..0000000 --- a/data/games/garage/mods/testnodes/models/testnodes_pyramid.obj +++ /dev/null @@ -1,24 +0,0 @@ -# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_onetexture.blend' -# www.blender.org -o Cube -v 0.500000 -0.500000 -0.500000 -v 0.500000 -0.500000 0.500000 -v -0.500000 -0.500000 0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.000000 0.500000 -0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vt 0.500000 1.000000 -vn 0.000000 -1.000000 0.000000 -vn -0.894400 0.447200 -0.000000 -vn 0.000000 0.447200 -0.894400 -vn 0.894400 0.447200 0.000000 -vn -0.000000 0.447200 0.894400 -s off -f 1/1/1 2/2/1 3/3/1 4/4/1 -f 3/4/2 5/5/2 4/3/2 -f 5/5/3 1/3/3 4/4/3 -f 1/4/4 5/5/4 2/3/4 -f 2/4/5 5/5/5 3/3/5 diff --git a/data/games/garage/mods/testnodes/nodeboxes.lua b/data/games/garage/mods/testnodes/nodeboxes.lua deleted file mode 100644 index 0025ee0..0000000 --- a/data/games/garage/mods/testnodes/nodeboxes.lua +++ /dev/null @@ -1,242 +0,0 @@ -local S = core.get_translator("testnodes") - --- Nodebox examples and tests. - --- An simple example nodebox with one centered box -core.register_node("testnodes:nodebox_fixed", { - description = S("Fixed Nodebox Test Node").."\n".. - S("Nodebox is always the same"), - tiles = {"testnodes_nodebox.png"}, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, - }, - - groups = {dig_immediate=3}, -}) - --- 50% higher than a regular node -core.register_node("testnodes:nodebox_overhigh", { - description = S("+50% high Nodebox Test Node"), - tiles = {"testnodes_nodebox.png"}, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 1, 0.5}, - }, - - groups = {dig_immediate=3}, -}) - --- 95% higher than a regular node -core.register_node("testnodes:nodebox_overhigh2", { - description = S("+95% high Nodebox Test Node"), - tiles = {"testnodes_nodebox.png"}, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - -- Y max: more is possible, but glitchy - fixed = {-0.5, -0.5, -0.5, 0.5, 1.45, 0.5}, - }, - - groups = {dig_immediate=3}, -}) - --- Height of nodebox changes with its param2 value -core.register_node("testnodes:nodebox_leveled", { - description = S("Leveled Nodebox Test Node").."\n".. - S("param2 = height (0..127)"), - tiles = {"testnodes_nodebox.png^[colorize:#0F0:32"}, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "leveled", - node_box = { - type = "leveled", - fixed = {-0.5, 0.0, -0.5, 0.5, -0.499, 0.5}, - }, - - groups = {dig_immediate=3}, -}) - - -local nodebox_wall = { - type = "connected", - fixed = {-0.125, -0.500, -0.125, 0.125, 0.500, 0.125}, - connect_front = {-0.125, -0.500, -0.500, 0.125, 0.400, -0.125}, - connect_back = {-0.125, -0.500, 0.125, 0.125, 0.400, 0.500}, - connect_left = {-0.500, -0.500, -0.125, -0.125, 0.400, 0.125}, - connect_right = {0.125, -0.500, -0.125, 0.500, 0.400, 0.125}, -} - -local nodebox_cable = { - type = "connected", - fixed = {-2/16, -2/16, -2/16, 2/16, 2/16, 2/16}, - connect_front = {-1/16, -1/16, -8/16, 1/16, 1/16, -2/16}, - connect_back = {-1/16, -1/16, 2/16, 1/16, 1/16, 8/16}, - connect_left = {-8/16, -1/16, -1/16, -2/16, 1/16, 1/16}, - connect_right = { 2/16, -1/16, -1/16, 8/16, 1/16, 1/16}, - connect_bottom = {-1/16, -8/16, -1/16, 1/16, -2/16, 1/16}, - connect_top = {-1/16, 2/16, -1/16, 1/16, 8/16, 1/16}, -} - -local nodebox_wall_thick = { - type = "connected", - fixed = {-0.25, -0.500, -0.25, 0.25, 0.500, 0.25}, - connect_front = {-0.25, -0.500, -0.500, 0.25, 0.400, -0.25}, - connect_back = {-0.25, -0.500, 0.25, 0.25, 0.400, 0.500}, - connect_left = {-0.500, -0.500, -0.25, -0.25, 0.400, 0.25}, - connect_right = {0.25, -0.500, -0.25, 0.500, 0.400, 0.25}, -} - --- Wall-like nodebox that connects to 4 neighbors -core.register_node("testnodes:nodebox_connected", { - description = S("Connected Nodebox Test Node (4 Side Wall)").."\n".. - S("Connects to 4 neighbors sideways"), - tiles = {"testnodes_nodebox.png^[colorize:#F00:32"}, - groups = {connected_nodebox=1, dig_immediate=3}, - drawtype = "nodebox", - paramtype = "light", - connects_to = {"group:connected_nodebox"}, - connect_sides = {"front", "back", "left", "right"}, - node_box = nodebox_wall, -}) - --- Cable-like nodebox that connects to 6 neighbors -core.register_node("testnodes:nodebox_connected_6side", { - description = S("Connected Nodebox Test Node (6 Side Cable)").."\n".. - S("Connects to 6 neighbors"), - tiles = {"testnodes_nodebox.png^[colorize:#F00:32"}, - groups = {connected_nodebox=1, dig_immediate=3}, - drawtype = "nodebox", - paramtype = "light", - connects_to = {"group:connected_nodebox"}, - connect_sides = {"front", "back", "left", "right", "top", "bottom"}, - node_box = nodebox_cable, -}) - --- More walls -core.register_node("testnodes:nodebox_connected_facedir", { - description = S("Facedir Connected Nodebox Test Node (4 Side Wall)").."\n".. - S("Connects to neighbors").."\n".. - S("param2 = facedir rotation of textures (not of the nodebox!)"), - tiles = { - "testnodes_1.png", - "testnodes_2.png", - "testnodes_3.png", - "testnodes_4.png", - "testnodes_5.png", - "testnodes_6.png", - }, - groups = {connected_nodebox=1, dig_immediate=3}, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - connects_to = {"group:connected_nodebox"}, - connect_sides = {"front", "back", "left", "right"}, - node_box = nodebox_wall_thick, -}) - -core.register_node("testnodes:nodebox_connected_4dir", { - description = S("4Dir Connected Nodebox Test Node").."\n".. - S("Connects to neighbors").."\n".. - S("param2 = 4dir rotation of textures (not of the nodebox!)"), - tiles = { - "testnodes_1f.png", - "testnodes_2f.png", - "testnodes_3f.png", - "testnodes_4f.png", - "testnodes_5f.png", - "testnodes_6f.png", - }, - groups = {connected_nodebox=1, dig_immediate=3}, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "4dir", - connects_to = {"group:connected_nodebox"}, - connect_sides = {"front", "back", "left", "right"}, - node_box = nodebox_wall_thick, -}) - --- Doesn't connect, but lets other nodes connect -core.register_node("testnodes:facedir_to_connect_to", { - description = S("Facedir Node that connected Nodeboxes connect to").."\n".. - S("Neighbors connect only to left (blue 4) and top (yellow 1) face").."\n".. - S("(Currently broken for param2 >= 4, see FIXME in nodedef.cpp)").."\n".. - S("param2 = facedir"), - tiles = { - "testnodes_1.png", - "testnodes_2.png", - "testnodes_3.png", - "testnodes_4.png", - "testnodes_5.png", - "testnodes_6.png", - }, - groups = {connected_nodebox=1, dig_immediate=3}, - drawtype = "normal", - paramtype2 = "facedir", - connect_sides = {"left", "top"}, -}) - --- 3D sign and button: --- These are example nodes for more realistic example uses --- of wallmounted_rotate_vertical -core.register_node("testnodes:sign3d", { - description = S("Nodebox Sign, Nodebox Type \"fixed\""), - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "wallmounted", - wallmounted_rotate_vertical = true, - sunlight_propagates = true, - walkable = false, - tiles = { - "testnodes_sign3d.png", - }, - groups = { dig_immediate = 3 }, - node_box = { - type = "fixed", - fixed = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, - }, -}) - -core.register_node("testnodes:sign3d_wallmounted", { - description = S("Nodebox Sign, Nodebox Type \"wallmounted\""), - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "wallmounted", - wallmounted_rotate_vertical = true, - sunlight_propagates = true, - walkable = false, - tiles = { - "testnodes_sign3d.png^[colorize:#ff0000:127", - }, - groups = { dig_immediate = 3 }, - node_box = { - type = "wallmounted", - wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, - wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, - wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, - }, -}) - -core.register_node("testnodes:button", { - description = S("Button Nodebox Test Node"), - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "wallmounted", - wallmounted_rotate_vertical = true, - sunlight_propagates = true, - walkable = false, - tiles = { - "testnodes_nodebox.png", - }, - groups = { dig_immediate = 3 }, - node_box = { - type = "fixed", - fixed = { -4/16, -8/16, -2/16, 4/16, -6/16, 2/16 }, - }, -}) - diff --git a/data/games/garage/mods/testnodes/overlays.lua b/data/games/garage/mods/testnodes/overlays.lua deleted file mode 100644 index 7f7a1cd..0000000 --- a/data/games/garage/mods/testnodes/overlays.lua +++ /dev/null @@ -1,93 +0,0 @@ -local S = core.get_translator("testnodes") - -core.register_node("testnodes:overlay", { - description = S("Texture Overlay Test Node") .. "\n" .. - S("Uncolorized"), - tiles = {{name = "testnodes_overlayable.png"}}, - overlay_tiles = {{name = "testnodes_overlay.png"}}, - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:overlay_color_all", { - description = S("Texture Overlay Test Node, Colorized") .. "\n" .. - S("param2 changes color"), - tiles = {{name = "testnodes_overlayable.png"}}, - overlay_tiles = {{name = "testnodes_overlay.png"}}, - paramtype2 = "color", - palette = "testnodes_palette_full.png", - - - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:overlay_color_overlay", { - description = S("Texture Overlay Test Node, Colorized Overlay") .. "\n" .. - S("param2 changes color of overlay"), - tiles = {{name = "testnodes_overlayable.png", color="white"}}, - overlay_tiles = {{name = "testnodes_overlay.png"}}, - paramtype2 = "color", - palette = "testnodes_palette_full.png", - - - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:overlay_color_overlayed", { - description = S("Texture Overlay Test Node, Colorized Base") .. "\n" .. - S("param2 changes color of base texture"), - tiles = {{name = "testnodes_overlayable.png"}}, - overlay_tiles = {{name = "testnodes_overlay.png", color="white"}}, - paramtype2 = "color", - palette = "testnodes_palette_full.png", - - - groups = { dig_immediate = 2 }, -}) - -local global_overlay_color = "#FF2000" -core.register_node("testnodes:overlay_global", { - description = S("Texture Overlay Test Node, Global Color") .. "\n" .. - S("Global color = @1", global_overlay_color), - tiles = {{name = "testnodes_overlayable.png"}}, - overlay_tiles = {{name = "testnodes_overlay.png"}}, - color = global_overlay_color, - - - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:overlay_global_color_all", { - description = S("Texture Overlay Test Node, Global Color + Colorized") .. "\n" .. - S("Global color = @1", global_overlay_color) .. "\n" .. - S("param2 changes color"), - tiles = {{name = "testnodes_overlayable.png"}}, - overlay_tiles = {{name = "testnodes_overlay.png"}}, - color = global_overlay_color, - paramtype2 = "color", - palette = "testnodes_palette_full.png", - - - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:overlay_global_color_overlay", { - description = S("Texture Overlay Test Node, Global Color + Colorized Overlay") .. "\n" .. - S("Global color = @1", global_overlay_color) .. "\n" .. - S("param2 changes color of overlay"), - tiles = {{name = "testnodes_overlayable.png", color=global_overlay_color}}, - overlay_tiles = {{name = "testnodes_overlay.png"}}, - color = global_overlay_color, - paramtype2 = "color", - palette = "testnodes_palette_full.png", - - - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:overlay_global_color_overlayed", { - description = S("Texture Overlay Test Node, Global Color + Colorized Base") .. "\n" .. - S("Global color = @1", global_overlay_color) .. "\n" .. - S("param2 changes color of base texture"), - tiles = {{name = "testnodes_overlayable.png"}}, - overlay_tiles = {{name = "testnodes_overlay.png", color=global_overlay_color}}, - color = global_overlay_color, - paramtype2 = "color", - palette = "testnodes_palette_full.png", - - - groups = { dig_immediate = 2 }, -}) diff --git a/data/games/garage/mods/testnodes/param2.lua b/data/games/garage/mods/testnodes/param2.lua deleted file mode 100644 index aec1fd4..0000000 --- a/data/games/garage/mods/testnodes/param2.lua +++ /dev/null @@ -1,321 +0,0 @@ --- This file is for misc. param2 tests that aren't covered in drawtypes.lua already. - -local S = core.get_translator("testnodes") - -core.register_node("testnodes:facedir", { - description = S("Facedir Test Node").."\n".. - S("param2 = facedir rotation (0..23)"), - paramtype2 = "facedir", - tiles = { - "testnodes_1.png", - "testnodes_2.png", - "testnodes_3.png", - "testnodes_4.png", - "testnodes_5.png", - "testnodes_6.png", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:4dir", { - description = S("4dir Test Node").."\n".. - S("param2 = 4dir rotation (0..3)"), - paramtype2 = "4dir", - tiles = { - "testnodes_1f.png", - "testnodes_2f.png", - "testnodes_3f.png", - "testnodes_4f.png", - "testnodes_5f.png", - "testnodes_6f.png", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:facedir_nodebox", { - description = S("Facedir Nodebox Test Node").."\n".. - S("param2 = facedir rotation (0..23)"), - tiles = { - "testnodes_1.png", - "testnodes_2.png", - "testnodes_3.png", - "testnodes_4.png", - "testnodes_5.png", - "testnodes_6.png", - }, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.2, 0.2, 0.2}, - }, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:4dir_nodebox", { - description = S("4dir Nodebox Test Node").."\n".. - S("param2 = 4dir rotation (0..3)"), - tiles = { - "testnodes_1f.png", - "testnodes_2f.png", - "testnodes_3f.png", - "testnodes_4f.png", - "testnodes_5f.png", - "testnodes_6f.png", - }, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "4dir", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.2, 0.2, 0.2}, - }, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:4dir_nodebox_stair", { - description = S("4dir Nodebox Stair Test Node").."\n".. - S("param2 = 4dir rotation (0..3)"), - tiles = { - "testnodes_1f.png", - "testnodes_2f.png", - "testnodes_3f.png", - "testnodes_4f.png", - "testnodes_5f.png", - "testnodes_6f.png", - }, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "4dir", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, - }, - }, - - groups = { dig_immediate = 3 }, -}) - - -core.register_node("testnodes:wallmounted", { - description = S("Wallmounted Test Node").."\n".. - S("param2 = wallmounted rotation (0..7)"), - paramtype2 = "wallmounted", - tiles = { - "testnodes_1w.png", - "testnodes_2w.png", - "testnodes_3w.png", - "testnodes_4w.png", - "testnodes_5w.png", - "testnodes_6w.png", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:wallmounted_rot", { - description = S("Wallmounted Rotatable Test Node"), - paramtype2 = "wallmounted", - wallmounted_rotate_vertical = true, - tiles = { - "testnodes_1w.png^[colorize:#FFFF00:40", - "testnodes_2w.png^[colorize:#FFFF00:40", - "testnodes_3w.png^[colorize:#FFFF00:40", - "testnodes_4w.png^[colorize:#FFFF00:40", - "testnodes_5w.png^[colorize:#FFFF00:40", - "testnodes_6w.png^[colorize:#FFFF00:40", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:wallmounted_nodebox", { - description = S("Wallmounted Nodebox Test Node").."\n".. - S("param2 = wallmounted rotation (0..7)"), - paramtype2 = "wallmounted", - paramtype = "light", - tiles = { - "testnodes_1w.png", - "testnodes_2w.png", - "testnodes_3w.png", - "testnodes_4w.png", - "testnodes_5w.png", - "testnodes_6w.png", - }, - drawtype = "nodebox", - node_box = { - type = "wallmounted", - wall_top = { -0.5, 0, -0.5, 0.5, 0.5, 0.5 }, - wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, - wall_side = { -0.5, -0.5, -0.5, 0, 0.5, 0.5 }, - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:wallmounted_nodebox_rot", { - description = S("Wallmounted Rotatable Nodebox Test Node"), - paramtype2 = "wallmounted", - wallmounted_rotate_vertical = true, - paramtype = "light", - tiles = { - "testnodes_1w.png^[colorize:#FFFF00:40", - "testnodes_2w.png^[colorize:#FFFF00:40", - "testnodes_3w.png^[colorize:#FFFF00:40", - "testnodes_4w.png^[colorize:#FFFF00:40", - "testnodes_5w.png^[colorize:#FFFF00:40", - "testnodes_6w.png^[colorize:#FFFF00:40", - }, - drawtype = "nodebox", - node_box = { - type = "wallmounted", - wall_top = { -0.5, 0, -0.5, 0.5, 0.5, 0.5 }, - wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, - wall_side = { -0.5, -0.5, -0.5, 0, 0.5, 0.5 }, - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:color", { - description = S("Color Test Node").."\n".. - S("param2 = color (0..255)"), - paramtype2 = "color", - palette = "testnodes_palette_full.png", - tiles = { - "testnodes_node.png", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:colorfacedir", { - description = S("Color Facedir Test Node").."\n".. - S("param2 = color + facedir rotation (0..23, 32..55, ...)"), - paramtype2 = "colorfacedir", - palette = "testnodes_palette_facedir.png", - tiles = { - "testnodes_1g.png", - "testnodes_2g.png", - "testnodes_3g.png", - "testnodes_4g.png", - "testnodes_5g.png", - "testnodes_6g.png", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:colorfacedir_nodebox", { - description = S("Color Facedir Nodebox Test Node").."\n".. - S("param2 = color + facedir rotation (0..23, 32..55, ...)"), - tiles = { - "testnodes_1g.png", - "testnodes_2g.png", - "testnodes_3g.png", - "testnodes_4g.png", - "testnodes_5g.png", - "testnodes_6g.png", - }, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "colorfacedir", - palette = "testnodes_palette_facedir.png", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.2, 0.2, 0.2}, - }, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:color4dir", { - description = S("Color 4dir Test Node").."\n".. - S("param2 = color + 4dir rotation (0..255)"), - paramtype2 = "color4dir", - palette = "testnodes_palette_4dir.png", - tiles = { - "testnodes_1fg.png", - "testnodes_2fg.png", - "testnodes_3fg.png", - "testnodes_4fg.png", - "testnodes_5fg.png", - "testnodes_6fg.png", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:color4dir_nodebox", { - description = S("Color 4dir Nodebox Test Node").."\n".. - S("param2 = color + 4dir rotation (0..255)"), - tiles = { - "testnodes_1fg.png", - "testnodes_2fg.png", - "testnodes_3fg.png", - "testnodes_4fg.png", - "testnodes_5fg.png", - "testnodes_6fg.png", - }, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "color4dir", - palette = "testnodes_palette_4dir.png", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.2, 0.2, 0.2}, - }, - - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:colorwallmounted", { - description = S("Color Wallmounted Test Node").."\n".. - S("param2 = color + wallmounted rotation (0..7, 8..15, ...)"), - paramtype2 = "colorwallmounted", - paramtype = "light", - palette = "testnodes_palette_wallmounted.png", - tiles = { - "testnodes_1wg.png", - "testnodes_2wg.png", - "testnodes_3wg.png", - "testnodes_4wg.png", - "testnodes_5wg.png", - "testnodes_6wg.png", - }, - - groups = { dig_immediate = 3 }, -}) - -core.register_node("testnodes:colorwallmounted_nodebox", { - description = S("Color Wallmounted Nodebox Test Node").."\n".. - S("param2 = color + wallmounted rotation (0..7, 8..15, ...)"), - paramtype2 = "colorwallmounted", - paramtype = "light", - palette = "testnodes_palette_wallmounted.png", - tiles = { - "testnodes_1wg.png", - "testnodes_2wg.png", - "testnodes_3wg.png", - "testnodes_4wg.png", - "testnodes_5wg.png", - "testnodes_6wg.png", - }, - drawtype = "nodebox", - node_box = { - type = "wallmounted", - wall_top = { -0.5, 0, -0.5, 0.5, 0.5, 0.5 }, - wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, - wall_side = { -0.5, -0.5, -0.5, 0, 0.5, 0.5 }, - }, - - groups = { dig_immediate = 3 }, -}) - diff --git a/data/games/garage/mods/testnodes/performance_test_nodes.lua b/data/games/garage/mods/testnodes/performance_test_nodes.lua deleted file mode 100644 index fc22db3..0000000 --- a/data/games/garage/mods/testnodes/performance_test_nodes.lua +++ /dev/null @@ -1,59 +0,0 @@ --- Performance test mesh nodes - -local S = core.get_translator("testnodes") - --- Complex mesh -core.register_node("testnodes:performance_mesh_clip", { - description = S("Performance Test Node") .. "\n" .. S("Marble with 'clip' transparency"), - drawtype = "mesh", - mesh = "testnodes_marble_glass.obj", - tiles = {"testnodes_marble_glass.png"}, - paramtype = "light", - use_texture_alpha = "clip", - - groups = {dig_immediate=3}, -}) - --- Complex mesh, alpha blending -core.register_node("testnodes:performance_mesh_blend", { - description = S("Performance Test Node") .. "\n" .. S("Marble with 'blend' transparency"), - drawtype = "mesh", - mesh = "testnodes_marble_glass.obj", - tiles = {"testnodes_marble_glass.png"}, - paramtype = "light", - use_texture_alpha = "blend", - - groups = {dig_immediate=3}, -}) - --- Overlay -core.register_node("testnodes:performance_overlay_clip", { - description = S("Performance Test Node") .. "\n" .. S("Marble with overlay with 'clip' transparency") .. "\n" .. S("Palette for demonstration"), - drawtype = "mesh", - mesh = "testnodes_marble_metal.obj", - tiles = {"testnodes_marble_metal.png"}, - overlay_tiles = {{name = "testnodes_marble_metal_overlay.png", color = "white"}}, - paramtype = "light", - paramtype2 = "color", - palette = "testnodes_palette_metal.png", - color = "#705216"; - use_texture_alpha = "clip", - - groups = {dig_immediate=3}, -}) - --- Overlay -core.register_node("testnodes:performance_overlay_blend", { - description = S("Performance Test Node") .. "\n" .. S("Marble with overlay with 'blend' transparency") .. "\n" .. S("Palette for demonstration"), - drawtype = "mesh", - mesh = "testnodes_marble_metal.obj", - tiles = {"testnodes_marble_metal.png"}, - overlay_tiles = {{name = "testnodes_marble_metal_overlay.png", color = "white"}}, - paramtype = "light", - paramtype2 = "color", - palette = "testnodes_palette_metal.png", - color = "#705216"; - use_texture_alpha = "blend", - - groups = {dig_immediate=3}, -}) diff --git a/data/games/garage/mods/testnodes/properties.lua b/data/games/garage/mods/testnodes/properties.lua deleted file mode 100644 index 29dc14a..0000000 --- a/data/games/garage/mods/testnodes/properties.lua +++ /dev/null @@ -1,685 +0,0 @@ --- Test Nodes: Node property tests - -local S = core.get_translator("testnodes") - --- Is supposed to fall when it doesn't rest on solid ground -core.register_node("testnodes:falling", { - description = S("Falling Node").."\n".. - S("Falls down if no node below"), - tiles = { - "testnodes_node.png", - "testnodes_node.png", - "testnodes_node_falling.png", - }, - groups = { falling_node = 1, dig_immediate = 3 }, -}) - -core.register_node("testnodes:falling_facedir", { - description = S("Falling Facedir Node").."\n".. - S("Falls down if no node below").."\n".. - S("param2 = facedir rotation"), - tiles = { - "testnodes_node_falling_1.png", - "testnodes_node_falling_2.png", - "testnodes_node_falling_3.png", - "testnodes_node_falling_4.png", - "testnodes_node_falling_5.png", - "testnodes_node_falling_6.png", - }, - paramtype2 = "facedir", - groups = { falling_node = 1, dig_immediate = 3 }, -}) - --- Same as falling node, but will stop falling on top of liquids -core.register_node("testnodes:falling_float", { - description = S("Falling+Floating Node").."\n".. - S("Falls down if no node below, floats on liquids (liquidtype ~= \"none\")"), - groups = { falling_node = 1, float = 1, dig_immediate = 3 }, - - - tiles = { - "testnodes_node.png", - "testnodes_node.png", - "testnodes_node_falling.png", - }, - color = "cyan", -}) - --- This node attaches to the floor and drops as item --- when the floor is gone. -core.register_node("testnodes:attached", { - description = S("Floor-Attached Node").."\n".. - S("Drops as item if no solid node below"), - tiles = { - "testnodes_attached_top.png", - "testnodes_attached_bottom.png", - "testnodes_attached_side.png", - }, - groups = { attached_node = 1, dig_immediate = 3 }, -}) --- This node attaches to the side of a node and drops as item --- when the node it attaches to is gone. -core.register_node("testnodes:attached_wallmounted", { - description = S("Wallmounted Attached Node").."\n".. - S("Attaches to solid node it was placed on; drops as item if neighbor node is gone").."\n".. - S("param2 = wallmounted rotation (0..7)"), - paramtype2 = "wallmounted", - tiles = { - "testnodes_attachedw_top.png", - "testnodes_attachedw_bottom.png", - "testnodes_attachedw_side.png", - }, - groups = { attached_node = 1, dig_immediate = 3 }, -}) - --- This node attaches to the side of a node and drops as item --- when the node it attaches to is gone. --- Also adds vertical 90° rotation variants. -core.register_node("testnodes:attached_wallmounted_rot", { - description = S("Rotatable Wallmounted Attached Node").."\n".. - S("Attaches to solid node it was placed on; drops as item if neighbor node is gone").."\n".. - S("param2 = wallmounted rotation (0..7)").."\n".. - S("May be rotated by 90° if placed at floor or ceiling"), - paramtype2 = "wallmounted", - tiles = { - "testnodes_attachedwr_top.png", - "testnodes_attachedwr_bottom.png", - "testnodes_attachedwr_side.png", - }, - wallmounted_rotate_vertical = true, - groups = { attached_node = 1, dig_immediate = 3 }, -}) - --- Wallmounted node that always attaches to the floor -core.register_node("testnodes:attached_wallmounted_floor", { - description = S("Floor-Attached Wallmounted Node").."\n".. - S("Drops as item if no solid node below (regardless of rotation)").."\n".. - S("param2 = wallmounted rotation (visual only) (0..7)"), - paramtype2 = "wallmounted", - tiles = { - "testnodes_attached_top.png", - "testnodes_attached_bottom.png", - "testnodes_attached_side.png", - }, - groups = { attached_node = 3, dig_immediate = 3 }, - color = "#FF8080", -}) - --- Wallmounted node that always attaches to the floor. --- Also adds 90° rotation variants. -core.register_node("testnodes:attached_wallmounted_floor_rot", { - description = S("Rotatable Floor-Attached Wallmounted Node").."\n".. - S("Drops as item if no solid node below (regardless of rotation)").."\n".. - S("param2 = wallmounted rotation (visual only) (0..7)").."\n".. - S("May be rotated by 90° if placed at floor or ceiling"), - paramtype2 = "wallmounted", - tiles = { - "testnodes_attachedfr_top.png", - "testnodes_attachedfr_bottom.png", - "testnodes_attachedfr_side.png", - }, - wallmounted_rotate_vertical = true, - groups = { attached_node = 3, dig_immediate = 3 }, -}) - --- This node attaches to the ceiling and drops as item --- when the ceiling is gone. -core.register_node("testnodes:attached_top", { - description = S("Ceiling-Attached Node").."\n".. - S("Drops as item if no solid node above"), - tiles = { - "testnodes_attached_bottom.png", - "testnodes_attached_top.png", - "testnodes_attached_side.png^[transformR180", - }, - groups = { attached_node = 4, dig_immediate = 3 }, -}) - --- Same as wallmounted attached, but for facedir -core.register_node("testnodes:attached_facedir", { - description = S("Facedir Attached Node").."\n".. - S("Attaches to a neighboring solid node; drops as item if that node is gone").."\n".. - S("param2 = facedir rotation (0..23)"), - paramtype2 = "facedir", - tiles = { - "testnodes_attachedf_side.png^[transformR180", - "testnodes_attachedf_side.png", - "testnodes_attachedf_side.png^[transformR90", - "testnodes_attachedf_side.png^[transformR270", - "testnodes_attachedf_bottom.png", - "testnodes_attachedf_top.png", - }, - groups = { attached_node = 2, dig_immediate = 3 }, -}) - --- Same as facedir attached, but for 4dir -core.register_node("testnodes:attached_4dir", { - description = S("4dir Attached Node").."\n".. - S("Attaches to the side of a solid node; drops as item if that node is gone").."\n".. - S("param2 = 4dir rotation (0..3)"), - paramtype2 = "4dir", - tiles = { - "testnodes_attached4_side.png^[transformR180", - "testnodes_attached4_side.png", - "testnodes_attached4_side.png^[transformR90", - "testnodes_attached4_side.png^[transformR270", - "testnodes_attached4_bottom.png", - "testnodes_attached4_top.png", - }, - groups = { attached_node = 2, dig_immediate = 3 }, -}) - --- Jump disabled -core.register_node("testnodes:nojump", { - description = S("Non-jumping Node").."\n".. - S("You can't jump on it"), - groups = {disable_jump=1, dig_immediate=3}, - tiles = {"testnodes_nojump_top.png", "testnodes_nojump_side.png"}, -}) - --- Jump disabled plant -core.register_node("testnodes:nojump_walkable", { - description = S("Non-jumping Plant Node").."\n".. - S("You can't jump while your feet are in it"), - drawtype = "plantlike", - groups = {disable_jump=1, dig_immediate=3}, - walkable = false, - tiles = {"testnodes_nojump_top.png"}, -}) - -local climbable_nodebox = { - type = "regular", -} - --- Climbable up and down with jump and sneak keys -core.register_node("testnodes:climbable", { - description = S("Climbable Node").."\n".. - S("You can climb up and down"), - climbable = true, - walkable = false, - - - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - tiles = {"testnodes_climbable_top.png","testnodes_climbable_top.png","testnodes_climbable_side.png"}, - use_texture_alpha = "clip", - drawtype = "nodebox", - node_box = climbable_nodebox, - groups = {dig_immediate=3}, -}) - --- Climbable only downwards with sneak key -core.register_node("testnodes:climbable_nojump", { - description = S("Downwards-climbable Node").."\n".. - S("You can climb only downwards"), - climbable = true, - walkable = false, - - groups = {disable_jump=1, dig_immediate=3}, - drawtype = "nodebox", - node_box = climbable_nodebox, - tiles = {"testnodes_climbable_nojump_top.png","testnodes_climbable_nojump_top.png","testnodes_climbable_nojump_side.png"}, - use_texture_alpha = "clip", - paramtype = "light", - sunlight_propagates = true, -}) - - -core.register_node("testnodes:climbable_nodescend", { - description = S("Upwards-climbable Node"), - climbable = true, - walkable = false, - - groups = {disable_descend=1, dig_immediate=3}, - drawtype = "nodebox", - node_box = climbable_nodebox, - tiles = {"testnodes_climbable_nodescend_top.png","testnodes_climbable_nodescend_top.png","testnodes_climbable_nodescend_side.png"}, - use_texture_alpha = "clip", - paramtype = "light", - sunlight_propagates = true, -}) - -core.register_node("testnodes:climbable_nodescend_nojump", { - description = S("Horizontal-only Climbable Node"), - climbable = true, - walkable = false, - - groups = {disable_jump=1, disable_descend=1, dig_immediate=3}, - drawtype = "nodebox", - node_box = climbable_nodebox, - tiles = {"testnodes_climbable_noclimb_top.png","testnodes_climbable_noclimb_top.png","testnodes_climbable_noclimb_side.png"}, - use_texture_alpha = "clip", - paramtype = "light", - sunlight_propagates = true, -}) - --- A liquid in which you can't rise -core.register_node("testnodes:liquid_nojump", { - description = S("Non-jumping Liquid Source Node").."\n".. - S("Swimmable liquid, but you can't swim upwards"), - liquidtype = "source", - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquidflowing_nojump", - liquid_alternative_source = "testnodes:liquid_nojump", - liquid_renewable = false, - groups = {disable_jump=1, dig_immediate=3}, - walkable = false, - - drawtype = "liquid", - tiles = {"testnodes_liquidsource.png^[colorize:#FF0000:127"}, - special_tiles = { - {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = false}, - {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - pointable = false, - liquids_pointable = true, - is_ground_content = false, - post_effect_color = {a = 70, r = 255, g = 0, b = 200}, -}) - --- A liquid in which you can't rise (flowing variant) -core.register_node("testnodes:liquidflowing_nojump", { - description = S("Non-jumping Flowing Liquid Node").."\n".. - S("Swimmable liquid, but you can't swim upwards"), - liquidtype = "flowing", - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquidflowing_nojump", - liquid_alternative_source = "testnodes:liquid_nojump", - liquid_renewable = false, - groups = {disable_jump=1, dig_immediate=3}, - walkable = false, - - - drawtype = "flowingliquid", - tiles = {"testnodes_liquidflowing.png^[colorize:#FF0000:127"}, - special_tiles = { - {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, - {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - pointable = false, - liquids_pointable = true, - is_ground_content = false, - post_effect_color = {a = 70, r = 255, g = 0, b = 200}, -}) - --- A liquid which doesn't have liquid movement physics (source variant) -core.register_node("testnodes:liquid_noswim", { - description = S("No-swim Liquid Source Node").."\n".. - S("Liquid node, but swimming is disabled"), - liquidtype = "source", - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquidflowing_noswim", - liquid_alternative_source = "testnodes:liquid_noswim", - liquid_renewable = false, - liquid_move_physics = false, - groups = {dig_immediate=3}, - walkable = false, - - drawtype = "liquid", - tiles = {"testnodes_liquidsource.png^[colorize:#FF00FF:127"}, - special_tiles = { - {name = "testnodes_liquidsource.png^[colorize:#FF00FF:127", backface_culling = false}, - {name = "testnodes_liquidsource.png^[colorize:#FF00FF:127", backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - pointable = false, - liquids_pointable = true, - buildable_to = true, - is_ground_content = false, - post_effect_color = {a = 70, r = 255, g = 200, b = 200}, -}) - --- A liquid which doen't have liquid movement physics (flowing variant) -core.register_node("testnodes:liquidflowing_noswim", { - description = S("No-swim Flowing Liquid Node").."\n".. - S("Liquid node, but swimming is disabled"), - liquidtype = "flowing", - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquidflowing_noswim", - liquid_alternative_source = "testnodes:liquid_noswim", - liquid_renewable = false, - liquid_move_physics = false, - groups = {dig_immediate=3}, - walkable = false, - - - drawtype = "flowingliquid", - tiles = {"testnodes_liquidflowing.png^[colorize:#FF00FF:127"}, - special_tiles = { - {name = "testnodes_liquidflowing.png^[colorize:#FF00FF:127", backface_culling = false}, - {name = "testnodes_liquidflowing.png^[colorize:#FF00FF:127", backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - pointable = false, - liquids_pointable = true, - buildable_to = true, - is_ground_content = false, - post_effect_color = {a = 70, r = 255, g = 200, b = 200}, -}) - --- A liquid in which you can't actively descend. --- Note: You'll still descend slowly by doing nothing. -core.register_node("testnodes:liquid_nodescend", { - description = S("No-descending Liquid Source Node"), - liquidtype = "source", - liquid_range = 0, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquidflowing_nodescend", - liquid_alternative_source = "testnodes:liquid_nodescend", - liquid_renewable = false, - groups = {disable_descend=1, dig_immediate=3}, - walkable = false, - - drawtype = "liquid", - tiles = {"testnodes_liquidsource.png^[colorize:#FFFF00:127"}, - special_tiles = { - {name = "testnodes_liquidsource.png^[colorize:#FFFF00:127", backface_culling = false}, - {name = "testnodes_liquidsource.png^[colorize:#FFFF00:127", backface_culling = true}, - }, - use_texture_alpha = "blend", - paramtype = "light", - pointable = false, - liquids_pointable = true, - is_ground_content = false, - post_effect_color = {a = 70, r = 255, g = 255, b = 200}, -}) - --- A liquid in which you can't actively descend (flowing variant) -core.register_node("testnodes:liquidflowing_nodescend", { - description = S("No-descending Flowing Liquid Node"), - liquidtype = "flowing", - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquidflowing_nodescend", - liquid_alternative_source = "testnodes:liquid_nodescend", - liquid_renewable = false, - groups = {disable_descend=1, dig_immediate=3}, - walkable = false, - - - drawtype = "flowingliquid", - tiles = {"testnodes_liquidflowing.png^[colorize:#FFFF00:127"}, - special_tiles = { - {name = "testnodes_liquidflowing.png^[colorize:#FFFF00:127", backface_culling = false}, - {name = "testnodes_liquidflowing.png^[colorize:#FFFF00:127", backface_culling = false}, - }, - use_texture_alpha = "blend", - paramtype = "light", - paramtype2 = "flowingliquid", - pointable = false, - liquids_pointable = true, - is_ground_content = false, - post_effect_color = {a = 70, r = 255, g = 255, b = 200}, -}) - --- Nodes that modify fall damage (various damage modifiers) -for i=-100, 100, 25 do - if i ~= 0 then - local subname, descnum - if i < 0 then - subname = "NEG"..string.format("%03d", math.abs(i)) - descnum = tostring(i) - else - subname = string.format("%03d", i) - descnum = S("+@1", i) - end - local tex, color, desc - if i > 0 then - local val = math.floor((i/100)*255) - tex = "testnodes_fall_damage_plus.png" - color = { b=0, g=255-val, r=255, a=255 } - desc = S("Fall Damage Node (+@1%)", i) - else - tex = "testnodes_fall_damage_minus.png" - if i == -100 then - color = { r=0, b=0, g=255, a=255 } - else - local val = math.floor((math.abs(i)/100)*255) - color = { r=0, b=255, g=255-val, a=255 } - end - desc = S("Fall Damage Node (-@1%)", math.abs(i)) - end - core.register_node("testnodes:damage"..subname, { - description = desc, - groups = {fall_damage_add_percent=i, dig_immediate=3}, - - - tiles = { tex }, - is_ground_content = false, - color = color, - }) - end -end - --- Bouncy nodes (various bounce levels) -local MAX_BOUNCE_JUMPY = 180 -local MAX_BOUNCE_NONJUMPY = 140 -for i=-MAX_BOUNCE_NONJUMPY, MAX_BOUNCE_JUMPY, 20 do - if i ~= 0 then - local desc - local val = math.floor((math.abs(i) - 20) / 200 * 255) - local val2 = math.max(0, 255 - val) - local num = string.format("%03d", math.abs(i)) - if i > 0 then - desc = S("Bouncy Node (@1%), jumpy", i).."\n".. - S("Sneaking/jumping affects bounce") - color = { r=val2, g=val2, b=255, a=255 } - else - desc = S("Bouncy Node (@1%), non-jumpy", math.abs(i)).."\n".. - S("Sneaking/jumping does not affect bounce") - color = { r=val2, g=255, b=val2, a=255 } - num = "NEG"..num - end - core.register_node("testnodes:bouncy"..num, { - description = desc, - groups = {bouncy=i, dig_immediate=3}, - - - color = color, - tiles ={"testnodes_bouncy.png"}, - is_ground_content = false, - }) - end -end - --- Slippery nodes (various slippery levels) -for i=1, 5 do - core.register_node("testnodes:slippery"..i, { - description = S("Slippery Node (@1)", i), - tiles ={"testnodes_slippery.png"}, - is_ground_content = false, - groups = {slippery=i, dig_immediate=3}, - color = { r=0, g=255, b=math.floor((i/5)*255), a=255 }, - }) -end - --- Move resistance nodes (various resistance levels) -for r=0, 7 do - if r > 0 then - core.register_node("testnodes:move_resistance"..r, { - description = S("Move-resistant Node (@1)", r).."\n".. - S("Reduces movement speed"), - walkable = false, - move_resistance = r, - - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_move_resistance.png" }, - is_ground_content = false, - groups = { dig_immediate = 3 }, - color = { b = 0, g = 255, r = math.floor((r/7)*255), a = 255 }, - }) - end - - local mdesc, mcolor - if r == 0 then - mdesc = S("Liquidlike Movement Node").."\n".. - S("Swimmable (no move resistance)") - mcolor = { b = 255, g = 255, r = 128 } - else - mdesc = S("Move-resistant Node (@1), liquidlike", r).."\n".. - S("Reduces movement speed; swimmable") - mcolor = { b = 255, g = 0, r = math.floor((r/7)*255), a = 255 } - end - - - core.register_node("testnodes:move_resistance_liquidlike"..r, { - description = mdesc, - walkable = false, - move_resistance = r, - liquid_move_physics = true, - - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_move_resistance.png" }, - is_ground_content = false, - groups = { dig_immediate = 3 }, - color = mcolor, - }) -end - -core.register_node("testnodes:climbable_move_resistance_4", { - description = S("Climbable Move-resistant Node (4)").."\n".. - S("You can climb up and down; reduced movement speed"), - walkable = false, - climbable = true, - move_resistance = 4, - - drawtype = "nodebox", - paramtype = "light", - sunlight_propagates = true, - tiles = {"testnodes_climbable_top.png","testnodes_climbable_top.png","testnodes_climbable_resistance_side.png"}, - use_texture_alpha = "clip", - is_ground_content = false, - groups = { dig_immediate = 3 }, -}) - --- By placing something on the node, the node itself will be replaced -core.register_node("testnodes:buildable_to", { - description = S("\"buildable_to\" Node").."\n".. - S("Placing a node on it will replace it"), - buildable_to = true, - tiles = {"testnodes_buildable_to.png"}, - is_ground_content = false, - groups = {dig_immediate=3}, -}) - --- Nodes that deal damage to players that are inside them. --- Negative damage nodes should heal. -for d=-3,3 do - if d ~= 0 then - local sub, tile, desc - if d > 0 then - sub = tostring(d) - tile = "testnodes_damage.png" - desc = S("Damage Node (@1 damage per second)", d) - else - sub = "m" .. tostring(math.abs(d)) - tile = "testnodes_damage_neg.png" - desc = S("Healing Node (@1 HP per second)", math.abs(d)) - end - if math.abs(d) == 2 then - tile = tile .. "^[colorize:#000000:70" - elseif math.abs(d) == 3 then - tile = tile .. "^[colorize:#000000:140" - end - core.register_node("testnodes:damage_"..sub, { - description = desc, - damage_per_second = d, - - - walkable = false, - is_ground_content = false, - drawtype = "allfaces", - paramtype = "light", - sunlight_propagates = true, - tiles = { tile }, - groups = {dig_immediate=3}, - }) - end -end - --- Causes drowning damage -core.register_node("testnodes:drowning_1", { - description = S("Drowning Node (@1 damage)", 1).."\n".. - S("You'll drown inside it"), - drowning = 1, - - - walkable = false, - is_ground_content = false, - drawtype = "allfaces", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_drowning.png" }, - groups = {dig_immediate=3}, -}) - --- post_effect_color_shaded - -core.register_node("testnodes:post_effect_color_shaded_false", { - description = S("\"post_effect_color_shaded = false\" Node"), - - drawtype = "allfaces", - tiles = {"testnodes_post_effect_color_shaded_false.png"}, - use_texture_alpha = "blend", - paramtype = "light", - sunlight_propagates = true, - post_effect_color = {a = 128, r = 255, g = 255, b = 255}, - post_effect_color_shaded = false, - - walkable = false, - is_ground_content = false, - groups = {dig_immediate=3}, -}) - -core.register_node("testnodes:post_effect_color_shaded_true", { - description = S("\"post_effect_color_shaded = true\" Node"), - - drawtype = "allfaces", - tiles = {"testnodes_post_effect_color_shaded_true.png"}, - use_texture_alpha = "blend", - paramtype = "light", - sunlight_propagates = true, - post_effect_color = {a = 128, r = 255, g = 255, b = 255}, - post_effect_color_shaded = true, - - walkable = false, - is_ground_content = false, - groups = {dig_immediate=3}, -}) - --- Pointability - --- Register wrapper for compactness -local function register_pointable_test_node(name, description, pointable) - local texture = "testnodes_"..name..".png" - core.register_node("testnodes:"..name, { - description = S(description), - tiles = {texture}, - drawtype = "glasslike_framed", - paramtype = "light", - walkable = false, - pointable = pointable, - groups = {dig_immediate=3, [name.."_test"]=1}, - }) -end - -register_pointable_test_node("pointable", "Pointable Node", true) -register_pointable_test_node("not_pointable", "Not Pointable Node", false) -register_pointable_test_node("blocking_pointable", "Blocking Pointable Node", "blocking") diff --git a/data/games/garage/mods/testnodes/textures.lua b/data/games/garage/mods/testnodes/textures.lua deleted file mode 100644 index 0d41947..0000000 --- a/data/games/garage/mods/testnodes/textures.lua +++ /dev/null @@ -1,369 +0,0 @@ --- Node texture tests - -local S = core.get_translator("testnodes") - -core.register_node("testnodes:6sides", { - description = S("Six Textures Test Node").."\n".. - S("Has 1 texture per face"), - tiles = { - "testnodes_normal1.png", - "testnodes_normal2.png", - "testnodes_normal3.png", - "testnodes_normal4.png", - "testnodes_normal5.png", - "testnodes_normal6.png", - }, - - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:anim", { - description = S("Animated Test Node").."\n".. - S("Tiles animate from A to D in 4s cycle"), - tiles = { - { name = "testnodes_anim.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 4.0, - }, }, - }, - - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:fill_positioning", { - description = S("Fill Modifier Test Node") .. "\n" .. - S("The node should have the same look as " .. - "testnodes:fill_positioning_reference."), - drawtype = "glasslike", - paramtype = "light", - tiles = {"[fill:16x16:#ffffff^[fill:6x6:1,1:#00ffdc" .. - "^[fill:6x6:1,9:#00ffdc^[fill:6x6:9,1:#00ffdc^[fill:6x6:9,9:#00ffdc"}, - groups = {dig_immediate = 3}, -}) - -core.register_node("testnodes:fill_positioning_reference", { - description = S("Fill Modifier Test Node Reference"), - drawtype = "glasslike", - paramtype = "light", - tiles = {"testnodes_fill_positioning_reference.png"}, - groups = {dig_immediate = 3}, -}) - -core.register_node("testnodes:modifier_mask", { - description = S("[mask Modifier Test Node"), - tiles = {"testnodes_128x128_rgb.png^[mask:testnodes_mask_WRGBKW.png"}, - groups = {dig_immediate = 3}, -}) - --- Node texture transparency test - -local alphas = { 64, 128, 191 } - -for a=1,#alphas do - local alpha = alphas[a] - - -- Transparency taken from texture - core.register_node("testnodes:alpha_texture_"..alpha, { - description = S("Texture Alpha Test Node (@1)", alpha).."\n".. - S("Semi-transparent"), - drawtype = "glasslike", - paramtype = "light", - tiles = { - "testnodes_alpha"..alpha..".png", - }, - use_texture_alpha = "blend", - - groups = { dig_immediate = 3 }, - }) - - -- Transparency set via texture modifier - core.register_node("testnodes:alpha_"..alpha, { - description = S("Alpha Test Node (@1)", alpha).."\n".. - S("Semi-transparent"), - drawtype = "glasslike", - paramtype = "light", - tiles = { - "testnodes_alpha.png^[opacity:" .. alpha, - }, - use_texture_alpha = "blend", - - groups = { dig_immediate = 3 }, - }) -end - -core.register_node("testnodes:alpha_compositing", { - description = S("Texture Overlay Test Node") .. "\n" .. - S("A regular grid should be visible where each cell contains two " .. - "texels with the same color.") .. "\n" .. - S("Texture overlay is gamma-incorrect, " .. - "and in general it does not do alpha compositing, " .. - "both for backwards compatibility."), - drawtype = "glasslike", - paramtype = "light", - tiles = {"testnodes_alpha_compositing_bottom.png^" .. - "testnodes_alpha_compositing_top.png"}, - use_texture_alpha = "blend", - groups = {dig_immediate = 3}, -}) - --- Generate PNG textures - -local function mandelbrot(w, h, iterations) - local r = {} - for y=0, h-1 do - for x=0, w-1 do - local re = (x - w/2) * 4/w - local im = (y - h/2) * 4/h - -- zoom in on a nice view - re = re / 128 - 0.23 - im = im / 128 - 0.82 - - local px, py = 0, 0 - local i = 0 - while px*px + py*py <= 4 and i < iterations do - px, py = px*px - py*py + re, 2 * px * py + im - i = i + 1 - end - r[w*y+x+1] = i / iterations - end - end - return r -end - -local function gen_checkers(w, h, tile) - local r = {} - for y=0, h-1 do - for x=0, w-1 do - local hori = math.floor(x / tile) % 2 == 0 - local vert = math.floor(y / tile) % 2 == 0 - r[w*y+x+1] = hori ~= vert and 1 or 0 - end - end - return r -end - --- The engine should perform color reduction of the generated PNG in certain --- cases, so we have this helper to check the result -local function encode_and_check(w, h, ctype, data) - local ret = core.encode_png(w, h, data) - assert(ret:sub(1, 8) == "\137PNG\r\n\026\n", "missing png signature") - assert(ret:sub(9, 16) == "\000\000\000\rIHDR", "didn't find ihdr chunk") - local ctype_actual = ret:byte(26) -- Color Type (1 byte) - ctype = ({rgba=6, rgb=2, gray=0})[ctype] - assert(ctype_actual == ctype, "png should have color type " .. ctype .. - " but actually has " .. ctype_actual) - return ret -end - -local fractal = mandelbrot(512, 512, 128) -local frac_emb = mandelbrot(64, 64, 64) -local checker = gen_checkers(512, 512, 32) - -local floor = math.floor -local abs = math.abs -local data_emb = {} -local data_mb = {} -local data_ck = {} -for i=1, #frac_emb do - data_emb[i] = { - r = floor(abs(frac_emb[i] * 2 - 1) * 255), - g = floor(abs(1 - frac_emb[i]) * 255), - b = floor(frac_emb[i] * 255), - a = frac_emb[i] < 0.95 and 255 or 0, - } -end -for i=1, #fractal do - data_mb[i] = { - r = floor(fractal[i] * 255), - g = floor(abs(fractal[i] * 2 - 1) * 255), - b = floor(abs(1 - fractal[i]) * 255), - a = 255, - } - data_ck[i] = checker[i] > 0 and "#888" or "#000" -end - -fractal = nil -frac_emb = nil -checker = nil - -local textures_path = core.get_worldpath() .. "/" -core.safe_file_write( - textures_path .. "testnodes1.png", - encode_and_check(512, 512, "rgb", data_mb) -) -local png_ck = encode_and_check(512, 512, "gray", data_ck) -core.dynamic_add_media({ - filename = "testnodes_generated_mb.png", - filepath = textures_path .. "testnodes1.png" -}) -core.dynamic_add_media({ - filename = "testnodes_generated_ck.png", - filedata = png_ck, -}) - -core.register_node("testnodes:generated_png_mb", { - description = S("Generated Mandelbrot PNG Test Node"), - tiles = { "testnodes_generated_mb.png" }, - - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:generated_png_ck", { - description = S("Generated Checker PNG Test Node"), - tiles = { "testnodes_generated_ck.png" }, - - groups = { dig_immediate = 2 }, -}) - -local png_emb = "[png:" .. core.encode_base64( - encode_and_check(64, 64, "rgba", data_emb)) - -core.register_node("testnodes:generated_png_emb", { - description = S("Generated In-Band Mandelbrot PNG Test Node"), - tiles = { png_emb }, - - drawtype = "allfaces", -- required because of transparent pixels - use_texture_alpha = "clip", - paramtype = "light", - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:generated_png_src_emb", { - description = S("Generated In-Band Source Blit Mandelbrot PNG Test Node"), - tiles = { png_emb .. "^testnodes_damage_neg.png" }, - - drawtype = "allfaces", -- required because of transparent pixels - use_texture_alpha = "clip", - paramtype = "light", - groups = { dig_immediate = 2 }, -}) -core.register_node("testnodes:generated_png_dst_emb", { - description = S("Generated In-Band Dest Blit Mandelbrot PNG Test Node"), - tiles = { "testnodes_generated_ck.png^" .. png_emb }, - - groups = { dig_immediate = 2 }, -}) - -png_ck = nil -png_emb = nil -data_emb = nil -data_mb = nil -data_ck = nil - ---[[ - -The following nodes can be used to demonstrate the TGA format support. - -Luanti supports TGA types 1, 2, 3 & 10. While adding the support for -TGA type 9 (RLE-compressed, color-mapped) is easy, it is not advisable -to do so, as it is not backwards compatible with any engine version pre-5.5; -content creators should therefore either use TGA type 1 or 10, or PNG. - -TODO: Types 1, 2 & 10 should have two test nodes each (i.e. bottom-top -and top-bottom) for 16bpp (A1R5G5B5), 24bpp (B8G8R8), 32bpp (B8G8R8A8) -colors. - -Note: Luanti requires the optional TGA footer for a texture to load. -If a TGA image does not load in Luanti, append eight (8) null bytes, -then the string “TRUEVISION-XFILE.”, then another null byte. - -]]-- - -core.register_node("testnodes:tga_type1_24bpp_bt", { - description = S("TGA Type 1 (color-mapped RGB) 24bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type1_24bpp_bt.tga" }, - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type1_24bpp_tb", { - description = S("TGA Type 1 (color-mapped RGB) 24bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type1_24bpp_tb.tga" }, - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type2_16bpp_bt", { - description = S("TGA Type 2 (uncompressed RGB) 16bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_16bpp_bt.tga" }, - use_texture_alpha = "clip", - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type2_16bpp_tb", { - description = S("TGA Type 2 (uncompressed RGB) 16bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_16bpp_tb.tga" }, - use_texture_alpha = "clip", - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type2_32bpp_bt", { - description = S("TGA Type 2 (uncompressed RGB) 32bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_32bpp_bt.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type2_32bpp_tb", { - description = S("TGA Type 2 (uncompressed RGB) 32bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type2_32bpp_tb.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type3_16bpp_bt", { - description = S("TGA Type 3 (uncompressed grayscale) 16bpp bottom-top Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type3_16bpp_bt.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type3_16bpp_tb", { - description = S("TGA Type 3 (uncompressed grayscale) 16bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type3_16bpp_tb.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type10_32bpp_bt", { - description = S("TGA Type 10 (RLE-compressed RGB) 32bpp bottom-top Test Node"), - tiles = { "testnodes_tga_type10_32bpp_bt.tga" }, - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) - -core.register_node("testnodes:tga_type10_32bpp_tb", { - description = S("TGA Type 10 (RLE-compressed RGB) 32bpp top-bottom Test Node"), - drawtype = "glasslike", - paramtype = "light", - sunlight_propagates = true, - tiles = { "testnodes_tga_type10_32bpp_tb.tga" }, - use_texture_alpha = "blend", - groups = { dig_immediate = 2 }, -}) diff --git a/data/games/garage/mods/testnodes/textures/testnodes_1.png b/data/games/garage/mods/testnodes/textures/testnodes_1.png deleted file mode 100644 index 6730997..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_1.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_128x128_rgb.png b/data/games/garage/mods/testnodes/textures/testnodes_128x128_rgb.png deleted file mode 100644 index 060d8e6..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_128x128_rgb.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_1f.png b/data/games/garage/mods/testnodes/textures/testnodes_1f.png deleted file mode 100644 index f9a1b69..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_1f.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_1fg.png b/data/games/garage/mods/testnodes/textures/testnodes_1fg.png deleted file mode 100644 index 5d0beb0..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_1fg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_1g.png b/data/games/garage/mods/testnodes/textures/testnodes_1g.png deleted file mode 100644 index 529298e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_1g.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_1w.png b/data/games/garage/mods/testnodes/textures/testnodes_1w.png deleted file mode 100644 index d24e571..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_1w.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_1wg.png b/data/games/garage/mods/testnodes/textures/testnodes_1wg.png deleted file mode 100644 index b2eba0e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_1wg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_2.png b/data/games/garage/mods/testnodes/textures/testnodes_2.png deleted file mode 100644 index 6c87c86..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_2f.png b/data/games/garage/mods/testnodes/textures/testnodes_2f.png deleted file mode 100644 index a26f840..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_2f.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_2fg.png b/data/games/garage/mods/testnodes/textures/testnodes_2fg.png deleted file mode 100644 index 3386330..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_2fg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_2g.png b/data/games/garage/mods/testnodes/textures/testnodes_2g.png deleted file mode 100644 index cb9060f..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_2g.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_2w.png b/data/games/garage/mods/testnodes/textures/testnodes_2w.png deleted file mode 100644 index b56874e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_2w.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_2wg.png b/data/games/garage/mods/testnodes/textures/testnodes_2wg.png deleted file mode 100644 index 108dc87..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_2wg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_3.png b/data/games/garage/mods/testnodes/textures/testnodes_3.png deleted file mode 100644 index 05b4562..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_3.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_3f.png b/data/games/garage/mods/testnodes/textures/testnodes_3f.png deleted file mode 100644 index d007ee4..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_3f.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_3fg.png b/data/games/garage/mods/testnodes/textures/testnodes_3fg.png deleted file mode 100644 index 01e4276..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_3fg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_3g.png b/data/games/garage/mods/testnodes/textures/testnodes_3g.png deleted file mode 100644 index 5c84f58..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_3g.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_3w.png b/data/games/garage/mods/testnodes/textures/testnodes_3w.png deleted file mode 100644 index 8b435cf..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_3w.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_3wg.png b/data/games/garage/mods/testnodes/textures/testnodes_3wg.png deleted file mode 100644 index 9ee9006..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_3wg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_4.png b/data/games/garage/mods/testnodes/textures/testnodes_4.png deleted file mode 100644 index 15e6ffe..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_4.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_4f.png b/data/games/garage/mods/testnodes/textures/testnodes_4f.png deleted file mode 100644 index 7e444fd..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_4f.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_4fg.png b/data/games/garage/mods/testnodes/textures/testnodes_4fg.png deleted file mode 100644 index 6068139..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_4fg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_4g.png b/data/games/garage/mods/testnodes/textures/testnodes_4g.png deleted file mode 100644 index 8f144fa..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_4g.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_4w.png b/data/games/garage/mods/testnodes/textures/testnodes_4w.png deleted file mode 100644 index 214e0df..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_4w.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_4wg.png b/data/games/garage/mods/testnodes/textures/testnodes_4wg.png deleted file mode 100644 index 888b3d4..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_4wg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_5.png b/data/games/garage/mods/testnodes/textures/testnodes_5.png deleted file mode 100644 index 1ef1c72..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_5.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_5f.png b/data/games/garage/mods/testnodes/textures/testnodes_5f.png deleted file mode 100644 index a4162db..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_5f.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_5fg.png b/data/games/garage/mods/testnodes/textures/testnodes_5fg.png deleted file mode 100644 index f21acbb..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_5fg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_5g.png b/data/games/garage/mods/testnodes/textures/testnodes_5g.png deleted file mode 100644 index 30da479..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_5g.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_5w.png b/data/games/garage/mods/testnodes/textures/testnodes_5w.png deleted file mode 100644 index b4cb424..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_5w.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_5wg.png b/data/games/garage/mods/testnodes/textures/testnodes_5wg.png deleted file mode 100644 index fac9db2..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_5wg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_6.png b/data/games/garage/mods/testnodes/textures/testnodes_6.png deleted file mode 100644 index 805813e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_6.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_6f.png b/data/games/garage/mods/testnodes/textures/testnodes_6f.png deleted file mode 100644 index be3f695..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_6f.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_6fg.png b/data/games/garage/mods/testnodes/textures/testnodes_6fg.png deleted file mode 100644 index 75df824..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_6fg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_6g.png b/data/games/garage/mods/testnodes/textures/testnodes_6g.png deleted file mode 100644 index a88f4c9..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_6g.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_6w.png b/data/games/garage/mods/testnodes/textures/testnodes_6w.png deleted file mode 100644 index e6bbf97..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_6w.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_6wg.png b/data/games/garage/mods/testnodes/textures/testnodes_6wg.png deleted file mode 100644 index 29ca933..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_6wg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_airlike.png b/data/games/garage/mods/testnodes/textures/testnodes_airlike.png deleted file mode 100644 index 5a5664a..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_airlike.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_allfaces.png b/data/games/garage/mods/testnodes/textures/testnodes_allfaces.png deleted file mode 100644 index c0a7dc5..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_allfaces.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_allfaces_optional.png b/data/games/garage/mods/testnodes/textures/testnodes_allfaces_optional.png deleted file mode 100644 index 1f6a173..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_allfaces_optional.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_alpha.png b/data/games/garage/mods/testnodes/textures/testnodes_alpha.png deleted file mode 100644 index 157fa73..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_alpha.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_alpha128.png b/data/games/garage/mods/testnodes/textures/testnodes_alpha128.png deleted file mode 100644 index 16babf6..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_alpha128.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_alpha191.png b/data/games/garage/mods/testnodes/textures/testnodes_alpha191.png deleted file mode 100644 index f165d28..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_alpha191.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_alpha64.png b/data/games/garage/mods/testnodes/textures/testnodes_alpha64.png deleted file mode 100644 index c343c32..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_alpha64.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_alpha_compositing_bottom.png b/data/games/garage/mods/testnodes/textures/testnodes_alpha_compositing_bottom.png deleted file mode 100644 index 40d9f53..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_alpha_compositing_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_alpha_compositing_top.png b/data/games/garage/mods/testnodes/textures/testnodes_alpha_compositing_top.png deleted file mode 100644 index 64b5664..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_alpha_compositing_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_anim.png b/data/games/garage/mods/testnodes/textures/testnodes_anim.png deleted file mode 100644 index d321fe8..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_anim.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attached4_bottom.png b/data/games/garage/mods/testnodes/textures/testnodes_attached4_bottom.png deleted file mode 100644 index b7a7a2f..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attached4_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attached4_side.png b/data/games/garage/mods/testnodes/textures/testnodes_attached4_side.png deleted file mode 100644 index 869e073..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attached4_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attached4_top.png b/data/games/garage/mods/testnodes/textures/testnodes_attached4_top.png deleted file mode 100644 index 94219bc..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attached4_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attached_bottom.png b/data/games/garage/mods/testnodes/textures/testnodes_attached_bottom.png deleted file mode 100644 index e01ae57..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attached_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attached_side.png b/data/games/garage/mods/testnodes/textures/testnodes_attached_side.png deleted file mode 100644 index 9459cbb..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attached_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attached_top.png b/data/games/garage/mods/testnodes/textures/testnodes_attached_top.png deleted file mode 100644 index 0148b41..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attached_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedf_bottom.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedf_bottom.png deleted file mode 100644 index f9ffdfd..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedf_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedf_side.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedf_side.png deleted file mode 100644 index 93c0e82..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedf_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedf_top.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedf_top.png deleted file mode 100644 index 978ef61..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedf_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_bottom.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_bottom.png deleted file mode 100644 index 21ece33..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_side.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_side.png deleted file mode 100644 index 1e6a696..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_top.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_top.png deleted file mode 100644 index feef552..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedfr_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedw_bottom.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedw_bottom.png deleted file mode 100644 index 488ad23..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedw_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedw_side.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedw_side.png deleted file mode 100644 index a02facb..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedw_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedw_top.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedw_top.png deleted file mode 100644 index 1f4fc7b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedw_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_bottom.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_bottom.png deleted file mode 100644 index 1a2e1e9..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_bottom.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_side.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_side.png deleted file mode 100644 index 382e2da..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_top.png b/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_top.png deleted file mode 100644 index 39ea67b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_attachedwr_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_blocking_pointable.png b/data/games/garage/mods/testnodes/textures/testnodes_blocking_pointable.png deleted file mode 100644 index fa02104..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_blocking_pointable.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_bouncy.png b/data/games/garage/mods/testnodes/textures/testnodes_bouncy.png deleted file mode 100644 index eabbbdf..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_bouncy.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_buildable_to.png b/data/games/garage/mods/testnodes/textures/testnodes_buildable_to.png deleted file mode 100644 index 23b5e54..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_buildable_to.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_noclimb_side.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_noclimb_side.png deleted file mode 100644 index f0b80ee..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_noclimb_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_noclimb_top.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_noclimb_top.png deleted file mode 100644 index 1905336..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_noclimb_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nodescend_side.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_nodescend_side.png deleted file mode 100644 index d1c4726..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nodescend_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nodescend_top.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_nodescend_top.png deleted file mode 100644 index 63da83f..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nodescend_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nojump_side.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_nojump_side.png deleted file mode 100644 index d5ca130..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nojump_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nojump_top.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_nojump_top.png deleted file mode 100644 index 2ea3eca..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_nojump_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_resistance_side.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_resistance_side.png deleted file mode 100644 index 860e998..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_resistance_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_side.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_side.png deleted file mode 100644 index c56ea90..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_climbable_top.png b/data/games/garage/mods/testnodes/textures/testnodes_climbable_top.png deleted file mode 100644 index f2a7e59..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_climbable_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_damage.png b/data/games/garage/mods/testnodes/textures/testnodes_damage.png deleted file mode 100644 index 9de2ab5..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_damage.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_damage_neg.png b/data/games/garage/mods/testnodes/textures/testnodes_damage_neg.png deleted file mode 100644 index 85811bc..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_damage_neg.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_drowning.png b/data/games/garage/mods/testnodes/textures/testnodes_drowning.png deleted file mode 100644 index 57ffc8f..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_drowning.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_fall_damage_minus.png b/data/games/garage/mods/testnodes/textures/testnodes_fall_damage_minus.png deleted file mode 100644 index 88d3bdf..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_fall_damage_minus.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_fall_damage_plus.png b/data/games/garage/mods/testnodes/textures/testnodes_fall_damage_plus.png deleted file mode 100644 index 61fdec2..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_fall_damage_plus.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_fencelike.png b/data/games/garage/mods/testnodes/textures/testnodes_fencelike.png deleted file mode 100644 index 84dea1b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_fencelike.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_fill_positioning_reference.png b/data/games/garage/mods/testnodes/textures/testnodes_fill_positioning_reference.png deleted file mode 100644 index 2ecd969..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_fill_positioning_reference.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_firelike.png b/data/games/garage/mods/testnodes/textures/testnodes_firelike.png deleted file mode 100644 index ee59b0d..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_firelike.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_glasslike.png b/data/games/garage/mods/testnodes/textures/testnodes_glasslike.png deleted file mode 100644 index cf3e354..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_glasslike.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_detail.png b/data/games/garage/mods/testnodes/textures/testnodes_glasslike_detail.png deleted file mode 100644 index 30c9586..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_detail.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed.png b/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed.png deleted file mode 100644 index 8a513f2..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed2.png b/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed2.png deleted file mode 100644 index 4ea839c..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed_optional.png b/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed_optional.png deleted file mode 100644 index 37de77d..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_glasslike_framed_optional.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_glasslikeliquid.png b/data/games/garage/mods/testnodes/textures/testnodes_glasslikeliquid.png deleted file mode 100644 index e1e96ff..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_glasslikeliquid.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light.png b/data/games/garage/mods/testnodes/textures/testnodes_light.png deleted file mode 100644 index 4ba0081..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_1.png b/data/games/garage/mods/testnodes/textures/testnodes_light_1.png deleted file mode 100644 index 57adf5a..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_1.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_10.png b/data/games/garage/mods/testnodes/textures/testnodes_light_10.png deleted file mode 100644 index 4838347..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_10.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_11.png b/data/games/garage/mods/testnodes/textures/testnodes_light_11.png deleted file mode 100644 index 4c423d9..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_11.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_12.png b/data/games/garage/mods/testnodes/textures/testnodes_light_12.png deleted file mode 100644 index bc7946d..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_12.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_13.png b/data/games/garage/mods/testnodes/textures/testnodes_light_13.png deleted file mode 100644 index 0b63c84..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_13.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_14.png b/data/games/garage/mods/testnodes/textures/testnodes_light_14.png deleted file mode 100644 index a817bd3..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_14.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_2.png b/data/games/garage/mods/testnodes/textures/testnodes_light_2.png deleted file mode 100644 index 852eaef..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_3.png b/data/games/garage/mods/testnodes/textures/testnodes_light_3.png deleted file mode 100644 index 79fc834..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_3.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_4.png b/data/games/garage/mods/testnodes/textures/testnodes_light_4.png deleted file mode 100644 index 75f8c61..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_4.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_5.png b/data/games/garage/mods/testnodes/textures/testnodes_light_5.png deleted file mode 100644 index b6eede0..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_5.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_6.png b/data/games/garage/mods/testnodes/textures/testnodes_light_6.png deleted file mode 100644 index ef54add..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_6.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_7.png b/data/games/garage/mods/testnodes/textures/testnodes_light_7.png deleted file mode 100644 index 4a885b0..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_7.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_8.png b/data/games/garage/mods/testnodes/textures/testnodes_light_8.png deleted file mode 100644 index b283301..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_8.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_light_9.png b/data/games/garage/mods/testnodes/textures/testnodes_light_9.png deleted file mode 100644 index 2aa9023..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_light_9.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_line_crossing.png b/data/games/garage/mods/testnodes/textures/testnodes_line_crossing.png deleted file mode 100644 index e566f27..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_line_crossing.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_line_curved.png b/data/games/garage/mods/testnodes/textures/testnodes_line_curved.png deleted file mode 100644 index ab9f8e7..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_line_curved.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_line_straight.png b/data/games/garage/mods/testnodes/textures/testnodes_line_straight.png deleted file mode 100644 index 4f33d9c..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_line_straight.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_line_t_junction.png b/data/games/garage/mods/testnodes/textures/testnodes_line_t_junction.png deleted file mode 100644 index 5668f6e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_line_t_junction.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquid.png b/data/games/garage/mods/testnodes/textures/testnodes_liquid.png deleted file mode 100644 index 98ab270..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquid.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing.png deleted file mode 100644 index 1736b89..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r0.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r0.png deleted file mode 100644 index e8a6103..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r0.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r1.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r1.png deleted file mode 100644 index b4e45b4..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r1.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r2.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r2.png deleted file mode 100644 index e064b8f..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r3.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r3.png deleted file mode 100644 index bef7739..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r3.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r4.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r4.png deleted file mode 100644 index de1001b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r4.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r5.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r5.png deleted file mode 100644 index 97b422e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r5.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r6.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r6.png deleted file mode 100644 index 4cd8e4e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r6.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r7.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r7.png deleted file mode 100644 index 711dd96..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r7.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r8.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r8.png deleted file mode 100644 index 9cf22b8..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidflowing_r8.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource.png deleted file mode 100644 index b3f29b7..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r0.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r0.png deleted file mode 100644 index da0a996..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r0.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r1.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r1.png deleted file mode 100644 index 66bf2be..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r1.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r2.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r2.png deleted file mode 100644 index fc5f65c..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r3.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r3.png deleted file mode 100644 index 0f46e29..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r3.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r4.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r4.png deleted file mode 100644 index 0693a04..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r4.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r5.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r5.png deleted file mode 100644 index cc9d039..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r5.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r6.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r6.png deleted file mode 100644 index e276a07..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r6.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r7.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r7.png deleted file mode 100644 index 3534a4b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r7.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r8.png b/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r8.png deleted file mode 100644 index ee1a8b1..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_liquidsource_r8.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_marble_glass.png b/data/games/garage/mods/testnodes/textures/testnodes_marble_glass.png deleted file mode 100644 index cd7ce5c..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_marble_glass.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_marble_metal.png b/data/games/garage/mods/testnodes/textures/testnodes_marble_metal.png deleted file mode 100644 index 205d499..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_marble_metal.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_marble_metal_overlay.png b/data/games/garage/mods/testnodes/textures/testnodes_marble_metal_overlay.png deleted file mode 100644 index e2bb431..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_marble_metal_overlay.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mask_WRGBKW.png b/data/games/garage/mods/testnodes/textures/testnodes_mask_WRGBKW.png deleted file mode 100644 index 03ab71e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mask_WRGBKW.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes.png deleted file mode 100644 index 51b8e00..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes10.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes10.png deleted file mode 100644 index a6d569a..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes10.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes2.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes2.png deleted file mode 100644 index 9ea65c1..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes3.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes3.png deleted file mode 100644 index 96bc55a..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes3.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes4.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes4.png deleted file mode 100644 index fca3372..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes4.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes5.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes5.png deleted file mode 100644 index 0f24f16..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes5.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes6.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes6.png deleted file mode 100644 index 46c6e50..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes6.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes7.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes7.png deleted file mode 100644 index 75b3bdd..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes7.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes8.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes8.png deleted file mode 100644 index 4b18859..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes8.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes9.png b/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes9.png deleted file mode 100644 index 9902be8..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_mesh_stripes9.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_move_resistance.png b/data/games/garage/mods/testnodes/textures/testnodes_move_resistance.png deleted file mode 100644 index cc7cb05..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_move_resistance.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node.png b/data/games/garage/mods/testnodes/textures/testnodes_node.png deleted file mode 100644 index 145099b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node_falling.png b/data/games/garage/mods/testnodes/textures/testnodes_node_falling.png deleted file mode 100644 index 4415318..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node_falling.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_1.png b/data/games/garage/mods/testnodes/textures/testnodes_node_falling_1.png deleted file mode 100644 index 74137b3..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_1.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_2.png b/data/games/garage/mods/testnodes/textures/testnodes_node_falling_2.png deleted file mode 100644 index 8327673..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_3.png b/data/games/garage/mods/testnodes/textures/testnodes_node_falling_3.png deleted file mode 100644 index 975de54..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_3.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_4.png b/data/games/garage/mods/testnodes/textures/testnodes_node_falling_4.png deleted file mode 100644 index 87fc276..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_4.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_5.png b/data/games/garage/mods/testnodes/textures/testnodes_node_falling_5.png deleted file mode 100644 index 9a8ce2d..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_5.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_6.png b/data/games/garage/mods/testnodes/textures/testnodes_node_falling_6.png deleted file mode 100644 index 9ad2f5b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_node_falling_6.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_nodebox.png b/data/games/garage/mods/testnodes/textures/testnodes_nodebox.png deleted file mode 100644 index 66e8dd6..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_nodebox.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_nojump_side.png b/data/games/garage/mods/testnodes/textures/testnodes_nojump_side.png deleted file mode 100644 index 6a64cff..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_nojump_side.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_nojump_top.png b/data/games/garage/mods/testnodes/textures/testnodes_nojump_top.png deleted file mode 100644 index fe77083..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_nojump_top.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_normal.png b/data/games/garage/mods/testnodes/textures/testnodes_normal.png deleted file mode 100644 index a1acfd9..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_normal.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_normal1.png b/data/games/garage/mods/testnodes/textures/testnodes_normal1.png deleted file mode 100644 index edaba77..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_normal1.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_normal2.png b/data/games/garage/mods/testnodes/textures/testnodes_normal2.png deleted file mode 100644 index 0080a9e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_normal2.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_normal3.png b/data/games/garage/mods/testnodes/textures/testnodes_normal3.png deleted file mode 100644 index 0426ab2..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_normal3.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_normal4.png b/data/games/garage/mods/testnodes/textures/testnodes_normal4.png deleted file mode 100644 index 0d1922e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_normal4.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_normal5.png b/data/games/garage/mods/testnodes/textures/testnodes_normal5.png deleted file mode 100644 index 0b7dcd2..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_normal5.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_normal6.png b/data/games/garage/mods/testnodes/textures/testnodes_normal6.png deleted file mode 100644 index f34a67d..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_normal6.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_not_pointable.png b/data/games/garage/mods/testnodes/textures/testnodes_not_pointable.png deleted file mode 100644 index 8509a68..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_not_pointable.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_overlay.png b/data/games/garage/mods/testnodes/textures/testnodes_overlay.png deleted file mode 100644 index 1c69b5e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_overlay.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_overlayable.png b/data/games/garage/mods/testnodes/textures/testnodes_overlayable.png deleted file mode 100644 index 431bc94..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_overlayable.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_palette_4dir.png b/data/games/garage/mods/testnodes/textures/testnodes_palette_4dir.png deleted file mode 100644 index 7a26c9b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_palette_4dir.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_palette_facedir.png b/data/games/garage/mods/testnodes/textures/testnodes_palette_facedir.png deleted file mode 100644 index 8cf47bb..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_palette_facedir.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_palette_full.png b/data/games/garage/mods/testnodes/textures/testnodes_palette_full.png deleted file mode 100644 index e0a5f8b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_palette_full.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_palette_metal.png b/data/games/garage/mods/testnodes/textures/testnodes_palette_metal.png deleted file mode 100644 index 8d87445..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_palette_metal.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_palette_wallmounted.png b/data/games/garage/mods/testnodes/textures/testnodes_palette_wallmounted.png deleted file mode 100644 index 682f3ac..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_palette_wallmounted.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike.png deleted file mode 100644 index cc46444..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_degrotate.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_degrotate.png deleted file mode 100644 index 01c81da..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_degrotate.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_leveled.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_leveled.png deleted file mode 100644 index 53504db..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_leveled.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_meshoptions.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_meshoptions.png deleted file mode 100644 index d504d45..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_meshoptions.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted.png deleted file mode 100644 index 79cf212..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base.png deleted file mode 100644 index b9ee9e5..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png deleted file mode 100644 index 85311cb..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_degrotate.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_leveled.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_leveled.png deleted file mode 100644 index bc602ba..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_leveled.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png deleted file mode 100644 index d100023..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_meshoptions.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png deleted file mode 100644 index 97a8915..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_waving.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_waving.png deleted file mode 100644 index 527817b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_waving.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png deleted file mode 100644 index 45e75bd..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_degrotate.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png deleted file mode 100644 index 8954b2c..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_leveled.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_meshoptions.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_meshoptions.png deleted file mode 100644 index a782d48..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_meshoptions.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png deleted file mode 100644 index 0decffa..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_waving.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_waving.png deleted file mode 100644 index 112a054..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_rooted_waving.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_wallmounted.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_wallmounted.png deleted file mode 100644 index c603f14..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_wallmounted.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_waving.png b/data/games/garage/mods/testnodes/textures/testnodes_plantlike_waving.png deleted file mode 100644 index b584a8d..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_plantlike_waving.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_pointable.png b/data/games/garage/mods/testnodes/textures/testnodes_pointable.png deleted file mode 100644 index 70c8f36..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_pointable.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_post_effect_color_shaded_false.png b/data/games/garage/mods/testnodes/textures/testnodes_post_effect_color_shaded_false.png deleted file mode 100644 index a14713a..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_post_effect_color_shaded_false.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_post_effect_color_shaded_true.png b/data/games/garage/mods/testnodes/textures/testnodes_post_effect_color_shaded_true.png deleted file mode 100644 index 448cf91..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_post_effect_color_shaded_true.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail2_crossing.png b/data/games/garage/mods/testnodes/textures/testnodes_rail2_crossing.png deleted file mode 100644 index 530bbba..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail2_crossing.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail2_curved.png b/data/games/garage/mods/testnodes/textures/testnodes_rail2_curved.png deleted file mode 100644 index 4ed1ca0..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail2_curved.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail2_straight.png b/data/games/garage/mods/testnodes/textures/testnodes_rail2_straight.png deleted file mode 100644 index 8749330..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail2_straight.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail2_t_junction.png b/data/games/garage/mods/testnodes/textures/testnodes_rail2_t_junction.png deleted file mode 100644 index 0517f65..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail2_t_junction.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail_crossing.png b/data/games/garage/mods/testnodes/textures/testnodes_rail_crossing.png deleted file mode 100644 index 3916ce1..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail_crossing.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail_curved.png b/data/games/garage/mods/testnodes/textures/testnodes_rail_curved.png deleted file mode 100644 index e444198..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail_curved.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail_straight.png b/data/games/garage/mods/testnodes/textures/testnodes_rail_straight.png deleted file mode 100644 index 872d04f..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail_straight.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_rail_t_junction.png b/data/games/garage/mods/testnodes/textures/testnodes_rail_t_junction.png deleted file mode 100644 index 7e4af51..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_rail_t_junction.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_sign3d.png b/data/games/garage/mods/testnodes/textures/testnodes_sign3d.png deleted file mode 100644 index e4ad947..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_sign3d.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_signlike.png b/data/games/garage/mods/testnodes/textures/testnodes_signlike.png deleted file mode 100644 index 33ffcba..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_signlike.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_slippery.png b/data/games/garage/mods/testnodes/textures/testnodes_slippery.png deleted file mode 100644 index b990468..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_slippery.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_street_crossing.png b/data/games/garage/mods/testnodes/textures/testnodes_street_crossing.png deleted file mode 100644 index d6e35ad..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_street_crossing.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_street_curved.png b/data/games/garage/mods/testnodes/textures/testnodes_street_curved.png deleted file mode 100644 index 251b7fb..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_street_curved.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_street_straight.png b/data/games/garage/mods/testnodes/textures/testnodes_street_straight.png deleted file mode 100644 index 639e24b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_street_straight.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_street_t_junction.png b/data/games/garage/mods/testnodes/textures/testnodes_street_t_junction.png deleted file mode 100644 index 713621e..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_street_t_junction.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_sunlight_filter.png b/data/games/garage/mods/testnodes/textures/testnodes_sunlight_filter.png deleted file mode 100644 index b38ea40..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_sunlight_filter.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga deleted file mode 100644 index 2dc587b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga deleted file mode 100644 index b44a81c..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga deleted file mode 100644 index d2c2ca6..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga deleted file mode 100644 index dfcb988..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga deleted file mode 100644 index 0206216..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga deleted file mode 100644 index 2563f08..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga deleted file mode 100644 index 3350500..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga deleted file mode 100644 index 216de06..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga deleted file mode 100644 index 695bb4b..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga b/data/games/garage/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga deleted file mode 100644 index c08a093..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_torchlike_ceiling.png b/data/games/garage/mods/testnodes/textures/testnodes_torchlike_ceiling.png deleted file mode 100644 index 5d9862c..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_torchlike_ceiling.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_torchlike_floor.png b/data/games/garage/mods/testnodes/textures/testnodes_torchlike_floor.png deleted file mode 100644 index adf1e00..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_torchlike_floor.png and /dev/null differ diff --git a/data/games/garage/mods/testnodes/textures/testnodes_torchlike_wall.png b/data/games/garage/mods/testnodes/textures/testnodes_torchlike_wall.png deleted file mode 100644 index cb442b2..0000000 Binary files a/data/games/garage/mods/testnodes/textures/testnodes_torchlike_wall.png and /dev/null differ diff --git a/data/games/garage/mods/testpathfinder/README.md b/data/games/garage/mods/testpathfinder/README.md deleted file mode 100644 index 2b9d46e..0000000 --- a/data/games/garage/mods/testpathfinder/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Pathfinder Tester - -Usage: - -Use the Pathfinder Tester tool (`testpathfinder:testpathfinder`). -Here's how it works: - -* Place on node: Set destination position -* Punch: Find path -* Sneak+punch: Select pathfinding algorithm - -Information will be shown in chat. If a path was found, all waypoints -will be shown for a few seconds. - -See `init.lua` for config variables. diff --git a/data/games/garage/mods/testpathfinder/init.lua b/data/games/garage/mods/testpathfinder/init.lua deleted file mode 100644 index a0f99f8..0000000 --- a/data/games/garage/mods/testpathfinder/init.lua +++ /dev/null @@ -1,136 +0,0 @@ -local S = core.get_translator("testpathfinder") - --- Config parameters - --- Maximum direct distance between start and end -local MAX_DIRECT_DISTANCE = 64 --- Maximum search distance -local MAX_SEARCH_DISTANCE = 32 --- Maximum permitted jump height -local MAX_JUMP = 1 --- Maximum permitted drop height -local MAX_DROP = 5 --- If true, mod won't refuse to run pathfinder even at long distances -local IGNORE_MAX_DISTANCE_SAFEGUARD = false - --- End of config parameters - -local timer = 0 -local algorithms = { - "A*_noprefetch", - "A*", - "Dijkstra", -} - -local function find_path_for_player(player, itemstack) - local meta = itemstack:get_meta() - if not meta then - return - end - local x = meta:get_int("pos_x") - local y = meta:get_int("pos_y") - local z = meta:get_int("pos_z") - local algo = meta:get_int("algorithm") - if x and y and z then - local pos2 = {x=x, y=y, z=z} - algo = algorithms[algo+1] - local pos1 = vector.round(player:get_pos()) - -- Don't bother calling pathfinder for high distance to avoid freezing - if (not IGNORE_MAX_DISTANCE_SAFEGUARD) and (vector.distance(pos1, pos2) > MAX_DIRECT_DISTANCE) then - core.chat_send_player(player:get_player_name(), S("Destination too far away! Set a destination (via placing) within a distance of @1 and try again!", MAX_DIRECT_DISTANCE)) - return - end - local str = S("Path from @1 to @2:", - core.pos_to_string(pos1), - core.pos_to_string(pos2)) - - core.chat_send_player(player:get_player_name(), str) - local time_start = core.get_us_time() - local path = core.find_path(pos1, pos2, MAX_SEARCH_DISTANCE, MAX_JUMP, MAX_DROP, algo) - local time_end = core.get_us_time() - local time_diff = time_end - time_start - str = "" - if not path then - core.chat_send_player(player:get_player_name(), S("No path!")) - core.chat_send_player(player:get_player_name(), S("Time: @1 ms", time_diff/1000)) - return - end - for s=1, #path do - str = str .. core.pos_to_string(path[s]) .. "\n" - local t - if s == #path then - t = "testpathfinder_waypoint_end.png" - elseif s == 1 then - t = "testpathfinder_waypoint_start.png" - else - local c = math.floor(((#path-s)/#path)*255) - t = string.format("testpathfinder_waypoint.png^[multiply:#%02x%02x00", 0xFF-c, c) - end - core.add_particle({ - pos = path[s], - expirationtime = 5 + 0.2 * s, - playername = player:get_player_name(), - glow = core.LIGHT_MAX, - texture = t, - size = 3, - }) - end - core.chat_send_player(player:get_player_name(), str) - core.chat_send_player(player:get_player_name(), S("Path length: @1", #path)) - core.chat_send_player(player:get_player_name(), S("Time: @1 ms", time_diff/1000)) - end -end - -local function set_destination(itemstack, user, pointed_thing) - if not (user and user:is_player()) then - return - end - local name = user:get_player_name() - local obj - local meta = itemstack:get_meta() - if pointed_thing.type == "node" then - local pos = pointed_thing.above - meta:set_int("pos_x", pos.x) - meta:set_int("pos_y", pos.y) - meta:set_int("pos_z", pos.z) - core.chat_send_player(user:get_player_name(), S("Destination set to @1", core.pos_to_string(pos))) - return itemstack - end -end - -local function find_path_or_set_algorithm(itemstack, user, pointed_thing) - if not (user and user:is_player()) then - return - end - local ctrl = user:get_player_control() - -- No sneak: Find path - if not ctrl.sneak then - find_path_for_player(user, itemstack) - else - -- Sneak: Set algorithm - local meta = itemstack:get_meta() - local algo = meta:get_int("algorithm") - algo = (algo + 1) % #algorithms - meta:set_int("algorithm", algo) - core.chat_send_player(user:get_player_name(), S("Algorithm: @1", algorithms[algo+1])) - return itemstack - end -end - --- Punch: Find path --- Sneak+punch: Select pathfinding algorithm --- Place: Select destination node -core.register_tool("testpathfinder:testpathfinder", { - description = S("Pathfinder Tester") .."\n".. - S("Finds path between 2 points") .."\n".. - S("Place on node: Select destination") .."\n".. - S("Punch: Find path from here") .."\n".. - S("Sneak+Punch: Change algorithm"), - inventory_image = "testpathfinder_testpathfinder.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = find_path_or_set_algorithm, - on_secondary_use = set_destination, - on_place = set_destination, -}) - - diff --git a/data/games/garage/mods/testpathfinder/mod.conf b/data/games/garage/mods/testpathfinder/mod.conf deleted file mode 100644 index 6b2c0e3..0000000 --- a/data/games/garage/mods/testpathfinder/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testpathfinder -description = Tool to test Luanti's pathfinder function diff --git a/data/games/garage/mods/testpathfinder/textures/testpathfinder_testpathfinder.png b/data/games/garage/mods/testpathfinder/textures/testpathfinder_testpathfinder.png deleted file mode 100644 index 37eef05..0000000 Binary files a/data/games/garage/mods/testpathfinder/textures/testpathfinder_testpathfinder.png and /dev/null differ diff --git a/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint.png b/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint.png deleted file mode 100644 index 661dcf9..0000000 Binary files a/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint.png and /dev/null differ diff --git a/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint_end.png b/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint_end.png deleted file mode 100644 index 41a1cc5..0000000 Binary files a/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint_end.png and /dev/null differ diff --git a/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint_start.png b/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint_start.png deleted file mode 100644 index a22e31c..0000000 Binary files a/data/games/garage/mods/testpathfinder/textures/testpathfinder_waypoint_start.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/README.md b/data/games/garage/mods/testtools/README.md deleted file mode 100644 index 03d826d..0000000 --- a/data/games/garage/mods/testtools/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# Test Tools readme - -Test Tools is a mod for developers that adds a bunch of tools to directly manipulate nodes and entities. This is great for quickly testing out stuff. - -Here's the list of tools: - -## Remover -Removes nodes and non-player entities that you punch. - -## Node Setter -Replace a node with another one. - -First, punch a node you want to remember. -Then rightclick any other node to replace it with the node you remembered. - -If you rightclick while pointing nothing, you can manually enter the node and param2. - -## Param2 Tool -Change the value param2 of nodes. - -* Punch: Add 1 to param2 -* Sneak+Punch: Add 8 to param2 -* Place: Subtract 1 from param2 -* Sneak+Place: Subtract 8 from param2 - -Note: Use the debug screen (F5) to see the param2 of the pointed node. - -## Falling Node Tool -Turns nodes into falling nodes. - -Usage: - -* Punch node: Make it fall -* Place: Try to teleport up to 2 units upwards, then make it fall - -## Node Meta Editor -Edit and view metadata of nodes. - -Usage: - -* Punch: Open node metadata editor - -## Item Meta Editor -Edit and view metadata of items. - -Usage: - -* Place/Punch: Opens item metadata editor of the item in the next - inventory slot from the wielded item - -## Entity Rotator -Changes the entity rotation (with `set_rotation`). - -Usage: - -* Punch entity: Rotate yaw -* Punch entity while holding down “Sneak” key: Rotate pitch -* Punch entity while holding down “Special” key (aka “Aux”): Rotate roll - -Each usage rotates the entity by 22.5°. - -## Entity Spawner -Spawns entities. - -Usage: - -* Punch to select entity or spawn one directly -* Place to place selected entity - -## Object Property Editor -Edits properties of objects. - -Usage: - -* Punch object to open a formspec that allows you to view and edit properties -* Punch air to edit properties of your own player object - -To edit a property, select it in the list, enter a new value (in Lua syntax) -and hit “Submit”. - -## Object Attacher -Allows you to attach an object to another one. - -Basic usage: -* First select the parent object, then the child object that should be attached -* Selecting an object is done by punching it -* Sneak+punch to detach selected object -* If you punch air, you select yourself - -Configuration: -* Place: Increase attachment Y position -* Sneak+place: decrease attachment Y position -* Aux+place: Increase attachment X rotation -* Aux+Sneak+Rightclick: Decrease attachment X rotation - -Hint: To detach all objects nearby you (including on yourself), use the -`/detach` server command. - -## Object Mover -Move an object by a given distance. - -Usage: -* Punch object into the direction you want to move it -* Sneak+punch: Move object towards you -* Place: Increase move distance -* Sneak+place: Decrease move distance - -## Children Getter -Shows list of objects that are attached to an object (aka "children") in chat. - -Usage: -* Punch object: Show children of punched object -* Punch air: Show your own children - -## Entity Visual Scaler -Change visual size of entities - -Usage: - -* Punch entity to increase visual size -* Sneak+punch entity to decrease visual size - -## Branding Iron -Give an object a temporary name. - -Usage: -* Punch object: Brand the object -* Punch air: Brand yourself -* The name is valid until the object unloads. -* Devices that accept the returned name also accept "player:" for players. - -Use `testtools.get_branded_object(name)` to get an ObjRef. - -## Note Meta Privatizer -Sets the 'formspec' and 'infotext' metadata fields of a node -to private. This means that clients can no longer access these -fields. -This only works for chests [`chest:chest`] at the moment. - -Usage: -* Punch: Set metadata of pointed node to private - -## Light Tool -Show light level of node. - -Usage: -* Punch: Show light info of node in front of the punched node's side -* Place: Show light info of the node that you touched - -## Particle Spawner -Spawn a random animated particle. - -Usage: -* Punch: Spawn particle diff --git a/data/games/garage/mods/testtools/init.lua b/data/games/garage/mods/testtools/init.lua deleted file mode 100644 index 6586d87..0000000 --- a/data/games/garage/mods/testtools/init.lua +++ /dev/null @@ -1,1067 +0,0 @@ -local S = core.get_translator("testtools") -local F = core.formspec_escape - -testtools = {} - -dofile(core.get_modpath("testtools") .. "/light.lua") -dofile(core.get_modpath("testtools") .. "/privatizer.lua") -dofile(core.get_modpath("testtools") .. "/particles.lua") -dofile(core.get_modpath("testtools") .. "/node_box_visualizer.lua") - -local pointabilities_nodes = { - nodes = { - ["group:blocking_pointable_test"] = true, - ["group:not_pointable_test"] = true, - }, -} - -local pointabilities_objects = { - objects = { - ["group:blocking_pointable_test"] = true, - ["group:not_pointable_test"] = true, - }, -} - -core.register_tool("testtools:param2tool", { - description = S("Param2 Tool") .."\n".. - S("Modify param2 value of nodes") .."\n".. - S("Punch: +1") .."\n".. - S("Sneak+Punch: +8") .."\n".. - S("Place: -1") .."\n".. - S("Sneak+Place: -8"), - inventory_image = "testtools_param2tool.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_nodes, - on_use = function(itemstack, user, pointed_thing) - local pos = core.get_pointed_thing_position(pointed_thing) - if pointed_thing.type ~= "node" or (not pos) then - return - end - local add = 1 - if user then - local ctrl = user:get_player_control() - if ctrl.sneak then - add = 8 - end - end - local node = core.get_node(pos) - node.param2 = node.param2 + add - core.swap_node(pos, node) - end, - on_place = function(itemstack, user, pointed_thing) - local pos = core.get_pointed_thing_position(pointed_thing) - if pointed_thing.type ~= "node" or (not pos) then - return - end - local add = -1 - if user then - local ctrl = user:get_player_control() - if ctrl.sneak then - add = -8 - end - end - local node = core.get_node(pos) - node.param2 = node.param2 + add - core.swap_node(pos, node) - end, -}) - -core.register_tool("testtools:node_setter", { - description = S("Node Setter") .."\n".. - S("Replace pointed node with something else") .."\n".. - S("Punch: Select pointed node") .."\n".. - S("Place on node: Replace node with selected node") .."\n".. - S("Place in air: Manually select a node"), - inventory_image = "testtools_node_setter.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_nodes, - on_use = function(itemstack, user, pointed_thing) - local pos = core.get_pointed_thing_position(pointed_thing) - if pointed_thing.type == "nothing" then - local meta = itemstack:get_meta() - meta:set_string("node", "air") - meta:set_int("node_param2", 0) - if user and user:is_player() then - core.chat_send_player(user:get_player_name(), S("Now placing: @1 (param2=@2)", "air", 0)) - end - return itemstack - elseif pointed_thing.type ~= "node" or (not pos) then - return - end - local node = core.get_node(pos) - local meta = itemstack:get_meta() - meta:set_string("node", node.name) - meta:set_int("node_param2", node.param2) - if user and user:is_player() then - core.chat_send_player(user:get_player_name(), S("Now placing: @1 (param2=@2)", node.name, node.param2)) - end - return itemstack - end, - on_secondary_use = function(itemstack, user, pointed_thing) - local meta = itemstack:get_meta() - local nodename = meta:get_string("node") or "" - local param2 = meta:get_int("node_param2") or 0 - - core.show_formspec(user:get_player_name(), "testtools:node_setter", - "size[4,4]".. - "field[0.5,1;3,1;nodename;"..F(S("Node name (itemstring):"))..";"..F(nodename).."]".. - "field[0.5,2;3,1;param2;"..F(S("param2:"))..";"..F(tostring(param2)).."]".. - "button_exit[0.5,3;3,1;submit;"..F(S("Submit")).."]" - ) - end, - on_place = function(itemstack, user, pointed_thing) - local pos = core.get_pointed_thing_position(pointed_thing) - local meta = itemstack:get_meta() - local nodename = meta:get_string("node") - if nodename == "" and user and user:is_player() then - core.chat_send_player(user:get_player_name(), S("Punch a node first!")) - return - end - local param2 = meta:get_int("node_param2") - if not param2 then - param2 = 0 - end - local node = { name = nodename, param2 = param2 } - if not core.registered_nodes[nodename] then - core.chat_send_player(user:get_player_name(), S("Cannot set unknown node: @1", nodename)) - return - end - core.set_node(pos, node) - end, -}) - -core.register_tool("testtools:remover", { - description = S("Remover") .."\n".. - S("Punch: Remove pointed node or object"), - inventory_image = "testtools_remover.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = { - nodes = pointabilities_nodes.nodes, - objects = pointabilities_objects.objects, - }, - on_use = function(itemstack, user, pointed_thing) - local pos = core.get_pointed_thing_position(pointed_thing) - if pointed_thing.type == "node" and pos ~= nil then - core.remove_node(pos) - elseif pointed_thing.type == "object" then - local obj = pointed_thing.ref - if not obj:is_player() then - obj:remove() - else - core.chat_send_player(user:get_player_name(), S("Can't remove players!")) - end - end - end, -}) - -core.register_tool("testtools:falling_node_tool", { - description = S("Falling Node Tool") .."\n".. - S("Punch: Make pointed node fall") .."\n".. - S("Place: Move pointed node 2 units upwards, then make it fall"), - inventory_image = "testtools_falling_node_tool.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_nodes, - on_place = function(itemstack, user, pointed_thing) - -- Teleport node 1-2 units upwards (if possible) and make it fall - local pos = core.get_pointed_thing_position(pointed_thing) - if pointed_thing.type ~= "node" or (not pos) then - return - end - local ok = false - local highest - for i=1,2 do - local above = {x=pos.x,y=pos.y+i,z=pos.z} - local n2 = core.get_node(above) - local def2 = core.registered_nodes[n2.name] - if def2 and (not def2.walkable) then - highest = above - else - break - end - end - if highest then - local node = core.get_node(pos) - local metatable = core.get_meta(pos):to_table() - core.remove_node(pos) - core.set_node(highest, node) - local meta_highest = core.get_meta(highest) - meta_highest:from_table(metatable) - ok = core.spawn_falling_node(highest) - else - ok = core.spawn_falling_node(pos) - end - if not ok and user and user:is_player() then - core.chat_send_player(user:get_player_name(), S("Falling node could not be spawned!")) - end - end, - on_use = function(itemstack, user, pointed_thing) - local pos = core.get_pointed_thing_position(pointed_thing) - if pointed_thing.type ~= "node" or (not pos) then - return - end - local ok = core.spawn_falling_node(pos) - if not ok and user and user:is_player() then - core.chat_send_player(user:get_player_name(), S("Falling node could not be spawned!")) - end - end, -}) - -core.register_tool("testtools:rotator", { - description = S("Entity Rotator") .. "\n" .. - S("Rotate pointed entity") .."\n".. - S("Punch: Yaw") .."\n".. - S("Sneak+Punch: Pitch") .."\n".. - S("Aux1+Punch: Roll"), - inventory_image = "testtools_entity_rotator.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_objects, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "object" then - return - end - local obj = pointed_thing.ref - if obj:is_player() then - -- No player rotation - return - else - local axis = "y" - if user and user:is_player() then - local ctrl = user:get_player_control() - if ctrl.sneak then - axis = "x" - elseif ctrl.aux1 then - axis = "z" - end - end - local rot = obj:get_rotation() - rot[axis] = rot[axis] + math.pi/8 - if rot[axis] > math.pi*2 then - rot[axis] = rot[axis] - math.pi*2 - end - obj:set_rotation(rot) - end - end, -}) - -local mover_config = function(itemstack, user, pointed_thing) - if not (user and user:is_player()) then - return - end - local name = user:get_player_name() - local ctrl = user:get_player_control() - local meta = itemstack:get_meta() - local dist = 1.0 - if meta:contains("distance") then - dist = meta:get_int("distance") - end - if ctrl.sneak then - dist = dist - 1 - else - dist = dist + 1 - end - meta:set_int("distance", dist) - core.chat_send_player(user:get_player_name(), S("distance=@1/10", dist*2)) - return itemstack -end - -core.register_tool("testtools:object_mover", { - description = S("Object Mover") .."\n".. - S("Move pointed object towards or away from you") .."\n".. - S("Punch: Move by distance").."\n".. - S("Sneak+Punch: Move by negative distance").."\n".. - S("Place: Increase distance").."\n".. - S("Sneak+Place: Decrease distance"), - inventory_image = "testtools_object_mover.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_objects, - on_place = mover_config, - on_secondary_use = mover_config, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "object" then - return - end - local obj = pointed_thing.ref - if not (user and user:is_player()) then - return - end - local yaw = user:get_look_horizontal() - local dir = core.yaw_to_dir(yaw) - local pos = obj:get_pos() - local pitch = user:get_look_vertical() - if pitch > 0.25 * math.pi then - dir.y = -1 - dir.x = 0 - dir.z = 0 - elseif pitch < -0.25 * math.pi then - dir.y = 1 - dir.x = 0 - dir.z = 0 - end - local ctrl = user:get_player_control() - if ctrl.sneak then - dir = vector.multiply(dir, -1) - end - local meta = itemstack:get_meta() - if meta:contains("distance") then - local dist = meta:get_int("distance") - dir = vector.multiply(dir, dist*0.2) - end - pos = vector.add(pos, dir) - obj:set_pos(pos) - end, -}) - - - -core.register_tool("testtools:entity_scaler", { - description = S("Entity Visual Scaler") .."\n".. - S("Scale visual size of entities") .."\n".. - S("Punch: Increase size") .."\n".. - S("Sneak+Punch: Decrease scale"), - inventory_image = "testtools_entity_scaler.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_objects, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "object" then - return - end - local obj = pointed_thing.ref - if obj:is_player() then - -- No player scaling - return - else - local diff = 0.1 - if user and user:is_player() then - local ctrl = user:get_player_control() - if ctrl.sneak then - diff = -0.1 - end - end - local prop = obj:get_properties() - if not prop.visual_size then - prop.visual_size = { x=1, y=1, z=1 } - else - prop.visual_size = { x=prop.visual_size.x+diff, y=prop.visual_size.y+diff, z=prop.visual_size.z+diff } - if prop.visual_size.x <= 0.1 then - prop.visual_size.x = 0.1 - end - if prop.visual_size.y <= 0.1 then - prop.visual_size.y = 0.1 - end - if prop.visual_size.z <= 0.1 then - prop.visual_size.z = 0.1 - end - end - obj:set_properties(prop) - end - end, -}) - - --- value-weak tables, because we don't want to keep the objrefs of unloaded objects -local branded_objects = setmetatable({}, {__mode = "v"}) -local next_brand_num = 1 - -function testtools.get_branded_object(name) - if name:sub(1, 7) == "player:" then - return core.get_player_by_name(name:sub(8)) - elseif name:sub(1, 4) == "obj:" then - return branded_objects[tonumber(name:sub(5)) or 0] - end - return nil -end - -core.register_tool("testtools:branding_iron", { - description = S("Branding Iron") .."\n".. - S("Give an object a temporary name.") .."\n".. - S("Punch object: Brand the object") .."\n".. - S("Punch air: Brand yourself") .."\n".. - S("The name is valid until the object unloads.") .."\n".. - S("Devices that accept the returned name also accept \"player:\" for players."), - inventory_image = "testtools_branding_iron.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_objects, - on_use = function(_itemstack, user, pointed_thing) - local obj - local msg - if pointed_thing.type == "object" then - obj = pointed_thing.ref - msg = "You can now refer to this object with: \"@1\"" - elseif pointed_thing.type == "nothing" then - obj = user - msg = "You can now refer to yourself with: \"@1\"" - else - return - end - - local brand_num = next_brand_num - next_brand_num = next_brand_num + 1 - branded_objects[brand_num] = obj - - core.chat_send_player(user:get_player_name(), S(msg, "obj:"..brand_num)) - end, -}) - - -local selections = {} -local entity_list -local function get_entity_list() - if entity_list then - return entity_list - end - local ents = core.registered_entities - local list = {} - for k,_ in pairs(ents) do - table.insert(list, k) - end - table.sort(list) - entity_list = list - return entity_list -end -core.register_tool("testtools:entity_spawner", { - description = S("Entity Spawner") .."\n".. - S("Spawns entities") .."\n".. - S("Punch: Select entity to spawn") .."\n".. - S("Place: Spawn selected entity"), - inventory_image = "testtools_entity_spawner.png", - groups = { testtool = 1, disable_repair = 1 }, - on_place = function(itemstack, user, pointed_thing) - local name = user:get_player_name() - if pointed_thing.type == "node" then - if selections[name] then - local pos = pointed_thing.above - core.add_entity(pos, get_entity_list()[selections[name]]) - else - core.chat_send_player(name, S("Select an entity first (with punch key)!")) - end - end - end, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type == "object" then - return - end - if user and user:is_player() then - local list = table.concat(get_entity_list(), ",") - local name = user:get_player_name() - local sel = selections[name] or "" - core.show_formspec(name, "testtools:entity_list", - "size[9,9]".. - "textlist[0,0;9,8;entity_list;"..list..";"..sel..";false]".. - "button[0,8;4,1;spawn;Spawn entity]" - ) - end - end, -}) - -local function prop_to_string(property) - if type(property) == "string" then - return "\"" .. property .. "\"" - elseif type(property) == "table" then - return tostring(dump(property)):gsub("\n", "") - else - return tostring(property) - end -end - -local property_formspec_data = {} -local property_formspec_index = {} -local selected_objects = {} -local function get_object_properties_form(obj, playername) - if not playername then return "" end - local props = obj:get_properties() - local str = "" - property_formspec_data[playername] = {} - local proplist = {} - for k,_ in pairs(props) do - table.insert(proplist, k) - end - table.sort(proplist) - for p=1, #proplist do - local k = proplist[p] - local v = props[k] - local newline = "" - newline = k .. " = " - newline = newline .. prop_to_string(v) - str = str .. F(newline) - if p < #proplist then - str = str .. "," - end - table.insert(property_formspec_data[playername], k) - end - return str -end - -local editor_formspec_selindex = {} - -local editor_formspec = function(playername, obj, value, sel) - if not value then - value = "" - end - if not sel then - sel = "" - end - local list = get_object_properties_form(obj, playername) - local title - if obj:is_player() then - title = S("Object properties of player “@1”", obj:get_player_name()) - else - local ent = obj:get_luaentity() - title = S("Object properties of @1", ent.name) - end - core.show_formspec(playername, "testtools:object_editor", - "size[9,9]".. - "label[0,0;"..F(title).."]".. - "textlist[0,0.5;9,7.5;object_props;"..list..";"..sel..";false]".. - "field[0.2,8.75;8,1;value;"..F(S("Value"))..";"..F(value).."]".. - "field_close_on_enter[value;false]".. - "button[8,8.5;1,1;submit;"..F(S("Submit")).."]" - ) -end - -core.register_tool("testtools:object_editor", { - description = S("Object Property Editor") .."\n".. - S("Edit properties of objects") .."\n".. - S("Punch object: Edit object") .."\n".. - S("Punch air: Edit yourself"), - inventory_image = "testtools_object_editor.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_objects, - on_use = function(itemstack, user, pointed_thing) - if user and user:is_player() then - local name = user:get_player_name() - - if pointed_thing.type == "object" then - selected_objects[name] = pointed_thing.ref - elseif pointed_thing.type == "nothing" then - -- Use on yourself if pointing nothing - selected_objects[name] = user - else - -- Unsupported pointed thing - return - end - - local sel = editor_formspec_selindex[name] - local val - if selected_objects[name] and selected_objects[name]:get_properties() then - local props = selected_objects[name]:get_properties() - local keys = property_formspec_data[name] - if property_formspec_index[name] and props then - local key = keys[property_formspec_index[name]] - val = prop_to_string(props[key]) - end - end - - editor_formspec(name, selected_objects[name], val, sel) - end - end, -}) - -local ent_parent = {} -local ent_child = {} -local DEFAULT_ATTACH_OFFSET_Y = 11 - -local attacher_config = function(itemstack, user, pointed_thing) - if not (user and user:is_player()) then - return - end - if pointed_thing.type == "object" then - return - end - local name = user:get_player_name() - local ctrl = user:get_player_control() - local meta = itemstack:get_meta() - if ctrl.aux1 then - local rot_x = meta:get_float("rot_x") - if ctrl.sneak then - rot_x = rot_x - math.pi/8 - else - rot_x = rot_x + math.pi/8 - end - if rot_x > 6.2 then - rot_x = 0 - elseif rot_x < 0 then - rot_x = math.pi * (15/8) - end - core.chat_send_player(name, S("rotation=@1", core.pos_to_string({x=rot_x,y=0,z=0}))) - meta:set_float("rot_x", rot_x) - else - local pos_y - if meta:contains("pos_y") then - pos_y = meta:get_int("pos_y") - else - pos_y = DEFAULT_ATTACH_OFFSET_Y - end - if ctrl.sneak then - pos_y = pos_y - 1 - else - pos_y = pos_y + 1 - end - core.chat_send_player(name, S("position=@1", core.pos_to_string({x=0,y=pos_y,z=0}))) - meta:set_int("pos_y", pos_y) - end - return itemstack -end - -core.register_tool("testtools:object_attacher", { - description = S("Object Attacher") .."\n".. - S("Attach object to another") .."\n".. - S("Punch objects to first select parent object, then the child object to attach") .."\n".. - S("Punch air to select yourself") .."\n".. - S("Place: Incease attachment Y offset") .."\n".. - S("Sneak+Place: Decease attachment Y offset") .."\n".. - S("Aux1+Place: Incease attachment rotation") .."\n".. - S("Aux1+Sneak+Place: Decrease attachment rotation"), - inventory_image = "testtools_object_attacher.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_objects, - on_place = attacher_config, - on_secondary_use = attacher_config, - on_use = function(itemstack, user, pointed_thing) - if user and user:is_player() then - local name = user:get_player_name() - local selected_object - if pointed_thing.type == "object" then - selected_object = pointed_thing.ref - elseif pointed_thing.type == "nothing" then - selected_object = user - else - return - end - local ctrl = user:get_player_control() - if ctrl.sneak then - if selected_object:get_attach() then - selected_object:set_detach() - core.chat_send_player(name, S("Object detached!")) - else - core.chat_send_player(name, S("Object is not attached!")) - end - return - end - local parent = ent_parent[name] - local child = ent_child[name] - local ename = S("") - if not parent then - parent = selected_object - ent_parent[name] = parent - elseif not child then - child = selected_object - ent_child[name] = child - end - local entity = selected_object:get_luaentity() - if entity then - ename = entity.name - elseif selected_object:is_player() then - ename = selected_object:get_player_name() - end - if selected_object == parent then - core.chat_send_player(name, S("Parent object selected: @1", ename)) - elseif selected_object == child then - core.chat_send_player(name, S("Child object selected: @1", ename)) - end - if parent and child then - if parent == child then - core.chat_send_player(name, S("Can't attach an object to itself!")) - ent_parent[name] = nil - ent_child[name] = nil - return - end - local meta = itemstack:get_meta() - local y - if meta:contains("pos_y") then - y = meta:get_int("pos_y") - else - y = DEFAULT_ATTACH_OFFSET_Y - end - local rx = meta:get_float("rot_x") or 0 - local offset = {x=0,y=y,z=0} - local angle = {x=rx,y=0,z=0} - child:set_attach(parent, "", offset, angle) - local check_parent = child:get_attach() - if check_parent then - core.chat_send_player(name, S("Object attached! position=@1, rotation=@2", - core.pos_to_string(offset), core.pos_to_string(angle))) - else - core.chat_send_player(name, S("Attachment failed!")) - end - ent_parent[name] = nil - ent_child[name] = nil - end - end - end, -}) - -local function print_object(obj) - if obj:is_player() then - return "player '"..obj:get_player_name().."'" - elseif obj:get_luaentity() then - return "LuaEntity '"..obj:get_luaentity().name.."'" - else - return "object" - end -end - -core.register_tool("testtools:children_getter", { - description = S("Children Getter") .."\n".. - S("Shows list of objects attached to object") .."\n".. - S("Punch object to show its 'children'") .."\n".. - S("Punch air to show your own 'children'"), - inventory_image = "testtools_children_getter.png", - groups = { testtool = 1, disable_repair = 1 }, - pointabilities = pointabilities_objects, - on_use = function(itemstack, user, pointed_thing) - if user and user:is_player() then - local name = user:get_player_name() - local selected_object - local self_name - if pointed_thing.type == "object" then - selected_object = pointed_thing.ref - elseif pointed_thing.type == "nothing" then - selected_object = user - else - return - end - self_name = print_object(selected_object) - local children = selected_object:get_children() - local ret = "" - for c=1, #children do - ret = ret .. "* " .. print_object(children[c]) - if c < #children then - ret = ret .. "\n" - end - end - if ret == "" then - ret = S("No children attached to @1.", self_name) - else - ret = S("Children of @1:", self_name) .. "\n" .. ret - end - core.chat_send_player(user:get_player_name(), ret) - end - end, -}) - --- Use loadstring to parse param as a Lua value -local function use_loadstring(param, player) - -- For security reasons, require 'server' priv, just in case - -- someone is actually crazy enough to run this on a public server. - local privs = core.get_player_privs(player:get_player_name()) - if not privs.server then - return false, "You need 'server' privilege to change object properties!" - end - if not param then - return false, "Failed: parameter is nil" - end - --[[ DANGER ZONE ]] - -- Interpret string as Lua value - local func, errormsg = loadstring("return (" .. param .. ")") - if not func then - return false, "Failed: " .. errormsg - end - - -- Apply sandbox here using setfenv - setfenv(func, {}) - - -- Run it - local good, errOrResult = pcall(func) - if not good then - -- A Lua error was thrown - return false, "Failed: " .. errOrResult - end - - -- errOrResult will be the value - return true, errOrResult -end - --- Item Meta Editor + Node Meta Editor -local node_meta_posses = {} -local meta_latest_keylist = {} - -local function show_meta_formspec(user, metatype, pos_or_item, key, value, keylist) - local textlist - if keylist then - textlist = "textlist[0,0.5;2.5,6.5;keylist;"..keylist.."]" - else - textlist = "" - end - - local form = "size[15,9]".. - "label[0,0;"..F(S("Current keys:")).."]".. - textlist.. - "field[3,0.5;12,1;key;"..F(S("Key"))..";"..F(key).."]".. - "textarea[3,1.5;12,6;value;"..F(S("Value (use empty value to delete key)"))..";"..F(value).."]".. - "button[4,8;3,1;set;"..F(S("Set value")).."]" - - local extra_label - local formname - if metatype == "node" then - formname = "testtools:node_meta_editor" - extra_label = S("pos = @1", core.pos_to_string(pos_or_item)) - else - formname = "testtools:item_meta_editor" - extra_label = S("item = @1", pos_or_item:get_name()) - end - form = form .. "label[0,7.2;"..F(extra_label).."]" - - core.show_formspec(user:get_player_name(), formname, form) -end - -local function get_meta_keylist(meta, playername, escaped) - local keys = {} - local ekeys = {} - local mtable = meta:to_table() - for k,_ in pairs(mtable.fields) do - table.insert(keys, k) - if escaped then - table.insert(ekeys, F(k)) - else - table.insert(ekeys, k) - end - end - if playername then - meta_latest_keylist[playername] = keys - end - return table.concat(ekeys, ",") -end - -core.register_tool("testtools:node_meta_editor", { - description = S("Node Meta Editor") .. "\n" .. - S("Place: Edit node metadata"), - inventory_image = "testtools_node_meta_editor.png", - groups = { testtool = 1, disable_repair = 1 }, - on_place = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - if not user:is_player() then - return itemstack - end - local pos = pointed_thing.under - node_meta_posses[user:get_player_name()] = pos - local meta = core.get_meta(pos) - local inv = meta:get_inventory() - show_meta_formspec(user, "node", pos, "", "", get_meta_keylist(meta, user:get_player_name(), true)) - return itemstack - end, -}) - -local function get_item_next_to_wielded_item(player) - local inv = player:get_inventory() - local wield = player:get_wield_index() - local itemstack = inv:get_stack("main", wield+1) - return itemstack -end -local function set_item_next_to_wielded_item(player, itemstack) - local inv = player:get_inventory() - local wield = player:get_wield_index() - inv:set_stack("main", wield+1, itemstack) -end - -local function use_item_meta_editor(itemstack, user, pointed_thing) - if not user:is_player() then - return itemstack - end - local item_to_edit = get_item_next_to_wielded_item(user) - if item_to_edit:is_empty() then - core.chat_send_player(user:get_player_name(), S("Place an item next to the Item Meta Editor in your inventory first!")) - return itemstack - end - local meta = item_to_edit:get_meta() - show_meta_formspec(user, "item", item_to_edit, "", "", get_meta_keylist(meta, user:get_player_name(), true)) - return itemstack -end - -core.register_tool("testtools:item_meta_editor", { - description = S("Item Meta Editor") .. "\n" .. - S("Punch/Place: Edit item metadata of item in the next inventory slot"), - inventory_image = "testtools_item_meta_editor.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = use_item_meta_editor, - on_secondary_use = use_item_meta_editor, - on_place = use_item_meta_editor, -}) - -core.register_on_player_receive_fields(function(player, formname, fields) - if not (player and player:is_player()) then - return - end - if formname == "testtools:entity_list" then - local name = player:get_player_name() - if fields.entity_list then - local expl = core.explode_textlist_event(fields.entity_list) - if expl.type == "DCL" then - local pos = vector.add(player:get_pos(), {x=0,y=1,z=0}) - selections[name] = expl.index - core.add_entity(pos, get_entity_list()[expl.index]) - return - elseif expl.type == "CHG" then - selections[name] = expl.index - return - end - elseif fields.spawn and selections[name] then - local pos = vector.add(player:get_pos(), {x=0,y=1,z=0}) - core.add_entity(pos, get_entity_list()[selections[name]]) - return - end - elseif formname == "testtools:object_editor" then - local name = player:get_player_name() - if fields.object_props then - local expl = core.explode_textlist_event(fields.object_props) - if expl.type == "DCL" or expl.type == "CHG" then - property_formspec_index[name] = expl.index - - local props = selected_objects[name]:get_properties() - local keys = property_formspec_data[name] - if (not property_formspec_index[name]) or (not props) then - return - end - local key = keys[property_formspec_index[name]] - editor_formspec_selindex[name] = expl.index - editor_formspec(name, selected_objects[name], prop_to_string(props[key]), expl.index) - return - end - end - if fields.key_enter_field == "value" or fields.submit then - local props = selected_objects[name]:get_properties() - local keys = property_formspec_data[name] - if (not property_formspec_index[name]) or (not props) then - return - end - local key = keys[property_formspec_index[name]] - if not key then - return - end - local success, str = use_loadstring(fields.value, player) - if success then - props[key] = str - else - core.chat_send_player(name, str) - return - end - selected_objects[name]:set_properties(props) - local sel = editor_formspec_selindex[name] - editor_formspec(name, selected_objects[name], prop_to_string(props[key]), sel) - return - end - elseif formname == "testtools:node_setter" then - local playername = player:get_player_name() - local witem = player:get_wielded_item() - if witem:get_name() == "testtools:node_setter" then - if fields.nodename and fields.param2 then - local param2 = tonumber(fields.param2) - if not param2 then - return - end - local meta = witem:get_meta() - meta:set_string("node", fields.nodename) - meta:set_int("node_param2", param2) - player:set_wielded_item(witem) - end - end - elseif formname == "testtools:node_meta_editor" or formname == "testtools:item_meta_editor" then - local name = player:get_player_name() - local metatype - local pos_or_item - if formname == "testtools:node_meta_editor" then - metatype = "node" - pos_or_item = node_meta_posses[name] - else - metatype = "item" - pos_or_item = get_item_next_to_wielded_item(player) - end - if fields.keylist then - local evnt = core.explode_textlist_event(fields.keylist) - if evnt.type == "DCL" or evnt.type == "CHG" then - local keylist_table = meta_latest_keylist[name] - if metatype == "node" and not pos_or_item then - return - end - local meta - if metatype == "node" then - meta = core.get_meta(pos_or_item) - else - meta = pos_or_item:get_meta() - end - if not keylist_table then - return - end - if #keylist_table == 0 then - return - end - local key = keylist_table[evnt.index] - local value = meta:get_string(key) - local keylist_escaped = {} - for k,v in pairs(keylist_table) do - keylist_escaped[k] = F(v) - end - local keylist = table.concat(keylist_escaped, ",") - show_meta_formspec(player, metatype, pos_or_item, key, value, keylist) - return - end - elseif fields.key and fields.key ~= "" and fields.value then - if metatype == "node" and not pos_or_item then - return - end - local meta - if metatype == "node" then - meta = core.get_meta(pos_or_item) - elseif metatype == "item" then - if pos_or_item:is_empty() then - return - end - meta = pos_or_item:get_meta() - end - if fields.set then - meta:set_string(fields.key, fields.value) - if metatype == "item" then - set_item_next_to_wielded_item(player, pos_or_item) - end - show_meta_formspec(player, metatype, pos_or_item, fields.key, fields.value, - get_meta_keylist(meta, name, true)) - end - return - end - end -end) - -core.register_on_leaveplayer(function(player) - local name = player:get_player_name() - meta_latest_keylist[name] = nil - node_meta_posses[name] = nil -end) - --- Pointing Staffs - -core.register_tool("testtools:blocked_pointing_staff", { - description = S("Blocked Pointing Staff").."\n".. - S("Can point the Blocking Pointable Node/Object and ".. - "the Pointable Node/Object is point blocking."), - inventory_image = "testtools_blocked_pointing_staff.png", - pointabilities = { - nodes = { - ["testnodes:blocking_pointable"] = true, - ["group:pointable_test"] = "blocking" - }, - objects = { - ["testentities:blocking_pointable"] = true, - ["group:pointable_test"] = "blocking" - } - } -}) - -core.register_tool("testtools:ultimate_pointing_staff", { - description = S("Ultimate Pointing Staff").."\n".. - S("Can point all pointable test nodes, objects and liquids."), - inventory_image = "testtools_ultimate_pointing_staff.png", - liquids_pointable = true, - pointabilities = { - nodes = { - ["group:blocking_pointable_test"] = true, - ["group:pointable_test"] = true, - ["testnodes:not_pointable"] = true - }, - objects = { - ["group:blocking_pointable_test"] = true, - ["group:pointable_test"] = true, - ["testentities:not_pointable"] = true - } - } -}) diff --git a/data/games/garage/mods/testtools/light.lua b/data/games/garage/mods/testtools/light.lua deleted file mode 100644 index 861a358..0000000 --- a/data/games/garage/mods/testtools/light.lua +++ /dev/null @@ -1,37 +0,0 @@ - -local S = core.get_translator("testtools") - -local function get_func(is_place) - return function(itemstack, user, pointed_thing) - local pos - if is_place then - pos = pointed_thing.under - else - pos = pointed_thing.above - end - if pointed_thing.type ~= "node" or not pos then - return - end - - local node = core.get_node(pos) - local pstr = core.pos_to_string(pos) - local time = core.get_timeofday() - local sunlight = core.get_natural_light(pos) - local artificial = core.get_artificial_light(node.param1) - local message = ("pos=%s | param1=0x%02x | " .. - "sunlight=%d | artificial=%d | timeofday=%.5f" ) - :format(pstr, node.param1, sunlight, artificial, time) - core.chat_send_player(user:get_player_name(), message) - end -end - -core.register_tool("testtools:lighttool", { - description = S("Light Tool") .. "\n" .. - S("Show light values of node") .. "\n" .. - S("Punch: Light of node above touched node") .. "\n" .. - S("Place: Light of touched node itself"), - inventory_image = "testtools_lighttool.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = get_func(false), - on_place = get_func(true), -}) diff --git a/data/games/garage/mods/testtools/mod.conf b/data/games/garage/mods/testtools/mod.conf deleted file mode 100644 index cde1b26..0000000 --- a/data/games/garage/mods/testtools/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = testtools -description = Some tools to directly manipulate nodes and entities. Great for development and testing diff --git a/data/games/garage/mods/testtools/node_box_visualizer.lua b/data/games/garage/mods/testtools/node_box_visualizer.lua deleted file mode 100644 index 444f939..0000000 --- a/data/games/garage/mods/testtools/node_box_visualizer.lua +++ /dev/null @@ -1,79 +0,0 @@ -local S = core.get_translator("testtools") - -core.register_entity("testtools:visual_box", { - initial_properties = { - visual = "cube", - textures = { - "blank.png", "blank.png", "blank.png", - "blank.png", "blank.png", "blank.png", - }, - use_texture_alpha = true, - physical = false, - pointable = false, - static_save = false, - }, - - on_activate = function(self) - self.timestamp = core.get_us_time() + 5000000 - end, - - on_step = function(self) - if core.get_us_time() >= self.timestamp then - self.object:remove() - end - end, -}) - -local BOX_TYPES = {"node_box", "collision_box", "selection_box"} -local DEFAULT_BOX_TYPE = "selection_box" - -local function visualizer_on_use(itemstack, user, pointed_thing) - if pointed_thing.type ~= "node" then - return - end - - local meta = itemstack:get_meta() - local box_type = meta:get("box_type") or DEFAULT_BOX_TYPE - - local result = core.get_node_boxes(box_type, pointed_thing.under) - local t = "testtools_visual_" .. box_type .. ".png" - - for _, box in ipairs(result) do - local box_min = pointed_thing.under + vector.new(box[1], box[2], box[3]) - local box_max = pointed_thing.under + vector.new(box[4], box[5], box[6]) - local box_center = (box_min + box_max) / 2 - local obj = core.add_entity(box_center, "testtools:visual_box") - if not obj then - break - end - obj:set_properties({ - textures = {t, t, t, t, t, t}, - -- Add a small offset to avoid Z-fighting. - visual_size = vector.add(box_max - box_min, 0.01), - }) - end -end - -local function visualizer_on_place(itemstack, placer, pointed_thing) - local meta = itemstack:get_meta() - local prev_value = meta:get("box_type") or DEFAULT_BOX_TYPE - local prev_index = table.indexof(BOX_TYPES, prev_value) - assert(prev_index ~= -1) - - local new_value = BOX_TYPES[(prev_index % #BOX_TYPES) + 1] - meta:set_string("box_type", new_value) - core.chat_send_player(placer:get_player_name(), S("[Node Box Visualizer] box_type = @1", new_value)) - - return itemstack -end - -core.register_tool("testtools:node_box_visualizer", { - description = S("Node Box Visualizer") .. "\n" .. - S("Punch: Show node/collision/selection boxes of the pointed node") .. "\n" .. - S("Place: Change selected box type (default: selection box)"), - inventory_image = "testtools_node_box_visualizer.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = visualizer_on_use, - on_place = visualizer_on_place, - on_secondary_use = visualizer_on_place, -}) diff --git a/data/games/garage/mods/testtools/particles.lua b/data/games/garage/mods/testtools/particles.lua deleted file mode 100644 index 17f4f5c..0000000 --- a/data/games/garage/mods/testtools/particles.lua +++ /dev/null @@ -1,36 +0,0 @@ -core.register_tool("testtools:particle_spawner", { - description = "Particle Spawner".."\n".. - "Punch: Spawn random test particle", - inventory_image = "testtools_particle_spawner.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = function(itemstack, user, pointed_thing) - local pos = core.get_pointed_thing_position(pointed_thing, true) - if pos == nil then - if user then - pos = user:get_pos() - end - end - pos = vector.add(pos, {x=0, y=0.5, z=0}) - local tex, anim - if math.random(0, 1) == 0 then - tex = "testtools_particle_sheet.png" - anim = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} - else - tex = "testtools_particle_vertical.png" - anim = {type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} - end - - core.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0.04, z=0}, - expirationtime = 6, - collisiondetection = true, - texture = tex, - animation = anim, - size = 4, - glow = math.random(0, 5), - }) - end, -}) - diff --git a/data/games/garage/mods/testtools/privatizer.lua b/data/games/garage/mods/testtools/privatizer.lua deleted file mode 100644 index 54c3508..0000000 --- a/data/games/garage/mods/testtools/privatizer.lua +++ /dev/null @@ -1,29 +0,0 @@ -core.register_tool("testtools:privatizer", { - description = "Node Meta Privatizer".."\n".. - "Punch: Marks 'infotext' and 'formspec' meta fields of chest as private", - inventory_image = "testtools_privatizer.png", - groups = { testtool = 1, disable_repair = 1 }, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type == "node" then - local node = core.get_node(pointed_thing.under) - if core.get_item_group(node.name, "meta_is_privatizable") == 1 then - local p = pointed_thing.under - core.log("action", "[testtools] Privatizer used at "..core.pos_to_string(p)) - core.get_meta(p):mark_as_private({"infotext", "formspec"}) - if user and user:is_player() then - core.chat_send_player(user:get_player_name(), "Node metadata (infotext, formspec) set private!") - end - return - elseif node.name == "chest_of_everything:chest" then - if user and user:is_player() then - core.chat_send_player(user:get_player_name(), "Privatizer can't be used on the Chest of Everything. Use it on a normal chest.") - end - return - end - end - if user and user:is_player() then - core.chat_send_player(user:get_player_name(), "Privatizer can only be used on chest!") - end - end, -}) - diff --git a/data/games/garage/mods/testtools/textures/testtools_blocked_pointing_staff.png b/data/games/garage/mods/testtools/textures/testtools_blocked_pointing_staff.png deleted file mode 100644 index aa1cdb9..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_blocked_pointing_staff.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_branding_iron.png b/data/games/garage/mods/testtools/textures/testtools_branding_iron.png deleted file mode 100644 index 9ac2bb7..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_branding_iron.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_children_getter.png b/data/games/garage/mods/testtools/textures/testtools_children_getter.png deleted file mode 100644 index 763a1e3..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_children_getter.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_entity_rotator.png b/data/games/garage/mods/testtools/textures/testtools_entity_rotator.png deleted file mode 100644 index 17ebb2d..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_entity_rotator.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_entity_scaler.png b/data/games/garage/mods/testtools/textures/testtools_entity_scaler.png deleted file mode 100644 index 4909c25..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_entity_scaler.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_entity_spawner.png b/data/games/garage/mods/testtools/textures/testtools_entity_spawner.png deleted file mode 100644 index 6199e01..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_entity_spawner.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_falling_node_tool.png b/data/games/garage/mods/testtools/textures/testtools_falling_node_tool.png deleted file mode 100644 index 30099a7..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_falling_node_tool.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_item_meta_editor.png b/data/games/garage/mods/testtools/textures/testtools_item_meta_editor.png deleted file mode 100644 index 5cebb0a..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_item_meta_editor.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_lighttool.png b/data/games/garage/mods/testtools/textures/testtools_lighttool.png deleted file mode 100644 index 470adba..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_lighttool.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_node_box_visualizer.png b/data/games/garage/mods/testtools/textures/testtools_node_box_visualizer.png deleted file mode 100644 index 1b16aa7..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_node_box_visualizer.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_node_meta_editor.png b/data/games/garage/mods/testtools/textures/testtools_node_meta_editor.png deleted file mode 100644 index 89eafd6..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_node_meta_editor.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_node_setter.png b/data/games/garage/mods/testtools/textures/testtools_node_setter.png deleted file mode 100644 index 8599438..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_node_setter.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_object_attacher.png b/data/games/garage/mods/testtools/textures/testtools_object_attacher.png deleted file mode 100644 index 4d9bf6f..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_object_attacher.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_object_editor.png b/data/games/garage/mods/testtools/textures/testtools_object_editor.png deleted file mode 100644 index d1ce9ce..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_object_editor.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_object_mover.png b/data/games/garage/mods/testtools/textures/testtools_object_mover.png deleted file mode 100644 index 8b14e9f..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_object_mover.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_param2tool.png b/data/games/garage/mods/testtools/textures/testtools_param2tool.png deleted file mode 100644 index dbc6635..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_param2tool.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_particle_sheet.png b/data/games/garage/mods/testtools/textures/testtools_particle_sheet.png deleted file mode 100644 index 6d70394..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_particle_sheet.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_particle_spawner.png b/data/games/garage/mods/testtools/textures/testtools_particle_spawner.png deleted file mode 100644 index 5bd276b..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_particle_spawner.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_particle_vertical.png b/data/games/garage/mods/testtools/textures/testtools_particle_vertical.png deleted file mode 100644 index 0320b75..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_particle_vertical.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_privatizer.png b/data/games/garage/mods/testtools/textures/testtools_privatizer.png deleted file mode 100644 index dd82fba..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_privatizer.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_remover.png b/data/games/garage/mods/testtools/textures/testtools_remover.png deleted file mode 100644 index 73f14cd..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_remover.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_ultimate_pointing_staff.png b/data/games/garage/mods/testtools/textures/testtools_ultimate_pointing_staff.png deleted file mode 100644 index e4d80fb..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_ultimate_pointing_staff.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_visual_collision_box.png b/data/games/garage/mods/testtools/textures/testtools_visual_collision_box.png deleted file mode 100644 index c8ab97c..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_visual_collision_box.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_visual_node_box.png b/data/games/garage/mods/testtools/textures/testtools_visual_node_box.png deleted file mode 100644 index dbbb8d9..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_visual_node_box.png and /dev/null differ diff --git a/data/games/garage/mods/testtools/textures/testtools_visual_selection_box.png b/data/games/garage/mods/testtools/textures/testtools_visual_selection_box.png deleted file mode 100644 index 1f4bbf3..0000000 Binary files a/data/games/garage/mods/testtools/textures/testtools_visual_selection_box.png and /dev/null differ diff --git a/data/games/garage/mods/testtranslations/init.lua b/data/games/garage/mods/testtranslations/init.lua deleted file mode 100644 index a2de998..0000000 --- a/data/games/garage/mods/testtranslations/init.lua +++ /dev/null @@ -1,26 +0,0 @@ -local S, NS = core.get_translator("testtranslations") - -local function send_compare(name, text) - core.chat_send_player(name, ("%s | %s | %s"):format( - core.get_translated_string("", text), text, core.get_translated_string("fr", text))) -end - -core.register_chatcommand("testtranslations", { - params = "", - description = "Test translations", - privs = {}, - func = function(name, param) - core.chat_send_player(name, "Please ensure your locale is set to \"fr\"") - core.chat_send_player(name, "Untranslated | Client-side translation | Server-side translation (fr)") - send_compare(name, S("Testing .tr files: untranslated")) - send_compare(name, S("Testing .po files: untranslated")) - send_compare(name, S("Testing .mo files: untranslated")) - send_compare(name, S("Testing fuzzy .po entry: untranslated (expected)")) - send_compare(name, core.translate("translation_po", "Testing .po without context: untranslated")) - send_compare(name, core.translate("translation_mo", "Testing .mo without context: untranslated")) - for i = 0,4 do - send_compare(name, NS("@1: .po singular", "@1: .po plural", i, tostring(i))) - send_compare(name, NS("@1: .mo singular", "@1: .mo plural", i, tostring(i))) - end - end -}) diff --git a/data/games/garage/mods/testtranslations/locale/testtranslations.fr.po b/data/games/garage/mods/testtranslations/locale/testtranslations.fr.po deleted file mode 100644 index 2bcc6c7..0000000 --- a/data/games/garage/mods/testtranslations/locale/testtranslations.fr.po +++ /dev/null @@ -1,9 +0,0 @@ -# Dummy entry. This is a test to make sure that a parser error is not thrown -# if the following line is msgctxt. -msgctxt "testtranslations" -msgid "Dummy entry" -msgstr "Dummy result" - -# Used for translating the mod title -msgid "Test translations" -msgstr "Test translations (French)" diff --git a/data/games/garage/mods/testtranslations/locale/translation_mo.fr.mo b/data/games/garage/mods/testtranslations/locale/translation_mo.fr.mo deleted file mode 100644 index 0e7190d..0000000 Binary files a/data/games/garage/mods/testtranslations/locale/translation_mo.fr.mo and /dev/null differ diff --git a/data/games/garage/mods/testtranslations/locale/translation_po.fr.po b/data/games/garage/mods/testtranslations/locale/translation_po.fr.po deleted file mode 100644 index 5aefc0f..0000000 --- a/data/games/garage/mods/testtranslations/locale/translation_po.fr.po +++ /dev/null @@ -1,22 +0,0 @@ -# Test Plural-Forms parsing -msgid "" -msgstr "" -"Plural-Forms: nplurals=2; plural= (n-1+1)<=1 ? n||1?0:1 : 1?(!!2):2;" - -msgctxt "testtranslations" -msgid "Testing .po files: untranslated" -msgstr "Testing .po files: translated" - -msgctxt "testtranslations" -msgid "@1: .po singular" -msgid_plural "@1: .po plural" -msgstr[0] "@1: .po 0 and 1 (French singular)" -msgstr[1] "@1: .po >1 (French plural)" - -#, foo bar fuzzy -msgctxt "testtranslations" -msgid "Testing fuzzy .po entry: untranslated (expected)" -msgstr "Testing fuzzy .po entry: translated (wrong)" - -msgid "Testing .po without context: untranslated" -msgstr "Testing .po without context: translated" diff --git a/data/games/garage/mods/testtranslations/locale/translation_tr.fr.tr b/data/games/garage/mods/testtranslations/locale/translation_tr.fr.tr deleted file mode 100644 index b9ac66a..0000000 --- a/data/games/garage/mods/testtranslations/locale/translation_tr.fr.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain: testtranslations -Testing .tr files: untranslated=Testing .tr files: translated diff --git a/data/games/garage/mods/testtranslations/mod.conf b/data/games/garage/mods/testtranslations/mod.conf deleted file mode 100644 index 1fc09cf..0000000 --- a/data/games/garage/mods/testtranslations/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = testtranslations -title = Test translations -description = Test mod to test translations. diff --git a/data/games/garage/mods/testtranslations/test_locale/readme.txt b/data/games/garage/mods/testtranslations/test_locale/readme.txt deleted file mode 100644 index 7a2ed43..0000000 --- a/data/games/garage/mods/testtranslations/test_locale/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -The translation files in this directory intentionally include errors (which -would be reported when someone starts the devtest game in the de locale). This -allows the unittest to check that the translation file reader also handles -files that include errors. diff --git a/data/games/garage/mods/testtranslations/test_locale/translation_mo.de.mo b/data/games/garage/mods/testtranslations/test_locale/translation_mo.de.mo deleted file mode 100644 index ffe05cd..0000000 Binary files a/data/games/garage/mods/testtranslations/test_locale/translation_mo.de.mo and /dev/null differ diff --git a/data/games/garage/mods/testtranslations/test_locale/translation_po.de.po b/data/games/garage/mods/testtranslations/test_locale/translation_po.de.po deleted file mode 100644 index 9a64805..0000000 --- a/data/games/garage/mods/testtranslations/test_locale/translation_po.de.po +++ /dev/null @@ -1,42 +0,0 @@ -# This file is used by the C++ unittest for testing the parser -msgid "" -msgstr "\n\n\n" -"Plural-Forms: nplurals=2; plural=n!=1;" -"\n\n\n" - -msgid "foo" - msgstr "bar" - -msgid "Untranslated" -msgstr "" - -#, fuzzy -msgid "Fuzzy entry" -msgstr "Wrong" - -msgid "Multi\\""line\n" -"string" -msgstr "Multi\\\"" "li\\ne\nresult" - -msgctxt "Something" in "between" -msgctxt "String does not end -msgstr "Lost string" -msgid "Wrong order" - -msgid "Singular form" -msgid_plural "Plural form" -msgstr[0] "Singular result" -msgstr[1] "Plural result" - -msgid "Not enough value" -msgid_plural "Not enough values" -msgstr[0] "Result" - -msgid "Partial translation" -msgid_plural "Partial translations" -msgstr[0] "Partially translated" -msgstr[1] "" - -msgctxt "context" -msgid "With context" -msgstr "Has context" diff --git a/data/games/garage/mods/testtranslations/translation_mo.de.po b/data/games/garage/mods/testtranslations/translation_mo.de.po deleted file mode 100644 index c3f22c4..0000000 --- a/data/games/garage/mods/testtranslations/translation_mo.de.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "Plural-Forms: nplurals=2; plural= n != 1;" - -msgctxt "context" -msgid "With context" -msgstr "Has context" - -msgctxt "context" -msgid "Singular form" -msgid_plural "Plural form" -msgstr[0] "Singular result" -msgstr[1] "Plural result" - -# Replace plural form delimiter in the msgstr -msgid "Corrupt singular" -msgid_plural "Corrupt plural" -msgstr[0] "Corrupt singular result" -msgstr[1] "Corrupt plural result" - -# Replace terminating NUL in the MO file -msgid "Corrupt entry" -msgstr "Corrupted result" - -# Change the address of this entry to something invalid -msgid "Removed entry" -msgstr "Removed result" diff --git a/data/games/garage/mods/testtranslations/translation_mo.fr.po b/data/games/garage/mods/testtranslations/translation_mo.fr.po deleted file mode 100644 index e6cf6d6..0000000 --- a/data/games/garage/mods/testtranslations/translation_mo.fr.po +++ /dev/null @@ -1,18 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n>1;" - -msgctxt "testtranslations" -msgid "Testing .mo files: untranslated" -msgstr "Testing .mo files: translated" - -msgid "Testing .mo without context: untranslated" -msgstr "Testing .mo without context: translated" - -msgctxt "testtranslations" -msgid "@1: .mo singular" -msgid_plural "@1: .mo plural" -msgstr[0] "@1: .mo 0 and 1 (French singular)" -msgstr[1] "@1: .mo >1 (French plural)" diff --git a/data/games/garage/mods/tiled/init.lua b/data/games/garage/mods/tiled/init.lua deleted file mode 100644 index 51e1fda..0000000 --- a/data/games/garage/mods/tiled/init.lua +++ /dev/null @@ -1,50 +0,0 @@ -local align_help = "Texture spans over a space of 8×8 nodes" -local align_help_n = "Tiles looks the same for every node" - -core.register_node("tiled:tiled", { - description = "Tiled Node (world-aligned)".."\n"..align_help, - tiles = {{ - name = "tiled_tiled.png", - align_style = "world", - scale = 8, - }}, - groups = {cracky=3}, -}) - -core.register_node("tiled:tiled_rooted", { - description = "Tiled 'plantlike_rooted' Node (world-aligned)".."\n".. - "Base node texture spans over a space of 8×8 nodes".."\n".. - "A plantlike thing grows on top", - paramtype = "light", - drawtype = "plantlike_rooted", - tiles = {{ - name = "tiled_tiled.png", - align_style = "world", - scale = 8, - }}, - special_tiles = {"tiled_tiled_node.png"}, - groups = {cracky=3}, -}) - -core.register_node("tiled:tiled_n", { - description = "Tiled Node (node-aligned)".."\n"..align_help_n, - tiles = {{ - name = "tiled_tiled_node.png", - align_style = "node", - }}, - groups = {cracky=3}, -}) - -stairs.register_stair_and_slab("tiled_n", "tiled:tiled_n", - {cracky=3}, - {{name="tiled_tiled_node.png", align_style="node"}}, - "Tiled Stair (node-aligned)".."\n"..align_help_n, - "Tiled Slab (node-aligned)".."\n"..align_help_n) - -stairs.register_stair_and_slab("tiled", "tiled:tiled", - {cracky=3}, - {{name="tiled_tiled.png", align_style="world", scale=8}}, - "Tiled Stair (world-aligned)".."\n"..align_help, - "Tiled Slab (world-aligned)".."\n"..align_help) - - diff --git a/data/games/garage/mods/tiled/mod.conf b/data/games/garage/mods/tiled/mod.conf deleted file mode 100644 index 78b19f9..0000000 --- a/data/games/garage/mods/tiled/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = tiled -description = Add nodes with a special texture that spans multiple nodes (aka "world-aligned") -depends = stairs diff --git a/data/games/garage/mods/tiled/textures/tiled_tiled.png b/data/games/garage/mods/tiled/textures/tiled_tiled.png deleted file mode 100644 index 363a264..0000000 Binary files a/data/games/garage/mods/tiled/textures/tiled_tiled.png and /dev/null differ diff --git a/data/games/garage/mods/tiled/textures/tiled_tiled_node.png b/data/games/garage/mods/tiled/textures/tiled_tiled_node.png deleted file mode 100644 index cc69028..0000000 Binary files a/data/games/garage/mods/tiled/textures/tiled_tiled_node.png and /dev/null differ diff --git a/data/games/garage/mods/tnt/README.txt b/data/games/garage/mods/tnt/README.txt new file mode 100644 index 0000000..ad9ca0e --- /dev/null +++ b/data/games/garage/mods/tnt/README.txt @@ -0,0 +1,73 @@ +Minetest Game mod: tnt +====================== +See license.txt for license information. + +Authors of source code +---------------------- +PilzAdam (MIT) +ShadowNinja (MIT) +sofar (sofar@foo-projects.org) (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media +---------------- +BlockMen (CC BY-SA 3.0): +All textures not mentioned below. + +ShadowNinja (CC BY-SA 3.0): +tnt_smoke.png + +Wuzzy (CC BY-SA 3.0): +All gunpowder textures except tnt_gunpowder_inventory.png. + +sofar (sofar@foo-projects.org) (CC BY-SA 3.0): +tnt_blast.png + +paramat (CC BY-SA 3.0) +tnt_tnt_stick.png - Derived from a texture by benrob0329. + +TumeniNodes (CC0 1.0) +tnt_explode.ogg +renamed, edited, and converted to .ogg from Explosion2.wav +by steveygos93 (CC0 1.0) + + +tnt_ignite.ogg +renamed, edited, and converted to .ogg from sparkler_fuse_nm.wav +by theneedle.tv (CC0 1.0) + + +tnt_gunpowder_burning.ogg +renamed, edited, and converted to .ogg from road flare ignite burns.wav +by frankelmedico (CC0 1.0) + + + +Introduction +------------ +This mod adds TNT. TNT is a tool to help the player in mining. + +How to use the mod: + +Craft gunpowder by placing coal and gravel in the crafting area. +The gunpowder can be used to craft TNT sticks or as a fuse trail for TNT. + +To craft 2 TNT sticks: +G_G +GPG +G_G +G = gunpowder +P = paper +The sticks are not usable as an explosive. + +Craft TNT from 9 TNT sticks. + +There are different ways to ignite TNT: + 1. Hit it with a torch. + 2. Hit a gunpowder fuse trail that leads to TNT with a torch or + flint-and-steel. + 3. Activate it with mesecons (fastest way). + +For 1 TNT: +Node destruction radius is 3 nodes. +Player and object damage radius is 6 nodes. diff --git a/data/games/garage/mods/tnt/init.lua b/data/games/garage/mods/tnt/init.lua new file mode 100644 index 0000000..05f01e3 --- /dev/null +++ b/data/games/garage/mods/tnt/init.lua @@ -0,0 +1,713 @@ +-- tnt/init.lua + +tnt = {} + +-- Load support for MT game translation. +local S = minetest.get_translator("tnt") + + +-- Default to enabled when in singleplayer +local enable_tnt = minetest.settings:get_bool("enable_tnt") +if enable_tnt == nil then + enable_tnt = minetest.is_singleplayer() +end + +-- loss probabilities array (one in X will be lost) +local loss_prob = {} + +loss_prob["default:cobble"] = 3 +loss_prob["default:dirt"] = 4 + +local tnt_radius = tonumber(minetest.settings:get("tnt_radius") or 3) + +-- Fill a list with data for content IDs, after all nodes are registered +local cid_data = {} +minetest.register_on_mods_loaded(function() + for name, def in pairs(minetest.registered_nodes) do + cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + flammable = def.groups.flammable, + on_blast = def.on_blast, + } + end +end) + +local function rand_pos(center, pos, radius) + local def + local reg_nodes = minetest.registered_nodes + local i = 0 + repeat + -- Give up and use the center if this takes too long + if i > 4 then + pos.x, pos.z = center.x, center.z + break + end + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) + def = reg_nodes[minetest.get_node(pos).name] + i = i + 1 + until def and not def.walkable +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + for _, item in pairs(drops) do + local count = math.min(item:get_count(), item:get_stack_max()) + while count > 0 do + local take = math.max(1,math.min(radius * radius, + count, + item:get_stack_max())) + rand_pos(pos, drop_pos, radius) + local dropitem = ItemStack(item) + dropitem:set_count(take) + local obj = minetest.add_item(drop_pos, dropitem) + if obj then + obj:get_luaentity().collect = true + obj:set_acceleration({x = 0, y = -10, z = 0}) + obj:set_velocity({x = math.random(-3, 3), + y = math.random(0, 10), + z = math.random(-3, 3)}) + end + count = count - take + end + end +end + +local function add_drop(drops, item) + item = ItemStack(item) + local name = item:get_name() + if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then + return + end + + local drop = drops[name] + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local basic_flame_on_construct -- cached value +local function destroy(drops, npos, cid, c_air, c_fire, + on_blast_queue, on_construct_queue, + ignore_protection, ignore_on_blast, owner) + if not ignore_protection and minetest.is_protected(npos, owner) then + return cid + end + + local def = cid_data[cid] + + if not def then + return c_air + elseif not ignore_on_blast and def.on_blast then + on_blast_queue[#on_blast_queue + 1] = { + pos = vector.new(npos), + on_blast = def.on_blast + } + return cid + elseif def.flammable then + on_construct_queue[#on_construct_queue + 1] = { + fn = basic_flame_on_construct, + pos = vector.new(npos) + } + return c_fire + else + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + return c_air + end +end + +local function calc_velocity(pos1, pos2, old_vel, power) + -- Avoid errors caused by a vector of zero length + if vector.equals(pos1, pos2) then + return old_vel + end + + local vel = vector.direction(pos1, pos2) + vel = vector.normalize(vel) + vel = vector.multiply(vel, power) + + -- Divide by distance + local dist = vector.distance(pos1, pos2) + dist = math.max(dist, 1) + vel = vector.divide(vel, dist) + + -- Add old velocity + vel = vector.add(vel, old_vel) + + -- randomize it a bit + vel = vector.add(vel, { + x = math.random() - 0.5, + y = math.random() - 0.5, + z = math.random() - 0.5, + }) + + -- Limit to terminal velocity + dist = vector.length(vel) + if dist > 250 then + vel = vector.divide(vel, dist / 250) + end + return vel +end + +local function entity_physics(pos, radius, drops) + local objs = minetest.get_objects_inside_radius(pos, radius) + for _, obj in pairs(objs) do + local obj_pos = obj:get_pos() + if obj_pos then + local dist = math.max(1, vector.distance(pos, obj_pos)) + + local damage = (4 / dist) * radius + if obj:is_player() then + local dir = vector.normalize(vector.subtract(obj_pos, pos)) + local moveoff = vector.multiply(dir, 2 / dist * radius) + obj:add_velocity(moveoff) + + obj:set_hp(obj:get_hp() - damage) + else + local luaobj = obj:get_luaentity() + + -- object might have disappeared somehow + if luaobj then + local do_damage = true + local do_knockback = true + local entity_drops = {} + local objdef = minetest.registered_entities[luaobj.name] + + if objdef and objdef.on_blast then + do_damage, do_knockback, entity_drops = objdef.on_blast(luaobj, damage) + end + + if do_knockback then + local obj_vel = obj:get_velocity() + obj:set_velocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + if do_damage then + if not obj:get_armor_groups().immortal then + obj:punch(obj, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + end + end + for _, item in pairs(entity_drops) do + add_drop(drops, item) + end + end + end + end + end +end + +local function add_effects(pos, radius, drops) + minetest.add_particle({ + pos = pos, + velocity = vector.new(), + acceleration = vector.new(), + expirationtime = 0.4, + size = radius * 10, + collisiondetection = false, + vertical = false, + texture = "tnt_boom.png", + glow = 15, + }) + minetest.add_particlespawner({ + amount = 64, + time = 0.5, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -10, y = -10, z = -10}, + maxvel = {x = 10, y = 10, z = 10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 2.5, + minsize = radius * 3, + maxsize = radius * 5, + texture = "tnt_smoke.png", + }) + + -- we just dropped some items. Look at the items entities and pick + -- one of them to use as texture + local texture = "tnt_blast.png" --fallback texture + local node + local most = 0 + for name, stack in pairs(drops) do + local count = stack:get_count() + if count > most then + most = count + local def = minetest.registered_nodes[name] + if def then + node = { name = name } + if def.tiles and type(def.tiles[1]) == "string" then + texture = def.tiles[1] + end + end + end + end + + minetest.add_particlespawner({ + amount = 64, + time = 0.1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -3, y = 0, z = -3}, + maxvel = {x = 3, y = 5, z = 3}, + minacc = {x = 0, y = -10, z = 0}, + maxacc = {x = 0, y = -10, z = 0}, + minexptime = 0.8, + maxexptime = 2.0, + minsize = radius * 0.33, + maxsize = radius, + texture = texture, + -- ^ only as fallback for clients without support for `node` parameter + node = node, + collisiondetection = true, + }) +end + +function tnt.burn(pos, nodename) + local name = nodename or minetest.get_node(pos).name + local def = minetest.registered_nodes[name] + if not def then + return + elseif def.on_ignite then + def.on_ignite(pos) + elseif minetest.get_item_group(name, "tnt") > 0 then + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.sound_play("tnt_ignite", {pos = pos, gain = 1.0}, true) + minetest.get_node_timer(pos):start(1) + end +end + +local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner, explode_center) + pos = vector.round(pos) + -- scan for adjacent TNT nodes first, and enlarge the explosion + local vm1 = VoxelManip() + local p1 = vector.subtract(pos, 2) + local p2 = vector.add(pos, 2) + local minp, maxp = vm1:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm1:get_data() + local count = 0 + local c_tnt + local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") + local c_tnt_boom = minetest.get_content_id("tnt:boom") + local c_air = minetest.CONTENT_AIR + local c_ignore = minetest.CONTENT_IGNORE + if enable_tnt then + c_tnt = minetest.get_content_id("tnt:tnt") + else + c_tnt = c_tnt_burning -- tnt is not registered if disabled + end + -- make sure we still have explosion even when centre node isnt tnt related + if explode_center then + count = 1 + end + + for z = pos.z - 2, pos.z + 2 do + for y = pos.y - 2, pos.y + 2 do + local vi = a:index(pos.x - 2, y, z) + for x = pos.x - 2, pos.x + 2 do + local cid = data[vi] + if cid == c_tnt or cid == c_tnt_boom or cid == c_tnt_burning then + count = count + 1 + data[vi] = c_air + end + vi = vi + 1 + end + end + end + + vm1:set_data(data) + vm1:write_to_map() + + -- recalculate new radius + radius = math.floor(radius * math.pow(count, 1/3)) + + -- perform the explosion + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + p1 = vector.subtract(pos, radius) + p2 = vector.add(pos, radius) + minp, maxp = vm:read_from_map(p1, p2) + a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + data = vm:get_data() + + local drops = {} + local on_blast_queue = {} + local on_construct_queue = {} + basic_flame_on_construct = minetest.registered_nodes["fire:basic_flame"].on_construct + + -- Used to efficiently remove metadata of nodes that were destroyed. + -- Metadata is probably sparse, so this may save us some work. + local has_meta = {} + for _, p in ipairs(minetest.find_nodes_with_meta(p1, p2)) do + has_meta[a:indexp(p)] = true + end + + local c_fire = minetest.get_content_id("fire:basic_flame") + for z = -radius, radius do + for y = -radius, radius do + local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) + for x = -radius, radius do + local r = vector.length(vector.new(x, y, z)) + if (radius * radius) / (r * r) >= (pr:next(80, 125) / 100) then + local cid = data[vi] + local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} + if cid ~= c_air and cid ~= c_ignore then + local new_cid = destroy(drops, p, cid, c_air, c_fire, + on_blast_queue, on_construct_queue, + ignore_protection, ignore_on_blast, owner) + + if new_cid ~= data[vi] then + data[vi] = new_cid + if has_meta[vi] then + minetest.get_meta(p):from_table(nil) + end + end + end + end + vi = vi + 1 + end + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() + vm:update_liquids() + + -- call check_single_for_falling for everything within 1.5x blast radius + for y = -radius * 1.5, radius * 1.5 do + for z = -radius * 1.5, radius * 1.5 do + for x = -radius * 1.5, radius * 1.5 do + local rad = {x = x, y = y, z = z} + local s = vector.add(pos, rad) + local r = vector.length(rad) + if r / radius < 1.4 then + minetest.check_single_for_falling(s) + end + end + end + end + + for _, queued_data in pairs(on_blast_queue) do + local dist = math.max(1, vector.distance(queued_data.pos, pos)) + local intensity = (radius * radius) / (dist * dist) + local node_drops = queued_data.on_blast(queued_data.pos, intensity) + if node_drops then + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + end + end + + for _, queued_data in pairs(on_construct_queue) do + queued_data.fn(queued_data.pos) + end + + minetest.log("action", "TNT owned by " .. owner .. " detonated at " .. + minetest.pos_to_string(pos) .. " with radius " .. radius) + + return drops, radius +end + +function tnt.boom(pos, def) + def = def or {} + def.radius = def.radius or 1 + def.damage_radius = def.damage_radius or def.radius * 2 + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if not def.explode_center and def.ignore_protection ~= true then + minetest.set_node(pos, {name = "tnt:boom"}) + end + local sound = def.sound or "tnt_explode" + minetest.sound_play(sound, {pos = pos, gain = 2.5, + max_hear_distance = math.min(def.radius * 20, 128)}, true) + local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, + def.ignore_on_blast, owner, def.explode_center) + -- append entity drops + local damage_radius = (radius / math.max(1, def.radius)) * def.damage_radius + entity_physics(pos, damage_radius, drops) + if not def.disable_drops then + eject_drops(drops, pos, radius) + end + add_effects(pos, radius, drops) + minetest.log("action", "A TNT explosion occurred at " .. minetest.pos_to_string(pos) .. + " with radius " .. radius) +end + +minetest.register_node("tnt:boom", { + drawtype = "airlike", + inventory_image = "tnt_boom.png", + wield_image = "tnt_boom.png", + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + -- unaffected by explosions + on_blast = function() end, +}) + +minetest.register_node("tnt:gunpowder", { + description = S("Gun Powder"), + drawtype = "raillike", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + tiles = { + "tnt_gunpowder_straight.png", + "tnt_gunpowder_curved.png", + "tnt_gunpowder_t_junction.png", + "tnt_gunpowder_crossing.png" + }, + inventory_image = "tnt_gunpowder_inventory.png", + wield_image = "tnt_gunpowder_inventory.png", + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {dig_immediate = 2, attached_node = 1, flammable = 5, + connect_to_raillike = minetest.raillike_group("gunpowder")}, + sounds = default.node_sound_leaves_defaults(), + + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + default.log_player_action(puncher, "ignites tnt:gunpowder at", pos) + end + end, + on_blast = function(pos, intensity) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, + on_burn = function(pos) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, + on_ignite = function(pos, igniter) + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end, +}) + +minetest.register_node("tnt:gunpowder_burning", { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + light_source = 5, + tiles = {{ + name = "tnt_gunpowder_burning_straight_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_curved_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_t_junction_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_crossing_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }}, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + drop = "", + groups = { + dig_immediate = 2, + attached_node = 1, + connect_to_raillike = minetest.raillike_group("gunpowder"), + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + for dx = -1, 1 do + for dz = -1, 1 do + if math.abs(dx) + math.abs(dz) == 1 then + for dy = -1, 1 do + tnt.burn({ + x = pos.x + dx, + y = pos.y + dy, + z = pos.z + dz, + }) + end + end + end + end + minetest.remove_node(pos) + end, + -- unaffected by explosions + on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_gunpowder_burning", {pos = pos, + gain = 1.0}, true) + minetest.get_node_timer(pos):start(1) + end, +}) + +minetest.register_craft({ + output = "tnt:gunpowder 5", + type = "shapeless", + recipe = {"default:coal_lump", "default:gravel"} +}) + +minetest.register_craftitem("tnt:tnt_stick", { + description = S("TNT Stick"), + inventory_image = "tnt_tnt_stick.png", + groups = {flammable = 5}, +}) + +if enable_tnt then + minetest.register_craft({ + output = "tnt:tnt_stick 2", + recipe = { + {"tnt:gunpowder", "", "tnt:gunpowder"}, + {"tnt:gunpowder", "default:paper", "tnt:gunpowder"}, + {"tnt:gunpowder", "", "tnt:gunpowder"}, + } + }) + + minetest.register_craft({ + output = "tnt:tnt", + recipe = { + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"}, + {"tnt:tnt_stick", "tnt:tnt_stick", "tnt:tnt_stick"} + } + }) + + minetest.register_abm({ + label = "TNT ignition", + nodenames = {"group:tnt", "tnt:gunpowder"}, + neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"}, + interval = 4, + chance = 1, + action = function(pos, node) + tnt.burn(pos, node.name) + end, + }) +end + +function tnt.register_tnt(def) + local name + if not def.name:find(':') then + name = "tnt:" .. def.name + else + name = def.name + def.name = def.name:match(":([%w_]+)") + end + if not def.tiles then def.tiles = {} end + local tnt_top = def.tiles.top or def.name .. "_top.png" + local tnt_bottom = def.tiles.bottom or def.name .. "_bottom.png" + local tnt_side = def.tiles.side or def.name .. "_side.png" + local tnt_burning = def.tiles.burning or def.name .. "_top_burning_animated.png" + if not def.damage_radius then def.damage_radius = def.radius * 2 end + + if enable_tnt then + minetest.register_node(":" .. name, { + description = def.description, + tiles = {tnt_top, tnt_bottom, tnt_side}, + is_ground_content = false, + groups = {dig_immediate = 2, mesecon = 2, tnt = 1, flammable = 5}, + sounds = default.node_sound_wood_defaults(), + after_place_node = function(pos, placer) + if placer and placer:is_player() then + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + end + end, + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.registered_nodes[name .. "_burning"].on_construct(pos) + default.log_player_action(puncher, "ignites", node.name, "at", pos) + end + end, + on_blast = function(pos, intensity) + minetest.after(0.1, function() + tnt.boom(pos, def) + end) + end, + mesecons = {effector = + {action_on = + function(pos) + tnt.boom(pos, def) + end + } + }, + on_burn = function(pos) + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.registered_nodes[name .. "_burning"].on_construct(pos) + end, + on_ignite = function(pos, igniter) + minetest.swap_node(pos, {name = name .. "_burning"}) + minetest.registered_nodes[name .. "_burning"].on_construct(pos) + end, + }) + end + + minetest.register_node(":" .. name .. "_burning", { + tiles = { + { + name = tnt_burning, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + tnt_bottom, tnt_side + }, + light_source = 5, + drop = "", + sounds = default.node_sound_wood_defaults(), + groups = {falling_node = 1, not_in_creative_inventory = 1}, + on_timer = function(pos, elapsed) + tnt.boom(pos, def) + end, + -- unaffected by explosions + on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_ignite", {pos = pos}, true) + minetest.get_node_timer(pos):start(4) + minetest.check_for_falling(pos) + end, + }) +end + +tnt.register_tnt({ + name = "tnt:tnt", + description = S("TNT"), + radius = tnt_radius, +}) diff --git a/data/games/garage/mods/tnt/license.txt b/data/games/garage/mods/tnt/license.txt new file mode 100644 index 0000000..903d4b0 --- /dev/null +++ b/data/games/garage/mods/tnt/license.txt @@ -0,0 +1,100 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 PilzAdam +Copyright (C) 2014-2016 ShadowNinja +Copyright (C) 2016 sofar (sofar@foo-projects.org) +Copyright (C) 2014-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + +=================================== + +Licenses of media +----------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 ShadowNinja +Copyright (C) 2015-2016 Wuzzy +Copyright (C) 2016 sofar (sofar@foo-projects.org) +Copyright (C) 2018 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +==================================================== + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +for audio files (found in sounds folder) +TumeniNodes +steveygos93 +theneedle.tv +frankelmedico + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public domain +by waiving all of his or her rights to the work worldwide under copyright law, including all +related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as publicity +or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this deed makes no +warranties about the work, and disclaims liability for all uses of the work, to the fullest +extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author or the affirmer. + +This license is acceptable for Free Cultural Works. +For more Information: +https://creativecommons.org/publicdomain/zero/1.0/ + diff --git a/data/games/garage/mods/tnt/locale/template.txt b/data/games/garage/mods/tnt/locale/template.txt new file mode 100644 index 0000000..62bcb15 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder= +TNT Stick= +TNT= diff --git a/data/games/garage/mods/tnt/locale/tnt.de.tr b/data/games/garage/mods/tnt/locale/tnt.de.tr new file mode 100644 index 0000000..09d2ac2 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.de.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Schießpulver +TNT Stick=TNT-Stange +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.eo.tr b/data/games/garage/mods/tnt/locale/tnt.eo.tr new file mode 100644 index 0000000..b467d2f --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.eo.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Pulvo +TNT Stick=Dinamita bastono +TNT=Dinamito diff --git a/data/games/garage/mods/tnt/locale/tnt.es.tr b/data/games/garage/mods/tnt/locale/tnt.es.tr new file mode 100644 index 0000000..d9f3f20 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.es.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Pólvora +TNT Stick=Cartucho de TNT +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.fr.tr b/data/games/garage/mods/tnt/locale/tnt.fr.tr new file mode 100644 index 0000000..3fe48fb --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.fr.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Poudre à canon +TNT Stick=Bâton de TNT +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.id.tr b/data/games/garage/mods/tnt/locale/tnt.id.tr new file mode 100644 index 0000000..2652ae0 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.id.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Bubuk Mesiu +TNT Stick=Tongkat TNT +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.it.tr b/data/games/garage/mods/tnt/locale/tnt.it.tr new file mode 100644 index 0000000..6437c00 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.it.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Polvere da sparo +TNT Stick=Candelotto di TNT +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.ja.tr b/data/games/garage/mods/tnt/locale/tnt.ja.tr new file mode 100644 index 0000000..d7af9f5 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.ja.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=火薬 +TNT Stick=ダイナマイト +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.jbo.tr b/data/games/garage/mods/tnt/locale/tnt.jbo.tr new file mode 100644 index 0000000..b1b425a --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=lo tercelpu'o +TNT Stick=lo granrti'enti +TNT=lo bamrti'enti diff --git a/data/games/garage/mods/tnt/locale/tnt.lv.tr b/data/games/garage/mods/tnt/locale/tnt.lv.tr new file mode 100644 index 0000000..2af9c2e --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.lv.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Šaujampulveris +TNT Stick=Dinamīta kociņš +TNT=Dinamīts diff --git a/data/games/garage/mods/tnt/locale/tnt.ms.tr b/data/games/garage/mods/tnt/locale/tnt.ms.tr new file mode 100644 index 0000000..8f537c7 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.ms.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Serbuk Letupan +TNT Stick=Batang TNT +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.pl.tr b/data/games/garage/mods/tnt/locale/tnt.pl.tr new file mode 100644 index 0000000..1ede267 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.pl.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Proch strzelniczy +TNT Stick=Dynamit +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.pt_BR.tr b/data/games/garage/mods/tnt/locale/tnt.pt_BR.tr new file mode 100644 index 0000000..d4fc174 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Pólvora +TNT Stick=Banana de Dinamite +TNT=Dinamite diff --git a/data/games/garage/mods/tnt/locale/tnt.ru.tr b/data/games/garage/mods/tnt/locale/tnt.ru.tr new file mode 100644 index 0000000..d8f55f1 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.ru.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Порох +TNT Stick=Динамитная шашка +TNT=Динамит diff --git a/data/games/garage/mods/tnt/locale/tnt.sk.tr b/data/games/garage/mods/tnt/locale/tnt.sk.tr new file mode 100644 index 0000000..639b8c8 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.sk.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Pušný prach +TNT Stick=Časť TNT +TNT=TNT diff --git a/data/games/garage/mods/tnt/locale/tnt.sv.tr b/data/games/garage/mods/tnt/locale/tnt.sv.tr new file mode 100644 index 0000000..fd08913 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.sv.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Krut +TNT Stick=Dynamitpinne +TNT=Dynamit diff --git a/data/games/garage/mods/tnt/locale/tnt.uk.tr b/data/games/garage/mods/tnt/locale/tnt.uk.tr new file mode 100644 index 0000000..5186549 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.uk.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=Порох +TNT Stick=Тротилова шашка +TNT=Тротил diff --git a/data/games/garage/mods/tnt/locale/tnt.zh_CN.tr b/data/games/garage/mods/tnt/locale/tnt.zh_CN.tr new file mode 100644 index 0000000..4cb2e94 --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=火药粉 +TNT Stick=三硝基甲苯棒 +TNT=三硝基甲苯 diff --git a/data/games/garage/mods/tnt/locale/tnt.zh_TW.tr b/data/games/garage/mods/tnt/locale/tnt.zh_TW.tr new file mode 100644 index 0000000..c1b3caf --- /dev/null +++ b/data/games/garage/mods/tnt/locale/tnt.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: tnt +Gun Powder=火藥粉 +TNT Stick=炸藥棒 +TNT=炸藥包 diff --git a/data/games/garage/mods/tnt/mod.conf b/data/games/garage/mods/tnt/mod.conf new file mode 100644 index 0000000..9385e82 --- /dev/null +++ b/data/games/garage/mods/tnt/mod.conf @@ -0,0 +1,3 @@ +name = tnt +description = Minetest Game mod: tnt +depends = default, fire diff --git a/data/games/garage/mods/tnt/sounds/tnt_explode.ogg b/data/games/garage/mods/tnt/sounds/tnt_explode.ogg new file mode 100644 index 0000000..e00a16c Binary files /dev/null and b/data/games/garage/mods/tnt/sounds/tnt_explode.ogg differ diff --git a/data/games/garage/mods/tnt/sounds/tnt_gunpowder_burning.ogg b/data/games/garage/mods/tnt/sounds/tnt_gunpowder_burning.ogg new file mode 100644 index 0000000..8581c2d Binary files /dev/null and b/data/games/garage/mods/tnt/sounds/tnt_gunpowder_burning.ogg differ diff --git a/data/games/garage/mods/tnt/sounds/tnt_ignite.ogg b/data/games/garage/mods/tnt/sounds/tnt_ignite.ogg new file mode 100644 index 0000000..1a7062e Binary files /dev/null and b/data/games/garage/mods/tnt/sounds/tnt_ignite.ogg differ diff --git a/data/games/garage/mods/tnt/textures/tnt_blast.png b/data/games/garage/mods/tnt/textures/tnt_blast.png new file mode 100644 index 0000000..92be28b Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_blast.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_boom.png b/data/games/garage/mods/tnt/textures/tnt_boom.png new file mode 100644 index 0000000..c848bfc Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_boom.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_bottom.png b/data/games/garage/mods/tnt/textures/tnt_bottom.png new file mode 100644 index 0000000..95f66cb Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_bottom.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png new file mode 100644 index 0000000..efab2a9 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png new file mode 100644 index 0000000..bd1437f Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png new file mode 100644 index 0000000..654e539 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png new file mode 100644 index 0000000..5b567e3 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_crossing.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_crossing.png new file mode 100644 index 0000000..c0487a0 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_crossing.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_curved.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_curved.png new file mode 100644 index 0000000..8ed01db Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_curved.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_inventory.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_inventory.png new file mode 100644 index 0000000..105a2d2 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_inventory.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_straight.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_straight.png new file mode 100644 index 0000000..427feb9 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_straight.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_gunpowder_t_junction.png b/data/games/garage/mods/tnt/textures/tnt_gunpowder_t_junction.png new file mode 100644 index 0000000..b30c2b4 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_gunpowder_t_junction.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_side.png b/data/games/garage/mods/tnt/textures/tnt_side.png new file mode 100644 index 0000000..d303473 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_side.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_smoke.png b/data/games/garage/mods/tnt/textures/tnt_smoke.png new file mode 100644 index 0000000..6788974 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_smoke.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_tnt_stick.png b/data/games/garage/mods/tnt/textures/tnt_tnt_stick.png new file mode 100644 index 0000000..bc47a29 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_tnt_stick.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_top.png b/data/games/garage/mods/tnt/textures/tnt_top.png new file mode 100644 index 0000000..31b807c Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_top.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_top_burning.png b/data/games/garage/mods/tnt/textures/tnt_top_burning.png new file mode 100644 index 0000000..fc0d490 Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_top_burning.png differ diff --git a/data/games/garage/mods/tnt/textures/tnt_top_burning_animated.png b/data/games/garage/mods/tnt/textures/tnt_top_burning_animated.png new file mode 100644 index 0000000..18a270f Binary files /dev/null and b/data/games/garage/mods/tnt/textures/tnt_top_burning_animated.png differ diff --git a/data/games/garage/mods/unittests/async_env.lua b/data/games/garage/mods/unittests/async_env.lua deleted file mode 100644 index b00deb3..0000000 --- a/data/games/garage/mods/unittests/async_env.lua +++ /dev/null @@ -1,209 +0,0 @@ --- helper - -core.register_async_dofile(core.get_modpath(core.get_current_modname()) .. - DIR_DELIM .. "inside_async_env.lua") - -local function deepequal(a, b) - if type(a) == "function" then - return type(b) == "function" - elseif type(a) ~= "table" then - return a == b - elseif type(b) ~= "table" then - return false - end - for k, v in pairs(a) do - if not deepequal(v, b[k]) then - return false - end - end - for k, v in pairs(b) do - if not deepequal(a[k], v) then - return false - end - end - return true -end - --- Object Passing / Serialization - -local test_object = { - name = "stairs:stair_glass", - type = "node", - groups = {oddly_breakable_by_hand = 3, cracky = 3, stair = 1}, - description = "Glass Stair", - sounds = { - dig = {name = "default_glass_footstep", gain = 0.5}, - footstep = {name = "default_glass_footstep", gain = 0.3}, - dug = {name = "default_break_glass", gain = 1} - }, - node_box = { - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5} - }, - type = "fixed" - }, - tiles = { - {name = "stairs_glass_split.png", backface_culling = true}, - {name = "default_glass.png", backface_culling = true}, - {name = "stairs_glass_stairside.png^[transformFX", backface_culling = true} - }, - on_place = function(itemstack, placer) - return core.is_player(placer) - end, - sunlight_propagates = true, - is_ground_content = false, - pos = vector.new(-1, -2, -3), -} - -local function test_object_passing() - local tmp = core.serialize_roundtrip(test_object) - assert(deepequal(test_object, tmp)) - - local circular_key = {"foo", "bar"} - circular_key[circular_key] = true - tmp = core.serialize_roundtrip(circular_key) - assert(tmp[1] == "foo") - assert(tmp[2] == "bar") - assert(tmp[tmp] == true) - - local circular_value = {"foo"} - circular_value[2] = circular_value - tmp = core.serialize_roundtrip(circular_value) - assert(tmp[1] == "foo") - assert(tmp[2] == tmp) - - -- Two-segment cycle - local cycle_seg_1, cycle_seg_2 = {}, {} - cycle_seg_1[1] = cycle_seg_2 - cycle_seg_2[1] = cycle_seg_1 - tmp = core.serialize_roundtrip(cycle_seg_1) - assert(tmp[1][1] == tmp) - - -- Duplicated value without a cycle - local acyclic_dup_holder = {} - tmp = ItemStack("") - acyclic_dup_holder[tmp] = tmp - tmp = core.serialize_roundtrip(acyclic_dup_holder) - for k, v in pairs(tmp) do - assert(rawequal(k, v)) - end -end -unittests.register("test_object_passing", test_object_passing) - -local function test_userdata_passing(_, pos) - -- basic userdata passing - local obj = table.copy(test_object.tiles[1]) - obj.test = ItemStack("default:cobble 99") - local tmp = core.serialize_roundtrip(obj) - assert(type(tmp.test) == "userdata") - assert(obj.test:to_string() == tmp.test:to_string()) - - -- object can't be passed, should error - obj = core.raycast(pos, pos) - assert(not pcall(core.serialize_roundtrip, obj)) - - -- VManip - local vm = core.get_voxel_manip(pos, pos) - local expect = vm:get_node_at(pos) - local vm2 = core.serialize_roundtrip(vm) - assert(deepequal(vm2:get_node_at(pos), expect)) -end -unittests.register("test_userdata_passing", test_userdata_passing, {map=true}) - --- Asynchronous jobs - -local function test_handle_async(cb) - -- Basic test including mod name tracking and unittests.async_test() - -- which is defined inside_async_env.lua - local func = function(x) - return core.get_last_run_mod(), _VERSION, unittests[x]() - end - local expect = {core.get_last_run_mod(), _VERSION, true} - - core.handle_async(func, function(...) - if not deepequal(expect, {...}) then - return cb("Values did not equal") - end - if core.get_last_run_mod() ~= expect[1] then - return cb("Mod name not tracked correctly") - end - - -- Test passing of nil arguments and return values - core.handle_async(function(a, b) - return a, b - end, function(a, b) - if b ~= 123 then - return cb("Argument went missing") - end - cb() - end, nil, 123) - end, "async_test") -end -unittests.register("test_handle_async", test_handle_async, {async=true}) - -local function test_userdata_passing2(cb, _, pos) - -- VManip: check transfer into other env - local vm = core.get_voxel_manip(pos, pos) - local expect = vm:get_node_at(pos) - - core.handle_async(function(vm_, pos_) - return vm_:get_node_at(pos_) - end, function(ret) - if not deepequal(expect, ret) then - return cb("Node data mismatch (one-way)") - end - - -- VManip: test a roundtrip - core.handle_async(function(vm_) - return vm_ - end, function(vm2) - if not deepequal(expect, vm2:get_node_at(pos)) then - return cb("Node data mismatch (roundtrip)") - end - cb() - end, vm) - end, vm, pos) -end -unittests.register("test_userdata_passing2", test_userdata_passing2, {map=true, async=true}) - -local function test_portable_metatable_override() - assert(pcall(core.register_portable_metatable, "__builtin:vector", vector.metatable), - "Metatable name aliasing throws an error when it should be allowed") - - assert(not pcall(core.register_portable_metatable, "__builtin:vector", {}), - "Illegal metatable overriding allowed") -end -unittests.register("test_portable_metatable_override", test_portable_metatable_override) - -local function test_portable_metatable_registration(cb) - local custom_metatable = {} - core.register_portable_metatable("unittests:custom_metatable", custom_metatable) - - core.handle_async(function(x) - -- unittests.custom_metatable is registered in inside_async_env.lua - return getmetatable(x) == unittests.custom_metatable, x - end, function(metatable_preserved_async, table_after_roundtrip) - if not metatable_preserved_async then - return cb("Custom metatable not preserved (main -> async)") - end - if getmetatable(table_after_roundtrip) ~= custom_metatable then - return cb("Custom metable not preserved (after roundtrip)") - end - cb() - end, setmetatable({}, custom_metatable)) -end -unittests.register("test_portable_metatable_registration", test_portable_metatable_registration, {async=true}) - -local function test_vector_preserve(cb) - local vec = vector.new(1, 2, 3) - core.handle_async(function(x) - return x[1] - end, function(ret) - if ret ~= vec then -- fails if metatable was not preserved - return cb("Vector value mismatch") - end - cb() - end, {vec}) -end -unittests.register("test_async_vector", test_vector_preserve, {async=true}) diff --git a/data/games/garage/mods/unittests/color.lua b/data/games/garage/mods/unittests/color.lua deleted file mode 100644 index 8615444..0000000 --- a/data/games/garage/mods/unittests/color.lua +++ /dev/null @@ -1,17 +0,0 @@ -local function assert_colors_equal(c1, c2) - if type(c1) == "table" and type(c2) == "table" then - assert(c1.r == c2.r and c1.g == c2.g and c1.b == c2.b and c1.a == c2.a) - else - assert(c1 == c2) - end -end - -local function test_color_conversion() - assert_colors_equal(core.colorspec_to_table("#fff"), {r = 255, g = 255, b = 255, a = 255}) - assert_colors_equal(core.colorspec_to_table(0xFF00FF00), {r = 0, g = 255, b = 0, a = 255}) - assert_colors_equal(core.colorspec_to_table("#00000000"), {r = 0, g = 0, b = 0, a = 0}) - assert_colors_equal(core.colorspec_to_table("green"), {r = 0, g = 128, b = 0, a = 255}) - assert_colors_equal(core.colorspec_to_table("gren"), nil) -end - -unittests.register("test_color_conversion", test_color_conversion) diff --git a/data/games/garage/mods/unittests/content_ids.lua b/data/games/garage/mods/unittests/content_ids.lua deleted file mode 100644 index d2f1e0c..0000000 --- a/data/games/garage/mods/unittests/content_ids.lua +++ /dev/null @@ -1,37 +0,0 @@ -core.register_alias("unittests:test_content_ids_alias1", "air") -core.register_alias("unittests:test_content_ids_alias2", "~") - -local function test_content_ids() - assert(core.get_content_id("air") == core.CONTENT_AIR) - assert(core.get_content_id("unittests:test_content_ids_alias1") == core.CONTENT_AIR) - assert(core.get_content_id("unknown") == core.CONTENT_UNKNOWN) - assert(core.get_content_id("ignore") == core.CONTENT_IGNORE) - - assert(core.get_name_from_content_id(core.CONTENT_AIR) == "air") - assert(core.get_name_from_content_id(core.CONTENT_UNKNOWN) == "unknown") - assert(core.get_name_from_content_id(core.CONTENT_IGNORE) == "ignore") - - assert(pcall(core.get_content_id, "~") == false) - assert(pcall(core.get_content_id, "unittests:test_content_ids_alias2") == false) - assert(pcall(core.get_content_id) == false) - assert(core.get_name_from_content_id(0xFFFF) == "unknown") - assert(pcall(core.get_name_from_content_id) == false) -end - --- Run while mod is loading. -test_content_ids() - --- Run after mods have loaded. -unittests.register("test_content_ids", test_content_ids) - --- Run in async environment. -local function test_content_ids_async(cb) - local function func(test_func) - local ok, err = pcall(test_func) - if not ok then - return err - end - end - core.handle_async(func, cb, test_content_ids) -end -unittests.register("test_content_ids_async", test_content_ids_async, {async=true}) diff --git a/data/games/garage/mods/unittests/crafting.lua b/data/games/garage/mods/unittests/crafting.lua deleted file mode 100644 index 38b1202..0000000 --- a/data/games/garage/mods/unittests/crafting.lua +++ /dev/null @@ -1,112 +0,0 @@ -dofile(core.get_modpath(core.get_current_modname()) .. "/crafting_prepare.lua") - --- Test core.clear_craft function -local function test_clear_craft() - -- Clearing by output - core.register_craft({ - output = "foo", - recipe = {{"bar"}} - }) - core.register_craft({ - output = "foo 4", - recipe = {{"foo", "bar"}} - }) - assert(#core.get_all_craft_recipes("foo") == 2) - core.clear_craft({output="foo"}) - assert(core.get_all_craft_recipes("foo") == nil) - -- Clearing by input - core.register_craft({ - output = "foo 4", - recipe = {{"foo", "bar"}} - }) - assert(#core.get_all_craft_recipes("foo") == 1) - core.clear_craft({recipe={{"foo", "bar"}}}) - assert(core.get_all_craft_recipes("foo") == nil) -end -unittests.register("test_clear_craft", test_clear_craft) - --- Test core.get_craft_result function -local function test_get_craft_result() - -- normal - local input = { - method = "normal", - width = 2, - items = {"", "unittests:coal_lump", "", "unittests:stick"} - } - core.log("info", "[unittests] torch crafting input: "..dump(input)) - local output, decremented_input = core.get_craft_result(input) - core.log("info", "[unittests] torch crafting output: "..dump(output)) - core.log("info", "[unittests] torch crafting decremented input: "..dump(decremented_input)) - assert(output.item) - core.log("info", "[unittests] torch crafting output.item:to_table(): "..dump(output.item:to_table())) - assert(output.item:get_name() == "unittests:torch") - assert(output.item:get_count() == 4) - - -- fuel - input = { - method = "fuel", - width = 1, - items = {"unittests:coal_lump"} - } - core.log("info", "[unittests] coal fuel input: "..dump(input)) - output, decremented_input = core.get_craft_result(input) - core.log("info", "[unittests] coal fuel output: "..dump(output)) - core.log("info", "[unittests] coal fuel decremented input: "..dump(decremented_input)) - assert(output.time) - assert(output.time > 0) - - -- cooking - input = { - method = "cooking", - width = 1, - items = {"unittests:iron_lump"} - } - core.log("info", "[unittests] iron lump cooking input: "..dump(output)) - output, decremented_input = core.get_craft_result(input) - core.log("info", "[unittests] iron lump cooking output: "..dump(output)) - core.log("info", "[unittests] iron lump cooking decremented input: "..dump(decremented_input)) - assert(output.time) - assert(output.time > 0) - assert(output.item) - core.log("info", "[unittests] iron lump cooking output.item:to_table(): "..dump(output.item:to_table())) - assert(output.item:get_name() == "unittests:steel_ingot") - assert(output.item:get_count() == 1) - - -- tool repair (repairable) - input = { - method = "normal", - width = 2, - -- Using a wear of 60000 - items = {"unittests:repairable_tool 1 60000", "unittests:repairable_tool 1 60000"} - } - core.log("info", "[unittests] repairable tool crafting input: "..dump(input)) - output, decremented_input = core.get_craft_result(input) - core.log("info", "[unittests] repairable tool crafting output: "..dump(output)) - core.log("info", "[unittests] repairable tool crafting decremented input: "..dump(decremented_input)) - assert(output.item) - core.log("info", "[unittests] repairable tool crafting output.item:to_table(): "..dump(output.item:to_table())) - assert(output.item:get_name() == "unittests:repairable_tool") - -- Test the wear value. - -- See src/craftdef.cpp in Luanti source code for the formula. The formula to calculate - -- the value 51187 is: - -- 65536 - ((65536-60000)+(65536-60000)) + floor(additonal_wear * 65536 + 0.5) = 51187 - -- where additional_wear = 0.05 - assert(output.item:get_wear() == 51187) - assert(output.item:get_count() == 1) - - -- failing tool repair (unrepairable) - input = { - method = "normal", - width = 2, - items = {"unittests:unrepairable_tool 1 60000", "unittests:unrepairable_tool 1 60000"} - } - core.log("info", "[unittests] unrepairable tool crafting input: "..dump(input)) - output, decremented_input = core.get_craft_result(input) - core.log("info", "[unittests] unrepairable tool crafting output: "..dump(output)) - core.log("info", "[unittests] unrepairable tool crafting decremented input: "..dump(decremented_input)) - assert(output.item) - core.log("info", "[unittests] unrepairable tool crafting output.item:to_table(): "..dump(output.item:to_table())) - -- unrepairable tool must not yield any output - assert(output.item:is_empty()) -end -unittests.register("test_get_craft_result", test_get_craft_result) diff --git a/data/games/garage/mods/unittests/crafting_prepare.lua b/data/games/garage/mods/unittests/crafting_prepare.lua deleted file mode 100644 index 63ad0a5..0000000 --- a/data/games/garage/mods/unittests/crafting_prepare.lua +++ /dev/null @@ -1,94 +0,0 @@ --- Registering some dummy items and recipes for the crafting tests - -core.register_craftitem("unittests:torch", { - description = "Crafting Test Item: Torch", - inventory_image = "unittests_torch.png", - - groups = { dummy = 1 }, -}) -core.register_craftitem("unittests:coal_lump", { - description = "Crafting Test Item: Coal Lump", - inventory_image = "unittests_coal_lump.png", - - groups = { dummy = 1 }, -}) -core.register_craftitem("unittests:stick", { - description = "Crafting Test Item: Stick", - inventory_image = "unittests_stick.png", - - groups = { dummy = 1 }, -}) -core.register_craftitem("unittests:iron_lump", { - description = "Crafting Test Item: Iron Lump", - inventory_image = "unittests_iron_lump.png", - - groups = { dummy = 1 }, -}) -core.register_craftitem("unittests:steel_ingot", { - description = "Crafting Test Item: Steel Ingot", - inventory_image = "unittests_steel_ingot.png", - - groups = { dummy = 1 }, -}) - --- Use aliases in recipes for more complete testing - -core.register_alias("unittests:steel_ingot_alias", "unittests:steel_ingot") -core.register_alias("unittests:coal_lump_alias", "unittests:coal_lump") -core.register_alias("unittests:iron_lump_alias", "unittests:iron_lump") - --- Recipes for tests: Normal crafting, cooking and fuel - -core.register_craft({ - output = 'unittests:torch 4', - recipe = { - {'unittests:coal_lump_alias'}, - {'unittests:stick'}, - } -}) - -core.register_craft({ - type = "cooking", - output = "unittests:steel_ingot_alias", - recipe = "unittests:iron_lump_alias", -}) - -core.register_craft({ - type = "fuel", - recipe = "unittests:coal_lump_alias", - burntime = 40, -}) - --- Test tool repair -core.register_craft({ - type = "toolrepair", - additional_wear = -0.05, -}) - --- Test the disable_repair=1 group -core.register_tool("unittests:unrepairable_tool", { - description = "Crafting Test Item: Unrepairable Tool", - inventory_image = "unittests_unrepairable_tool.png", - tool_capabilities = { - groupcaps = { - cracky = { - times = {3, 2, 1}, - } - } - }, - groups = { disable_repair = 1, dummy = 1 } -}) - -core.register_tool("unittests:repairable_tool", { - description = "Crafting Test Item: Repairable Tool", - inventory_image = "unittests_repairable_tool.png", - tool_capabilities = { - groupcaps = { - cracky = { - times = {3, 2, 1}, - } - } - }, - - groups = { dummy = 1 }, -}) diff --git a/data/games/garage/mods/unittests/entity.lua b/data/games/garage/mods/unittests/entity.lua deleted file mode 100644 index af91a2a..0000000 --- a/data/games/garage/mods/unittests/entity.lua +++ /dev/null @@ -1,236 +0,0 @@ -local log = {} - -local function insert_log(...) - log[#log+1] = string.format(...) -end - -local function objref_str(self, ref) - if ref and ref:is_player() then - return "player" - end - return self.object == ref and "self" or tostring(ref) -end - -core.register_entity("unittests:callbacks", { - initial_properties = { - hp_max = 5, - visual = "upright_sprite", - textures = { "unittests_callback.png" }, - static_save = false, - }, - - on_activate = function(self, staticdata, dtime_s) - self.object:set_armor_groups({test = 100}) - assert(self.object:get_hp() == self.initial_properties.hp_max) - insert_log("on_activate(%d)", #staticdata) - end, - on_deactivate = function(self, removal) - insert_log("on_deactivate(%s)", tostring(removal)) - end, - on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) - insert_log("on_punch(%s, %.1f, %d)", objref_str(self, puncher), - time_from_last_punch, damage) - end, - on_death = function(self, killer) - assert(self.object:get_hp() == 0) - insert_log("on_death(%s)", objref_str(self, killer)) - end, - on_rightclick = function(self, clicker) - insert_log("on_rightclick(%s)", objref_str(self, clicker)) - end, - on_attach_child = function(self, child) - insert_log("on_attach_child(%s)", objref_str(self, child)) - assert(child:get_attach() == self.object) - local ok = false - for _, obj in ipairs(self.object:get_children()) do - if obj == child then - ok = true - end - end - assert(ok, "Child not found in get_children") - end, - on_detach_child = function(self, child) - insert_log("on_detach_child(%s)", objref_str(self, child)) - assert(child:get_attach() == nil) - local ok = true - for _, obj in ipairs(self.object:get_children()) do - if obj == child then - ok = false - end - end - assert(ok, "Former child found in get_children") - end, - on_detach = function(self, parent) - insert_log("on_detach(%s)", objref_str(self, parent)) - assert(self.object:get_attach() == nil) - local ok = true - for _, obj in ipairs(parent:get_children()) do - if obj == self.object then - ok = false - end - end - assert(ok, "Former child found in get_children") - end, - get_staticdata = function(self) - assert(false) - end, -}) - --- - -local function check_log(expect) - if #expect ~= #log then - error("Log mismatch: " .. core.write_json(log)) - end - for i, s in ipairs(expect) do - if log[i] ~= s then - error("Log mismatch at " .. i .. ": " .. core.write_json(log)) - end - end - log = {} -- clear it for next time -end - -local function test_entity_lifecycle(_, pos) - log = {} - - -- with binary in staticdata - local obj = core.add_entity(pos, "unittests:callbacks", "abc\000def") - assert(obj and obj:is_valid()) - check_log({"on_activate(7)"}) - - obj:set_hp(0) - check_log({"on_death(nil)", "on_deactivate(true)"}) - - assert(not obj:is_valid()) -end -unittests.register("test_entity_lifecycle", test_entity_lifecycle, {map=true}) - -local function test_entity_interact(_, pos) - log = {} - - local obj = core.add_entity(pos, "unittests:callbacks") - check_log({"on_activate(0)"}) - - -- rightclick - obj:right_click(obj) - check_log({"on_rightclick(self)"}) - - -- useless punch - obj:punch(obj, 0.5, {}) - check_log({"on_punch(self, 0.5, 0)"}) - - -- fatal punch - obj:punch(obj, 1.9, { - full_punch_interval = 1.0, - damage_groups = { test = 10 }, - }) - check_log({ - -- does 10 damage even though we only have 5 hp - "on_punch(self, 1.9, 10)", - "on_death(self)", - "on_deactivate(true)" - }) -end -unittests.register("test_entity_interact", test_entity_interact, {map=true}) - -local function test_entity_attach(player, pos) - log = {} - - local obj = core.add_entity(pos, "unittests:callbacks") - check_log({"on_activate(0)"}) - - -- attach player to entity - player:set_attach(obj) - check_log({"on_attach_child(player)"}) - assert(player:get_attach() == obj) - player:set_detach() - check_log({"on_detach_child(player)"}) - assert(player:get_attach() == nil) - - -- attach entity to player - obj:set_attach(player) - check_log({}) - assert(obj:get_attach() == player) - obj:set_detach() - check_log({"on_detach(player)"}) - assert(obj:get_attach() == nil) - - obj:remove() -end -unittests.register("test_entity_attach", test_entity_attach, {player=true, map=true}) - ---------- - -core.register_entity("unittests:dummy", { - initial_properties = { - hp_max = 1, - visual = "upright_sprite", - textures = { "no_texture.png" }, - static_save = false, - }, -}) - -local function test_entity_raycast(_, pos) - local obj1 = core.add_entity(pos, "unittests:dummy") - local obj2 = core.add_entity(pos:offset(1, 0, 0), "unittests:dummy") - local raycast = core.raycast(pos:offset(-1, 0, 0), pos:offset(2, 0, 0), true, false) - for pt in raycast do - if pt.type == "object" then - assert(pt.ref == obj1) - obj1:remove() - obj2:remove() - obj1 = nil -- object should be hit exactly one - end - end - assert(obj1 == nil) -end -unittests.register("test_entity_raycast", test_entity_raycast, {map=true}) - -local function test_object_iterator(pos, make_iterator) - local obj1 = core.add_entity(pos, "unittests:dummy") - local obj2 = core.add_entity(pos, "unittests:dummy") - assert(obj1 and obj2) - local found = false - -- As soon as we find one of the objects, we remove both, invalidating the other. - for obj in make_iterator() do - assert(obj:is_valid()) - if obj == obj1 or obj == obj2 then - obj1:remove() - obj2:remove() - found = true - end - end - assert(found) -end - -unittests.register("test_objects_inside_radius", function(_, pos) - test_object_iterator(pos, function() - return core.objects_inside_radius(pos, 1) - end) -end, {map=true}) - -unittests.register("test_objects_in_area", function(_, pos) - test_object_iterator(pos, function() - return core.objects_in_area(pos:offset(-1, -1, -1), pos:offset(1, 1, 1)) - end) -end, {map=true}) - --- Tests that bone rotation euler angles are preserved (see #14992) -local function test_get_bone_rot(_, pos) - local obj = core.add_entity(pos, "unittests:dummy") - for _ = 1, 100 do - local function assert_similar(euler_angles) - local _, rot = obj:get_bone_position("bonename") - assert(euler_angles:distance(rot) < 1e-3) - local override = obj:get_bone_override("bonename") - assert(euler_angles:distance(override.rotation.vec:apply(math.deg)) < 1e-3) - end - local deg = 1e3 * vector.new(math.random(), math.random(), math.random()) - obj:set_bone_position("bonename", vector.zero(), deg) - assert_similar(deg) - local rad = 3 * math.pi * vector.new(math.random(), math.random(), math.random()) - obj:set_bone_override("bonename", {rotation = {vec = rad}}) - assert_similar(rad:apply(math.deg)) - end -end -unittests.register("test_get_bone_rot", test_get_bone_rot, {map=true}) diff --git a/data/games/garage/mods/unittests/get_version.lua b/data/games/garage/mods/unittests/get_version.lua deleted file mode 100644 index 7ef7825..0000000 --- a/data/games/garage/mods/unittests/get_version.lua +++ /dev/null @@ -1,16 +0,0 @@ - -unittests.register("test_get_version", function() - local version = core.get_version() - assert(type(version) == "table") - assert(type(version.project) == "string") - assert(type(version.string) == "string") - assert(type(version.proto_min) == "number") - assert(type(version.proto_max) == "number") - assert(version.proto_max >= version.proto_min) - assert(type(version.is_dev) == "boolean") - if version.is_dev then - assert(type(version.hash) == "string") - else - assert(version.hash == nil) - end -end) diff --git a/data/games/garage/mods/unittests/init.lua b/data/games/garage/mods/unittests/init.lua deleted file mode 100644 index 7243343..0000000 --- a/data/games/garage/mods/unittests/init.lua +++ /dev/null @@ -1,235 +0,0 @@ -unittests = {} - -unittests.list = {} - --- name: Name of the test --- func: --- for sync: function(player, pos), should error on failure --- for async: function(callback, player, pos) --- MUST call callback() or callback("error msg") in case of error once test is finished --- this means you cannot use assert() in the test implementation --- opts: { --- player = false, -- Does test require a player? --- map = false, -- Does test require map access? --- async = false, -- Does the test run asynchronously? (read notes above!) --- } -function unittests.register(name, func, opts) - local def = table.copy(opts or {}) - def.name = name - def.func = func - table.insert(unittests.list, def) -end - -function unittests.on_finished(all_passed) - -- free to override -end - --- Calls invoke with a callback as argument --- Suspends coroutine until that callback is called --- Return values are passed through -local function await(invoke) - local co = coroutine.running() - assert(co) - local called_early = true - invoke(function(...) - if called_early == true then - called_early = {...} - else - coroutine.resume(co, ...) - co = nil - end - end) - if called_early ~= true then - -- callback was already called before yielding - return unpack(called_early) - end - called_early = nil - return coroutine.yield() -end - -function unittests.run_one(idx, counters, out_callback, player, pos) - local def = unittests.list[idx] - if not def.player then - player = nil - elseif player == nil then - out_callback(false) - return false - end - if not def.map then - pos = nil - elseif pos == nil then - out_callback(false) - return false - end - - local tbegin = core.get_us_time() - local function done(status, err) - local tend = core.get_us_time() - local ms_taken = (tend - tbegin) / 1000 - - if not status then - core.log("error", err) - end - print(string.format("[%s] %s - %dms", - status and "PASS" or "FAIL", def.name, ms_taken)) - counters.time = counters.time + ms_taken - counters.total = counters.total + 1 - if status then - counters.passed = counters.passed + 1 - end - end - - if def.async then - core.log("info", "[unittest] running " .. def.name .. " (async)") - def.func(function(err) - done(err == nil, err) - out_callback(true) - end, player, pos) - else - core.log("info", "[unittest] running " .. def.name) - local status, err = pcall(def.func, player, pos) - done(status, err) - out_callback(true) - end - - return true -end - -local function wait_for_player(callback) - if #core.get_connected_players() > 0 then - return callback(core.get_connected_players()[1]) - end - local first = true - core.register_on_joinplayer(function(player) - if first then - callback(player) - first = false - end - end) -end - -local function wait_for_map(pos, callback) - local function check() - if core.get_node(pos).name ~= "ignore" then - callback() - else - core.after(0, check) - end - end - check() -end - --- This runs in a coroutine so it uses await() -function unittests.run_all() - local counters = { time = 0, total = 0, passed = 0 } - - -- Run standalone tests first - for idx = 1, #unittests.list do - local def = unittests.list[idx] - def.done = await(function(cb) - unittests.run_one(idx, counters, cb, nil, nil) - end) - end - - -- Wait for a player to join, run tests that require a player - local player = await(wait_for_player) - for idx = 1, #unittests.list do - local def = unittests.list[idx] - if not def.done then - def.done = await(function(cb) - unittests.run_one(idx, counters, cb, player, nil) - end) - end - end - - -- Wait for the world to generate/load, run tests that require map access - local pos = player:get_pos():round():offset(0, 5, 0) - core.forceload_block(pos, true, -1) - await(function(cb) - wait_for_map(pos, cb) - end) - for idx = 1, #unittests.list do - local def = unittests.list[idx] - if not def.done then - def.done = await(function(cb) - unittests.run_one(idx, counters, cb, player, pos) - end) - end - end - - -- Print stats - assert(#unittests.list == counters.total) - print(string.rep("+", 80)) - print(string.format("Devtest Unit Test Results: %s", - counters.total == counters.passed and "PASSED" or "FAILED")) - print(string.format(" %d / %d failed tests.", - counters.total - counters.passed, counters.total)) - print(string.format(" Testing took %dms total.", counters.time)) - print(string.rep("+", 80)) - unittests.on_finished(counters.total == counters.passed) - return counters.total == counters.passed -end - --------------- - -local modpath = core.get_modpath("unittests") -dofile(modpath .. "/misc.lua") -dofile(modpath .. "/player.lua") -dofile(modpath .. "/crafting.lua") -dofile(modpath .. "/itemdescription.lua") -dofile(modpath .. "/async_env.lua") -dofile(modpath .. "/entity.lua") -dofile(modpath .. "/get_version.lua") -dofile(modpath .. "/itemstack_equals.lua") -dofile(modpath .. "/content_ids.lua") -dofile(modpath .. "/metadata.lua") -dofile(modpath .. "/raycast.lua") -dofile(modpath .. "/inventory.lua") -dofile(modpath .. "/load_time.lua") -dofile(modpath .. "/on_shutdown.lua") -dofile(modpath .. "/color.lua") - --------------- - -local function send_results(name, ok) - core.chat_send_player(name, - core.colorize(ok and "green" or "red", - (ok and "All devtest unit tests passed." or - "There were devtest unit test failures.") .. - " Check the console for detailed output.")) -end - -if core.settings:get_bool("devtest_unittests_autostart", false) then - local test_results = nil - core.after(0, function() - -- CI adds a mod which sets `unittests.on_finished` - -- to write status information to the filesystem - local old_on_finished = unittests.on_finished - unittests.on_finished = function(ok) - for _, player in ipairs(core.get_connected_players()) do - send_results(player:get_player_name(), ok) - end - test_results = ok - old_on_finished(ok) - end - coroutine.wrap(unittests.run_all)() - end) - core.register_on_joinplayer(function(player) - if test_results == nil then - return -- tests haven't completed yet - end - send_results(player:get_player_name(), test_results) - end) -else - core.register_chatcommand("unittests", { - privs = {basic_privs=true}, - description = "Runs devtest unittests (may modify player or map state)", - func = function(name, param) - unittests.on_finished = function(ok) - send_results(name, ok) - end - coroutine.wrap(unittests.run_all)() - return true, "" - end, - }) -end diff --git a/data/games/garage/mods/unittests/inside_async_env.lua b/data/games/garage/mods/unittests/inside_async_env.lua deleted file mode 100644 index fb61060..0000000 --- a/data/games/garage/mods/unittests/inside_async_env.lua +++ /dev/null @@ -1,35 +0,0 @@ -unittests = {} - -core.log("info", "Hello World") - -unittests.custom_metatable = {} -core.register_portable_metatable("unittests:custom_metatable", unittests.custom_metatable) - -local function do_tests() - assert(core == minetest) - -- stuff that should not be here - assert(not core.get_player_by_name) - assert(not core.set_node) - assert(not core.object_refs) - -- stuff that should be here - assert(ItemStack) - local meta = ItemStack():get_meta() - assert(type(meta) == "userdata") - assert(type(meta.set_tool_capabilities) == "function") - assert(core.registered_items[""]) - assert(next(core.registered_nodes) ~= nil) - assert(core.registered_craftitems["unittests:stick"]) - -- alias handling - assert(core.registered_items["unittests:steel_ingot_alias"].name == - "unittests:steel_ingot") - -- fallback to item defaults - assert(core.registered_items["unittests:description_test"].on_place == true) -end - -function unittests.async_test() - local ok, err = pcall(do_tests) - if not ok then - core.log("error", err) - end - return ok -end diff --git a/data/games/garage/mods/unittests/inside_mapgen_env.lua b/data/games/garage/mods/unittests/inside_mapgen_env.lua deleted file mode 100644 index f6f8513..0000000 --- a/data/games/garage/mods/unittests/inside_mapgen_env.lua +++ /dev/null @@ -1,34 +0,0 @@ -core.log("info", "Hello World") - -local function do_tests() - assert(core == minetest) - -- stuff that should not be here - assert(not core.get_player_by_name) - assert(not core.object_refs) - -- stuff that should be here - assert(core.register_on_generated) - assert(core.get_node) - assert(core.spawn_tree) - assert(ItemStack) - local meta = ItemStack():get_meta() - assert(type(meta) == "userdata") - assert(type(meta.set_tool_capabilities) == "function") - assert(core.registered_items[""]) - assert(core.save_gen_notify) - -- alias handling - assert(core.registered_items["unittests:steel_ingot_alias"].name == - "unittests:steel_ingot") - -- fallback to item defaults - assert(core.registered_items["unittests:description_test"].on_place == true) -end - --- first thread to get here runs the tests -if core.ipc_cas("unittests:mg_once", nil, true) then - -- this is checked from the main env - core.ipc_set("unittests:mg", { pcall(do_tests) }) -end - -core.register_on_generated(function(vm, pos1, pos2, blockseed) - local n = tonumber(core.get_mapgen_setting("chunksize")) * 16 - 1 - assert(pos2:subtract(pos1) == vector.new(n, n, n)) -end) diff --git a/data/games/garage/mods/unittests/inventory.lua b/data/games/garage/mods/unittests/inventory.lua deleted file mode 100644 index cffcba4..0000000 --- a/data/games/garage/mods/unittests/inventory.lua +++ /dev/null @@ -1,73 +0,0 @@ - -local item_with_meta = ItemStack({name = "air", meta = {test = "abc"}}) - -local test_list = { - ItemStack("air"), - ItemStack(""), - ItemStack(item_with_meta), -} - -local function compare_lists(a, b) - if not a or not b or #a ~= #b then - return false - end - for i=1, #a do - if not ItemStack(a[i]):equals(ItemStack(b[i])) then - return false - end - end - return true -end - -local function test_inventory() - local inv = core.create_detached_inventory("test") - - inv:set_lists({test = {""}}) - assert(inv:get_list("test")) - - assert(inv:get_size("test") == 1) - assert(inv:set_size("test", 3)) - assert(not inv:set_size("test", -1)) - - assert(inv:get_width("test") == 0) - assert(inv:set_width("test", 3)) - assert(not inv:set_width("test", -1)) - - inv:set_stack("test", 1, "air") - inv:set_stack("test", 3, item_with_meta) - assert(not inv:is_empty("test")) - assert(compare_lists(inv:get_list("test"), test_list)) - - assert(inv:add_item("test", "air") == ItemStack()) - assert(inv:add_item("test", item_with_meta) == ItemStack()) - assert(inv:get_stack("test", 1) == ItemStack("air 2")) - - assert(inv:room_for_item("test", "air 99")) - inv:set_stack("test", 2, "air 99") - assert(not inv:room_for_item("test", "air 99")) - inv:set_stack("test", 2, "") - - assert(inv:contains_item("test", "air")) - assert(not inv:contains_item("test", "air 99")) - assert(inv:contains_item("test", item_with_meta, true)) - - -- Items should be removed in reverse and combine with first stack removed - assert(inv:remove_item("test", "air") == item_with_meta) - item_with_meta:set_count(2) - assert(inv:remove_item("test", "air 2") == item_with_meta) - assert(inv:remove_item("test", "air") == ItemStack("air")) - assert(inv:is_empty("test")) - - -- Failure of set_list(s) should not change inventory - local before = inv:get_list("test") - pcall(inv.set_lists, inv, {test = true}) - pcall(inv.set_list, inv, "test", true) - local after = inv:get_list("test") - assert(compare_lists(before, after)) - - local location = inv:get_location() - assert(core.remove_detached_inventory("test")) - assert(not core.get_inventory(location)) -end - -unittests.register("test_inventory", test_inventory) diff --git a/data/games/garage/mods/unittests/itemdescription.lua b/data/games/garage/mods/unittests/itemdescription.lua deleted file mode 100644 index 730248d..0000000 --- a/data/games/garage/mods/unittests/itemdescription.lua +++ /dev/null @@ -1,43 +0,0 @@ -local full_description = "Description Test Item\nFor testing item decription" -core.register_tool("unittests:description_test", { - description = full_description, - inventory_image = "unittests_description_test.png", - groups = { dummy = 1 }, -}) - -core.register_chatcommand("item_description", { - param = "", - description = "Show the short and full description of the wielded item.", - func = function(name) - local player = core.get_player_by_name(name) - local item = player:get_wielded_item() - return true, string.format("short_description: %s\ndescription: %s", - item:get_short_description(), item:get_description()) - end -}) - -local function test_short_desc() - local function get_short_description(item) - return ItemStack(item):get_short_description() - end - - local stack = ItemStack("unittests:description_test") - assert(stack:get_short_description() == "Description Test Item") - assert(get_short_description("unittests:description_test") == "Description Test Item") - assert(core.registered_items["unittests:description_test"].short_description == nil) - assert(stack:get_description() == full_description) - assert(stack:get_description() == core.registered_items["unittests:description_test"].description) - - stack:get_meta():set_string("description", "Hello World") - assert(stack:get_short_description() == "Hello World") - assert(stack:get_description() == "Hello World") - assert(get_short_description(stack) == "Hello World") - assert(get_short_description("unittests:description_test") == "Description Test Item") - - stack:get_meta():set_string("short_description", "Foo Bar") - assert(stack:get_short_description() == "Foo Bar") - assert(stack:get_description() == "Hello World") - - return true -end -unittests.register("test_short_desc", test_short_desc) diff --git a/data/games/garage/mods/unittests/itemstack_equals.lua b/data/games/garage/mods/unittests/itemstack_equals.lua deleted file mode 100644 index 561e612..0000000 --- a/data/games/garage/mods/unittests/itemstack_equals.lua +++ /dev/null @@ -1,74 +0,0 @@ -local function test_itemstack_equals_non_stack() - local i1 = ItemStack("basenodes:stone") - local i2 = { foo = "bar" } - - assert(not i1:equals(i2)) - assert(i1 ~= i2) - assert(i2 ~= i1) -end - -unittests.register("test_itemstack_equals_non_stack", test_itemstack_equals_non_stack) - -local function test_itemstack_equals_name() - local i1 = ItemStack("basenodes:stone") - local i2 = ItemStack("basenodes:desert_stone") - - assert(not i1:equals(i2)) - assert(i1 ~= i2) -end - -unittests.register("test_itemstack_equals_name", test_itemstack_equals_name) - -local function test_itemstack_equals_count() - local i1 = ItemStack("basenodes:stone") - local i2 = ItemStack("basenodes:stone 2") - - assert(not i1:equals(i2)) - assert(i1 ~= i2) -end - -unittests.register("test_itemstack_equals_count", test_itemstack_equals_count) - -local function test_itemstack_equals_wear() - local i1 = ItemStack("basetools:axe_stone") - local i2 = ItemStack("basetools:axe_stone") - - i2:add_wear(1) - - assert(not i1:equals(i2)) - assert(i1 ~= i2) -end - -unittests.register("test_itemstack_equals_wear", test_itemstack_equals_wear) - -local function test_itemstack_equals_metadata() - local i1 = ItemStack("basenodes:stone") - local i2 = ItemStack("basenodes:stone") - local i3 = ItemStack("basenodes:stone") - - local m1 = i1:get_meta() - local m2 = i2:get_meta() - local m3 = i3:get_meta() - - local keys = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"} - local values = {} - - for i, key in pairs(keys) do - m1:set_int(key, i) - m3:set_int(key, i) - values[key] = i - end - - m3:set_int("a", 999) - - for key, i in pairs(values) do - m2:set_int(key, i) - end - - assert(i1:equals(i2)) - assert(i1 == i2) - assert(not i1:equals(i3)) - assert(i1 ~= i3) -end - -unittests.register("test_itemstack_equals_metadata", test_itemstack_equals_metadata) diff --git a/data/games/garage/mods/unittests/load_time.lua b/data/games/garage/mods/unittests/load_time.lua deleted file mode 100644 index 12f1a38..0000000 --- a/data/games/garage/mods/unittests/load_time.lua +++ /dev/null @@ -1,13 +0,0 @@ --- Test item (un)registration and overriding -do - local itemname = "unittests:test_override_item" - core.register_craftitem(":" .. itemname, {description = "foo"}) - assert(assert(core.registered_items[itemname]).description == "foo") - core.override_item(itemname, {description = "bar"}) - assert(assert(core.registered_items[itemname]).description == "bar") - core.override_item(itemname, {}, {"description"}) - -- description has the empty string as a default - assert(assert(core.registered_items[itemname]).description == "") - core.unregister_item("unittests:test_override_item") - assert(core.registered_items["unittests:test_override_item"] == nil) -end diff --git a/data/games/garage/mods/unittests/metadata.lua b/data/games/garage/mods/unittests/metadata.lua deleted file mode 100644 index bdd51c3..0000000 --- a/data/games/garage/mods/unittests/metadata.lua +++ /dev/null @@ -1,121 +0,0 @@ --- Tests of generic and specific metadata functionality - -local compare_meta = ItemStack("unittests:iron_lump"):get_meta() -compare_meta:from_table({ - fields = { - a = "1", - b = "2", - c = "3", - d = "4", - e = "e", - }, -}) - -local function test_metadata(meta) - meta:from_table({fields = {a = 2, b = "2"}}) - meta:set_string("a", 1) - meta:set_string("c", "3") - meta:set_int("d", 4) - meta:set_string("e", "e") - - meta:set_string("", "!") - meta:set_string("", "") - - assert(meta:equals(compare_meta)) - - local tab = meta:to_table() - assert(tab.fields.a == "1") - assert(tab.fields.b == "2") - assert(tab.fields.c == "3") - assert(tab.fields.d == "4") - assert(tab.fields.e == "e") - - local keys = meta:get_keys() - assert(table.indexof(keys, "a") > 0) - assert(table.indexof(keys, "b") > 0) - assert(table.indexof(keys, "c") > 0) - assert(table.indexof(keys, "d") > 0) - assert(table.indexof(keys, "e") > 0) - assert(#keys == 5) - - assert(not meta:contains("")) - assert(meta:contains("a")) - assert(meta:contains("b")) - assert(meta:contains("c")) - assert(meta:contains("d")) - assert(meta:contains("e")) - - assert(meta:get("") == nil) - assert(meta:get_string("") == "") - assert(meta:get_int("") == 0) - assert(meta:get_float("") == 0.0) - assert(meta:get("a") == "1") - assert(meta:get_string("a") == "1") - assert(meta:get_int("a") == 1) - assert(meta:get_float("a") == 1.0) - assert(meta:get_int("e") == 0) - assert(meta:get_float("e") == 0.0) - - meta:set_float("f", 1.1) - meta:set_string("g", "${f}") - meta:set_string("h", "${g}") - meta:set_string("i", "${h}") - assert(meta:get_float("h") > 1) - assert(meta:get_string("i") == "${f}") - - meta:set_float("j", 1.23456789) - assert(meta:get_float("j") == 1.23456789) - meta:set_float("j", -1 / 0) - assert(meta:get_float("j") == -1 / 0) - meta:set_float("j", 0 / 0) - assert(core.is_nan(meta:get_float("j"))) - - meta:from_table() - assert(next(meta:to_table().fields) == nil) - assert(#meta:get_keys() == 0) - - assert(not meta:equals(compare_meta)) -end - -local function test_metadata_compat(meta) - -- key/value removal using set_string (undocumented, deprecated way) - meta:set_string("key", "value") - assert(meta:get_string("key") == "value") - meta:set_string("key", nil) -- ignore warning - assert(meta:to_table().fields["key"] == nil) - - -- undocumented but supported consequence of Lua's - -- automatic string <--> number cast - meta:set_string("key", 2) - assert(meta:get_string("key") == "2") - - -- from_table with non-string keys (supported) - local values = meta:to_table() - values.fields["new"] = 420 - meta:from_table(values) - assert(meta:get_int("new") == 420) - values.fields["new"] = nil - meta:from_table(values) - assert(meta:get("new") == nil) -end - - -local storage_a = core.get_mod_storage() -local storage_b = core.get_mod_storage() -local function test_mod_storage() - assert(rawequal(storage_a, storage_b)) - test_metadata(storage_a) -end -unittests.register("test_mod_storage", test_mod_storage) - -local function test_item_metadata() - local meta = ItemStack("unittest:coal_lump"):get_meta() - test_metadata(meta) - test_metadata_compat(meta) -end -unittests.register("test_item_metadata", test_item_metadata) - -local function test_node_metadata(player, pos) - test_metadata(core.get_meta(pos)) -end -unittests.register("test_node_metadata", test_node_metadata, {map=true}) diff --git a/data/games/garage/mods/unittests/misc.lua b/data/games/garage/mods/unittests/misc.lua deleted file mode 100644 index d01eed1..0000000 --- a/data/games/garage/mods/unittests/misc.lua +++ /dev/null @@ -1,332 +0,0 @@ -core.register_mapgen_script(core.get_modpath(core.get_current_modname()) .. - DIR_DELIM .. "inside_mapgen_env.lua") - -local function test_pseudo_random() - -- We have comprehensive unit tests in C++, this is just to make sure the API code isn't messing up - local gen1 = PseudoRandom(13) - assert(gen1:next() == 22290) - assert(gen1:next() == 13854) - - local gen2 = PseudoRandom(gen1:get_state()) - for n = 0, 16 do - assert(gen1:next() == gen2:next()) - end - - local pr3 = PseudoRandom(-101) - assert(pr3:next(0, 100) == 35) - -- unusual case that is normally disallowed: - assert(pr3:next(10000, 42767) == 12485) -end -unittests.register("test_pseudo_random", test_pseudo_random) - -local function test_pcg_random() - -- We have comprehensive unit tests in C++, this is just to make sure the API code isn't messing up - local gen1 = PcgRandom(55) - - for n = 0, 16 do - gen1:next() - end - - local gen2 = PcgRandom(26) - gen2:set_state(gen1:get_state()) - - for n = 16, 32 do - assert(gen1:next() == gen2:next()) - end -end -unittests.register("test_pcg_random", test_pcg_random) - -local function test_dynamic_media(cb, player) - if core.get_player_information(player:get_player_name()).protocol_version < 40 then - core.log("warning", "test_dynamic_media: Client too old, skipping test.") - return cb() - end - - -- Check that the client acknowledges media transfers - local path = core.get_worldpath() .. "/test_media.obj" - local f = io.open(path, "w") - f:write("# contents don't matter\n") - f:close() - - local call_ok = false - local ok = core.dynamic_add_media({ - filepath = path, - to_player = player:get_player_name(), - }, function(name) - if not call_ok then - return cb("impossible condition") - end - cb() - end) - if not ok then - return cb("dynamic_add_media() returned error") - end - call_ok = true - - -- if the callback isn't called this test will just hang :shrug: -end -unittests.register("test_dynamic_media", test_dynamic_media, {async=true, player=true}) - -local function test_v3f_metatable(player) - assert(vector.check(player:get_pos())) -end -unittests.register("test_v3f_metatable", test_v3f_metatable, {player=true}) - -local function test_v3s16_metatable(player, pos) - local node = core.get_node(pos) - local found_pos = core.find_node_near(pos, 0, node.name, true) - assert(vector.check(found_pos)) -end -unittests.register("test_v3s16_metatable", test_v3s16_metatable, {map=true}) - -local function test_clear_meta(_, pos) - local ref = core.get_meta(pos) - - for way = 1, 3 do - ref:set_string("foo", "bar") - assert(ref:contains("foo")) - - if way == 1 then - ref:from_table({}) - elseif way == 2 then - ref:from_table(nil) - else - ref:set_string("foo", "") - end - - assert(#core.find_nodes_with_meta(pos, pos) == 0, "clearing failed " .. way) - end -end -unittests.register("test_clear_meta", test_clear_meta, {map=true}) - -local on_punch_called, on_place_called -core.register_on_placenode(function() - on_place_called = true -end) -core.register_on_punchnode(function() - on_punch_called = true -end) -local function test_node_callbacks(_, pos) - on_place_called = false - on_punch_called = false - - core.place_node(pos, {name="basenodes:dirt"}) - assert(on_place_called, "on_place not called") - core.punch_node(pos) - assert(on_punch_called, "on_punch not called") - core.remove_node(pos) -end -unittests.register("test_node_callbacks", test_node_callbacks, {map=true}) - -local function test_hashing() - local input = "hello\000world" - assert(core.sha1(input) == "f85b420f1e43ebf88649dfcab302b898d889606c") - assert(core.sha256(input) == "b206899bc103669c8e7b36de29d73f95b46795b508aa87d612b2ce84bfb29df2") -end -unittests.register("test_hashing", test_hashing) - -local function test_compress() - -- This text should be compressible, to make sure the results are... normal - local text = "The\000 icey canoe couldn't move very well on the\128 lake. The\000 ice was too stiff and the icey canoe's paddles simply wouldn't punch through." - local methods = { - "deflate", - "zstd", - -- "noodle", -- for warning alarm test - } - local zstd_magic = string.char(0x28, 0xB5, 0x2F, 0xFD) - for _, method in ipairs(methods) do - local compressed = core.compress(text, method) - assert(core.decompress(compressed, method) == text, "input/output mismatch for compression method " .. method) - local has_zstd_magic = compressed:sub(1, 4) == zstd_magic - if method == "zstd" then - assert(has_zstd_magic, "zstd magic number not in zstd method") - else - assert(not has_zstd_magic, "zstd magic number in method " .. method .. " (which is not zstd)") - end - end -end -unittests.register("test_compress", test_compress) - -local function test_urlencode() - -- checks that API code handles null bytes - assert(core.urlencode("foo\000bar!") == "foo%00bar%21") -end -unittests.register("test_urlencode", test_urlencode) - -local function test_parse_json() - local raw = "{\"how\\u0000weird\":\n\"yes\\u0000really\",\"n\":-1234567891011,\"z\":null}" - do - local data = core.parse_json(raw) - assert(data["how\000weird"] == "yes\000really") - assert(data.n == -1234567891011) - assert(data.z == nil) - end - do - local null = {} - local data = core.parse_json(raw, null) - assert(data.z == null) - end - do - local data, err = core.parse_json('"ceci n\'est pas un json', nil, true) - assert(data == nil) - assert(type(err) == "string") - end -end -unittests.register("test_parse_json", test_parse_json) - -local function test_write_json() - -- deeply nested structures should be preserved - local leaf = 42 - local data = leaf - for i = 1, 1000 do - data = {data} - end - local roundtripped = core.parse_json(core.write_json(data)) - for i = 1, 1000 do - roundtripped = roundtripped[1] - end - assert(roundtripped == 42) -end -unittests.register("test_write_json", test_write_json) - -local function test_game_info() - local info = core.get_game_info() - local game_conf = Settings(info.path .. "/game.conf") - assert(info.id == "devtest") - assert(info.title == game_conf:get("title")) -end -unittests.register("test_game_info", test_game_info) - -local function test_mapgen_edges(cb) - -- Test that the map can extend to the expected edges and no further. - local min_edge, max_edge = core.get_mapgen_edges() - local min_finished = {} - local max_finished = {} - local function finish() - if #min_finished ~= 1 then - return cb("Expected 1 block to emerge around mapgen minimum edge") - end - if min_finished[1] ~= (min_edge / core.MAP_BLOCKSIZE):floor() then - return cb("Expected block within minimum edge to emerge") - end - if #max_finished ~= 1 then - return cb("Expected 1 block to emerge around mapgen maximum edge") - end - if max_finished[1] ~= (max_edge / core.MAP_BLOCKSIZE):floor() then - return cb("Expected block within maximum edge to emerge") - end - return cb() - end - local emerges_left = 2 - local function emerge_block(blockpos, action, blocks_left, finished) - if action ~= core.EMERGE_CANCELLED then - table.insert(finished, blockpos) - end - if blocks_left == 0 then - emerges_left = emerges_left - 1 - if emerges_left == 0 then - return finish() - end - end - end - core.emerge_area(min_edge:subtract(1), min_edge, emerge_block, min_finished) - core.emerge_area(max_edge, max_edge:add(1), emerge_block, max_finished) -end -unittests.register("test_mapgen_edges", test_mapgen_edges, {map=true, async=true}) - -local finish_test_on_mapblocks_changed -core.register_on_mapblocks_changed(function(modified_blocks, modified_block_count) - if finish_test_on_mapblocks_changed then - finish_test_on_mapblocks_changed(modified_blocks, modified_block_count) - finish_test_on_mapblocks_changed = nil - end -end) -local function test_on_mapblocks_changed(cb, player, pos) - local bp1 = (pos / core.MAP_BLOCKSIZE):floor() - local bp2 = bp1:add(1) - for _, bp in ipairs({bp1, bp2}) do - -- Make a modification in the block. - local p = bp * core.MAP_BLOCKSIZE - core.load_area(p) - local meta = core.get_meta(p) - meta:set_int("test_on_mapblocks_changed", meta:get_int("test_on_mapblocks_changed") + 1) - end - finish_test_on_mapblocks_changed = function(modified_blocks, modified_block_count) - if modified_block_count < 2 then - return cb("Expected at least two mapblocks to be recorded as modified") - end - if not modified_blocks[core.hash_node_position(bp1)] or - not modified_blocks[core.hash_node_position(bp2)] then - return cb("The expected mapblocks were not recorded as modified") - end - cb() - end -end -unittests.register("test_on_mapblocks_changed", test_on_mapblocks_changed, {map=true, async=true}) - -local function test_gennotify_api() - local DECO_ID = 123 - local UD_ID = "unittests:dummy" - - -- the engine doesn't check if the id is actually valid, maybe it should - core.set_gen_notify({decoration=true}, {DECO_ID}) - - core.set_gen_notify({custom=true}, nil, {UD_ID}) - - local flags, deco, custom = core.get_gen_notify() - local function ff(flag) - return (" " .. flags .. " "):match("[ ,]" .. flag .. "[ ,]") ~= nil - end - assert(ff("decoration"), "'decoration' flag missing") - assert(ff("custom"), "'custom' flag missing") - assert(table.indexof(deco, DECO_ID) > 0) - assert(table.indexof(custom, UD_ID) > 0) - - core.set_gen_notify({decoration=false, custom=false}) - - flags, deco, custom = core.get_gen_notify() - assert(not ff("decoration") and not ff("custom")) - assert(#deco == 0, "deco ids not empty") - assert(#custom == 0, "custom ids not empty") -end -unittests.register("test_gennotify_api", test_gennotify_api) - --- <=> inside_mapgen_env.lua -local function test_mapgen_env(cb) - -- emerge threads start delayed so this can take a second - local res = core.ipc_get("unittests:mg") - if res == nil then - return core.after(0, test_mapgen_env, cb) - end - -- handle error status - if res[1] then - cb() - else - cb(res[2]) - end -end -unittests.register("test_mapgen_env", test_mapgen_env, {async=true}) - -local function test_ipc_vector_preserve(cb) - -- the IPC also uses register_portable_metatable - core.ipc_set("unittests:v", vector.new(4, 0, 4)) - local v = core.ipc_get("unittests:v") - assert(type(v) == "table") - assert(vector.check(v)) -end -unittests.register("test_ipc_vector_preserve", test_ipc_vector_preserve) - -local function test_ipc_poll(cb) - core.ipc_set("unittests:flag", nil) - assert(core.ipc_poll("unittests:flag", 1) == false) - - -- Note that unlike the async result callback - which has to wait for the - -- next server step - the IPC is instant - local t0 = core.get_us_time() - core.handle_async(function() - core.ipc_set("unittests:flag", true) - end, function() end) - assert(core.ipc_poll("unittests:flag", 1000) == true, "Wait failed (or slow machine?)") - print("delta: " .. (core.get_us_time() - t0) .. "us") -end -unittests.register("test_ipc_poll", test_ipc_poll) diff --git a/data/games/garage/mods/unittests/mod.conf b/data/games/garage/mods/unittests/mod.conf deleted file mode 100644 index ccff737..0000000 --- a/data/games/garage/mods/unittests/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = unittests -description = Adds automated unit tests for the engine -# Also test that it is possible to depend on first_mod -depends = first_mod, basenodes diff --git a/data/games/garage/mods/unittests/on_shutdown.lua b/data/games/garage/mods/unittests/on_shutdown.lua deleted file mode 100644 index 6d5d886..0000000 --- a/data/games/garage/mods/unittests/on_shutdown.lua +++ /dev/null @@ -1,22 +0,0 @@ --- Test whether players still exist on shutdown -local players = {} - -core.register_on_joinplayer(function(player) - players[player:get_player_name()] = true -end) - -core.register_on_leaveplayer(function(player) - local name = player:get_player_name(); - assert(players[name], "Unrecorded player join.") - players[name] = nil -end) - -core.register_on_shutdown(function() - for _, player in pairs(core.get_connected_players()) do - local name = player:get_player_name() - assert(players[name], "Unrecorded player join or left too early.") - players[name] = nil - end - - assert(not next(players), "Invalid connected players on shutdown.") -end) diff --git a/data/games/garage/mods/unittests/player.lua b/data/games/garage/mods/unittests/player.lua deleted file mode 100644 index f8945f3..0000000 --- a/data/games/garage/mods/unittests/player.lua +++ /dev/null @@ -1,206 +0,0 @@ --- --- HP Change Reasons --- -local expect = nil -core.register_on_player_hpchange(function(player, hp_change, reason) - if expect == nil then - return - end - - for key, value in pairs(reason) do - assert(expect[key] == value) - end - for key, value in pairs(expect) do - assert(reason[key] == value) - end - - expect = nil -end) - -local function run_hpchangereason_tests(player) - local old_hp = player:get_hp() - - player:set_hp(20) - expect = { type = "set_hp", from = "mod" } - player:set_hp(3) - assert(expect == nil) - - expect = { a = 234, type = "set_hp", from = "mod" } - player:set_hp(7, { a= 234 }) - assert(expect == nil) - - expect = { df = 3458973454, type = "fall", from = "mod" } - player:set_hp(10, { type = "fall", df = 3458973454 }) - assert(expect == nil) - - player:set_hp(old_hp) -end -unittests.register("test_hpchangereason", run_hpchangereason_tests, {player=true}) - --- --- HP differences --- - -local expected_diff = nil -local hpchange_counter = 0 -local die_counter = 0 -core.register_on_player_hpchange(function(player, hp_change, reason) - if expected_diff then - assert(hp_change == expected_diff) - hpchange_counter = hpchange_counter + 1 - end -end) -core.register_on_dieplayer(function() - die_counter = die_counter + 1 -end) - -local function hp_diference_test(player, hp_max) - assert(hp_max >= 22) - - local old_hp = player:get_hp() - local old_hp_max = player:get_properties().hp_max - - hpchange_counter = 0 - die_counter = 0 - - expected_diff = nil - player:set_properties({hp_max = hp_max}) - player:set_hp(22) - assert(player:get_hp() == 22) - assert(hpchange_counter == 0) - assert(die_counter == 0) - - -- HP difference is not clamped - expected_diff = -25 - player:set_hp(-3) - -- actual final HP value is clamped to >= 0 - assert(player:get_hp() == 0) - assert(hpchange_counter == 1) - assert(die_counter == 1) - - expected_diff = 22 - player:set_hp(22) - assert(player:get_hp() == 22) - assert(hpchange_counter == 2) - assert(die_counter == 1) - - -- Integer overflow is prevented - -- so result is S32_MIN, not S32_MIN - 22 - expected_diff = -2147483648 - player:set_hp(-2147483648) - -- actual final HP value is clamped to >= 0 - assert(player:get_hp() == 0) - assert(hpchange_counter == 3) - assert(die_counter == 2) - - -- Damage is ignored if player is already dead (hp == 0) - expected_diff = "never equal" - player:set_hp(-11) - assert(player:get_hp() == 0) - -- no on_player_hpchange or on_dieplayer call expected - assert(hpchange_counter == 3) - assert(die_counter == 2) - - expected_diff = 11 - player:set_hp(11) - assert(player:get_hp() == 11) - assert(hpchange_counter == 4) - assert(die_counter == 2) - - -- HP difference is not clamped - expected_diff = 1000000 - 11 - player:set_hp(1000000) - -- actual final HP value is clamped to <= hp_max - assert(player:get_hp() == hp_max) - assert(hpchange_counter == 5) - assert(die_counter == 2) - - -- "Healing" is not ignored when hp == hp_max - expected_diff = 80000 - hp_max - player:set_hp(80000) - assert(player:get_hp() == hp_max) - -- on_player_hpchange_call expected - assert(hpchange_counter == 6) - assert(die_counter == 2) - - expected_diff = nil - player:set_properties({hp_max = old_hp_max}) - player:set_hp(old_hp) - core.close_formspec(player:get_player_name(), "") -- hide death screen -end -local function run_hp_difference_tests(player) - hp_diference_test(player, 22) - hp_diference_test(player, 30) - hp_diference_test(player, 65535) -- U16_MAX -end -unittests.register("test_hp_difference", run_hp_difference_tests, {player=true}) - --- --- Player meta --- -local function run_player_meta_tests(player) - local meta = player:get_meta() - meta:set_string("foo", "bar") - assert(meta:contains("foo")) - assert(meta:get_string("foo") == "bar") - assert(meta:get("foo") == "bar") - - local meta2 = player:get_meta() - assert(meta2:get_string("foo") == "bar") - assert(meta2:get("foo") == "bar") - assert(meta:equals(meta2)) - - meta:set_string("bob", "dillan") - assert(meta:get_string("foo") == "bar") - assert(meta:get_string("bob") == "dillan") - assert(meta:get("bob") == "dillan") - assert(meta2:get_string("foo") == "bar") - assert(meta2:get_string("bob") == "dillan") - assert(meta2:get("bob") == "dillan") - assert(meta:equals(meta2)) - - meta:set_string("foo", "") - assert(not meta:contains("foo")) - assert(meta:get("foo") == nil) - assert(meta:get_string("foo") == "") - assert(meta:equals(meta2)) -end -unittests.register("test_player_meta", run_player_meta_tests, {player=true}) - --- --- Player add pos --- -local function run_player_add_pos_tests(player) - local pos = player:get_pos() - player:add_pos(vector.new(0, 1000, 0)) - local newpos = player:get_pos() - player:add_pos(vector.new(0, -1000, 0)) - local backpos = player:get_pos() - local newdist = vector.distance(pos, newpos) - assert(math.abs(newdist - 1000) <= 1) - assert(vector.distance(pos, backpos) <= 1) -end -unittests.register("test_player_add_pos", run_player_add_pos_tests, {player=true}) - --- --- Hotbar selection clamp --- -local function run_player_hotbar_clamp_tests(player) - local inv = player:get_inventory() - local old_inv_size = inv:get_size("main") - local old_inv_list = inv:get_list("main") -- Avoid accidentally removing item - local old_bar_size = player:hud_get_hotbar_itemcount() - - inv:set_size("main", 5) - - player:hud_set_hotbar_itemcount(2) - assert(player:hud_get_hotbar_itemcount() == 2) - - player:hud_set_hotbar_itemcount(6) - assert(player:hud_get_hotbar_itemcount() == 5) - - inv:set_size("main", old_inv_size) - inv:set_list("main", old_inv_list) - player:hud_set_hotbar_itemcount(old_bar_size) -end -unittests.register("test_player_hotbar_clamp", run_player_hotbar_clamp_tests, {player=true}) diff --git a/data/games/garage/mods/unittests/raycast.lua b/data/games/garage/mods/unittests/raycast.lua deleted file mode 100644 index 08d6a11..0000000 --- a/data/games/garage/mods/unittests/raycast.lua +++ /dev/null @@ -1,36 +0,0 @@ -local function raycast_with_pointabilities(start_pos, end_pos, pointabilities) - local ray = core.raycast(start_pos, end_pos, nil, nil, pointabilities) - for hit in ray do - if hit.type == "node" then - return hit.under - end - end - return nil -end - -local function test_raycast_pointabilities(player, pos1) - local pos2 = pos1:offset(0, 0, 1) - local pos3 = pos1:offset(0, 0, 2) - - local oldnode1 = core.get_node(pos1) - local oldnode2 = core.get_node(pos2) - local oldnode3 = core.get_node(pos3) - core.swap_node(pos1, {name = "air"}) - core.swap_node(pos2, {name = "testnodes:not_pointable"}) - core.swap_node(pos3, {name = "testnodes:pointable"}) - - local p = nil - assert(raycast_with_pointabilities(pos1, pos3, p) == pos3) - - p = core.registered_items["testtools:blocked_pointing_staff"].pointabilities - assert(raycast_with_pointabilities(pos1, pos3, p) == nil) - - p = core.registered_items["testtools:ultimate_pointing_staff"].pointabilities - assert(raycast_with_pointabilities(pos1, pos3, p) == pos2) - - core.swap_node(pos1, oldnode1) - core.swap_node(pos2, oldnode2) - core.swap_node(pos3, oldnode3) -end - -unittests.register("test_raycast_pointabilities", test_raycast_pointabilities, {map=true}) diff --git a/data/games/garage/mods/unittests/textures/default_dirt.png b/data/games/garage/mods/unittests/textures/default_dirt.png deleted file mode 100644 index 5867030..0000000 Binary files a/data/games/garage/mods/unittests/textures/default_dirt.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_callback.png b/data/games/garage/mods/unittests/textures/unittests_callback.png deleted file mode 100644 index 3c80fdc..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_callback.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_coal_lump.png b/data/games/garage/mods/unittests/textures/unittests_coal_lump.png deleted file mode 100644 index f460d90..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_coal_lump.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_description_test.png b/data/games/garage/mods/unittests/textures/unittests_description_test.png deleted file mode 100644 index e3c7275..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_description_test.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_iron_lump.png b/data/games/garage/mods/unittests/textures/unittests_iron_lump.png deleted file mode 100644 index 22f43e9..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_iron_lump.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_repairable_tool.png b/data/games/garage/mods/unittests/textures/unittests_repairable_tool.png deleted file mode 100644 index 46fbbaa..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_repairable_tool.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_steel_ingot.png b/data/games/garage/mods/unittests/textures/unittests_steel_ingot.png deleted file mode 100644 index 6977696..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_steel_ingot.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_stick.png b/data/games/garage/mods/unittests/textures/unittests_stick.png deleted file mode 100644 index ffdce70..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_stick.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_torch.png b/data/games/garage/mods/unittests/textures/unittests_torch.png deleted file mode 100644 index ba5eebe..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_torch.png and /dev/null differ diff --git a/data/games/garage/mods/unittests/textures/unittests_unrepairable_tool.png b/data/games/garage/mods/unittests/textures/unittests_unrepairable_tool.png deleted file mode 100644 index c676213..0000000 Binary files a/data/games/garage/mods/unittests/textures/unittests_unrepairable_tool.png and /dev/null differ diff --git a/data/games/garage/mods/util_commands/init.lua b/data/games/garage/mods/util_commands/init.lua deleted file mode 100644 index 8341901..0000000 --- a/data/games/garage/mods/util_commands/init.lua +++ /dev/null @@ -1,243 +0,0 @@ -core.register_chatcommand("hotbar", { - params = "", - description = "Set hotbar size", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local size = tonumber(param) - if not size then - return false, "Missing or incorrect size parameter!" - end - local ok = player:hud_set_hotbar_itemcount(size) - if ok then - return true - else - return false, "Invalid item count!" - end - end, -}) - -core.register_chatcommand("hp", { - params = "", - description = "Set your health", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local hp = tonumber(param) - if not hp or core.is_nan(hp) or hp < 0 or hp > 65535 then - return false, "Missing or incorrect hp parameter!" - end - player:set_hp(hp) - return true - end, -}) - -local s_infplace = core.settings:get("devtest_infplace") -if s_infplace == "true" then - infplace = true -elseif s_infplace == "false" then - infplace = false -else - infplace = core.is_creative_enabled("") -end - -core.register_chatcommand("infplace", { - params = "", - description = "Toggle infinite node placement", - func = function(name, param) - infplace = not infplace - if infplace then - core.chat_send_all("Infinite node placement enabled!") - core.log("action", "Infinite node placement enabled") - else - core.chat_send_all("Infinite node placement disabled!") - core.log("action", "Infinite node placement disabled") - end - return true - end, -}) - -core.register_chatcommand("detach", { - params = "[]", - description = "Detach all objects nearby", - func = function(name, param) - local radius = tonumber(param) - if type(radius) ~= "number" then - radius = 8 - end - if radius < 1 then - radius = 1 - end - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local objs = core.get_objects_inside_radius(player:get_pos(), radius) - local num = 0 - for o=1, #objs do - if objs[o]:get_attach() then - objs[o]:set_detach() - num = num + 1 - end - end - return true, string.format("%d object(s) detached.", num) - end, -}) - -core.register_chatcommand("use_tool", { - params = "(dig ) | (hit ) []", - description = "Apply tool wear a number of times, as if it were used for digging", - func = function(name, param) - local player = core.get_player_by_name(name) - if not player then - return false, "No player." - end - local mode, group, level, uses = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+) (%d+)") - if not mode then - mode, group, level = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+)") - uses = 1 - end - if not mode or not group or not level then - return false - end - if mode ~= "dig" and mode ~= "hit" then - return false - end - local tool = player:get_wielded_item() - local caps = tool:get_tool_capabilities() - if not caps or tool:get_count() == 0 then - return false, "No tool in hand." - end - local actual_uses = 0 - for u=1, uses do - local wear = tool:get_wear() - local dp - if mode == "dig" then - dp = core.get_dig_params({[group]=3, level=level}, caps, wear) - else - dp = core.get_hit_params({[group]=100}, caps, level, wear) - end - tool:add_wear(dp.wear) - actual_uses = actual_uses + 1 - if tool:get_count() == 0 then - break - end - end - player:set_wielded_item(tool) - if tool:get_count() == 0 then - return true, string.format("Tool used %d time(s). ".. - "The tool broke after %d use(s).", uses, actual_uses) - else - local wear = tool:get_wear() - return true, string.format("Tool used %d time(s). ".. - "Final wear=%d", uses, wear) - end - end, -}) - - --- Unlimited node placement -core.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - if placer and placer:is_player() then - return infplace - end -end) - --- Don't pick up if the item is already in the inventory -local old_handle_node_drops = core.handle_node_drops -function core.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() or not infplace then - return old_handle_node_drops(pos, drops, digger) - end - local inv = digger:get_inventory() - if inv then - for _, item in ipairs(drops) do - if not inv:contains_item("main", item, true) then - inv:add_item("main", item) - end - end - end -end - -core.register_chatcommand("set_displayed_itemcount", { - params = "(-s \"\" [-c ]) | -a ", - description = "Set the displayed itemcount of the wielded item", - func = function(name, param) - local player = core.get_player_by_name(name) - local item = player:get_wielded_item() - local meta = item:get_meta() - local flag1 = param:sub(1, 2) - if flag1 == "-s" then - if param:sub(3, 4) ~= " \"" then - return false, "Error: Space and string with \"s expected after -s." - end - local se = param:find("\"", 5, true) - if not se then - return false, "Error: String with two \"s expected after -s." - end - local s = param:sub(5, se - 1) - if param:sub(se + 1, se + 4) == " -c " then - s = core.colorize(param:sub(se + 5), s) - end - meta:set_string("count_meta", s) - elseif flag1 == "-a" then - local num = tonumber(param:sub(4)) - if not num then - return false, "Error: Invalid number: "..param:sub(4) - end - meta:set_int("count_alignment", num) - else - return false - end - player:set_wielded_item(item) - return true, "Displayed itemcount set." - end, -}) - -core.register_chatcommand("dump_item", { - params = "", - description = "Prints a dump of the wielded item in table form", - func = function(name, param) - local player = core.get_player_by_name(name) - local item = player:get_wielded_item() - local str = dump(item:to_table()) - print(str) - return true, str - end, -}) - -core.register_chatcommand("dump_itemdef", { - params = "", - description = "Prints a dump of the wielded item's definition in table form", - func = function(name, param) - local player = core.get_player_by_name(name) - local str = dump(player:get_wielded_item():get_definition()) - print(str) - return true, str - end, -}) - -core.register_chatcommand("dump_wear_bar", { - params = "", - description = "Prints a dump of the wielded item's wear bar parameters in table form", - func = function(name, param) - local player = core.get_player_by_name(name) - local item = player:get_wielded_item() - local str = dump(item:get_wear_bar_params()) - print(str) - return true, str - end, -}) - -core.register_chatcommand("set_saturation", { - params = "", - description = "Set the saturation for current player.", - func = function(player_name, param) - local saturation = tonumber(param) - core.get_player_by_name(player_name):set_lighting({saturation = saturation }) - end -}) diff --git a/data/games/garage/mods/util_commands/mod.conf b/data/games/garage/mods/util_commands/mod.conf deleted file mode 100644 index fea6dd3..0000000 --- a/data/games/garage/mods/util_commands/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = util_commands -description = Random server commands to make testing easier and more convenient diff --git a/data/games/garage/mods/vessels/README.txt b/data/games/garage/mods/vessels/README.txt new file mode 100644 index 0000000..c101c0c --- /dev/null +++ b/data/games/garage/mods/vessels/README.txt @@ -0,0 +1,22 @@ +Minetest Game mod: vessels +========================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Vanessa Ezekowitz (LGPLv2.1+) +Modified by Perttu Ahola (LGPLv2.1+) +Various Minetest Game developers and contributors (LGPLv2.1+) + +Authors of media (textures) +--------------------------- +All not listed below, Vanessa Ezekowitz (CC BY-SA 3.0) + +The following textures were modified by Thomas-S (CC BY-SA 3.0): + vessels_drinking_glass.png + vessels_drinking_glass_inv.png + vessels_glass_bottle.png + vessels_steel_bottle.png + +The following texture was created by Wuzzy (CC BY-SA 3.0): + vessels_shelf_slot.png (based on vessels_glass_bottle.png) diff --git a/data/games/garage/mods/vessels/init.lua b/data/games/garage/mods/vessels/init.lua new file mode 100644 index 0000000..a2f2471 --- /dev/null +++ b/data/games/garage/mods/vessels/init.lua @@ -0,0 +1,233 @@ +-- vessels/init.lua + +-- Minetest Game mod: vessels +-- See README.txt for licensing and other information. + +-- Load support for MT game translation. +local S = minetest.get_translator("vessels") + + +local vessels_shelf_formspec = + "size[8,7;]" .. + "list[context;vessels;0,0.3;8,2;]" .. + "list[current_player;main;0,2.85;8,1;]" .. + "list[current_player;main;0,4.08;8,3;8]" .. + "listring[context;vessels]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0, 2.85) + +local function update_vessels_shelf(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("vessels") + + local formspec = vessels_shelf_formspec + -- Inventory slots overlay + local vx, vy = 0, 0.3 + local n_items = 0 + for i = 1, 16 do + if i == 9 then + vx = 0 + vy = vy + 1 + end + if not invlist or invlist[i]:is_empty() then + formspec = formspec .. + "image[" .. vx .. "," .. vy .. ";1,1;vessels_shelf_slot.png]" + else + local stack = invlist[i] + if not stack:is_empty() then + n_items = n_items + stack:get_count() + end + end + vx = vx + 1 + end + meta:set_string("formspec", formspec) + if n_items == 0 then + meta:set_string("infotext", S("Empty Vessels Shelf")) + else + meta:set_string("infotext", S("Vessels Shelf (@1 items)", n_items)) + end +end + +local vessels_shelf_def = { + description = S("Vessels Shelf"), + tiles = {"default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "vessels_shelf.png", "vessels_shelf.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + update_vessels_shelf(pos) + local inv = meta:get_inventory() + inv:set_size("vessels", 8 * 2) + end, + can_dig = function(pos,player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("vessels") + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if minetest.get_item_group(stack:get_name(), "vessel") ~= 0 then + return stack:get_count() + end + return 0 + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "vessels", drops) + drops[#drops + 1] = "vessels:shelf" + minetest.remove_node(pos) + return drops + end, + on_metadata_inventory_put = function(pos) + update_vessels_shelf(pos) + end, + on_metadata_inventory_take = function(pos) + update_vessels_shelf(pos) + end, + on_metadata_inventory_move = function(pos) + update_vessels_shelf(pos) + end, +} +default.set_inventory_action_loggers(vessels_shelf_def, "vessels shelf") +minetest.register_node("vessels:shelf", vessels_shelf_def) + +minetest.register_craft({ + output = "vessels:shelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:vessel", "group:vessel", "group:vessel"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_node("vessels:glass_bottle", { + description = S("Empty Glass Bottle"), + drawtype = "plantlike", + tiles = {"vessels_glass_bottle.png"}, + inventory_image = "vessels_glass_bottle.png", + wield_image = "vessels_glass_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:glass_bottle 10", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "", "default:glass"}, + {"", "default:glass", ""} + } +}) + +minetest.register_node("vessels:drinking_glass", { + description = S("Empty Drinking Glass"), + drawtype = "plantlike", + tiles = {"vessels_drinking_glass.png"}, + inventory_image = "vessels_drinking_glass_inv.png", + wield_image = "vessels_drinking_glass.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:drinking_glass 14", + recipe = { + {"default:glass", "", "default:glass"}, + {"default:glass", "", "default:glass"}, + {"default:glass", "default:glass", "default:glass"} + } +}) + +minetest.register_node("vessels:steel_bottle", { + description = S("Empty Heavy Steel Bottle"), + drawtype = "plantlike", + tiles = {"vessels_steel_bottle.png"}, + inventory_image = "vessels_steel_bottle.png", + wield_image = "vessels_steel_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_craft( { + output = "vessels:steel_bottle 5", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""} + } +}) + + +-- Glass and steel recycling + +minetest.register_craftitem("vessels:glass_fragments", { + description = S("Glass Fragments"), + inventory_image = "vessels_glass_fragments.png", +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:glass_bottle", + "vessels:glass_bottle", + }, +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:drinking_glass", + "vessels:drinking_glass", + }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "vessels:glass_fragments", +}) + +minetest.register_craft( { + type = "cooking", + output = "default:steel_ingot", + recipe = "vessels:steel_bottle", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "vessels:shelf", + burntime = 30, +}) + +-- Register glass fragments as dungeon loot +if minetest.global_exists("dungeon_loot") then + dungeon_loot.register({ + name = "vessels:glass_fragments", chance = 0.35, count = {1, 4} + }) +end diff --git a/data/games/garage/mods/vessels/license.txt b/data/games/garage/mods/vessels/license.txt new file mode 100644 index 0000000..3bd2951 --- /dev/null +++ b/data/games/garage/mods/vessels/license.txt @@ -0,0 +1,52 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 Vanessa Ezekowitz +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Vanessa Ezekowitz +Copyright (C) 2016 Thomas-S + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/vessels/locale/template.txt b/data/games/garage/mods/vessels/locale/template.txt new file mode 100644 index 0000000..e6e5f69 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf= +Vessels Shelf (@1 items)= +Vessels Shelf= +Empty Glass Bottle= +Empty Drinking Glass= +Empty Heavy Steel Bottle= +Glass Fragments= diff --git a/data/games/garage/mods/vessels/locale/vessels.de.tr b/data/games/garage/mods/vessels/locale/vessels.de.tr new file mode 100644 index 0000000..162e359 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.de.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Leeres Gefäßregal +Vessels Shelf (@1 items)=Gefäßregal (@1 Gegenstände) +Vessels Shelf=Gefäßregal +Empty Glass Bottle=Leere Glasflasche +Empty Drinking Glass=Leeres Trinkglas +Empty Heavy Steel Bottle=Leere schwere Stahlflasche +Glass Fragments=Glasfragmente diff --git a/data/games/garage/mods/vessels/locale/vessels.eo.tr b/data/games/garage/mods/vessels/locale/vessels.eo.tr new file mode 100644 index 0000000..63a955d --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.eo.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Malplena vaza plataĵo +Vessels Shelf (@1 items)=Vaza plataĵo (@1 objektoj) +Vessels Shelf=Vaza plataĵo +Empty Glass Bottle=Malplena vitra botelo +Empty Drinking Glass=Malplena glaso +Empty Heavy Steel Bottle=Malplena peza ŝtala botelo +Glass Fragments=Vitraj eroj diff --git a/data/games/garage/mods/vessels/locale/vessels.es.tr b/data/games/garage/mods/vessels/locale/vessels.es.tr new file mode 100644 index 0000000..d6131d8 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.es.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Estante de vasijas vacío +Vessels Shelf (@1 items)=Estante de vasijas (@1 objetos) +Vessels Shelf=Estante de vasijas +Empty Glass Bottle=Botella de vidrio vacía +Empty Drinking Glass=Vaso para beber vacío +Empty Heavy Steel Bottle=Botella de acero vacía +Glass Fragments=Fragmentos de vidrio diff --git a/data/games/garage/mods/vessels/locale/vessels.fr.tr b/data/games/garage/mods/vessels/locale/vessels.fr.tr new file mode 100644 index 0000000..f099c19 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.fr.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Etagère à récipient vide +Vessels Shelf (@1 items)=Etagère à récipient (@1 articles) +Vessels Shelf=Etagère à récipient +Empty Glass Bottle=Bouteille de verre vide +Empty Drinking Glass=Verre vide +Empty Heavy Steel Bottle=Bouteille d'acier lourde vide +Glass Fragments=Fragments de verre diff --git a/data/games/garage/mods/vessels/locale/vessels.id.tr b/data/games/garage/mods/vessels/locale/vessels.id.tr new file mode 100644 index 0000000..f80fbc3 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.id.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Rak Bejana Kosong +Vessels Shelf (@1 items)=Rak Bejana (@1 barang) +Vessels Shelf=Rak Bejana +Empty Glass Bottle=Botol Kaca Kosong +Empty Drinking Glass=Gelas Minum Kosong +Empty Heavy Steel Bottle=Botol Baja Berat Kosong +Glass Fragments=Pecahan Kaca diff --git a/data/games/garage/mods/vessels/locale/vessels.it.tr b/data/games/garage/mods/vessels/locale/vessels.it.tr new file mode 100644 index 0000000..70ea575 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.it.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Scaffale per contenitori vuoto +Vessels Shelf (@1 items)=Scaffale per contenitori (@1 oggetti) +Vessels Shelf=Scaffale per contenitori +Empty Glass Bottle=Bottiglia di vetro vuota +Empty Drinking Glass=Bicchiere di vetro vuoto +Empty Heavy Steel Bottle=Bottigia di metallo pesante vuota +Glass Fragments=Frammenti di vetro diff --git a/data/games/garage/mods/vessels/locale/vessels.ja.tr b/data/games/garage/mods/vessels/locale/vessels.ja.tr new file mode 100644 index 0000000..451489a --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.ja.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=空の瓶の棚 +Vessels Shelf (@1 items)=瓶の棚(@1 本) +Vessels Shelf=瓶の棚 +Empty Glass Bottle=空のガラス瓶 +Empty Drinking Glass=空のガラスコップ +Empty Heavy Steel Bottle=空の重い鉄瓶 +Glass Fragments=ガラスの破片 diff --git a/data/games/garage/mods/vessels/locale/vessels.jbo.tr b/data/games/garage/mods/vessels/locale/vessels.jbo.tr new file mode 100644 index 0000000..6e1145e --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.jbo.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=.i ti kunti ke vasru kajna +Vessels Shelf (@1 items)=.i lo ti vasru kajna cu vasru lo @1 dacti +Vessels Shelf=lo vasru kajna +Empty Glass Bottle=lo blacybo'i be no da +Empty Drinking Glass=lo blacykabri be no da +Empty Heavy Steel Bottle=lo tilju ke gasta botpi be no da +Glass Fragments=lo derxi be lo blaci spisa diff --git a/data/games/garage/mods/vessels/locale/vessels.lv.tr b/data/games/garage/mods/vessels/locale/vessels.lv.tr new file mode 100644 index 0000000..2e5127f --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.lv.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Tukšs trauku plaukts +Vessels Shelf (@1 items)=Trauku plaukts ar @1 priekšmetiem +Vessels Shelf=Trauku plaukts +Empty Glass Bottle=Tukša stikla pudele +Empty Drinking Glass=Tukša glāze +Empty Heavy Steel Bottle=Tukša tērauda pudele +Glass Fragments=Stikla skaidas diff --git a/data/games/garage/mods/vessels/locale/vessels.ms.tr b/data/games/garage/mods/vessels/locale/vessels.ms.tr new file mode 100644 index 0000000..db6e62f --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.ms.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Rak Bekas Kaca Kosong +Vessels Shelf (@1 items)=Rak Bekas Kaca (@1 item) +Vessels Shelf=Rak Bekas Kaca +Empty Glass Bottle=Botol Kaca Kosong +Empty Drinking Glass=Gelas Minuman Kosong +Empty Heavy Steel Bottle=Botol Keluli Berat Kosong +Glass Fragments=Serpihan Kaca diff --git a/data/games/garage/mods/vessels/locale/vessels.pl.tr b/data/games/garage/mods/vessels/locale/vessels.pl.tr new file mode 100644 index 0000000..5e91da9 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.pl.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Pusta półka na naczynia +Vessels Shelf (@1 items)=Półka na naczynia (@1 przedmiotów) +Vessels Shelf=Półka na naczynia +Empty Glass Bottle=Pusta szklana butelka +Empty Drinking Glass=Pusta butelka do picia +Empty Heavy Steel Bottle=Pusta stalowa butelka +Glass Fragments=Odłamki szkła diff --git a/data/games/garage/mods/vessels/locale/vessels.pt_BR.tr b/data/games/garage/mods/vessels/locale/vessels.pt_BR.tr new file mode 100644 index 0000000..c22cb06 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Prateleira de Vasos Vazia +Vessels Shelf (@1 items)=Prateleira de Vasos (@1 itens) +Vessels Shelf=Prateleira de Vasos +Empty Glass Bottle=Garrafa de Vidro Vazia +Empty Drinking Glass=Copo Vazio +Empty Heavy Steel Bottle=Garrafa de Aço Pesada Vazia +Glass Fragments=Cacos de Vidro diff --git a/data/games/garage/mods/vessels/locale/vessels.ru.tr b/data/games/garage/mods/vessels/locale/vessels.ru.tr new file mode 100644 index 0000000..e9f276a --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.ru.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Полка с пустыми сосудами +Vessels Shelf (@1 items)=Полка с сосудами (@1 штук) +Vessels Shelf=Полка с сосудами +Empty Glass Bottle=Пустая стеклянная бутылка +Empty Drinking Glass=Пустой стакан +Empty Heavy Steel Bottle=Пустая стальная бутылка +Glass Fragments=Стеклянные осколки diff --git a/data/games/garage/mods/vessels/locale/vessels.sk.tr b/data/games/garage/mods/vessels/locale/vessels.sk.tr new file mode 100644 index 0000000..6ec640b --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.sk.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Prázdna polica na fľašky +Vessels Shelf (@1 items)=Polica na fľašky (@1 položka/y) +Vessels Shelf=Polica na fľašky +Empty Glass Bottle=Prázdna sklenená fľaša +Empty Drinking Glass=Prázdny pohár na pitie +Empty Heavy Steel Bottle=Prázdna oceľová fľaša +Glass Fragments=Časti skla diff --git a/data/games/garage/mods/vessels/locale/vessels.sv.tr b/data/games/garage/mods/vessels/locale/vessels.sv.tr new file mode 100644 index 0000000..48e76e2 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.sv.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Tom kärlhylla +Vessels Shelf (@1 items)=Kärlhylla (@1 saker) +Vessels Shelf=Kärlhylla +Empty Glass Bottle=Tom glasflaska +Empty Drinking Glass=Tom drycksflaska +Empty Heavy Steel Bottle=Tom tungstålsflaska +Glass Fragments=Glasbitar diff --git a/data/games/garage/mods/vessels/locale/vessels.uk.tr b/data/games/garage/mods/vessels/locale/vessels.uk.tr new file mode 100644 index 0000000..34165d9 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.uk.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=Пуста полиця для посуду +Vessels Shelf (@1 items)=Полиця для посуду (@1 предм.) +Vessels Shelf=Полиця для посуду +Empty Glass Bottle=Порожня скляна пляшка +Empty Drinking Glass=Порожня склянка +Empty Heavy Steel Bottle=Порожня важка сталева пляшка +Glass Fragments=Скляні уламки diff --git a/data/games/garage/mods/vessels/locale/vessels.zh_CN.tr b/data/games/garage/mods/vessels/locale/vessels.zh_CN.tr new file mode 100644 index 0000000..e303e24 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.zh_CN.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=空容器架 +Vessels Shelf (@1 items)=容器架(@1项) +Vessels Shelf=容器架 +Empty Glass Bottle=空玻璃瓶 +Empty Drinking Glass=空水杯 +Empty Heavy Steel Bottle=空重型钢瓶 +Glass Fragments=玻璃碎片 diff --git a/data/games/garage/mods/vessels/locale/vessels.zh_TW.tr b/data/games/garage/mods/vessels/locale/vessels.zh_TW.tr new file mode 100644 index 0000000..6aecb35 --- /dev/null +++ b/data/games/garage/mods/vessels/locale/vessels.zh_TW.tr @@ -0,0 +1,8 @@ +# textdomain: vessels +Empty Vessels Shelf=空容器架 +Vessels Shelf (@1 items)=容器架(@1項) +Vessels Shelf=容器架 +Empty Glass Bottle=空玻璃瓶 +Empty Drinking Glass=空水杯 +Empty Heavy Steel Bottle=空重型鋼瓶 +Glass Fragments=玻璃碎片 diff --git a/data/games/garage/mods/vessels/mod.conf b/data/games/garage/mods/vessels/mod.conf new file mode 100644 index 0000000..eba9076 --- /dev/null +++ b/data/games/garage/mods/vessels/mod.conf @@ -0,0 +1,4 @@ +name = vessels +description = Minetest Game mod: vessels +depends = default +optional_depends = dungeon_loot diff --git a/data/games/garage/mods/vessels/textures/vessels_drinking_glass.png b/data/games/garage/mods/vessels/textures/vessels_drinking_glass.png new file mode 100644 index 0000000..aef7329 Binary files /dev/null and b/data/games/garage/mods/vessels/textures/vessels_drinking_glass.png differ diff --git a/data/games/garage/mods/vessels/textures/vessels_drinking_glass_inv.png b/data/games/garage/mods/vessels/textures/vessels_drinking_glass_inv.png new file mode 100644 index 0000000..e50c8c7 Binary files /dev/null and b/data/games/garage/mods/vessels/textures/vessels_drinking_glass_inv.png differ diff --git a/data/games/garage/mods/vessels/textures/vessels_glass_bottle.png b/data/games/garage/mods/vessels/textures/vessels_glass_bottle.png new file mode 100644 index 0000000..2a46aaf Binary files /dev/null and b/data/games/garage/mods/vessels/textures/vessels_glass_bottle.png differ diff --git a/data/games/garage/mods/vessels/textures/vessels_glass_fragments.png b/data/games/garage/mods/vessels/textures/vessels_glass_fragments.png new file mode 100644 index 0000000..acf2d38 Binary files /dev/null and b/data/games/garage/mods/vessels/textures/vessels_glass_fragments.png differ diff --git a/data/games/garage/mods/vessels/textures/vessels_shelf.png b/data/games/garage/mods/vessels/textures/vessels_shelf.png new file mode 100644 index 0000000..87c69b2 Binary files /dev/null and b/data/games/garage/mods/vessels/textures/vessels_shelf.png differ diff --git a/data/games/garage/mods/vessels/textures/vessels_shelf_slot.png b/data/games/garage/mods/vessels/textures/vessels_shelf_slot.png new file mode 100644 index 0000000..93a729e Binary files /dev/null and b/data/games/garage/mods/vessels/textures/vessels_shelf_slot.png differ diff --git a/data/games/garage/mods/vessels/textures/vessels_steel_bottle.png b/data/games/garage/mods/vessels/textures/vessels_steel_bottle.png new file mode 100644 index 0000000..169930a Binary files /dev/null and b/data/games/garage/mods/vessels/textures/vessels_steel_bottle.png differ diff --git a/data/games/garage/mods/walls/README.txt b/data/games/garage/mods/walls/README.txt new file mode 100644 index 0000000..ba33bd7 --- /dev/null +++ b/data/games/garage/mods/walls/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: walls +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Auke Kok (LGPLv2.1+) diff --git a/data/games/garage/mods/walls/init.lua b/data/games/garage/mods/walls/init.lua new file mode 100644 index 0000000..0f7425c --- /dev/null +++ b/data/games/garage/mods/walls/init.lua @@ -0,0 +1,73 @@ +-- walls/init.lua + +walls = {} + +local fence_collision_extra = minetest.settings:get_bool("enable_fence_tall") and 3/8 or 0 + +-- Load support for MT game translation. +local S = minetest.get_translator("walls") + +walls.register = function(wall_name, wall_desc, wall_texture_table, wall_mat, wall_sounds) + --make wall_texture_table paramenter backwards compatible for mods passing single texture + if type(wall_texture_table) ~= "table" then + wall_texture_table = { wall_texture_table } + end + -- inventory node, and pole-type wall start item + minetest.register_node(wall_name, { + description = wall_desc, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}, + -- connect_bottom = + connect_front = {-3/16, -1/2, -1/2, 3/16, 3/8, -1/4}, + connect_left = {-1/2, -1/2, -3/16, -1/4, 3/8, 3/16}, + connect_back = {-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}, + connect_right = { 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}, + }, + collision_box = { + type = "connected", + fixed = {-1/4, -1/2, -1/4, 1/4, 1/2 + fence_collision_extra, 1/4}, + -- connect_top = + -- connect_bottom = + connect_front = {-1/4,-1/2,-1/2,1/4,1/2 + fence_collision_extra,-1/4}, + connect_left = {-1/2,-1/2,-1/4,-1/4,1/2 + fence_collision_extra,1/4}, + connect_back = {-1/4,-1/2,1/4,1/4,1/2 + fence_collision_extra,1/2}, + connect_right = {1/4,-1/2,-1/4,1/2,1/2 + fence_collision_extra,1/4}, + }, + connects_to = { "group:wall", "group:stone", "group:fence", "group:wall_connected" }, + paramtype = "light", + is_ground_content = false, + tiles = wall_texture_table, + walkable = true, + groups = { cracky = 3, wall = 1, stone = 2 }, + sounds = wall_sounds, + }) + + -- crafting recipe + -- HACK: + -- Walls have no crafts, when register new wall via API from another mod, but in the same namespace (`walls`). + -- So we should remove `":"` at the beginning of the name. + if wall_name:sub(1, 1) == ":" then + wall_name = wall_name:sub(2) + end + minetest.register_craft({ + output = wall_name .. " 6", + recipe = { + { "", "", "" }, + { wall_mat, wall_mat, wall_mat}, + { wall_mat, wall_mat, wall_mat}, + } + }) + +end + +walls.register("walls:cobble", S("Cobblestone Wall"), {"default_cobble.png"}, + "default:cobble", default.node_sound_stone_defaults()) + +walls.register("walls:mossycobble", S("Mossy Cobblestone Wall"), {"default_mossycobble.png"}, + "default:mossycobble", default.node_sound_stone_defaults()) + +walls.register("walls:desertcobble", S("Desert Cobblestone Wall"), {"default_desert_cobble.png"}, + "default:desert_cobble", default.node_sound_stone_defaults()) + diff --git a/data/games/garage/mods/walls/license.txt b/data/games/garage/mods/walls/license.txt new file mode 100644 index 0000000..ccfaf1c --- /dev/null +++ b/data/games/garage/mods/walls/license.txt @@ -0,0 +1,14 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2015 Auke Kok + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 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 Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/data/games/garage/mods/walls/locale/template.txt b/data/games/garage/mods/walls/locale/template.txt new file mode 100644 index 0000000..6721dc6 --- /dev/null +++ b/data/games/garage/mods/walls/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall= +Mossy Cobblestone Wall= +Desert Cobblestone Wall= diff --git a/data/games/garage/mods/walls/locale/walls.de.tr b/data/games/garage/mods/walls/locale/walls.de.tr new file mode 100644 index 0000000..c31d4f6 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.de.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Kopfsteinpflastermauer +Mossy Cobblestone Wall=Moosige Kopfsteinpflastermauer +Desert Cobblestone Wall=Wüstenkopfsteinpflastermauer diff --git a/data/games/garage/mods/walls/locale/walls.eo.tr b/data/games/garage/mods/walls/locale/walls.eo.tr new file mode 100644 index 0000000..95b8ced --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.eo.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Pavimŝtona muro +Mossy Cobblestone Wall=Muska pavimŝtona muro +Desert Cobblestone Wall=Dezerta pavimŝtona muro diff --git a/data/games/garage/mods/walls/locale/walls.es.tr b/data/games/garage/mods/walls/locale/walls.es.tr new file mode 100644 index 0000000..796710f --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.es.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Pared de adoquines +Mossy Cobblestone Wall=Pared de adoquines musgosos +Desert Cobblestone Wall=Pared de adoquines desérticos diff --git a/data/games/garage/mods/walls/locale/walls.fr.tr b/data/games/garage/mods/walls/locale/walls.fr.tr new file mode 100644 index 0000000..8dcb625 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.fr.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Mur en pavé +Mossy Cobblestone Wall=Mur en pavé moussu +Desert Cobblestone Wall=Mur en pavé du désert diff --git a/data/games/garage/mods/walls/locale/walls.id.tr b/data/games/garage/mods/walls/locale/walls.id.tr new file mode 100644 index 0000000..8bfd9c7 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.id.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Tembok Bongkahan Batu +Mossy Cobblestone Wall=Tembok Bongkahan Batu Berlumut +Desert Cobblestone Wall=Tembok Bongkahan Batu Gurun diff --git a/data/games/garage/mods/walls/locale/walls.it.tr b/data/games/garage/mods/walls/locale/walls.it.tr new file mode 100644 index 0000000..4babad2 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.it.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Muro di ciottoli +Mossy Cobblestone Wall=Muro di ciottoli muschiosi +Desert Cobblestone Wall=Muro di ciottoli del deserto diff --git a/data/games/garage/mods/walls/locale/walls.ja.tr b/data/games/garage/mods/walls/locale/walls.ja.tr new file mode 100644 index 0000000..c907aed --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.ja.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=丸石の塀 +Mossy Cobblestone Wall=苔むした丸石の塀 +Desert Cobblestone Wall=砂漠の丸石の塀 diff --git a/data/games/garage/mods/walls/locale/walls.jbo.tr b/data/games/garage/mods/walls/locale/walls.jbo.tr new file mode 100644 index 0000000..aba765c --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.jbo.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=lo lolro'iboi bitmu +Mossy Cobblestone Wall=lo clika lolro'iboi bitmu +Desert Cobblestone Wall=lo cantu'a lolro'iboi bitmu diff --git a/data/games/garage/mods/walls/locale/walls.lv.tr b/data/games/garage/mods/walls/locale/walls.lv.tr new file mode 100644 index 0000000..5d50ddf --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.lv.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Mūrakmens siena +Mossy Cobblestone Wall=Apsūnējuša mūrakmens siena +Desert Cobblestone Wall=Tuksneša mūrakmens siena diff --git a/data/games/garage/mods/walls/locale/walls.ms.tr b/data/games/garage/mods/walls/locale/walls.ms.tr new file mode 100644 index 0000000..9375342 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.ms.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Pagar Batu Buntar +Mossy Cobblestone Wall=Pagar Batu Buntar Berlumut +Desert Cobblestone Wall=Pagar Batu Buntar Gurun diff --git a/data/games/garage/mods/walls/locale/walls.pl.tr b/data/games/garage/mods/walls/locale/walls.pl.tr new file mode 100644 index 0000000..ff544e2 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.pl.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Brukowa ściana +Mossy Cobblestone Wall=Brukowa ściana z mchem +Desert Cobblestone Wall=Pustynno-brukowa ściana diff --git a/data/games/garage/mods/walls/locale/walls.pt_BR.tr b/data/games/garage/mods/walls/locale/walls.pt_BR.tr new file mode 100644 index 0000000..58c3d12 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Parede de Paralelepípedo +Mossy Cobblestone Wall=Parede de Paralelepípedo com Musgo +Desert Cobblestone Wall=Parede de Paralelepípedo do Deserto diff --git a/data/games/garage/mods/walls/locale/walls.ru.tr b/data/games/garage/mods/walls/locale/walls.ru.tr new file mode 100644 index 0000000..2f61536 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.ru.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Стена из булыжника +Mossy Cobblestone Wall=Стена из замшелого булыжника +Desert Cobblestone Wall=Стена из пустынного булыжника diff --git a/data/games/garage/mods/walls/locale/walls.sk.tr b/data/games/garage/mods/walls/locale/walls.sk.tr new file mode 100644 index 0000000..69cf3a9 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.sk.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Múr z dlažbových kociek +Mossy Cobblestone Wall=Múr z dlažbových kociek obrastených machom +Desert Cobblestone Wall=Múr z púštnych dlažbových kociek diff --git a/data/games/garage/mods/walls/locale/walls.sv.tr b/data/games/garage/mods/walls/locale/walls.sv.tr new file mode 100644 index 0000000..1ad4a29 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.sv.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Kullerstensvägg +Mossy Cobblestone Wall=Mossig kullerstensvägg +Desert Cobblestone Wall=Ökenkullerstensvägg diff --git a/data/games/garage/mods/walls/locale/walls.uk.tr b/data/games/garage/mods/walls/locale/walls.uk.tr new file mode 100644 index 0000000..25bdd26 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.uk.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=Кругляковий паркан +Mossy Cobblestone Wall=Паркан з моховитого кругляку +Desert Cobblestone Wall=Паркан з пустельного кругляку diff --git a/data/games/garage/mods/walls/locale/walls.zh_CN.tr b/data/games/garage/mods/walls/locale/walls.zh_CN.tr new file mode 100644 index 0000000..f590e82 --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.zh_CN.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=鹅卵石墙 +Mossy Cobblestone Wall=苔藓覆盖的鹅卵石墙 +Desert Cobblestone Wall=沙漠鹅卵石墙 diff --git a/data/games/garage/mods/walls/locale/walls.zh_TW.tr b/data/games/garage/mods/walls/locale/walls.zh_TW.tr new file mode 100644 index 0000000..ba1285f --- /dev/null +++ b/data/games/garage/mods/walls/locale/walls.zh_TW.tr @@ -0,0 +1,4 @@ +# textdomain: walls +Cobblestone Wall=鵝卵石牆 +Mossy Cobblestone Wall=苔蘚覆蓋的鵝卵石牆 +Desert Cobblestone Wall=沙漠鵝卵石牆 diff --git a/data/games/garage/mods/walls/mod.conf b/data/games/garage/mods/walls/mod.conf new file mode 100644 index 0000000..9b8bbe8 --- /dev/null +++ b/data/games/garage/mods/walls/mod.conf @@ -0,0 +1,3 @@ +name = walls +description = Minetest Game mod: walls +depends = default diff --git a/data/games/garage/mods/weather/README.txt b/data/games/garage/mods/weather/README.txt new file mode 100644 index 0000000..6733460 --- /dev/null +++ b/data/games/garage/mods/weather/README.txt @@ -0,0 +1,4 @@ +Minetest Game mod: weather +========================== +See license.txt for license information. +Source code by paramat (MIT). diff --git a/data/games/garage/mods/weather/api.lua b/data/games/garage/mods/weather/api.lua new file mode 100644 index 0000000..818e26a --- /dev/null +++ b/data/games/garage/mods/weather/api.lua @@ -0,0 +1,32 @@ +local CYCLE = 8 -- Time period of cyclic clouds update in seconds + +weather = {} + +-- default implementation is empty +function weather.get(player) + return {} +end + +local function do_update() + for _, player in ipairs(minetest.get_connected_players()) do + local params = weather.get(player) + assert(params ~= nil, "weather.get() must not return nil") + if params.clouds then + player:set_clouds(params.clouds) + end + if params.lighting then + player:set_lighting(params.lighting) + end + end +end + +local function cyclic_update() + do_update() + minetest.after(CYCLE, cyclic_update) +end +minetest.after(0, cyclic_update) + +-- Update on player join to instantly alter clouds from the default +minetest.register_on_joinplayer(function(player) + do_update() +end) diff --git a/data/games/garage/mods/weather/init.lua b/data/games/garage/mods/weather/init.lua new file mode 100644 index 0000000..6874328 --- /dev/null +++ b/data/games/garage/mods/weather/init.lua @@ -0,0 +1,129 @@ +-- Always load the API +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/api.lua") + +-- Disable by mapgen or setting + +if minetest.settings:get_bool("enable_weather") == false then + return +end + +local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name == "v6" or mg_name == "singlenode" then + -- set a default shadow intensity for mgv6 and singlenode + minetest.register_on_joinplayer(function(player) + player:set_lighting({ + shadows = { intensity = 0.33 }, + bloom = { intensity = 0.05 }, + volumetric_light = { strength = 0.2 }, + }) + end) + + return +end + +-- Default implementation for noise based cloud appearance + +local TSCALE = 600 -- Time scale of noise variation in seconds + +local np_density = { + offset = 0.5, + scale = 0.5, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 813, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local np_thickness = { + offset = 0.5, + scale = 0.5, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 96, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local np_speedx = { + offset = 0, + scale = 1, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 911923, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local np_speedz = { + offset = 0, + scale = 1, + spread = {x = TSCALE, y = TSCALE, z = TSCALE}, + seed = 5728, + octaves = 1, + persist = 0, + lacunarity = 2, +} + +local nobj_density = nil +local nobj_thickness = nil +local nobj_speedx = nil +local nobj_speedz = nil + +local function rangelim(value, lower, upper) + return math.min(math.max(value, lower), upper) +end + +local t_offset +do + local meta = minetest.get_mod_storage() + if meta:contains("time_offset") then + t_offset = meta:get_int("time_offset") + else + -- Use random offset so not each new world behaves the same. + t_offset = math.random(0, 300000) + meta:set_int("time_offset", t_offset) + end +end + +function weather.get(player) + -- Adjusted time in seconds + local time = math.floor(minetest.get_gametime() - t_offset) + + nobj_density = nobj_density or minetest.get_perlin(np_density) + nobj_thickness = nobj_thickness or minetest.get_perlin(np_thickness) + nobj_speedx = nobj_speedx or minetest.get_perlin(np_speedx) + nobj_speedz = nobj_speedz or minetest.get_perlin(np_speedz) + + local n_density = nobj_density:get_2d({x = time, y = 0}) -- 0 to 1 + local n_thickness = nobj_thickness:get_2d({x = time, y = 0}) -- 0 to 1 + local n_speedx = nobj_speedx:get_2d({x = time, y = 0}) -- -1 to 1 + local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) -- -1 to 1 + + -- Fallback to mid-value 50 for very old worlds + local humid = minetest.get_humidity(player:get_pos()) or 50 + -- Default and classic density value is 0.4, make this happen + -- at humidity midvalue 50 when n_density is at midvalue 0.5. + -- density_max = 0.25 at humid = 0. + -- density_max = 0.8 at humid = 50. + -- density_max = 1.35 at humid = 100. + local density_max = 0.8 + ((humid - 50) / 50) * 0.55 + -- Range limit density_max to always have occasional + -- small scattered clouds at extreme low humidity. + local density = rangelim(density_max, 0.2, 1.0) * n_density + + return { + clouds = { + density = density, + thickness = math.max(math.floor( + rangelim(32 * humid / 100, 8, 32) * n_thickness + ), 2), + speed = {x = n_speedx * 4, z = n_speedz * 4}, + }, + lighting = { + shadows = { intensity = 0.7 * (1 - density) }, + bloom = { intensity = 0.05 }, + volumetric_light = { strength = 0.2 }, + } + } +end diff --git a/data/games/garage/mods/weather/license.txt b/data/games/garage/mods/weather/license.txt new file mode 100644 index 0000000..33baa06 --- /dev/null +++ b/data/games/garage/mods/weather/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2019 paramat + +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. + +For more details: +https://opensource.org/licenses/MIT diff --git a/data/games/garage/mods/weather/mod.conf b/data/games/garage/mods/weather/mod.conf new file mode 100644 index 0000000..436ce67 --- /dev/null +++ b/data/games/garage/mods/weather/mod.conf @@ -0,0 +1,2 @@ +name = weather +description = Minetest Game mod: weather diff --git a/data/games/garage/mods/wool/README.txt b/data/games/garage/mods/wool/README.txt new file mode 100644 index 0000000..31febdf --- /dev/null +++ b/data/games/garage/mods/wool/README.txt @@ -0,0 +1,16 @@ +Minetest Game mod: wool +======================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +Cisoun (CC BY-SA 3.0): + wool_black.png wool_brown.png wool_dark_green.png wool_green.png + wool_magenta.png wool_pink.png wool_violet.png wool_yellow.png + wool_blue.png wool_cyan.png wool_dark_grey.png wool_grey.png + wool_orange.png wool_red.png wool_white.png diff --git a/data/games/garage/mods/wool/init.lua b/data/games/garage/mods/wool/init.lua new file mode 100644 index 0000000..87bd427 --- /dev/null +++ b/data/games/garage/mods/wool/init.lua @@ -0,0 +1,54 @@ +-- wool/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("wool") + +local dyes = dye.dyes + +for i = 1, #dyes do + local name, desc = unpack(dyes[i]) + + local color_group = "color_" .. name + + minetest.register_node("wool:" .. name, { + description = S(desc .. " Wool"), + tiles = {"wool_" .. name .. ".png"}, + is_ground_content = false, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, + flammable = 3, wool = 1, [color_group] = 1}, + sounds = default.node_sound_defaults(), + }) + + minetest.register_craft{ + type = "shapeless", + output = "wool:" .. name, + recipe = {"group:dye," .. color_group, "group:wool"}, + } +end + +-- Legacy +-- Backwards compatibility with jordach's 16-color wool mod +minetest.register_alias("wool:dark_blue", "wool:blue") +minetest.register_alias("wool:gold", "wool:yellow") + +-- Dummy calls to S() to allow translation scripts to detect the strings. +-- To update this run: +-- for _,e in ipairs(dye.dyes) do print(("S(%q)"):format(e[2].." Wool")) end + +--[[ +S("White Wool") +S("Grey Wool") +S("Dark Grey Wool") +S("Black Wool") +S("Violet Wool") +S("Blue Wool") +S("Cyan Wool") +S("Dark Green Wool") +S("Green Wool") +S("Yellow Wool") +S("Brown Wool") +S("Orange Wool") +S("Red Wool") +S("Magenta Wool") +S("Pink Wool") +--]] diff --git a/data/games/garage/mods/wool/license.txt b/data/games/garage/mods/wool/license.txt new file mode 100644 index 0000000..5dfc751 --- /dev/null +++ b/data/games/garage/mods/wool/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Cisoun + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/wool/locale/template.txt b/data/games/garage/mods/wool/locale/template.txt new file mode 100644 index 0000000..316cd2c --- /dev/null +++ b/data/games/garage/mods/wool/locale/template.txt @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool= +Grey Wool= +Dark Grey Wool= +Black Wool= +Violet Wool= +Blue Wool= +Cyan Wool= +Dark Green Wool= +Green Wool= +Yellow Wool= +Brown Wool= +Orange Wool= +Red Wool= +Magenta Wool= +Pink Wool= diff --git a/data/games/garage/mods/wool/locale/wool.de.tr b/data/games/garage/mods/wool/locale/wool.de.tr new file mode 100644 index 0000000..9b6b8ab --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.de.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Weiße Wolle +Grey Wool=Graue Wolle +Dark Grey Wool=Dunkelgraue Wolle +Black Wool=Schwarze Wolle +Violet Wool=Violette Wolle +Blue Wool=Blaue Wolle +Cyan Wool=Türkise Wolle +Dark Green Wool=Dunkelgrüne Wolle +Green Wool=Grüne Wolle +Yellow Wool=Gelbe Wolle +Brown Wool=Braune Wolle +Orange Wool=Orange Wolle +Red Wool=Rote Wolle +Magenta Wool=Magenta Wolle +Pink Wool=Rosa Wolle diff --git a/data/games/garage/mods/wool/locale/wool.eo.tr b/data/games/garage/mods/wool/locale/wool.eo.tr new file mode 100644 index 0000000..78242cd --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.eo.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Blanka lano +Grey Wool=Griza lano +Dark Grey Wool=Malhela griza lano +Black Wool=Nigra lano +Violet Wool=Violkolora lano +Blue Wool=Blua lano +Cyan Wool=Bluverda lano +Dark Green Wool=Malhela verda lano +Green Wool=Verda lano +Yellow Wool=Flava lano +Brown Wool=Bruna lano +Orange Wool=Oranĝkolora lano +Red Wool=Ruĝa lano +Magenta Wool=Fuksina lano +Pink Wool=Rozkolora lano diff --git a/data/games/garage/mods/wool/locale/wool.es.tr b/data/games/garage/mods/wool/locale/wool.es.tr new file mode 100644 index 0000000..ac15592 --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.es.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Lana blanca +Grey Wool=Lana gris +Dark Grey Wool=Lana gris oscuro +Black Wool=Lana negra +Violet Wool=Lana violeta +Blue Wool=Lana azul +Cyan Wool=Lana cián +Dark Green Wool=Lana verde oscuro +Green Wool=Lana verde +Yellow Wool=Lana amarilla +Brown Wool=Lana marrón +Orange Wool=Lana naranja +Red Wool=Lana roja +Magenta Wool=Lana magenta +Pink Wool=Lana rosa diff --git a/data/games/garage/mods/wool/locale/wool.fr.tr b/data/games/garage/mods/wool/locale/wool.fr.tr new file mode 100644 index 0000000..48a60a7 --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.fr.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Laine blanche +Grey Wool=Laine grise +Dark Grey Wool=Laine grise foncée +Black Wool=Laine noire +Violet Wool=Laine violette +Blue Wool=Laine bleue +Cyan Wool=Laine cyan +Dark Green Wool=Laine verte foncée +Green Wool=Laine verte +Yellow Wool=Laine jaune +Brown Wool=Laine marron +Orange Wool=Laine orange +Red Wool=Laine rouge +Magenta Wool=Laine magenta +Pink Wool=Laine rose diff --git a/data/games/garage/mods/wool/locale/wool.id.tr b/data/games/garage/mods/wool/locale/wool.id.tr new file mode 100644 index 0000000..603277f --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.id.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Wol Putih +Grey Wool=Wol Abu +Dark Grey Wool=Wol Abu Tua +Black Wool=Wol Hitam +Violet Wool=Wol Ungu +Blue Wool=Wol Biru +Cyan Wool=Wol Sian +Dark Green Wool=Wol Hijau Tua +Green Wool=Wol Hijau +Yellow Wool=Wol Kuning +Brown Wool=Wol Cokelat +Orange Wool=Wol Oranye +Red Wool=Wol Merah +Magenta Wool=Wol Magenta +Pink Wool=Wol Merah Muda diff --git a/data/games/garage/mods/wool/locale/wool.it.tr b/data/games/garage/mods/wool/locale/wool.it.tr new file mode 100644 index 0000000..8108f2f --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.it.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Lana bianca +Grey Wool=Lana grigia +Dark Grey Wool=Lana grigia scura +Black Wool=Lana nera +Violet Wool=Lana viola +Blue Wool=Lana blu +Cyan Wool=Lana ciano +Dark Green Wool=Lana verde scura +Green Wool=Lana verde +Yellow Wool=Lana gialla +Brown Wool=Lana marrone +Orange Wool=Lana arancione +Red Wool=Lana rossa +Magenta Wool=Lana magenta +Pink Wool=Lana rosa diff --git a/data/games/garage/mods/wool/locale/wool.ja.tr b/data/games/garage/mods/wool/locale/wool.ja.tr new file mode 100644 index 0000000..5051f9e --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.ja.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白色の羊毛 +Grey Wool=灰色の羊毛 +Dark Grey Wool=濃灰色の羊毛 +Black Wool=黒色の羊毛 +Violet Wool=紫色の羊毛 +Blue Wool=青色の羊毛 +Cyan Wool=青緑色の羊毛 +Dark Green Wool=濃緑色の羊毛 +Green Wool=緑色の羊毛 +Yellow Wool=黄色の羊毛 +Brown Wool=茶色の羊毛 +Orange Wool=橙色の羊毛 +Red Wool=赤色の羊毛 +Magenta Wool=赤紫色の羊毛 +Pink Wool=桃色の羊毛 diff --git a/data/games/garage/mods/wool/locale/wool.jbo.tr b/data/games/garage/mods/wool/locale/wool.jbo.tr new file mode 100644 index 0000000..4bf44ec --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.jbo.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=lo blabi sunla +Grey Wool=lo grusi sunla +Dark Grey Wool=lo xekri grusi sunla +Black Wool=lo xekri sunla +Violet Wool=lo zirpu sunla +Blue Wool=lo blanu sunla +Cyan Wool=lo cicna sunla +Dark Green Wool=lo xekri crino sunla +Green Wool=lo crino sunla +Yellow Wool=lo pelxu sunla +Brown Wool=lo bunre sunla +Orange Wool=lo narju sunla +Red Wool=lo xunre sunla +Magenta Wool=lo nukni sunla +Pink Wool=lo xunblabi sunla diff --git a/data/games/garage/mods/wool/locale/wool.lv.tr b/data/games/garage/mods/wool/locale/wool.lv.tr new file mode 100644 index 0000000..72e514e --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.lv.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Balta vilna +Grey Wool=Pelēka vilna +Dark Grey Wool=Tumšpelēka vilna +Black Wool=Melna vilna +Violet Wool=Violeta vilna +Blue Wool=Zila vilna +Cyan Wool=Ciānkrāsas vilna +Dark Green Wool=Tumšzaļa vilna +Green Wool=Zaļa vilna +Yellow Wool=Dzeltena vilna +Brown Wool=Brūna vilna +Orange Wool=Oranža vilna +Red Wool=Sarkana vilna +Magenta Wool=Fuksīna krāsas vilna +Pink Wool=Rozā vilna diff --git a/data/games/garage/mods/wool/locale/wool.ms.tr b/data/games/garage/mods/wool/locale/wool.ms.tr new file mode 100644 index 0000000..8b597d1 --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.ms.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Bulu Biri-Biri Putih +Grey Wool=Bulu Biri-Biri Kelabu +Dark Grey Wool=Bulu Biri-Biri Kelabu Tua +Black Wool=Bulu Biri-Biri Hitam +Violet Wool=Bulu Biri-Biri Ungu +Blue Wool=Bulu Biri-Biri Biru +Cyan Wool=Bulu Biri-Biri Biru Kehijauan +Dark Green Wool=Bulu Biri-Biri Hijau Tua +Green Wool=Bulu Biri-Biri Hijau +Yellow Wool=Bulu Biri-Biri Kuning +Brown Wool=Bulu Biri-Biri Perang +Orange Wool=Bulu Biri-Biri Jingga +Red Wool=Bulu Biri-Biri Merah +Magenta Wool=Bulu Biri-Biri Magenta +Pink Wool=Bulu Biri-Biri Merah Jambu diff --git a/data/games/garage/mods/wool/locale/wool.pl.tr b/data/games/garage/mods/wool/locale/wool.pl.tr new file mode 100644 index 0000000..9c411c8 --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.pl.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Biała wełna +Grey Wool=Szara wełna +Dark Grey Wool=Ciemnoszara wełna +Black Wool=Czarna wełna +Violet Wool=Fioletowa wełna +Blue Wool=Niebieska wełna +Cyan Wool=Cyjanowa wełna +Dark Green Wool=Ciemnozielona wełna +Green Wool=Zielona wełna +Yellow Wool=Żółta wełna +Brown Wool=Brązowa wełna +Orange Wool=Pomarańczowa wełna +Red Wool=Czerwona wełna +Magenta Wool=Karmazynowa wełna +Pink Wool=Różowa wełna diff --git a/data/games/garage/mods/wool/locale/wool.pt.tr b/data/games/garage/mods/wool/locale/wool.pt.tr new file mode 100644 index 0000000..9b4232f --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.pt.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Tecido Branco +Grey Wool=Tecido Cinza +Dark Grey Wool=Tecido Cinza-escuro +Black Wool=Tecido Preto +Violet Wool=Tecido Violeta +Blue Wool=Tecido Azul +Cyan Wool=Tecido Ciano +Dark Green Wool=Tecido Verde-escuro +Green Wool=Tecido Verde +Yellow Wool=Tecido Amarelo +Brown Wool=Tecido Marrom +Orange Wool=Tecido Laranja +Red Wool=Tecido Vermelho +Magenta Wool=Tecido Magenta +Pink Wool=Tecido Rosa diff --git a/data/games/garage/mods/wool/locale/wool.pt_BR.tr b/data/games/garage/mods/wool/locale/wool.pt_BR.tr new file mode 100644 index 0000000..9b4232f --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.pt_BR.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Tecido Branco +Grey Wool=Tecido Cinza +Dark Grey Wool=Tecido Cinza-escuro +Black Wool=Tecido Preto +Violet Wool=Tecido Violeta +Blue Wool=Tecido Azul +Cyan Wool=Tecido Ciano +Dark Green Wool=Tecido Verde-escuro +Green Wool=Tecido Verde +Yellow Wool=Tecido Amarelo +Brown Wool=Tecido Marrom +Orange Wool=Tecido Laranja +Red Wool=Tecido Vermelho +Magenta Wool=Tecido Magenta +Pink Wool=Tecido Rosa diff --git a/data/games/garage/mods/wool/locale/wool.ru.tr b/data/games/garage/mods/wool/locale/wool.ru.tr new file mode 100644 index 0000000..9893a08 --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.ru.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Белая шерсть +Grey Wool=Серая шерсть +Dark Grey Wool=Тёмно-Серая шерсть +Black Wool=Чёрная шерсть +Violet Wool=Фиолетовая шерсть +Blue Wool=Синяя шерсть +Cyan Wool=Бирюзовая шерсть +Dark Green Wool=Тёмно-Зелёная шерсть +Green Wool=Зелёная шерсть +Yellow Wool=Жёлтая шерсть +Brown Wool=Коричневая шерсть +Orange Wool=Оранжевая шерсть +Red Wool=Красная шерсть +Magenta Wool=Сиреневая шерсть +Pink Wool=Розовая шерсть diff --git a/data/games/garage/mods/wool/locale/wool.sk.tr b/data/games/garage/mods/wool/locale/wool.sk.tr new file mode 100644 index 0000000..755370e --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.sk.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Biela vlna +Grey Wool=Šedá vlna +Dark Grey Wool=Tmavošedá vlna +Black Wool=Čierna vlna +Violet Wool=Fialová vlna +Blue Wool=Modrá vlna +Cyan Wool=Tyrkysová vlna +Dark Green Wool=Tmavozelená vlna +Green Wool=Zelená vlna +Yellow Wool=Žltá vlna +Brown Wool=Hnedá vlna +Orange Wool=Oranžová vlna +Red Wool=Červená vlna +Magenta Wool=Purpurová vlna +Pink Wool=Ružová vlna diff --git a/data/games/garage/mods/wool/locale/wool.sv.tr b/data/games/garage/mods/wool/locale/wool.sv.tr new file mode 100644 index 0000000..bfce214 --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.sv.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Vit ull +Grey Wool=Grå ull +Dark Grey Wool=Mörkgrå ull +Black Wool=Svart ull +Violet Wool=Violett ull +Blue Wool=Blå ull +Cyan Wool=Cyan ull +Dark Green Wool=Mörkgrön ull +Green Wool=Grön ull +Yellow Wool=Gul ull +Brown Wool=Brun ull +Orange Wool=Orange ull +Red Wool=Röd ull +Magenta Wool=Magenta ull +Pink Wool=Rosa ull diff --git a/data/games/garage/mods/wool/locale/wool.uk.tr b/data/games/garage/mods/wool/locale/wool.uk.tr new file mode 100644 index 0000000..24dbed7 --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.uk.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=Біла вовна +Grey Wool=Сіра вовна +Dark Grey Wool=Темно-сіра вовна +Black Wool=Чорна вовна +Violet Wool=Фіолетова вовна +Blue Wool=Синя вовна +Cyan Wool=Синьо-зелена вовна +Dark Green Wool=Темно-зелена вовна +Green Wool=Зелена вовна +Yellow Wool=Жовта вовна +Brown Wool=Коричнева вовна +Orange Wool=Помаранчева вовна +Red Wool=Червона вовна +Magenta Wool=Пурпурна вовна +Pink Wool=Рожева вовна diff --git a/data/games/garage/mods/wool/locale/wool.zh_CN.tr b/data/games/garage/mods/wool/locale/wool.zh_CN.tr new file mode 100644 index 0000000..caac9ee --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.zh_CN.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白羊毛 +Grey Wool=灰羊毛 +Dark Grey Wool=暗灰羊毛 +Black Wool=黑羊毛 +Violet Wool=紫羊毛 +Blue Wool=蓝羊毛 +Cyan Wool=青羊毛 +Dark Green Wool=暗绿羊毛 +Green Wool=绿羊毛 +Yellow Wool=黄羊毛 +Brown Wool=棕羊毛 +Orange Wool=橙羊毛 +Red Wool=红羊毛 +Magenta Wool=品红羊毛 +Pink Wool=粉红羊毛 diff --git a/data/games/garage/mods/wool/locale/wool.zh_TW.tr b/data/games/garage/mods/wool/locale/wool.zh_TW.tr new file mode 100644 index 0000000..290a1fe --- /dev/null +++ b/data/games/garage/mods/wool/locale/wool.zh_TW.tr @@ -0,0 +1,16 @@ +# textdomain: wool +White Wool=白羊毛 +Grey Wool=灰羊毛 +Dark Grey Wool=暗灰羊毛 +Black Wool=黑羊毛 +Violet Wool=紫羊毛 +Blue Wool=藍羊毛 +Cyan Wool=青羊毛 +Dark Green Wool=暗綠羊毛 +Green Wool=綠羊毛 +Yellow Wool=黃羊毛 +Brown Wool=棕羊毛 +Orange Wool=橙羊毛 +Red Wool=紅羊毛 +Magenta Wool=品紅羊毛 +Pink Wool=粉紅羊毛 diff --git a/data/games/garage/mods/wool/mod.conf b/data/games/garage/mods/wool/mod.conf new file mode 100644 index 0000000..a0ca3f0 --- /dev/null +++ b/data/games/garage/mods/wool/mod.conf @@ -0,0 +1,3 @@ +name = wool +description = Minetest Game mod: wool +depends = default, dye diff --git a/data/games/garage/mods/wool/textures/wool_black.png b/data/games/garage/mods/wool/textures/wool_black.png new file mode 100644 index 0000000..700d439 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_black.png differ diff --git a/data/games/garage/mods/wool/textures/wool_blue.png b/data/games/garage/mods/wool/textures/wool_blue.png new file mode 100644 index 0000000..a074986 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_blue.png differ diff --git a/data/games/garage/mods/wool/textures/wool_brown.png b/data/games/garage/mods/wool/textures/wool_brown.png new file mode 100644 index 0000000..2620dfd Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_brown.png differ diff --git a/data/games/garage/mods/wool/textures/wool_cyan.png b/data/games/garage/mods/wool/textures/wool_cyan.png new file mode 100644 index 0000000..395b6ac Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_cyan.png differ diff --git a/data/games/garage/mods/wool/textures/wool_dark_green.png b/data/games/garage/mods/wool/textures/wool_dark_green.png new file mode 100644 index 0000000..0e73999 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_dark_green.png differ diff --git a/data/games/garage/mods/wool/textures/wool_dark_grey.png b/data/games/garage/mods/wool/textures/wool_dark_grey.png new file mode 100644 index 0000000..7253696 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_dark_grey.png differ diff --git a/data/games/garage/mods/wool/textures/wool_green.png b/data/games/garage/mods/wool/textures/wool_green.png new file mode 100644 index 0000000..dcb663b Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_green.png differ diff --git a/data/games/garage/mods/wool/textures/wool_grey.png b/data/games/garage/mods/wool/textures/wool_grey.png new file mode 100644 index 0000000..2f4c338 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_grey.png differ diff --git a/data/games/garage/mods/wool/textures/wool_magenta.png b/data/games/garage/mods/wool/textures/wool_magenta.png new file mode 100644 index 0000000..5c2c4a7 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_magenta.png differ diff --git a/data/games/garage/mods/wool/textures/wool_orange.png b/data/games/garage/mods/wool/textures/wool_orange.png new file mode 100644 index 0000000..a059f36 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_orange.png differ diff --git a/data/games/garage/mods/wool/textures/wool_pink.png b/data/games/garage/mods/wool/textures/wool_pink.png new file mode 100644 index 0000000..8e90140 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_pink.png differ diff --git a/data/games/garage/mods/wool/textures/wool_red.png b/data/games/garage/mods/wool/textures/wool_red.png new file mode 100644 index 0000000..da12ecf Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_red.png differ diff --git a/data/games/garage/mods/wool/textures/wool_violet.png b/data/games/garage/mods/wool/textures/wool_violet.png new file mode 100644 index 0000000..d7d6783 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_violet.png differ diff --git a/data/games/garage/mods/wool/textures/wool_white.png b/data/games/garage/mods/wool/textures/wool_white.png new file mode 100644 index 0000000..88f1e2f Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_white.png differ diff --git a/data/games/garage/mods/wool/textures/wool_yellow.png b/data/games/garage/mods/wool/textures/wool_yellow.png new file mode 100644 index 0000000..2b0f048 Binary files /dev/null and b/data/games/garage/mods/wool/textures/wool_yellow.png differ diff --git a/data/games/garage/mods/xpanes/README.txt b/data/games/garage/mods/xpanes/README.txt new file mode 100644 index 0000000..7e2a1be --- /dev/null +++ b/data/games/garage/mods/xpanes/README.txt @@ -0,0 +1,32 @@ +Minetest Game mod: xpanes +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by xyz (MIT) +BlockMen (MIT) +sofar (MIT) +Various Minetest Game developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +xyz (CC BY-SA 3.0): + All textures not mentioned below. + +Gambit (CC BY-SA 3.0): + xpanes_bar.png + +paramat (CC BY-SA 3.0): + xpanes_bar_top.png + +Krock (CC0 1.0): + xpanes_edge.png + +TumeniNodes (CC BY-SA 3.0): + xpanes_door_steel_bar.png + xpanes_item_steel_bar.png + xpanes_trapdoor_steel_bar.png + xpanes_trapdoor_steel_bar_side.png + xpanes_steel_bar_door_close.ogg + xpanes_steel_bar_door_open.ogg diff --git a/data/games/garage/mods/xpanes/init.lua b/data/games/garage/mods/xpanes/init.lua new file mode 100644 index 0000000..a02dbfe --- /dev/null +++ b/data/games/garage/mods/xpanes/init.lua @@ -0,0 +1,261 @@ +-- xpanes/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator("xpanes") + + +local function is_pane(pos) + return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0 +end + +local function connects_dir(pos, name, dir) + local aside = vector.add(pos, minetest.facedir_to_dir(dir)) + if is_pane(aside) then + return true + end + + local connects_to = minetest.registered_nodes[name].connects_to + if not connects_to then + return false + end + local list = minetest.find_nodes_in_area(aside, aside, connects_to) + + if #list > 0 then + return true + end + + return false +end + +local function swap(pos, node, name, param2) + if node.name == name and node.param2 == param2 then + return + end + + minetest.swap_node(pos, {name = name, param2 = param2}) +end + +local function update_pane(pos) + if not is_pane(pos) then + return + end + local node = minetest.get_node(pos) + local name = node.name + if name:sub(-5) == "_flat" then + name = name:sub(1, -6) + end + + local any = node.param2 + local c = {} + local count = 0 + for dir = 0, 3 do + c[dir] = connects_dir(pos, name, dir) + if c[dir] then + any = dir + count = count + 1 + end + end + + if count == 0 then + swap(pos, node, name .. "_flat", any) + elseif count == 1 then + swap(pos, node, name .. "_flat", (any + 1) % 4) + elseif count == 2 then + if (c[0] and c[2]) or (c[1] and c[3]) then + swap(pos, node, name .. "_flat", (any + 1) % 4) + else + swap(pos, node, name, 0) + end + else + swap(pos, node, name, 0) + end +end + +minetest.register_on_placenode(function(pos, node) + if minetest.get_item_group(node, "pane") then + update_pane(pos) + end + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end +end) + +minetest.register_on_dignode(function(pos) + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end +end) + +xpanes = {} +function xpanes.register_pane(name, def) + for i = 1, 15 do + minetest.register_alias("xpanes:" .. name .. "_" .. i, "xpanes:" .. name .. "_flat") + end + + local flatgroups = table.copy(def.groups) + flatgroups.pane = 1 + minetest.register_node(":xpanes:" .. name .. "_flat", { + description = def.description, + drawtype = "nodebox", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + paramtype2 = "facedir", + tiles = { + def.textures[3], + def.textures[3], + def.textures[3], + def.textures[3], + def.textures[1], + def.textures[1] + }, + groups = flatgroups, + drop = "xpanes:" .. name .. "_flat", + sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha and "blend" or "clip", + node_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + selection_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + connect_sides = { "left", "right" }, + }) + + local groups = table.copy(def.groups) + groups.pane = 1 + groups.not_in_creative_inventory = 1 + minetest.register_node(":xpanes:" .. name, { + drawtype = "nodebox", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + description = def.description, + tiles = { + def.textures[3], + def.textures[3], + def.textures[1] + }, + groups = groups, + drop = "xpanes:" .. name .. "_flat", + sounds = def.sounds, + use_texture_alpha = def.use_texture_alpha and "blend" or "clip", + node_box = { + type = "connected", + fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}}, + connect_front = {{-1/32, -1/2, -1/2, 1/32, 1/2, -1/32}}, + connect_left = {{-1/2, -1/2, -1/32, -1/32, 1/2, 1/32}}, + connect_back = {{-1/32, -1/2, 1/32, 1/32, 1/2, 1/2}}, + connect_right = {{1/32, -1/2, -1/32, 1/2, 1/2, 1/32}}, + }, + connects_to = {"group:pane", "group:stone", "group:glass", "group:wood", "group:tree"}, + }) + + minetest.register_craft({ + output = "xpanes:" .. name .. "_flat 16", + recipe = def.recipe + }) +end + +xpanes.register_pane("pane", { + description = S("Glass Pane"), + textures = {"default_glass.png", "", "xpanes_edge.png"}, + inventory_image = "default_glass.png", + wield_image = "default_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3}, + recipe = { + {"default:glass", "default:glass", "default:glass"}, + {"default:glass", "default:glass", "default:glass"} + } +}) + +xpanes.register_pane("obsidian_pane", { + description = S("Obsidian Glass Pane"), + textures = {"default_obsidian_glass.png", "", "xpanes_edge_obsidian.png"}, + inventory_image = "default_obsidian_glass.png", + wield_image = "default_obsidian_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3}, + recipe = { + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass", "default:obsidian_glass"} + } +}) + +xpanes.register_pane("bar", { + description = S("Steel Bars"), + textures = {"xpanes_bar.png", "", "xpanes_bar_top.png"}, + inventory_image = "xpanes_bar.png", + wield_image = "xpanes_bar.png", + groups = {cracky=2}, + sounds = default.node_sound_metal_defaults(), + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } +}) + +minetest.register_lbm({ + name = "xpanes:gen2", + nodenames = {"group:pane"}, + action = function(pos, node) + update_pane(pos) + for i = 0, 3 do + local dir = minetest.facedir_to_dir(i) + update_pane(vector.add(pos, dir)) + end + end +}) + +-- Register steel bar doors and trapdoors + +if minetest.get_modpath("doors") then + + doors.register("xpanes:door_steel_bar", { + tiles = {{name = "xpanes_door_steel_bar.png", backface_culling = true}}, + description = S("Steel Bar Door"), + inventory_image = "xpanes_item_steel_bar.png", + protected = true, + groups = {node = 1, cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), + sound_open = "xpanes_steel_bar_door_open", + sound_close = "xpanes_steel_bar_door_close", + gain_open = 0.15, + gain_close = 0.13, + recipe = { + {"xpanes:bar_flat", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "xpanes:bar_flat"}, + }, + }) + + doors.register_trapdoor("xpanes:trapdoor_steel_bar", { + description = S("Steel Bar Trapdoor"), + inventory_image = "xpanes_trapdoor_steel_bar.png", + wield_image = "xpanes_trapdoor_steel_bar.png", + tile_front = "xpanes_trapdoor_steel_bar.png", + tile_side = "xpanes_trapdoor_steel_bar_side.png", + protected = true, + groups = {node = 1, cracky = 1, level = 2, door = 1}, + sounds = default.node_sound_metal_defaults(), + sound_open = "xpanes_steel_bar_door_open", + sound_close = "xpanes_steel_bar_door_close", + gain_open = 0.15, + gain_close = 0.13, + }) + + minetest.register_craft({ + output = "xpanes:trapdoor_steel_bar", + recipe = { + {"xpanes:bar_flat", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "xpanes:bar_flat"}, + } + }) +end diff --git a/data/games/garage/mods/xpanes/license.txt b/data/games/garage/mods/xpanes/license.txt new file mode 100644 index 0000000..c1f31e3 --- /dev/null +++ b/data/games/garage/mods/xpanes/license.txt @@ -0,0 +1,65 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 xyz +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2016 Auke Kok +Copyright (C) 2014-2016 Various Minetest Game developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 xyz +Copyright (C) 2013-2016 Gambit +Copyright (C) 2016 paramat +Copyright (C) 2019 TumeniNodes + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/data/games/garage/mods/xpanes/locale/template.txt b/data/games/garage/mods/xpanes/locale/template.txt new file mode 100644 index 0000000..08dfbba --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/template.txt @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane= +Obsidian Glass Pane= +Steel Bars= +Steel Bar Door= +Steel Bar Trapdoor= diff --git a/data/games/garage/mods/xpanes/locale/xpanes.de.tr b/data/games/garage/mods/xpanes/locale/xpanes.de.tr new file mode 100644 index 0000000..9852753 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.de.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Glasscheibe +Obsidian Glass Pane=Obsidianglasscheibe +Steel Bars=Stahlgitter +Steel Bar Door=Stahlgittertür +Steel Bar Trapdoor=Stahlgitterfalltür diff --git a/data/games/garage/mods/xpanes/locale/xpanes.eo.tr b/data/games/garage/mods/xpanes/locale/xpanes.eo.tr new file mode 100644 index 0000000..cfbbfb5 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.eo.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Vitra vitraĵo +Obsidian Glass Pane=Obsidiana vitra vitraĵo +Steel Bars=Ŝtalaj baraĵoj +Steel Bar Door=Ŝtala baraĵa pordo +Steel Bar Trapdoor=Ŝtala baraĵa plankpordo diff --git a/data/games/garage/mods/xpanes/locale/xpanes.es.tr b/data/games/garage/mods/xpanes/locale/xpanes.es.tr new file mode 100644 index 0000000..9902be7 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.es.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Panel de vidrio +Obsidian Glass Pane=Panel de vidrio de obsidiana +Steel Bars=Barras de acero +Steel Bar Door=Puerta de barras de acero +Steel Bar Trapdoor=Trampilla de barras de acero diff --git a/data/games/garage/mods/xpanes/locale/xpanes.fr.tr b/data/games/garage/mods/xpanes/locale/xpanes.fr.tr new file mode 100644 index 0000000..c751799 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.fr.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Panneau de verre +Obsidian Glass Pane=Panneau de verre d'obsidienne +Steel Bars=Barreaux d'acier +Steel Bar Door=Porte en barreaux d'acier +Steel Bar Trapdoor=Trappe en barreaux d'acier diff --git a/data/games/garage/mods/xpanes/locale/xpanes.id.tr b/data/games/garage/mods/xpanes/locale/xpanes.id.tr new file mode 100644 index 0000000..906cc0f --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.id.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Panel Kaca +Obsidian Glass Pane=Panel Kaca Obsidian +Steel Bars=Batang Baja +Steel Bar Door=Pintu Batang Baja +Steel Bar Trapdoor=Pintu Kolong Batang Baja diff --git a/data/games/garage/mods/xpanes/locale/xpanes.it.tr b/data/games/garage/mods/xpanes/locale/xpanes.it.tr new file mode 100644 index 0000000..63c8b62 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.it.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Pannello di vetro +Obsidian Glass Pane=Pannello di vetro d'ossidiana +Steel Bars=Sbarre d'acciaio +Steel Bar Door=Porta con sbarre d'acciaio +Steel Bar Trapdoor=Botola con sbarre d'acciaio diff --git a/data/games/garage/mods/xpanes/locale/xpanes.ja.tr b/data/games/garage/mods/xpanes/locale/xpanes.ja.tr new file mode 100644 index 0000000..06e0bed --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.ja.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=板ガラス +Obsidian Glass Pane=黒曜石の板ガラス +Steel Bars=鉄棒の柵 +Steel Bar Door=鉄棒のドア +Steel Bar Trapdoor=鉄棒のトラップドア diff --git a/data/games/garage/mods/xpanes/locale/xpanes.jbo.tr b/data/games/garage/mods/xpanes/locale/xpanes.jbo.tr new file mode 100644 index 0000000..333b531 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.jbo.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=lo blaci plita +Obsidian Glass Pane=lo je'erma'ablaci blaci plita +Steel Bars=lo gasta garna +Steel Bar Door=lo gasta garna vrogai +Steel Bar Trapdoor=lo gasta garna lolvrogai diff --git a/data/games/garage/mods/xpanes/locale/xpanes.lv.tr b/data/games/garage/mods/xpanes/locale/xpanes.lv.tr new file mode 100644 index 0000000..c75849c --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.lv.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Stikla panelis +Obsidian Glass Pane=Obsidiāna stikla panelis +Steel Bars=Tērauda režģis +Steel Bar Door=Tērauda režģa durvis +Steel Bar Trapdoor=Tērauda režģa lūka diff --git a/data/games/garage/mods/xpanes/locale/xpanes.ms.tr b/data/games/garage/mods/xpanes/locale/xpanes.ms.tr new file mode 100644 index 0000000..dedfefa --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.ms.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Kaca Tingkap +Obsidian Glass Pane=Kaca Tingkap Obsidia +Steel Bars=Jeriji Keluli +Steel Bar Door=Pintu Jeriji Keluli +Steel Bar Trapdoor=Pintu Kolong Jeriji Keluli diff --git a/data/games/garage/mods/xpanes/locale/xpanes.pl.tr b/data/games/garage/mods/xpanes/locale/xpanes.pl.tr new file mode 100644 index 0000000..0ebb386 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.pl.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Szyba +Obsidian Glass Pane=Obsydianowa szyba +Steel Bars=Stalowe kraty +Steel Bar Door=Drzwi ze stalowych krat +Steel Bar Trapdoor=Właz ze stalowych krat diff --git a/data/games/garage/mods/xpanes/locale/xpanes.pt_BR.tr b/data/games/garage/mods/xpanes/locale/xpanes.pt_BR.tr new file mode 100644 index 0000000..c1ca3b2 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Painel de Vidro +Obsidian Glass Pane=Painel de Vidro de Obsidiana +Steel Bars=Barras de Aço +Steel Bar Door=Porta de Barras de Aço +Steel Bar Trapdoor=Alçapão de Barras de Aço diff --git a/data/games/garage/mods/xpanes/locale/xpanes.ru.tr b/data/games/garage/mods/xpanes/locale/xpanes.ru.tr new file mode 100644 index 0000000..cd7173e --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.ru.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Стеклянная панель +Obsidian Glass Pane=Панель из обсидианового стекла +Steel Bars=Стальная решетка +Steel Bar Door=Стальная решётчатая дверь +Steel Bar Trapdoor=Стальной решётчатый люк diff --git a/data/games/garage/mods/xpanes/locale/xpanes.sk.tr b/data/games/garage/mods/xpanes/locale/xpanes.sk.tr new file mode 100644 index 0000000..0d07e08 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.sk.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Tabuľa skla +Obsidian Glass Pane=Tabuľa obsidiánového skla +Steel Bars=Oceľové mreže +Steel Bar Door=Dvere z oceľových mreží +Steel Bar Trapdoor=Padajúce dvere z oceľových mreží diff --git a/data/games/garage/mods/xpanes/locale/xpanes.sv.tr b/data/games/garage/mods/xpanes/locale/xpanes.sv.tr new file mode 100644 index 0000000..7b615dd --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.sv.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Glasruta +Obsidian Glass Pane=Obsidianglasruta +Steel Bars=Stålgaller +Steel Bar Door=Stålgallerdörr +Steel Bar Trapdoor=Stålgallerfallucka diff --git a/data/games/garage/mods/xpanes/locale/xpanes.uk.tr b/data/games/garage/mods/xpanes/locale/xpanes.uk.tr new file mode 100644 index 0000000..41033bd --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.uk.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=Скляна панель +Obsidian Glass Pane=Панель з обсидіанового скла +Steel Bars=Ґрати +Steel Bar Door=Двері з ґратами +Steel Bar Trapdoor=Люк з ґратами diff --git a/data/games/garage/mods/xpanes/locale/xpanes.zh_CN.tr b/data/games/garage/mods/xpanes/locale/xpanes.zh_CN.tr new file mode 100644 index 0000000..7b1871c --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.zh_CN.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=玻璃窗 +Obsidian Glass Pane=黑曜石玻璃窗 +Steel Bars=钢筋 +Steel Bar Door=钢筋门 +Steel Bar Trapdoor=钢筋活板门 diff --git a/data/games/garage/mods/xpanes/locale/xpanes.zh_TW.tr b/data/games/garage/mods/xpanes/locale/xpanes.zh_TW.tr new file mode 100644 index 0000000..97ee7a2 --- /dev/null +++ b/data/games/garage/mods/xpanes/locale/xpanes.zh_TW.tr @@ -0,0 +1,6 @@ +# textdomain: xpanes +Glass Pane=玻璃窗 +Obsidian Glass Pane=黑曜石玻璃窗 +Steel Bars=鋼筋 +Steel Bar Door=鋼筋門 +Steel Bar Trapdoor=鋼筋活板門 diff --git a/data/games/garage/mods/xpanes/mod.conf b/data/games/garage/mods/xpanes/mod.conf new file mode 100644 index 0000000..dcb0716 --- /dev/null +++ b/data/games/garage/mods/xpanes/mod.conf @@ -0,0 +1,4 @@ +name = xpanes +description = Minetest Game mod: xpanes +depends = default +optional_depends = doors diff --git a/data/games/garage/mods/xpanes/sounds/xpanes_steel_bar_door_close.ogg b/data/games/garage/mods/xpanes/sounds/xpanes_steel_bar_door_close.ogg new file mode 100644 index 0000000..0620bfb Binary files /dev/null and b/data/games/garage/mods/xpanes/sounds/xpanes_steel_bar_door_close.ogg differ diff --git a/data/games/garage/mods/xpanes/sounds/xpanes_steel_bar_door_open.ogg b/data/games/garage/mods/xpanes/sounds/xpanes_steel_bar_door_open.ogg new file mode 100644 index 0000000..d159be9 Binary files /dev/null and b/data/games/garage/mods/xpanes/sounds/xpanes_steel_bar_door_open.ogg differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_bar.png b/data/games/garage/mods/xpanes/textures/xpanes_bar.png new file mode 100644 index 0000000..3ea62a9 Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_bar.png differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_bar_top.png b/data/games/garage/mods/xpanes/textures/xpanes_bar_top.png new file mode 100644 index 0000000..2955d72 Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_bar_top.png differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_door_steel_bar.png b/data/games/garage/mods/xpanes/textures/xpanes_door_steel_bar.png new file mode 100644 index 0000000..39f45c3 Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_door_steel_bar.png differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_edge.png b/data/games/garage/mods/xpanes/textures/xpanes_edge.png new file mode 100644 index 0000000..5768d66 Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_edge.png differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_edge_obsidian.png b/data/games/garage/mods/xpanes/textures/xpanes_edge_obsidian.png new file mode 100644 index 0000000..abdd14e Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_edge_obsidian.png differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_item_steel_bar.png b/data/games/garage/mods/xpanes/textures/xpanes_item_steel_bar.png new file mode 100644 index 0000000..46e4d9c Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_item_steel_bar.png differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_trapdoor_steel_bar.png b/data/games/garage/mods/xpanes/textures/xpanes_trapdoor_steel_bar.png new file mode 100644 index 0000000..a56c5ee Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_trapdoor_steel_bar.png differ diff --git a/data/games/garage/mods/xpanes/textures/xpanes_trapdoor_steel_bar_side.png b/data/games/garage/mods/xpanes/textures/xpanes_trapdoor_steel_bar_side.png new file mode 100644 index 0000000..a71231e Binary files /dev/null and b/data/games/garage/mods/xpanes/textures/xpanes_trapdoor_steel_bar_side.png differ diff --git a/data/games/garage/schematic_tables.txt b/data/games/garage/schematic_tables.txt new file mode 100644 index 0000000..e8765d5 --- /dev/null +++ b/data/games/garage/schematic_tables.txt @@ -0,0 +1,2228 @@ +Minetest Game schematic tables +============================== + +This document acts as the official record of all schematic tables used in +Minetest Game, and should be updated by any commit that adds a table type +schematic. + +The following tables are for pasting into mods that contain a function to +convert the Lua tables into .mts files. Such mods often have two functions to +process two formats of the 'data' table: + +The standard table format is described in the 'Schematic specifier' section of +the lua_api.txt file in Luanti. +The 'data' table appears as a sequence of vertical slices through the structure +the schematic describes. +Each XY-plane slice has the X-rows formatted in order of increasing Y, so the +slices of the structure visually appear upside-down in the table. +In this document this format is used where 'mts_save()' appears. + +The transformed table format was created to be easier to work with. +Each XY-plane slice has the X-rows formatted in order of decreasing Y, so the +slices of the structure visually appear upright in the table. +In this document this format is used where 'mts_save_up()' appears. + + +-- This node will not replace existing world nodes + +local _ = {name = "air", prob = 0} + + +-- Mapgen Apple tree + +local M = {name = "default:leaves", prob = 255} +local N = {name = "default:leaves", prob = 223} +local F = {name = "default:apple", prob = 63} +local Y = {name = "default:tree", prob = 255, force_place = true} +local T = {name = "default:tree", prob = 255} + +mts_save("apple_tree", { + size = {x = 7, y = 8, z = 7}, + data = { + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, Y, _, _, M, N, + _, M, M, _, Y, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, + + _, _, _, Y, _, _, _, + _, _, _, Y, _, _, _, + _, _, _, Y, _, _, _, + _, _, _, Y, _, _, _, + M, F, _, Y, _, F, M, + N, M, _, _, _, M, N, + _, M, M, M, M, M, _, + _, _, N, M, N, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, _, _, Y, M, N, + _, M, Y, _, M, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + }, +}) + + +-- Apple tree from sapling + +mts_save("apple_tree_from_sapling", { + size = {x = 7, y = 8, z = 7}, + data = { + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, T, _, _, M, N, + _, M, M, _, T, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, + + _, _, _, T, _, _, _, + _, _, _, Y, _, _, _, + _, _, _, T, _, _, _, + _, _, _, T, _, _, _, + M, F, _, T, _, F, M, + N, M, _, _, _, M, N, + _, M, M, M, M, M, _, + _, _, N, M, N, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, M, _, _, T, M, N, + _, M, T, _, M, M, _, + _, N, M, M, M, N, _, + _, _, _, N, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, F, M, M, _, + _, N, M, M, M, N, _, + _, _, N, M, N, _, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, M, N, _, _, + _, _, _, N, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + }, +}) + + +-- Mapgen Jungle tree + +local L = {name = "default:jungleleaves", prob = 255} +local N = {name = "default:jungleleaves", prob = 223} +local M = {name = "default:jungleleaves", prob = 191} +local B = {name = "default:jungletree", prob = 255, force_place = true} +local Y = {name = "default:jungletree", prob = 191, force_place = true} +local U = {name = "default:jungletree", prob = 127, force_place = true} +local I = {name = "default:jungletree", prob = 255} + +mts_save("jungle_tree", { + size = {x = 5, y = 17, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, L, N, _, _, + _, _, N, L, N, + _, _, _, _, _, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, B, L, _, _, + _, _, L, B, L, + _, _, _, _, _, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, B, B, B, _, + _, B, B, B, _, + _, U, B, U, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, L, N, + N, L, B, _, _, + N, L, B, _, _, + _, _, B, L, N, + _, _, B, L, N, + _, _, B, _, _, + N, L, L, L, N, + N, L, L, L, N, + _, N, L, N, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + L, B, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + N, L, N, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + }, + yslice_prob = { + {ypos=6, prob=191}, + {ypos=7, prob=191}, + {ypos=8, prob=191}, + {ypos=9, prob=191}, + {ypos=10, prob=191}, + }, +}) + + +-- Jungle tree from sapling + +local B = {name = "default:jungletree", prob = 255} +local C = {name = "default:jungletree", prob = 255, force_place = true} +local Y = {name = "default:jungletree", prob = 191} +local U = {name = "default:jungletree", prob = 127} + +mts_save("jungle_tree_from_sapling", { + size = {x = 5, y = 17, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, L, N, _, _, + _, _, N, L, N, + _, _, _, _, _, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, B, L, _, _, + _, _, L, B, L, + _, _, _, _, _, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, B, B, B, _, + _, B, C, B, _, + _, U, B, U, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, L, N, + N, L, B, _, _, + N, L, B, _, _, + _, _, B, L, N, + _, _, B, L, N, + _, _, B, _, _, + N, L, L, L, N, + N, L, L, L, N, + _, N, L, N, _, + + _, _, B, _, _, + _, _, B, _, _, + _, _, U, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + L, B, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, L, B, L, + _, _, _, _, _, + N, B, L, B, N, + N, L, L, L, N, + _, N, N, N, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + N, L, N, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, N, L, N, + _, _, _, _, _, + M, N, N, N, M, + M, N, N, N, M, + _, _, _, _, _, + }, + yslice_prob = { + {ypos=6, prob=191}, + {ypos=7, prob=191}, + {ypos=8, prob=191}, + {ypos=9, prob=191}, + {ypos=10, prob=191}, + }, +}) + + +-- Mapgen Pine tree + +local L = {name = "default:pine_needles", prob = 255} +local M = {name = "default:pine_needles", prob = 223} +local N = {name = "default:pine_needles", prob = 191} +local T = {name = "default:pine_tree", prob = 255, force_place = true} +local B = {name = "default:pine_tree", prob = 255} + +mts_save("pine_tree", { + size = {x = 5, y = 16, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 9, prob = 127}, + {ypos = 12, prob = 127}, + }, +}) + + +-- Pine tree from sapling + +local T = {name = "default:pine_tree", prob = 255} +local U = {name = "default:pine_tree", prob = 255, force_place = true} + +mts_save("pine_tree_from_sapling", { + size = {x = 5, y = 16, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, U, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 5, prob = 127}, + {ypos = 9, prob = 127}, + {ypos = 12, prob = 127}, + }, +}) + + +-- Snowy pine tree from sapling + +local T = {name = "default:pine_tree", prob = 255} +local U = {name = "default:pine_tree", prob = 255, force_place = true} +local L = {name = "default:pine_needles", prob = 255} +local S = {name = "default:snow", prob = 255} + +mts_save("snowy_pine_tree_from_sapling", { + size = {x = 5, y = 16, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + L, L, L, L, L, + S, S, S, S, S, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + L, L, _, L, M, + S, L, L, L, _, + _, _, _, _, _, + _, L, _, L, L, + _, L, L, L, S, + _, S, S, S, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, U, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + _, L, T, L, _, + _, _, T, _, _, + L, _, T, _, L, + S, L, L, L, S, + _, S, L, S, _, + _, _, S, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + M, L, _, L, M, + _, L, L, L, _, + _, _, _, _, _, + L, L, _, L, L, + S, L, L, L, S, + _, S, S, S, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, L, + _, _, _, _, S, + _, _, _, _, _, + L, L, L, L, _, + S, S, S, S, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 8, prob = 127}, + {ypos = 11, prob = 127}, + }, +}) + + +-- Mapgen Acacia tree + +local L = {name = "default:acacia_leaves", prob = 255} +local M = {name = "default:acacia_leaves", prob = 223} +local T = {name = "default:acacia_tree", prob = 255, force_place = true} + +mts_save("acacia_tree", { + size = {x = 9, y = 9, z = 9}, + data = { + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, L, L, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, T, _, _, _, _, _, _, + M, L, L, M, _, _, T, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, T, _, _, + _, _, T, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, M, M, M, M, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Acacia tree from sapling + +local T = {name = "default:acacia_tree", prob = 255} +local U = {name = "default:acacia_tree", prob = 255, force_place = true} + +mts_save("acacia_tree_from_sapling", { + size = {x = 9, y = 9, z = 9}, + data = { + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, L, L, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, T, _, _, _, _, _, _, + M, L, L, M, _, _, T, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + M, M, M, M, _, _, _, _, _, + _, _, _, _, M, L, L, L, M, + + _, _, _, _, T, _, _, _, _, + _, _, _, _, U, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, T, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + M, M, M, M, M, M, M, M, M, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, T, _, _, _, + _, _, _, T, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, T, _, _, + _, _, T, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, L, L, M, + M, L, L, L, M, _, _, _, _, + + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, + _, _, _, _, _, M, M, M, M, + M, M, M, M, M, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Mapgen Aspen tree + +local T = {name = "default:aspen_tree", prob = 255, force_place = true} +local B = {name = "default:aspen_tree", prob = 255} +local L = {name = "default:aspen_leaves", prob = 255} +local M = {name = "default:aspen_leaves", prob = 223} +local N = {name = "default:aspen_leaves", prob = 127} + +mts_save("aspen_tree", { + size = {x = 5, y = 14, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, L, T, L, _, + L, L, T, L, L, + _, L, T, L, _, + L, L, T, L, L, + _, L, T, L, _, + L, L, T, L, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 8, prob = 127}, + {ypos = 10, prob = 127}, + }, +}) + + +-- Aspen tree from sapling + +mts_save("aspen_tree_from_sapling", { + size = {x = 5, y = 14, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, B, _, _, + _, _, T, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, _, B, _, _, + _, L, B, L, _, + L, L, B, L, L, + _, L, B, L, _, + L, L, B, L, L, + _, L, B, L, _, + L, L, B, L, L, + _, L, L, L, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + M, L, L, L, M, + _, M, L, M, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + N, M, L, M, N, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + {ypos = 8, prob = 127}, + {ypos = 10, prob = 127}, + }, +}) + + +-- Mapgen emergent jungle tree + +local L = {name = "default:jungleleaves", prob = 255} +local N = {name = "default:jungleleaves", prob = 223} +local M = {name = "default:jungleleaves", prob = 127} +local B = {name = "default:jungletree", prob = 255, force_place = true} +local U = {name = "default:jungletree", prob = 127, force_place = true} + +mts_save("emergent_jungle_tree", { + size = {x = 7, y = 37, z = 7}, + data = { + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, N, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + _, _, _, B, N, N, N, + N, N, B, B, _, _, _, + _, _, _, B, _, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, B, N, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + M, _, B, _, B, _, M, + N, _, _, _, _, _, N, + N, L, _, _, _, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, B, N, N, + _, _, _, B, _, _, _, + N, N, B, B, _, _, _, + _, _, _, B, N, N, N, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + }, + yslice_prob = { + {ypos = 13, prob = 127}, + {ypos = 14, prob = 127}, + {ypos = 15, prob = 127}, + {ypos = 16, prob = 127}, + {ypos = 17, prob = 127}, + {ypos = 18, prob = 127}, + {ypos = 19, prob = 127}, + {ypos = 20, prob = 127}, + {ypos = 21, prob = 127}, + {ypos = 22, prob = 127}, + {ypos = 23, prob = 127}, + {ypos = 24, prob = 127}, + }, +}) + + +-- Emergent jungle tree from sapling + +local L = {name = "default:jungleleaves", prob = 255} +local N = {name = "default:jungleleaves", prob = 223} +local M = {name = "default:jungleleaves", prob = 127} +local S = {name = "default:jungletree", prob = 255, force_place = true} +local B = {name = "default:jungletree", prob = 255} +local U = {name = "default:jungletree", prob = 127} + +mts_save("emergent_jungle_tree_from_sapling", { + size = {x = 7, y = 37, z = 7}, + data = { + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, N, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + _, _, _, B, N, N, N, + N, N, B, B, _, _, _, + _, _, _, B, _, _, _, + _, _, _, B, B, N, N, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, B, B, B, _, _, + _, _, B, S, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, B, N, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + N, B, B, B, B, _, _, + _, _, B, B, B, _, _, + M, _, B, _, B, _, M, + N, _, _, _, _, _, N, + N, L, _, _, _, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, B, B, B, B, B, _, + _, U, B, B, B, U, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, B, B, B, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, B, N, N, + _, _, _, B, _, _, _, + N, N, B, B, _, _, _, + _, _, _, B, N, N, N, + _, _, _, B, _, _, _, + _, _, N, B, N, _, _, + _, _, _, B, _, _, _, + N, N, N, B, _, _, _, + _, _, _, B, _, _, _, + M, _, B, B, B, _, M, + N, _, B, _, B, _, N, + N, L, L, _, L, L, N, + N, L, L, L, L, L, N, + _, N, L, L, L, N, _, + + _, _, _, _, _, _, _, + _, _, B, _, B, _, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, B, B, _, B, B, _, + _, U, B, _, B, U, _, + _, _, U, _, U, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, B, N, + _, _, _, _, _, _, _, + N, B, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, B, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + M, _, _, _, _, _, M, + N, L, _, _, _, L, N, + N, B, L, L, L, B, N, + N, L, L, L, L, L, N, + _, N, N, N, N, N, _, + + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + B, _, _, _, _, _, B, + U, _, _, _, _, _, U, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, N, N, N, + _, _, _, _, _, _, _, + N, N, N, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, N, N, N, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, _, _, _, _, _, _, + _, M, M, M, M, M, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, N, N, N, N, N, _, + _, _, _, _, _, _, _, + }, + yslice_prob = { + {ypos = 13, prob = 127}, + {ypos = 14, prob = 127}, + {ypos = 15, prob = 127}, + {ypos = 16, prob = 127}, + {ypos = 17, prob = 127}, + {ypos = 18, prob = 127}, + {ypos = 19, prob = 127}, + {ypos = 20, prob = 127}, + {ypos = 21, prob = 127}, + {ypos = 22, prob = 127}, + {ypos = 23, prob = 127}, + {ypos = 24, prob = 127}, + }, +}) + + +-- Mapgen small pine tree + +local L = {name = "default:pine_needles", prob = 255} +local M = {name = "default:pine_needles", prob = 223} +local N = {name = "default:pine_needles", prob = 191} +local T = {name = "default:pine_tree", prob = 255, force_place = true} +local B = {name = "default:pine_tree", prob = 255} +local S = {name = "default:snow", prob = 255} + +mts_save("small_pine_tree", { + size = {x = 5, y = 12, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + _, _, T, _, _, + L, _, T, _, L, + L, L, T, L, L, + _, L, T, L, _, + _, L, T, L, _, + _, L, T, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Small pine tree from sapling + +mts_save("small_pine_tree_from_sapling", { + size = {x = 5, y = 12, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, B, _, _, + _, _, T, _, _, + _, _, B, _, _, + _, _, B, _, _, + L, _, B, _, L, + L, L, B, L, L, + _, L, B, L, _, + _, L, B, L, _, + _, L, B, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + _, L, L, L, _, + _, L, L, L, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, _, L, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + {ypos = 4, prob = 127}, + }, +}) + + +-- Snowy small pine tree from sapling + +mts_save("snowy_small_pine_tree_from_sapling", { + size = {x = 5, y = 13, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + S, L, L, L, S, + _, L, L, L, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, L, _, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, B, _, _, + _, _, T, _, _, + _, _, B, _, _, + _, _, B, _, _, + L, _, B, _, L, + L, L, B, L, L, + S, L, B, L, S, + _, L, B, L, _, + _, L, B, L, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, L, _, _, + _, _, S, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + L, L, _, L, L, + S, L, L, L, S, + _, L, L, L, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, L, _, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, L, L, L, _, + _, S, L, S, _, + _, _, S, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + }, +}) + + +-- Apple tree log + +mts_save("apple_log", { + size = {x = 4, y = 2, z = 1}, + data = { + {name = "default:tree", param2 = 12, prob = 127}, + {name = "default:tree", param2 = 12}, + {name = "default:tree", param2 = 12}, + {name = "default:tree", param2 = 12}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Jungletree log + +mts_save("jungle_log", { + size = {x = 5, y = 2, z = 1}, + data = { + {name = "default:jungletree", param2 = 12, prob = 127}, + {name = "default:jungletree", param2 = 12}, + {name = "default:jungletree", param2 = 12}, + {name = "default:jungletree", param2 = 12}, + {name = "default:jungletree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_brown", prob = 127}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Pine tree log + +mts_save("pine_log", { + size = {x = 5, y = 2, z = 1}, + data = { + {name = "default:pine_tree", param2 = 12, prob = 127}, + {name = "default:pine_tree", param2 = 12}, + {name = "default:pine_tree", param2 = 12}, + {name = "default:pine_tree", param2 = 12}, + {name = "default:pine_tree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_red", prob = 63}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Acacia tree log + +mts_save("acacia_log", { + size = {x = 5, y = 1, z = 1}, + data = { + {name = "default:acacia_tree", param2 = 12, prob = 127}, + {name = "default:acacia_tree", param2 = 12}, + {name = "default:acacia_tree", param2 = 12}, + {name = "default:acacia_tree", param2 = 12}, + {name = "default:acacia_tree", param2 = 12, prob = 127}, + }, +}) + + +-- Aspen tree log + +mts_save("aspen_log", { + size = {x = 5, y = 2, z = 1}, + data = { + {name = "default:aspen_tree", param2 = 12, prob = 127}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12}, + {name = "default:aspen_tree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "flowers:mushroom_red", prob = 63}, + {name = "flowers:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + }, +}) + + +-- Large cactus + +local C = {name = "default:cactus", prob = 255} +local R = {name = "default:cactus", prob = 255, force_place = true} +local E = {name = "default:cactus", prob = 127} + +mts_save("large_cactus", { + size = {x = 5, y = 7, z = 5}, + data = { + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, C, _, _, + _, _, R, _, _, + _, _, C, _, _, + C, C, C, C, C, + C, _, C, _, C, + E, _, C, _, E, + _, _, C, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + _, _, _, _, _, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + }, +}) + + +-- Papyrus + +mts_save("papyrus_on_dirt", { + size = {x = 1, y = 7, z = 1}, + data = { + {name = "default:dirt", prob = 255, force_place = true}, + {name = "default:dirt", prob = 255, force_place = true}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + }, +}) + +mts_save("papyrus_on_dry_dirt", { + size = {x = 1, y = 7, z = 1}, + data = { + {name = "default:dry_dirt", prob = 255, force_place = true}, + {name = "default:dry_dirt", prob = 255, force_place = true}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + {name = "default:papyrus", prob = 255}, + }, + yslice_prob = { + {ypos = 2, prob = 127}, + {ypos = 3, prob = 127}, + }, +}) + + +-- Bush + +local L = {name = "default:bush_leaves", prob = 255} +local M = {name = "default:bush_leaves", prob = 191} +local N = {name = "default:bush_leaves", prob = 127} +local S = {name = "default:bush_stem", prob = 255, force_place = true} + +mts_save("bush", { + size = {x = 3, y = 3, z = 3}, + data = { + _, _, _, + M, L, M, + N, M, N, + + _, _, _, + L, S, L, + M, L, M, + + _, _, _, + M, L, M, + N, M, N, + }, +}) + + +-- Blueberry bush + +local L = {name = "default:blueberry_bush_leaves_with_berries", prob = 255, force_place = true} +local M = {name = "default:blueberry_bush_leaves_with_berries", prob = 223} +local N = {name = "default:blueberry_bush_leaves_with_berries", prob = 95} + +mts_save("blueberry_bush", { + size = {x = 3, y = 1, z = 3}, + data = { + N, M, N, + + M, L, M, + + N, M, N, + }, +}) + + +-- Acacia bush + +local L = {name = "default:acacia_bush_leaves", prob = 255} +local M = {name = "default:acacia_bush_leaves", prob = 191} +local N = {name = "default:acacia_bush_leaves", prob = 127} +local S = {name = "default:acacia_bush_stem", prob = 255, force_place = true} + +mts_save("acacia_bush", { + size = {x = 3, y = 3, z = 3}, + data = { + _, _, _, + N, M, N, + M, L, M, + + _, _, _, + M, S, M, + L, L, L, + + _, _, _, + N, M, N, + M, L, M, + }, +}) + + +-- Pine bush + +local L = {name = "default:pine_bush_needles", prob = 255} +local M = {name = "default:pine_bush_needles", prob = 191} +local N = {name = "default:pine_bush_needles", prob = 127} +local S = {name = "default:pine_bush_stem", prob = 255, force_place = true} + +mts_save("pine_bush", { + size = {x = 3, y = 3, z = 3}, + data = { + _, _, _, + M, L, M, + N, M, N, + + _, _, _, + L, S, L, + M, L, M, + + _, _, _, + M, L, M, + N, M, N, + }, +}) diff --git a/data/games/garage/screenshot.png b/data/games/garage/screenshot.png index 7324883..d648ea4 100644 Binary files a/data/games/garage/screenshot.png and b/data/games/garage/screenshot.png differ diff --git a/data/games/garage/settingtypes.txt b/data/games/garage/settingtypes.txt index c436564..7f72aff 100644 --- a/data/games/garage/settingtypes.txt +++ b/data/games/garage/settingtypes.txt @@ -1,32 +1,81 @@ -# If enabled, nodes won't be used up when placed. -# Note: This behavior can also be toggled in-game with the /infplace command. -# -# - true: enabled -# - false: disabled -# - auto: only enabled when Creative Mode is enabled (default) -devtest_infplace (Infinite node placement) enum auto true,false,auto +# This file contains settings of minetest_game that can be changed in +# minetest.conf -# If enabled, new players receive some initial items when joining for the first time. -give_initial_stuff (Give initial stuff) bool true +# In creative mode players are able to dig all kind of blocks nearly +# instantly, and have access to unlimited resources. +# Some of the functionality is only available if this setting is present +# at startup. +creative_mode (Creative mode) bool false -# If enabled, automated tests of the Lua API such as player health, crafting and PseudoRandom will be performed on startup. -devtest_unittests_autostart (Perform unit tests) bool false +# Flammable nodes will be ignited by nearby igniters. Spreading fire may +# cause severe destruction. +# Spreading fire nodes will disappear when fire is disabled, but +# 'permanent_flame' nodes are unaffected. +enable_fire (Fire) bool true -# If enabled, the game will use all mapgen aliases for the v6 mapgen. -# If disabled, it will only use a minimal set of mapgen aliases. -# If enabled, there should be biome-specific tree, leaves and ground nodes. If disabled, stuff should use fallback nodes (like stone instead of desert stone). -# -# Many mapgen aliases have fallback values when no value is provided. Having this setting disabled can be useful to test whether those fallback values are functional. -devtest_v6_mapgen_aliases (Use all v6 mapgen aliases) bool false +# Enable flame sound. +flame_sound (Flame sound) bool true -# If enabled, the game will use dungeon stairs by enabling the corresponding mapgen aliases. -# -# Disabling this setting can be useful to test whether dungeons still work when stairs are not defined. -devtest_dungeon_stairs (Generate dungeon stairs) bool false +# Enable lavacooling. +enable_lavacooling (Lavacooling) bool true -# If enabled, the mapgen alias 'mapgen_mossycobble' will be used. This should enable random mossy cobblestone in dungeons. -# If disabled, it won't be used. The engine should fall back to cobble instead. -devtest_dungeon_mossycobble (Generate mossy cobblestone) bool false +# If enabled, steel tools, torches and cobblestone will be given to new +# players. +give_initial_stuff (Give initial items) bool false -# If enabled, some very basic biomes will be registered. -devtest_register_biomes (Register biomes) bool true +# If enabled, players respawn at the bed they last lay on instead of normal +# spawn. +# This setting is only read at startup. +enable_bed_respawn (Respawn at bed) bool true + +# If enabled, the night can be skipped if more than half of the players are +# in beds. +enable_bed_night_skip (Skip night when sleeping) bool true + +# If enabled, fences and walls cannot be jumped over. +enable_fence_tall (Tall fences and walls) bool false + +# When TNT explodes, it destroys nearby nodes and damages nearby players. +# This setting is disabled by default on servers. +enable_tnt (TNT) bool true + +# The radius in which nodes will be destroyed by a TNT explosion. +tnt_radius (TNT radius) int 3 0 + +# Sets the behaviour of the inventory items when a player dies. +# bones: Store items in a bone node but drop items if inside protected area. +# drop: Drop items on the ground. +# keep: Player keeps items. +bones_mode (Bones mode) enum bones bones,drop,keep + +# The time in seconds after which the bones of a dead player can be looted +# by everyone. +# Setting this to 0 will disable sharing of bones completely. +share_bones_time (Bones share time) int 1200 0 + +# How much earlier the bones of a dead player can be looted by +# everyone if the player dies in a protected area they don't own. +# 0 to disable. By default it is "share_bones_time" divide by four. +share_bones_time_early (Earlier bones share time) int 300 0 + +# Inform player of condition and location of new bones. +bones_position_message (Inform player about bones) bool false + +# Replaces old stairs with new ones. Only required for older worlds. +enable_stairs_replace_abm (Replace old stairs) bool false + +# If enabled, use the engine's spawn search which does not check for a +# suitable starting biome. +engine_spawn (Use engine spawn search) bool false + +# Whether river water source nodes create flowing sounds. +# Helps rivers create more sound, especially on level sections. +river_source_sounds (River source node sounds) bool false + +# If enabled, the 'weather' mod will control cloud parameters, shadow intensity, +# bloom and volumetric lighting. +# Non-functional in V6 or Singlenode mapgens. +enable_weather (Enable weather) bool true + +# If enabled, non-player actions are logged +log_non_player_actions (Log non-player action) bool false diff --git a/data/games/garage/utils/optimize_textures.sh b/data/games/garage/utils/optimize_textures.sh new file mode 100644 index 0000000..4dbe93a --- /dev/null +++ b/data/games/garage/utils/optimize_textures.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# Colors with 0 alpha need to be preserved, because opaque leaves ignore alpha. +# For that purpose, the use of indexed colors is disabled (-nc). + +find .. -name '*.png' -print0 | xargs -0 optipng -o7 -zm1-9 -nc -strip all -clobber diff --git a/data/games/garage/utils/test/minetest.conf b/data/games/garage/utils/test/minetest.conf new file mode 100644 index 0000000..395319b --- /dev/null +++ b/data/games/garage/utils/test/minetest.conf @@ -0,0 +1,2 @@ +minetest_game_smoke_test = true +random_mod_load_order = true diff --git a/data/games/garage/utils/test/run.sh b/data/games/garage/utils/test/run.sh new file mode 100755 index 0000000..fb4fa39 --- /dev/null +++ b/data/games/garage/utils/test/run.sh @@ -0,0 +1,19 @@ +#!/bin/bash -e +world=$(mktemp -d) +trap 'rm -rf "$world" || :' EXIT + +[ -f game.conf ] || { echo "Must be run in game root folder." >&2; exit 1; } + +chmod -R 777 "$world" # container uses unprivileged user inside + +vol=( + -v "$PWD/utils/test/minetest.conf":/etc/minetest/minetest.conf + --tmpfs /var/lib/minetest/.minetest + -v "$PWD":/var/lib/minetest/.minetest/games/minetest_game + -v "$world":/var/lib/minetest/.minetest/world +) +[ -z "$DOCKER_IMAGE" ] && DOCKER_IMAGE="ghcr.io/minetest/minetest:master" +docker run --rm -i "${vol[@]}" "$DOCKER_IMAGE" --config /etc/minetest/minetest.conf --gameid minetest + +test -f "$world/map.sqlite" || exit 1 +exit 0