From f07c4dcd839c5be09e83cae47126927bb86cb676 Mon Sep 17 00:00:00 2001 From: DS-Minetest Date: Mon, 2 Jan 2017 00:41:04 +0100 Subject: [PATCH 001/118] Decrease the cost of gunpowder for trails The cost of TNT remains the same --- mods/tnt/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index f9bc307c..711aad94 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -498,7 +498,7 @@ minetest.register_node("tnt:gunpowder_burning", { }) minetest.register_craft({ - output = "tnt:gunpowder", + output = "tnt:gunpowder 5", type = "shapeless", recipe = {"default:coal_lump", "default:gravel"} }) @@ -507,9 +507,9 @@ if enable_tnt then minetest.register_craft({ output = "tnt:tnt", recipe = { - {"", "group:wood", ""}, - {"group:wood", "tnt:gunpowder", "group:wood"}, - {"", "group:wood", ""} + {"group:wood", "tnt:gunpowder", "group:wood"}, + {"tnt:gunpowder", "tnt:gunpowder", "tnt:gunpowder"}, + {"group:wood", "tnt:gunpowder", "group:wood"} } }) From 8bc93598c625f18950eff402bc54030b426b5db9 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 27 Dec 2016 16:18:49 +0100 Subject: [PATCH 002/118] Papyrus, cactus: Require light level 13 for growth --- mods/default/functions.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 3bda4bf0..11c42d59 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -186,6 +186,9 @@ function default.grow_cactus(pos, node) 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 @@ -209,6 +212,9 @@ function default.grow_papyrus(pos, node) 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 From 42700a4b4ba812593f654cc2b38e35ac49dafa13 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 1 Jan 2017 14:10:22 +0000 Subject: [PATCH 003/118] Default: More generous meselamp recipe Require only 1 mese crystal instead of 3. To make farming in dark locations easier. To reduce and balance recipe ore cost. --- mods/default/crafting.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 483245c2..7738be32 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -632,10 +632,10 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'default:meselamp 1', + output = 'default:meselamp', recipe = { - {'', 'default:mese_crystal',''}, - {'default:mese_crystal', 'default:glass', 'default:mese_crystal'}, + {'default:glass'}, + {'default:mese_crystal'}, } }) From 9ab50702fbce2df09ec986992bba64b594c987a6 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 2 Jan 2017 16:21:38 +0000 Subject: [PATCH 004/118] Add LICENSE.txt --- LICENSE.txt | 476 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.txt | 31 +--- 2 files changed, 479 insertions(+), 28 deletions(-) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..269772b6 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,476 @@ +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. + +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 + diff --git a/README.txt b/README.txt index b59b7f94..97ad70ab 100644 --- a/README.txt +++ b/README.txt @@ -22,32 +22,7 @@ When stable releases are made, Minetest Game is packaged and made available in and in case the repository has grown too much, it may be reset. In that sense, this is not a "real" git repository. (Package maintainers please note!) -License of source code ----------------------- -Copyright (C) 2010-2012 celeron55, Perttu Ahola -See README.txt in each mod directory for information about other authors. +Licensing +--------- -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. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -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. - -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 +See LICENSE.txt From 48ab62db88ea4f79a0e13819e3981fdd37c89a1a Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 3 Jan 2017 16:54:01 +0000 Subject: [PATCH 005/118] Make doors place when shift is held instead of calling on_rightclick Fixes #1364 --- mods/doors/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index c5d4a140..ae257fb6 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -265,7 +265,8 @@ function doors.register(name, def) local node = minetest.get_node(pointed_thing.under) local pdef = minetest.registered_nodes[node.name] - if pdef and pdef.on_rightclick then + if pdef and pdef.on_rightclick and + not placer:get_player_control().sneak then return pdef.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) end From cadc8b34d7d5666dccd42031f57e140d4e311f90 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 2 Jan 2017 15:44:15 +0000 Subject: [PATCH 006/118] Add /killme chat command Added as a new mod as it doesn't fit anywhere else. This is a game play change, so it better suited to Minetest Game rather than builtin Fixes #857 --- mods/killme/init.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 mods/killme/init.lua diff --git a/mods/killme/init.lua b/mods/killme/init.lua new file mode 100644 index 00000000..06aa39de --- /dev/null +++ b/mods/killme/init.lua @@ -0,0 +1,24 @@ +minetest.register_chatcommand("killme", { + description = "Kill yourself to respawn", + func = function(name) + local player = minetest.get_player_by_name(name) + if player then + if minetest.setting_getbool("enable_damage") then + player:set_hp(0) + return true + else + for _, callback in pairs(core.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, "No static_spawnpoint defined" + end + else + -- Show error message if used when not logged in, eg: from IRC mod + return false, "You need to be online to be killed!" + end + end +}) From b6889134d34c7aa933bd1e4a808605ae2228bc97 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 2 Jan 2017 23:12:40 +0000 Subject: [PATCH 007/118] License.txt: Include full official LGPL 2.1 .txt file Copy-paste and only remove form-feed characters. --- LICENSE.txt | 285 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 164 insertions(+), 121 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 269772b6..48f0b8d1 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -15,33 +15,33 @@ 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 + 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. + 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.] + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] - Preamble + Preamble -The licenses for most software are designed to take away your + 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 + 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, + 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 @@ -49,12 +49,12 @@ 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 + 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 + 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 @@ -62,32 +62,32 @@ 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 + 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 + 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 + + 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 + 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 + 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 @@ -95,7 +95,7 @@ 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 + 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 @@ -103,7 +103,7 @@ 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 + 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 @@ -111,38 +111,38 @@ 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 + 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 + 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 + 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 + 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 + 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 + 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 @@ -150,13 +150,13 @@ 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 + "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 + 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 @@ -164,7 +164,7 @@ 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 + 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 @@ -172,37 +172,37 @@ 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, + 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 + + 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. + 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. + 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. + 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. + 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.) + (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, @@ -225,7 +225,7 @@ 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 + 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, @@ -233,66 +233,66 @@ 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 + + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + + 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 + 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 @@ -300,39 +300,39 @@ 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.) + 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. + 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. + 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. + 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. + 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 + 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 @@ -341,29 +341,29 @@ 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 + 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 + + 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. + 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. + 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 + 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 @@ -371,7 +371,7 @@ 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 + 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 @@ -380,15 +380,15 @@ 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 + 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 + + 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 @@ -419,7 +419,7 @@ 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 + 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, @@ -427,7 +427,7 @@ 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 + 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. @@ -439,8 +439,8 @@ 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 + + 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 @@ -449,9 +449,9 @@ 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 + NO WARRANTY -15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO + 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 @@ -461,7 +461,7 @@ 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 + 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 @@ -472,5 +472,48 @@ 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 - + 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! From 96aac5ff5bad4791fa1197e0517579a53270cdba Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 5 Jan 2017 01:34:22 +0000 Subject: [PATCH 008/118] Fire: Reduce flame light level to 13 --- mods/fire/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index bee487a5..b1b9284b 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -24,7 +24,7 @@ minetest.register_node("fire:basic_flame", { }, inventory_image = "fire_basic_flame.png", paramtype = "light", - light_source = 14, + light_source = 13, walkable = false, buildable_to = true, sunlight_propagates = true, @@ -65,7 +65,7 @@ minetest.register_node("fire:permanent_flame", { }, inventory_image = "fire_basic_flame.png", paramtype = "light", - light_source = 14, + light_source = 13, walkable = false, buildable_to = true, sunlight_propagates = true, From c8b1671ef0f333cf0af61969cf2bc5fae08cf354 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 6 Jan 2017 06:15:38 +0000 Subject: [PATCH 009/118] Default: Alter sand to sandstone recipe Craft 4 default:sand to default:sandstone. Previously, 4 group:sand was craftable to sandstone and sandstone was craftable back into default:sand, allowing silver and desert sands to be converted into incorrect colour sandstone and yellow sand. --- mods/default/crafting.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 7738be32..f82b0718 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -495,10 +495,10 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'default:sandstone', + output = "default:sandstone", recipe = { - {'group:sand', 'group:sand'}, - {'group:sand', 'group:sand'}, + {"default:sand", "default:sand"}, + {"default:sand", "default:sand"}, } }) From df19b4eab0aa1a03e5f70fdeec5097f3387e7e9b Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 7 Jan 2017 21:21:30 -0800 Subject: [PATCH 010/118] Dye: Simplify recipes. Create a simple triplet table (src1, src2, dst) for all the dye recipes and group them logically, with a bit of explanation where they actually come from. This prunes a lot of recipes from the list, but the old list had a ton of combinations that did not make any sense, as well as recipes that were just gross approximations and duplicates, mixing the same color with itself just to get the same color back, which just wastes packets at logon. The list has been checked to allow all colors created from the basic dyes (flowers+coal) so that all colors can be crafted. --- mods/dye/init.lua | 64 +++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index d414d77c..87f31d12 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -74,36 +74,40 @@ minetest.register_craft({ }) -- Mix recipes --- Just mix everything to everything somehow sanely - -local mixbases = {"pink", "magenta", "red", "orange", "brown", "yellow", "green", "dark_green", "cyan", "blue", "violet", "black", "dark_grey", "grey", "white"} - -local mixes = { - -- pink, magenta, red, orange, brown, yellow, green, dark_green, cyan, blue, violet, black, dark_grey, grey, white - white = {"pink", "pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "violet","grey", "grey", "grey","white"}, - grey = {"pink", "pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "violet","dark_grey","grey", "grey"}, - dark_grey = {"brown", "brown", "brown", "brown", "brown", "brown", "dark_green","dark_green","blue", "blue", "violet","black", "dark_grey"}, - black = {"black", "black", "black", "black", "black", "black", "black", "black", "black","black", "black", "black"}, - violet = {"magenta","magenta","magenta","red", "brown", "red", "cyan", "brown", "blue", "violet","violet"}, - blue = {"violet", "violet", "magenta","brown", "brown", "dark_green","cyan", "cyan", "cyan", "blue"}, - cyan = {"brown", "blue", "brown", "dark_green","dark_grey", "green", "cyan", "dark_green","cyan"}, - dark_green = {"brown", "brown", "brown", "brown", "brown", "green", "green", "dark_green"}, - green = {"yellow", "brown", "yellow", "yellow", "dark_green","green", "green"}, - yellow = {"orange", "red", "orange", "yellow", "orange", "yellow"}, - brown = {"brown", "brown", "brown", "orange", "brown"}, - orange = {"orange", "red", "orange", "orange"}, - red = {"pink", "magenta","red"}, - magenta = {"magenta","magenta"}, - pink = {"pink"}, +local dye_recipes = { + -- src1, src2, dst + -- RYB mixes + {"red", "blue", "violet"}, -- "purple" + {"yellow", "red", "orange"}, + {"yellow", "blue", "green"}, + -- RYB complementary mixes + {"red", "green", "dark_grey"}, + {"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 one, results in pairs(mixes) do - for i, result in ipairs(results) do - local another = mixbases[i] - minetest.register_craft({ - type = "shapeless", - output = 'dye:' .. result .. ' 2', - recipe = {'dye:' .. one, 'dye:' .. another}, - }) - end +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 From 57eb906047a177a0af213dc6fecbe8e559efab6d Mon Sep 17 00:00:00 2001 From: Baptiste Pouget Date: Thu, 12 Jan 2017 18:45:59 +0100 Subject: [PATCH 011/118] Add support for custom bed sounds --- mods/beds/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 3b2bb0d5..4df6b4a3 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -34,7 +34,7 @@ function beds.register_bed(name, def) is_ground_content = false, stack_max = 1, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, - sounds = default.node_sound_wood_defaults(), + sounds = def.sounds or default.node_sound_wood_defaults(), node_box = { type = "fixed", fixed = def.nodebox.bottom, @@ -138,7 +138,7 @@ function beds.register_bed(name, def) is_ground_content = false, pointable = false, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, - sounds = default.node_sound_wood_defaults(), + sounds = def.sounds or default.node_sound_wood_defaults(), drop = name .. "_bottom", node_box = { type = "fixed", From 8715b83ff03648174eb6b0861c6f3ec78982b95d Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Tue, 10 Jan 2017 21:35:48 -0800 Subject: [PATCH 012/118] Fire: Make explosions remove flames TNT removes flammable nodes from the destruction radius and should remove flames within it too because they lose their fuel and would be removed by ABM later anyway. --- mods/fire/init.lua | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index b1b9284b..a6dc1e5c 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -44,9 +44,6 @@ minetest.register_node("fire:basic_flame", { on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(30, 60)) end, - - on_blast = function() -- Unaffected by explosions - end, }) minetest.register_node("fire:permanent_flame", { @@ -72,9 +69,6 @@ minetest.register_node("fire:permanent_flame", { damage_per_second = 4, groups = {igniter = 2, dig_immediate = 3}, drop = "", - - on_blast = function() -- Unaffected by explosions - end, }) From 1470b9df79add8fdb6ae0e023db7050afcc1d55d Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 14 Jan 2017 02:30:27 +0000 Subject: [PATCH 013/118] Tree log decorations: Replace lua tables with .mts files --- mods/default/mapgen.lua | 72 ++----------------------- mods/default/schematics/acacia_log.mts | Bin 0 -> 65 bytes mods/default/schematics/apple_log.mts | Bin 0 -> 90 bytes mods/default/schematics/aspen_log.mts | Bin 0 -> 118 bytes mods/default/schematics/jungle_log.mts | Bin 0 -> 96 bytes mods/default/schematics/pine_log.mts | Bin 0 -> 93 bytes 6 files changed, 5 insertions(+), 67 deletions(-) create mode 100644 mods/default/schematics/acacia_log.mts create mode 100644 mods/default/schematics/apple_log.mts create mode 100644 mods/default/schematics/aspen_log.mts create mode 100644 mods/default/schematics/jungle_log.mts create mode 100644 mods/default/schematics/pine_log.mts diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index d786a841..3d2da557 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1204,20 +1204,7 @@ function default.register_decorations() biomes = {"deciduous_forest"}, y_min = 1, y_max = 31000, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "default:tree", param2 = 12, prob = 191}, - {name = "default:tree", param2 = 12}, - {name = "default:tree", param2 = 12, prob = 127}, - {name = "air", prob = 0}, - {name = "flowers:mushroom_brown", prob = 63}, - {name = "air", prob = 0}, - }, - }, + schematic = minetest.get_modpath("default") .. "/schematics/apple_log.mts", flags = "place_center_x", rotation = "random", }) @@ -1245,20 +1232,7 @@ function default.register_decorations() biomes = {"rainforest", "rainforest_swamp"}, y_min = 1, y_max = 31000, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "default:jungletree", param2 = 12, prob = 191}, - {name = "default:jungletree", param2 = 12}, - {name = "default:jungletree", param2 = 12, prob = 127}, - {name = "air", prob = 0}, - {name = "flowers:mushroom_brown", prob = 127}, - {name = "air", prob = 0}, - }, - }, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", flags = "place_center_x", rotation = "random", }) @@ -1299,20 +1273,7 @@ function default.register_decorations() biomes = {"taiga", "coniferous_forest"}, y_min = 1, y_max = 31000, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "default:pine_tree", param2 = 12, prob = 191}, - {name = "default:pine_tree", param2 = 12}, - {name = "default:pine_tree", param2 = 12, prob = 127}, - {name = "air", prob = 0}, - {name = "flowers:mushroom_red", prob = 63}, - {name = "air", prob = 0}, - }, - }, + schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", flags = "place_center_x", rotation = "random", }) @@ -1354,17 +1315,7 @@ function default.register_decorations() biomes = {"savanna"}, y_min = 1, y_max = 31000, - schematic = { - size = {x = 3, y = 2, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "default:acacia_tree", param2 = 12, prob = 191}, - {name = "default:acacia_tree", param2 = 12}, - {name = "default:acacia_tree", param2 = 12, prob = 127}, - }, - }, + schematic = minetest.get_modpath("default") .. "/schematics/acacia_log.mts", flags = "place_center_x", rotation = "random", }) @@ -1405,20 +1356,7 @@ function default.register_decorations() biomes = {"deciduous_forest"}, y_min = 1, y_max = 31000, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "default:aspen_tree", param2 = 12}, - {name = "default:aspen_tree", param2 = 12}, - {name = "default:aspen_tree", param2 = 12, prob = 127}, - {name = "flowers:mushroom_red", prob = 63}, - {name = "flowers:mushroom_brown", prob = 63}, - {name = "air", prob = 0}, - }, - }, + schematic = minetest.get_modpath("default") .. "/schematics/aspen_log.mts", flags = "place_center_x", rotation = "random", }) diff --git a/mods/default/schematics/acacia_log.mts b/mods/default/schematics/acacia_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..037bca8c32152f0927ff027811e918e713872b91 GIT binary patch literal 65 zcmeYb3HD`RVPIxpVqmPV2a?Q*nMDl3DXD3Rr8y;5iOGq{nThcwMX9M3bCMGnnB5Fg T5<1pzXP;zaW5d8XmC+Rd7>*KA literal 0 HcmV?d00001 diff --git a/mods/default/schematics/apple_log.mts b/mods/default/schematics/apple_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..e7ee8f2b84ab06165c4537cd4607ec56e3066608 GIT binary patch literal 90 zcmeYb3HD`RVPFPA#`^kt5F;_Oh=C_1H7&6;r^KqHC^eNqEG;L$JhiCUDz~&aqbNT= qH$JH-zdWyEPI3YRvztLmLITt0N3Y*XK5^uclao{6WDtsDOalOtHXH!} literal 0 HcmV?d00001 diff --git a/mods/default/schematics/aspen_log.mts b/mods/default/schematics/aspen_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..180e6fd1be8b31d1578f057edd7e3fb3f321c5ed GIT binary patch literal 118 zcmeYb3HD`RVPFPA#`^kt5Hm5eh(RbNH7&6;r^G6;xF9tzzN9EMl|dveC%-(ksMspE zv^b+EKR-9VC^dya3_~=jD8D?fVoq`b1GAe!N>T#b=U1=aK7H!QBPS=Pz{w!`m2m|C DeorWw literal 0 HcmV?d00001 diff --git a/mods/default/schematics/jungle_log.mts b/mods/default/schematics/jungle_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..54fa16d175a053f47c4ee55d678b33dbf507f314 GIT binary patch literal 96 zcmeYb3HD`RVPFPA#`^kt5F;_Oh(RbNH7&6;r^G6&G%r0TwWKIDl|d{mC%-(ksMspE wv^b+EKR-7(KR3Q8HKk%sasmUhn?XuK0@LS5uir{OapaMclT+Yi5Q<|=0|4+Z9U=e# literal 0 HcmV?d00001 From 6dcf541f6e4d0b03d57d36766e7e87641e551837 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 14 Jan 2017 21:39:17 -0800 Subject: [PATCH 014/118] Revert "Doors: Remove ..." and "Doors: Allow the screwdriver to ..." This reverts commit 5e4a6e8ac68b92c7394b80bb67839b71b4a4a00b, and commit 60cf3f85b6e661482ec2705cadbdc1b04e388d19. The original door API rewrite I posted had all rotation disabled using the correct on_rotate() handler returning `false`. Two subsequent changes attempting first to enable simple rotation and second disabling that again changed the callback handler to a boolean `false`, which is incorrect use in the screwdriver API, and actually allows rotation. The proper way to disable rotation for facedir nodes it to use a full callback handler that does `return false`. --- mods/doors/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index ae257fb6..61d48c1d 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -376,7 +376,9 @@ function doors.register(name, def) minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) minetest.check_for_falling({x = pos.x, y = pos.y + 1, z = pos.z}) end - def.on_rotate = false + def.on_rotate = function(pos, node, user, mode, new_param2) + return false + end if def.protected then def.can_dig = can_dig_door From 1104d571b0cd6aed190c2e53064768175a4b0329 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 17 Jan 2017 15:21:13 -0800 Subject: [PATCH 015/118] TNT: Log explosions and player igniting tnt or gunpowder --- mods/tnt/init.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 711aad94..5d1de604 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -372,6 +372,8 @@ function tnt.boom(pos, def) 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", { @@ -411,6 +413,9 @@ minetest.register_node("tnt:gunpowder", { on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == "default:torch" then minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + minetest.log("action", puncher:get_player_name() .. + " ignites tnt:gunpowder at " .. + minetest.pos_to_string(pos)) end end, on_blast = function(pos, intensity) @@ -550,6 +555,9 @@ function tnt.register_tnt(def) on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == "default:torch" then minetest.set_node(pos, {name = name .. "_burning"}) + minetest.log("action", puncher:get_player_name() .. + " ignites " .. node.name .. " at " .. + minetest.pos_to_string(pos)) end end, on_blast = function(pos, intensity) From eb1805ea0a4a91ab755b5665b22de6b8d6c7f184 Mon Sep 17 00:00:00 2001 From: Martin Doege Date: Sat, 14 Jan 2017 19:30:33 +0100 Subject: [PATCH 016/118] Textures: Strip color profiles from some textures Removes the "iCCP: known incorrect sRGB profile" error messages on the console when starting minetest_game by stripping offending color profiles. --- mods/carts/textures/carts_cart_front.png | Bin 3108 -> 459 bytes mods/carts/textures/carts_cart_side.png | Bin 3135 -> 486 bytes mods/carts/textures/carts_cart_top.png | Bin 3171 -> 522 bytes mods/default/textures/default_flint.png | Bin 3038 -> 397 bytes mods/default/textures/default_grass_1.png | Bin 2944 -> 300 bytes mods/default/textures/default_grass_2.png | Bin 2980 -> 336 bytes mods/default/textures/default_grass_3.png | Bin 3065 -> 418 bytes mods/default/textures/default_grass_4.png | Bin 3134 -> 503 bytes mods/default/textures/default_grass_5.png | Bin 3269 -> 628 bytes mods/default/textures/default_key.png | Bin 3037 -> 415 bytes mods/default/textures/default_key_skeleton.png | Bin 3043 -> 423 bytes mods/default/textures/default_ladder_steel.png | Bin 3223 -> 587 bytes mods/default/textures/default_sign_steel.png | Bin 3173 -> 537 bytes .../textures/default_sign_wall_steel.png | Bin 3187 -> 550 bytes .../textures/default_sign_wall_wood.png | Bin 3391 -> 758 bytes mods/default/textures/default_sign_wood.png | Bin 3406 -> 770 bytes mods/default/textures/default_snow_side.png | Bin 3445 -> 848 bytes mods/default/textures/default_snowball.png | Bin 3102 -> 446 bytes mods/doors/textures/doors_door_glass.png | Bin 3064 -> 491 bytes .../textures/doors_door_obsidian_glass.png | Bin 2988 -> 420 bytes mods/fire/textures/fire_flint_steel.png | Bin 3108 -> 459 bytes mods/flowers/textures/flowers_waterlily.png | Bin 3363 -> 690 bytes 22 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/carts/textures/carts_cart_front.png b/mods/carts/textures/carts_cart_front.png index b85696f9b64228026312844009f18a821ada1c94..38955b25adb0ce47e36697d888d4acc6c3d8ccda 100644 GIT binary patch delta 45 zcmZ1?ahiF8F*gHaage(cuJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne z9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{eQWT^B0GzjoyKE}SbXLT zb{bpEJtE$kC4c0I81WZzQ5KhzE#g}u)=U+qaYg)A9Gk{rW&(gBiR}UoD@nwrA|~;} zLfk~W6aXA4@hgu1iUph;f%sBx=^43vZeo&vuFKM+o7vhj=-!;{RE|Jk6vSkuF!^k{ zTY6dsla~v?;+;QBMqFFEsL0l4w$|20=Ei1U73#lk{(nu0d%H-lfo1g?xHu29w318~u5R|8d}7pTjVOlfdC~ zc%q1K(SMY2d5NNS^VnPgH=Rf4^8Qm3|6$mlv^duyQ5rr0YOFDk8lVE?*FJ!v5CIZ% zK(qt>(Kmm5I1s5m_f-n#TRsj}B0%?E`vVTE7*a(V13D^O4gKAI<8bA|h0VhBQ zI1Mg<%iub=0d9i_U<8bV=U@iB0rL<9VIeX^ffOKBNDDH6%pnHk2zfyMPzV$S#X*S> z4-!K8&?cw^Du=3}I;aWy9y$eGfUZJ=&^>4rnu30Z-opq?f~l}FtPPvM4A=$sgTvsJ zaDO7a8qR|Y;q7o0Tn`_E+u;lFb@(O~2}Gii1cZ;QLyD0~ zq#kKOx{zMvCNhFdBkxcc6a_^`8KLY^-l*j$7HTzW9jX*njXHvANA;j?qDE0Os847z zS_y4{wnO`%BhiWIY;+O265WVyLtjGQMt_f^-(WBp8b$|WgYm{hVUjUxFr}FNm{!br z%phhAGmFJy6|e?a2W%jgi4|aruzRt`u;;Kt*m3Mz91*9AGsk)2qH#Q20j?5v6n7Rk zgqy(4Lq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDrGF=7urk^*9x`m1LYYG{7iGpM2t|Y9MqyDlQ5qN`iSTS4ifPdm8#pxx~ zCH6~LONy7ASaM$pR?=4rQCg#PNU2Y0R#`>aOF2V%ukuCZX%(7^vr4i`h00l#DOHN9 zqbgUmLiL>LGrBC@g`P^UqW92e)Rfe`)r4wwYW-^S>N@Jn)eF>H)gNgPG#DBQ8WkGd z8Z(-zngN>mn$4Q`weVUDt$!q~JzBk5bJ{xE5!zd{JG3Wt@^qSY9_o^Hope|0 z*6ZHV!{{;eQuOxg-Oz{it@M-hYxD;UU;}FduEBnTK|{2mts&2_-f-B6WaMI$Wz=jm zYD_csH!d*lFn(d8X%cO+)1=qrlc|+ys%eAi12Y*jU$X+UF0d z+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChYI)@QQx?`N`84^=_}cic_3iN^`Gxvb`#tg3_via}1;7Em z0lNYoF4J1ZTh0(}B^1wIPW30fWWV=yK-D7Ys0X^2@!et$@BC?zyD^l0dtFxRlM zum{U^mkXD7hf9XXgg1rHMYuc#Ks{ zQOuo{IxBNlUR|ZQDs|PFSjkvs?8!KETtwW_xDU)gW<7H@-Y0%v{0z&DwTJbb?aZ!V zPjMVL<(!EGhku0fgvmsQ#9fI~Nlrer7PULy!eY*y=hP9?UUoC%Q{(tCNm$h~4pmp)YIh_3ETV2tjiAU!0h1dxU-n= zE9e!)6@RaH$L_vbX<1pjhp@`mOuh2W$p9Z`j`G8eBSfcF1Yy!cF&^mv8ypx_*1v?ZG?C@7x`Z86LUI zzB_p@_1??-S@-83YuJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne z9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{eQWT^B0GzjoyKE}SbXLT zb{bpEJtE$kC4c0I81WZzQ5KhzE#g}u)=U+qaYg)A9Gk{rW&(gBiR}UoD@nwrA|~;} zLfk~W6aXA4@hgu1iUph;f%sBx=^43vZeo&vuFKM+o7vhj=-!;{RE|Jk6vSkuF!^k{ zTY6dsla~v?;+;QBMqFFEsL0l4w$|20=Ei1U73#lk{(nu0d%H-lfo1g?xHu29w318~u5R|8d}7pTjVOlfdC~ zc%q1K(SMY2d5NNS^VnPgH=Rf4^8Qm3|6$mlv^duyQ5rr0YOFDk8lVE?*FJ!v5CIZ% zK(qt>(Kmm5I1s5m_f-n#TRsj}B0%?E`vVTE7*a(V13D^O4gKAI<8bA|h0VhBQ zI1Mg<%iub=0d9i_U<8bV=U@iB0rL<9VIeX^ffOKBNDDH6%pnHk2zfyMPzV$S#X*S> z4-!K8&?cw^Du=3}I;aWy9y$eGfUZJ=&^>4rnu30Z-opq?f~l}FtPPvM4A=$sgTvsJ zaDO7a8qR|Y;q7o0Tn`_E+u;lFb@(O~2}Gii1cZ;QLyD0~ zq#kKOx{zMvCNhFdBkxcc6a_^`8KLY^-l*j$7HTzW9jX*njXHvANA;j?qDE0Os847z zS_y4{wnO`%BhiWIY;+O265WVyLtjGQMt_f^-(WBp8b$|WgYm{hVUjUxFr}FNm{!br z%phhAGmFJy6|e?a2W%jgi4|aruzRt`u;;Kt*m3Mz91*9AGsk)2qH#Q20j?5v6n7Rk zgqy(4Lq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDrGF=7urk^*9x`m1LYYG{7iGpM2t|Y9MqyDlQ5qN`iSTS4ifPdm8#pxx~ zCH6~LONy7ASaM$pR?=4rQCg#PNU2Y0R#`>aOF2V%ukuCZX%(7^vr4i`h00l#DOHN9 zqbgUmLiL>LGrBC@g`P^UqW92e)Rfe`)r4wwYW-^S>N@Jn)eF>H)gNgPG#DBQ8WkGd z8Z(-zngN>mn$4Q`weVUDt$!q~JzBk5bJ{xE5!zd{JG3Wt@^qSY9_o^Hope|0 z*6ZHV!{{;eQuOxg-Oz{it@M-hYxD;UU;}FduEBnTK|{2mts&2_-f-B6WaMI$Wz=jm zYD_csH!d*lFn(d8X%cO+)1=qrlc|+ys%eAi12Y*jU$X+UF0d z+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChYI)@QQx?`N`84^=_}cic_3iN^`Gxvb`#tg3_via}1;7Em z0lNYoF4J1ZTh0(}B^1wIPW30fWWV=yK-D7Ys0X^2@!et$@BC?zyD^l0dtFxRlM zum{U^mkXD7hf9XXgg1rHMYuc#Ks{ zQOuo{IxBNlUR|ZQDs|PFSjkvs?8!KETtwW_xDU)gW<7H@-Y0%v{0z&DwTJbb?aZ!V zPjMVL<(!EGhku0fgvmsQ#9fI~Nlrer7PULy!eY*y=hP9?UUoC%Q{(tCNm$h~4pmp)YIh_3ETV2tjiAU!0h1dxU-n= zE9e!)6@RaH$L_vbX<1pjhp@`mOuh2W$p9Z`j`G8eBSfcF1Yy!cF&^mv8ypx_*1v?ZG?C@7x`Z86LUI zzB_p@_1??-S@-83Ysn45vIILO_J@#aaL`pM;7FNHV@JR*x37`TN&n2}-D9Er)3xGw?#IhG9_ delta 2713 zcmV;K3TE|+1mhTxGk*#?X+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHz3iJg{rR8-d% zhtIutdZEoQ6e&aRy$v9}H>uJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne z9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{eQWT^B0GzjoyKE}SbXLT zb{bpEJtE$kC4c0I81WZzQ5KhzE#g}u)=U+qaYg)A9Gk{rW&(gBiR}UoD@nwrA|~;} zLfk~W6aXA4@hgu1iUph;f%sBx=^43vZeo&vuFKM+o7vhj=-!;{RE|Jk6vSkuF!^k{ zTY6dsla~v?;+;QBMqFFEsL0l4w$|20=Ei1U73#lk{(nu0d%H-lfo1g?xHu29w318~u5R|8d}7pTjVOlfdC~ zc%q1K(SMY2d5NNS^VnPgH=Rf4^8Qm3|6$mlv^duyQ5rr0YOFDk8lVE?*FJ!v5CIZ% zK(qt>(Kmm5I1s5m_f-n#TRsj}B0%?E`vVTE7*a(V13D^O4gKAI<8bA|h0VhBQ zI1Mg<%iub=0d9i_U<8bV=U@iB0rL<9VIeX^ffOKBNDDH6%pnHk2zfyMPzV$S#X*S> z4-!K8&?cw^Du=3}I;aWy9y$eGfUZJ=&^>4rnu30Z-opq?f~l}FtPPvM4A=$sgTvsJ zaDO7a8qR|Y;q7o0Tn`_E+u;lFb@(O~2}Gii1cZ;QLyD0~ zq#kKOx{zMvCNhFdBkxcc6a_^`8KLY^-l*j$7HTzW9jX*njXHvANA;j?qDE0Os847z zS_y4{wnO`%BhiWIY;+O265WVyLtjGQMt_f^-(WBp8b$|WgYm{hVUjUxFr}FNm{!br z%phhAGmFJy6|e?a2W%jgi4|aruzRt`u;;Kt*m3Mz91*9AGsk)2qH#Q20j?5v6n7Rk zgqy(4Lq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDrGF=7urk^*9x`m1LYYG{7iGpM2t|Y9MqyDlQ5qN`iSTS4ifPdm8#pxx~ zCH6~LONy7ASaM$pR?=4rQCg#PNU2Y0R#`>aOF2V%ukuCZX%(7^vr4i`h00l#DOHN9 zqbgUmLiL>LGrBC@g`P^UqW92e)Rfe`)r4wwYW-^S>N@Jn)eF>H)gNgPG#DBQ8WkGd z8Z(-zngN>mn$4Q`weVUDt$!q~JzBk5bJ{xE5!zd{JG3Wt@^qSY9_o^Hope|0 z*6ZHV!{{;eQuOxg-Oz{it@M-hYxD;UU;}FduEBnTK|{2mts&2_-f-B6WaMI$Wz=jm zYD_csH!d*lFn(d8X%cO+)1=qrlc|+ys%eAi12Y*jU$X+UF0d z+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChYI)@QQx?`N`84^=_}cic_3iN^`Gxvb`#tg3_via}1;7Em z0lNYoF4J1ZTh0(}B^1wIPW30fWWV=yK-D7Ys0X^2@!et$@BC?zyD^l0dtFxRlM zum{U^mkXD7hf9XXgg1rHMYuc#Ks{ zQOuo{IxBNlUR|ZQDs|PFSjkvs?8!KETtwW_xDU)gW<7H@-Y0%v{0z&DwTJbb?aZ!V zPjMVL<(!EGhku0fgvmsQ#9fI~Nlrer7PULy!eY*y=hP9?UUoC%Q{(tCNm$h~4pmp)YIh_3ETV2tjiAU!0h1dxU-n= zE9e!)6@RaH$L_vbX<1pjhp@`mOuh2W$p9Z`j`G8eBSfcF1Yy!cF&^mv8ypx_*1v?ZG?C@7x`Z86LUI zzB_p@_1??-S@-83Ytw diff --git a/mods/default/textures/default_flint.png b/mods/default/textures/default_flint.png index 3211db1570ceff9d2dbe0d8a8fdc060ee7e33263..226c7406f493f3b5213feddb295cc5cb9d1b79a4 100644 GIT binary patch delta 371 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 bK!5=NQ1fAhI<`(200000NkvXXu0mjf0#nMF diff --git a/mods/default/textures/default_grass_1.png b/mods/default/textures/default_grass_1.png index 5ed8388bb5d5730f220f1987898a2e6f48b0fe98..e9faa2c32576891961db01f971033e2086429364 100644 GIT binary patch delta 274 zcmV+t0qy>P7pwx1BYyw{XF*Lt006O%3;baP00001b5ch_0olnce*gdgAY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^ z005XtL_t(I%k7Ra3c^4XMBipNA&nM_q8`M?^LQf9BvuxZMt^M7!WDypEG9%Z@GXKO zXqQeh)xa=sMu`Y@6x3=rfClhC05zSB>2+EXmW2ZFCVu;0`pmtFB>)J^LhZJNynM3B z1mJkn0m{r~^~ delta 2938 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 dZ6|E(j=<<|gVKgba?igy{D4^ z006v6L_t(I%k7iT3IS0R#((#AZ%t|xk@60nz{7bK?_lK(EPrgoM#LmTl3`d3_tvrU zCuX5oI=l0o@B8&_juH{R8U0oI5BLLq1yHSaGxy+3Al7H&6z-S zp7}L++vl_F-fFYgVtuCcX0Pw&ZYLIiWP1T%INkv;h>idp&JXBxw5GpwVwSrTUR&x# z2up@Ibwr~C-!CXpt61XHahWIdP6atkQsR1*#p*2Of*}my3d!|Wxk7uSA^-pY07*qo IM6N<$f{Cz!Jpcdz delta 2975 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 VR=?4N6x9F#002ovPDHLkV1l8OwPpYS diff --git a/mods/default/textures/default_grass_3.png b/mods/default/textures/default_grass_3.png index 101fefaa81e2fa241acca126aa3526da5d615614..92ca1b5d8d28ddfa4b16968380d5efd246727cbb 100644 GIT binary patch delta 393 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 A|cs;{6PZ!4! zi_^(}{{OdUR&D51x_kIAgP4S}@!D2LFSjrMH>-@ft4-`o3_|Ecoh|7CG`Jcc`87F6=+XS~cbu-Q>MT~W<^ZsXk8 z2lmX&hwBSHpZ@3J;rX9jbXhX3#3!l##@;mkHpK${nB67Kiic14K0JMWK2PJvdpz;` z{-q=U!Gnix8(Li>B`bE^lw@gXF+A+x;4$Olg>A70^+q)n-^EmUl7MD`WP#>2wKI1y z0?p?+KW|T3%gnwUZf2mZlTI4{=jPyCoRJ1HP{#Mv6ln&A?E7)GG6(o1OMv0R;OXk; Jvd$@?2>`bxlGp$M delta 3031 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 Z0RU^?UVV0wF4h15002ovPDHLkV1g2cr~m)} diff --git a/mods/default/textures/default_key_skeleton.png b/mods/default/textures/default_key_skeleton.png index eafcc19585b3239ca7061a7f939e6507422dd2e9..2b3497d37fc91be0c835905eb75e68dceaecb864 100644 GIT binary patch delta 338 zcmV-Y0j>Vy7pDV|Bv=GzK}|sb0I`n?{9y$E0004VQb$4o*~u(_0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r<0K( z7YP9VNkl*@8fLiT&Cx{3lLaTKp+wDTWfA%eEQC}_}$~+a< zI2zqby?#Nr`@~>yPf@H%(<()=W-@uD)43x}t7O?F)9D+t*}FPn7{U8MzyCs>4{0_V zY&M?&7^BJaApn)iImT$LP0G>A4k82Z1J)*l@NvMP-M+>c&3L@PxlBa{dOzqdfIBT0 kYm*Yf59&ghTmgWD0l;*TI7}*0BAb^tj|`8MF3bZ02F3R#5n-i zEdVe{S7t~6u(trf&JYW-00;~KFj0twDF6g}0AR=?BX|IWnE(_<@>e|ZE3OddDgXd@ znX){&BsoQaTL>+22Uk}v9w^R97b_GtVFF>AKrX_0nSU8Ffiw@`^UMGMppg|3;Dhu1 zc+L*4&dxTDwhmt{>c0m6B4T3W{^ifBa6kY6;dFk{{wy!E8h|?nfNlPwCGG@hUJIag z_lst-4?wj5py}FI^KkfnJUm6Akh$5}<>chpO2k52Vaiv1{%68pz*qfj`F=e7_x0eu z;v|7GU4MZ`1o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcqjPo+3 zB8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S1Au6Q z;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO0Dk~Ppn)o|K^yeJ7%adB9Ki+L!3+Fg zHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_vKpix|QD}yfa1JiQRk#j4a1Z)n2%fLC6RbVIkUx0b+_+BaR3cnT7Zv!AJxWizFb)h!jyGOOZ85F;a?DAXP{m@;!0_ zIe&*-M!JzZ$N(~e{D!NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWw%BIv?Wdily+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9rwXSQO+7mGt}d!;r5mBU zM0dY#r|y`ZzFvTyOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8UBnI0I&KNw!HF0k|9WTe* z@liuv!$3o&VU=N*;e?U7(SJOn)kcj*4~%KXT;n9;ZN_cJqb3F>Atp;r>P_yNQcbz0 zDW*G2J50yT%*~?B)|oY%Ju%lZ=bPu7*PGwBU|M)uEVih&xMfMQu79>|wtZn|Vi#w( z#jeBdlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!h;8Eq#KMS9gFl*neeosSBfoHYnBQIkwkyowPu(zdm zs`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMeBmZRodjHV?r+_5^X9J0W zL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0?0=B0A@}E)&XLY(4uw#D z=+@8&Vdi0r!+s1Wg@=V#hChyQh*%oYF_$%W(cD9G-$eREmPFp0XE9GXuPsV7Dn6<% zYCPIEx-_~!#x7=A%+*+(SV?S4962s3t~PFLzTf=q^M~S{;tS(@7nm=|U2u7!&cgJC zrxvL$5-d8FKz~e#PB@hCK@cja7K|nG6L%$!3VFgE!e=5c(KgYD*h5?@9!~N|DouKl z?2)`Rc_hU%r7Y#SgeR$xyi5&D-J3d|7MgY-Z8AMNy)lE5k&tmhsv%92wrA>R=4N)w ztYw9={>5&Kw=W)*2gz%*kgNq+Eef_mrsz~!DAy_nvVUh~S7yJ>iOM;atDY;(?aZ^v z+mJV$@1Ote62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~p zu715HdQEGAUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$ z+<4_1hktL%znR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX4c}I@?e+FW+b@^R zDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i&_B8C(+grT%{XWUQ z+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?SIDu(gXbmBM!FLxzyDi(mhmCkJc;e zM-ImyzW$x>cP$Mz4ONYt#^NJzM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4Q zQ=0o*Vq3aT%s$c9>fU<%N829{oHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6 z=YM0)-)awU@466l;nGF_i|0GMJI-A4xODQe+vO8ixL2C5I$v$-bm~0*lhaSfyPUh4 zuDM)mx$b(swR>jw=^LIm&fWCAdGQwi*43UlJ>9+YdT;l|_x0Zv-F|W>{m#p~*>@-I zt-MdXU-UrjLD@syht)q@{@mE_+<$7ocYmPs(cDM(28Dyq{*m>M4?_iynUBkc4TkHU zI6gT!;y-fz>HMcd&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M z!p0uH$#^p{Ui4P`?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&Gf6Gm z00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C`008P>0026e z000+nl3&F}0002~NklX z{&IO&{!?*`qtUh0>t}Sk4-5vk)Ns04kMJjL}$|l&zH&LR{%T#2b r_k(@{xbwVNo0Jg0RPevbzt_hAnW%cB(ZB6X00000NkvXXu0mjfZdakf diff --git a/mods/default/textures/default_ladder_steel.png b/mods/default/textures/default_ladder_steel.png index 1cc6dfde641502892f0993cb21d9239ccbc804e3..a312f3e84d5a4bc6fcd7df02c6f6aea582f10ab4 100644 GIT binary patch delta 27 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 QqW}N^07*qoM6N<$f|MYt2mk;8 delta 3024 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 Sgm}RK0000SHf z5zaa4y2d$25Cnu_$P?CDf*=4O2m+K+02pg6yWLLl0kSOXhU@jp*Vh-9%LVb?_epu4|7hOt_kGKzX^^U_h~pT5#bWVe@>A1w z9RMOCZ-&$9e*{2L6hu)(S(X4C4hQPG?sautqm)9dwRrD)Vmh5t6a{ITQkEr2l5jj8 znM@`WMbYb;ra^0sXsxNL>a9hZrbJQ1Y&N5=YbKKk07;U(=|lv1KAubbd*;{LuZvbn z(KHRFZCk9h04$fwZ_TfZ)>1IPfIoiJ V$bEE3EUf?l002ovPDHLkV1mX0vj6}9 delta 3030 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 delta 3208 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 diff --git a/mods/default/textures/default_snow_side.png b/mods/default/textures/default_snow_side.png index f95b3af8bbe19ff2dfc9d95c77bd617f32c1a966..03456c84498d7c06625dfc29db1917f159fd5af6 100644 GIT binary patch delta 87 zcmew=b%AYyvO5Dyx}&cn1H;CC?mvmF3=9m6#X;^)j5kl})B`yR$sR$z3=CCj3=9n| p3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$YMat)W}<{eynnE)ND7f59&ghTmgWD z0l;*TI7e|ZE3OddDgXd@nX){&BsoQaTL>+22Uk}v9w^R9 z7b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&VLTB&dxTDwhmt{>c0m6B4T3W z{^ifBa6kY6;dFk{{wy!E8h|?nfNlPwCGG@hUJIag_lst-4?wj5py}FI^KkfnJUm6A zkh$5}<>chpO2k52Vaiv1{%68pz*qfj`F=e7_x0eu;v|7GU4cgg_~63K^h~83&yop* zV%+ABM}Pdc3;+Bb(;~!4V!2o<6ys46agIcqjPo+3B8fthDa9qy|77CdEc*jK-!%ZR zYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S1Au6Q;m>#f??3%Vpd|o+W=WE9003S@ zBra6Svp>fO002awfhw>;8}z{#EWidF!3EsG3xE7zHiSYX#KJ-lLJDMn9CBbOtb#%) zhRv`YDqt_vKpix|QD}yfa1JiQRk#j4a1Z)n2%fLC6RbVIkUx0b+_+BaR3c znT7Zv!AJxWizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifqlp|(=5QHQ7#Gr)$3XMd?XsE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*S zAPZv|vv@2aYYnT0b%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5c zP6_8IrP_yNQcbz0DW*G2J50yT%*~?B)|oY%Ju%lZ z=bPu7*PGwBU|M)uEVih&xMfMQuC{HqePL%}7iYJ{uEXw=y_0>qeSeMpJqHbk*$%56 zS{;6Kv~mM9! zg3B(KJ}#RZ#@)!hR=4N)wtYw9={>5&Kw=W)*2gz%*kgNq+ zEef_mrsz~!DAy_nvS(#iX1~pe$~l&+o-57m%(KedkbgIv@1Ote62cPUlD4IWOIIx& zSmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGAUct(O!LkCy1 z<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}TincS4LsjI}fWY1>O zX6feMEq|U{4wkBy=9dm`4cXeX4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC- zq*U}&`cyXV(%rRT*Z6MH?i+i&_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-N zmiuj8txj!m?Z*Ss1N{dh4z}01)YTo*JycSU)_*JOM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&VO9;xODQe+vO8ixL2C5I$v$-bm~0*lhaSfyPUh4uDM)mx$b(swR>jw=^LIm&fWCA zdGQwi*43UlJ>9+YdT;l|_x0Zv-F|W>{m#p~*>@-It-MdXU-UrjLD@syht)q@{@mE_ z+<$7occAmp+(-8Yg@e!jk@b%cLj{kSkAKUC4TkHUI6gT!;y-fz>HMcd&t%Ugo)`Y2 z{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P`?ZJ24cOCDe z-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60|De66laYKE Z5da5tNliru;0X-@IusjQYrV0NzXIrdCc^*# diff --git a/mods/default/textures/default_snowball.png b/mods/default/textures/default_snowball.png index e952b79c03c0401d28e814cb95ea7074e7cad0fa..3a4dc1f66b0289e55032706c36436833099c4ec4 100644 GIT binary patch delta 421 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 diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png index f597299bdfaa2389d40c5179069ccd5685b937f9..26c427b9fef32a34b2fd8daa7bff4117933d1924 100644 GIT binary patch delta 429 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 DKBSx> delta 2962 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 IM6N<$f)I_IfB*mh diff --git a/mods/fire/textures/fire_flint_steel.png b/mods/fire/textures/fire_flint_steel.png index 624f5565dd3029b7f3fc0ce0de374bb8977e301d..c262ebc096f471c95e66b33ca3cd44a14494419d 100644 GIT binary patch delta 434 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 From ae426878d472f14424a3f812f2f5356485750094 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 22 Jan 2017 06:54:59 +0000 Subject: [PATCH 017/118] Sounds: Remove 'default_dig_crumbly' from leaves defaults table Now that the missing 'default_dig_snappy' sound has been added we can remove the dirt dig sound from the table. All nodes that use the leaves defaults table have group 'snappy' so 'default_dig_snappy' now becomes their default dig sound. --- mods/default/functions.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 11c42d59..957bce60 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -77,8 +77,6 @@ function default.node_sound_leaves_defaults(table) {name = "default_grass_footstep", gain = 0.45} table.dug = table.dug or {name = "default_grass_footstep", gain = 0.7} - table.dig = table.dig or - {name = "default_dig_crumbly", gain = 0.4} table.place = table.place or {name = "default_place_node", gain = 1.0} default.node_sound_defaults(table) From bee5b316a86abba55ddb3bf97eab3cb9fb5803b5 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 30 Dec 2016 22:13:27 +0000 Subject: [PATCH 018/118] Creative: Add creative.is_enabled_for --- game_api.txt | 6 ++++++ mods/creative/init.lua | 37 +++++++++++++++++++++++-------------- mods/creative/inventory.lua | 5 ++--- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/game_api.txt b/game_api.txt index 38718c36..cef46f66 100644 --- a/game_api.txt +++ b/game_api.txt @@ -78,6 +78,12 @@ For example, is used to show all tools. Name is used in the sfinv page name, title is the human readable title. +`is_enabled_for` is used to check whether a player is in creative mode: + + creative.is_enabled_for(name) + +Override this to allow per-player game modes. + 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. diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 868b802b..24700eb9 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,3 +1,9 @@ +creative = {} + +function creative.is_enabled_for(name) + return minetest.setting_getbool("creative_mode") +end + dofile(minetest.get_modpath("creative") .. "/inventory.lua") if minetest.setting_getbool("creative_mode") then @@ -28,22 +34,25 @@ if minetest.setting_getbool("creative_mode") then damage_groups = {fleshy = 10}, } }) +end - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - return true - end) +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return creative.is_enabled_for(placer:get_player_name()) +end) - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - return - end - local inv = digger:get_inventory() - if inv then - for _, item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then - inv:add_item("main", item) - end +-- Don't pick up if the item is already in the inventory +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() or + not creative.is_enabled_for(digger:get_player_name()) then + return + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + item = ItemStack(item):get_name() + if not inv:contains_item("main", item) then + inv:add_item("main", item) end end end diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index be24b3a2..1363e294 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -1,4 +1,3 @@ -creative = {} local player_inventory = {} function creative.init_creative_inventory(player) @@ -79,7 +78,7 @@ function creative.register_tab(name, title, items) sfinv.register_page("creative:" .. name, { title = title, is_in_nav = function(self, player, context) - return minetest.setting_getbool("creative_mode") + return creative.is_enabled_for(player:get_player_name()) end, get = function(self, player, context) local player_name = player:get_player_name() @@ -172,7 +171,7 @@ creative.register_tab("craftitems", "Items", minetest.registered_craftitems) local old_homepage_name = sfinv.get_homepage_name function sfinv.get_homepage_name(player) - if minetest.setting_getbool("creative_mode") then + if creative.is_enabled_for(player:get_player_name()) then return "creative:all" else return old_homepage_name(player) From 38500da6556860dca2d6197749f457a64f56f934 Mon Sep 17 00:00:00 2001 From: number Zero Date: Thu, 26 Jan 2017 16:36:48 +0300 Subject: [PATCH 019/118] Stairs: Fix smooth lighting of stair mesh --- mods/stairs/models/stairs_stair.obj | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/stairs/models/stairs_stair.obj b/mods/stairs/models/stairs_stair.obj index 45882c6e..198edf6e 100644 --- a/mods/stairs/models/stairs_stair.obj +++ b/mods/stairs/models/stairs_stair.obj @@ -55,7 +55,8 @@ usemtl None s off f 13/11/3 14/12/3 15/13/3 f 15/13/3 18/14/3 17/15/3 -f 14/12/3 16/16/3 18/14/3 +f 14/12/3 16/16/3 15/13/3 +f 16/16/3 18/14/3 15/13/3 o stairs_left v 0.500000 0.000000 0.000000 v 0.500000 -0.500000 -0.500000 @@ -75,7 +76,8 @@ usemtl None s off f 19/17/4 20/18/4 21/19/4 f 19/17/4 23/20/4 24/21/4 -f 20/18/4 24/21/4 22/22/4 +f 20/18/4 19/17/4 22/22/4 +f 19/17/4 24/21/4 22/22/4 o stairs_back v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000 From 1dd9fdb530797d25a779cffb9ad772a156050368 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 26 Jan 2017 15:54:32 +0000 Subject: [PATCH 020/118] Dungeons: Add mapgen alias for desert stone stairs --- mods/default/mapgen.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 3d2da557..3493417b 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -34,6 +34,7 @@ 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") minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick") minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick") From b06368adf2c5e5d00fa2e34fb914e6bc67dc82cf Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 27 Jan 2017 19:48:27 +0000 Subject: [PATCH 021/118] Fix node drops not being added to inventory when not in creative mode --- mods/creative/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 24700eb9..cd9e2b49 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -42,11 +42,14 @@ minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack 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 creative.is_enabled_for(digger:get_player_name()) then + if not digger or not digger:is_player() then return end + if not creative.is_enabled_for(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 From d560f59a742669f7cf20d47d1535c739f3593cbd Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 28 Dec 2016 19:27:05 +0000 Subject: [PATCH 022/118] Ores: Add silver sand blob ore, relocate other blob ores --- mods/default/mapgen.lua | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 3493417b..d6c84e92 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -45,11 +45,11 @@ minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebr function default.register_ores() minetest.clear_registered_ores() + -- Blob ores -- These first to avoid other ores in blobs -- Clay - -- This first to avoid clay in sand blobs minetest.register_ore({ ore_type = "blob", @@ -70,17 +70,16 @@ function default.register_ores() }, }) - -- Sand + -- Silver sand minetest.register_ore({ ore_type = "blob", - ore = "default:sand", - wherein = {"default:stone", "default:sandstone", - "default:desert_stone"}, + ore = "default:silver_sand", + wherein = {"default:stone"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -31, - y_max = 0, + y_min = -31000, + y_max = 31000, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -90,6 +89,13 @@ function default.register_ores() octaves = 1, persist = 0.0 }, + biomes = {"icesheet_ocean", "tundra", "tundra_beach", "tundra_ocean", + "taiga", "taiga_ocean", "snowy_grassland", "snowy_grassland_ocean", + "grassland", "grassland_dunes", "grassland_ocean", "coniferous_forest", + "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", + "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", + "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground"} }) -- Dirt @@ -112,7 +118,8 @@ function default.register_ores() persist = 0.0 }, biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", - "deciduous_forest", "savanna", "rainforest"} + "deciduous_forest", "deciduous_forest_shore", "savanna", "savanna_shore", + "rainforest", "rainforest_swamp"} }) -- Gravel @@ -134,6 +141,13 @@ function default.register_ores() octaves = 1, persist = 0.0 }, + biomes = {"icesheet_ocean", "tundra", "tundra_beach", "tundra_ocean", + "taiga", "taiga_ocean", "snowy_grassland", "snowy_grassland_ocean", + "grassland", "grassland_dunes", "grassland_ocean", "coniferous_forest", + "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", + "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", + "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground"} }) -- Scatter ores From e86955afae515fcb150f98ad4bc86d0aea91d6c7 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 31 Jan 2017 11:41:50 +0000 Subject: [PATCH 023/118] Creative: Cache creative mode setting --- mods/creative/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index cd9e2b49..7471e603 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,7 +1,9 @@ creative = {} +local creative_mode_cache = minetest.setting_getbool("creative_mode") + function creative.is_enabled_for(name) - return minetest.setting_getbool("creative_mode") + return creative_mode_cache end dofile(minetest.get_modpath("creative") .. "/inventory.lua") From 2b215848d8be34c25e7ea2176aaa6b9c32574f18 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 31 Jan 2017 14:14:13 +0000 Subject: [PATCH 024/118] Trees: Add 'snowy' group for pine sapling snow detection Use the 'snowy' group in the 'is snow nearby' function instead of default nodes. Often snow nodes are not from the default mod. --- mods/default/nodes.lua | 6 +++--- mods/default/trees.lua | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 3e781091..572c604f 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -378,7 +378,7 @@ minetest.register_node("default: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}, + 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.15}, @@ -445,7 +445,7 @@ minetest.register_node("default:snow", { {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, }, }, - groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1}, + groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1, snowy = 1}, sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.15}, dug = {name = "default_snow_footstep", gain = 0.2}, @@ -463,7 +463,7 @@ minetest.register_node("default:snow", { minetest.register_node("default:snowblock", { description = "Snow Block", tiles = {"default_snow.png"}, - groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1}, + groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.15}, dug = {name = "default_snow_footstep", gain = 0.2}, diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 0b95742c..2b676e75 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -27,8 +27,7 @@ end -- 'is snow nearby' function local function is_snow_nearby(pos) - return minetest.find_node_near(pos, 1, - {"default:snow", "default:snowblock", "default:dirt_with_snow"}) + return minetest.find_node_near(pos, 1, {"group:snowy"}) end From 2e950ac61c7125fe1906bbe7ac97712c3ff0f3e4 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 1 Feb 2017 18:44:50 +0000 Subject: [PATCH 025/118] Mapgen: Dedicated registrations for mgv6 blob ores Now that biomes are being specified for blob ores we need a separate set of blob ore registrations for mgv6 which has no Biome API biomes defined. Various minor improvements to mapgen.lua. --- mods/default/mapgen.lua | 120 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 110 insertions(+), 10 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index d6c84e92..14e1fc6d 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1,5 +1,5 @@ -- --- Aliases for map generator outputs +-- Aliases for map generators -- minetest.register_alias("mapgen_stone", "default:stone") @@ -43,11 +43,103 @@ minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebr -- Register ores -- -function default.register_ores() - minetest.clear_registered_ores() +-- Blob ores +-- These first to avoid other ores in blobs - -- Blob ores - -- These first to avoid other ores in blobs +-- Mgv6 + +function default.register_mgv6_blob_ores() + + -- 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_min = -15, + y_max = 0, + 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_min = -31, + y_max = 0, + 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_min = -31, + y_max = 31000, + 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_min = -31000, + y_max = 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 + }, + }) +end + + +-- All mapgens except mgv6 + +function default.register_blob_ores() -- Clay @@ -149,8 +241,13 @@ function default.register_ores() "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", "rainforest", "rainforest_swamp", "rainforest_ocean", "underground"} }) +end - -- Scatter ores + +-- Scatter ores +-- All mapgens + +function default.register_ores() -- Coal @@ -392,10 +489,9 @@ end -- Register biomes -- --- All mapgens except mgv6 and singlenode +-- All mapgens except mgv6 function default.register_biomes() - minetest.clear_registered_biomes() -- Icesheet @@ -1048,7 +1144,6 @@ end -- Mgv6 function default.register_mgv6_decorations() - minetest.clear_registered_decorations() -- Papyrus @@ -1181,7 +1276,6 @@ end function default.register_decorations() - minetest.clear_registered_decorations() -- Apple tree and log @@ -1563,12 +1657,18 @@ end -- Detect mapgen to select functions -- +minetest.clear_registered_biomes() +minetest.clear_registered_ores() +minetest.clear_registered_decorations() + local mg_name = minetest.get_mapgen_setting("mg_name") if mg_name == "v6" then + default.register_mgv6_blob_ores() default.register_ores() default.register_mgv6_decorations() else default.register_biomes() + default.register_blob_ores() default.register_ores() default.register_decorations() end From c88c0a98fdef2ada6f886ff6543380025e726337 Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Thu, 9 Feb 2017 00:59:25 +0100 Subject: [PATCH 026/118] Make drop logic work better for non-8-step-plants. (#1544) Using @paramat's formula. --- mods/farming/api.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 182e1b20..b6e3ee3e 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -330,12 +330,16 @@ farming.register_plant = function(name, def) -- 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 = 9 - i}, - {items = {mname .. ":" .. pname}, rarity= 18 - i * 2}, - {items = {mname .. ":seed_" .. pname}, rarity = 9 - i}, - {items = {mname .. ":seed_" .. pname}, rarity = 18 - i * 2}, + {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} From 86849d9eec523faf7446095d9bee1f4374c67ba5 Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 9 Feb 2017 00:01:30 +0000 Subject: [PATCH 027/118] Default: Add nodebox mese post light usable as a growlamp (#1480) Light level 14 to be able to grow plants. 3 returned from crafting with 1 glass node, 3 mese crystals and 1 wood plank. Seamlessly placable on appletree wood fence posts. --- mods/default/README.txt | 3 +++ mods/default/crafting.lua | 9 +++++++ mods/default/nodes.lua | 22 ++++++++++++++++++ .../textures/default_mese_post_light_side.png | Bin 0 -> 353 bytes .../default_mese_post_light_side_dark.png | Bin 0 -> 353 bytes .../textures/default_mese_post_light_top.png | Bin 0 -> 155 bytes 6 files changed, 34 insertions(+) create mode 100644 mods/default/textures/default_mese_post_light_side.png create mode 100644 mods/default/textures/default_mese_post_light_side_dark.png create mode 100644 mods/default/textures/default_mese_post_light_top.png diff --git a/mods/default/README.txt b/mods/default/README.txt index d261b6b5..57f4d4b2 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -115,6 +115,9 @@ paramat (CC BY-SA 3.0): default_grass_side.png 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 brunob.santos (CC BY-SA 4.0): default_desert_cobble.png diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index f82b0718..ce27bb42 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -639,6 +639,15 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "default:mese_post_light 3", + recipe = { + {"", "default:glass", ""}, + {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, + {"", "group:wood", ""}, + } +}) + minetest.register_craft({ output = 'default:obsidian_shard 9', recipe = { diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 572c604f..b5e8caa8 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -182,6 +182,7 @@ default:obsidian_glass default:brick default:meselamp +default:mese_post_light Misc ---- @@ -2078,6 +2079,27 @@ minetest.register_node("default:meselamp", { light_source = default.LIGHT_MAX, }) +minetest.register_node("default:mese_post_light", { + description = "Mese Post Light", + tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png", + "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png", + "default_mese_post_light_side.png", "default_mese_post_light_side.png"}, + wield_image = "default_mese_post_light_side.png", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16}, + }, + }, + paramtype = "light", + 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(), +}) + -- -- Misc -- diff --git a/mods/default/textures/default_mese_post_light_side.png b/mods/default/textures/default_mese_post_light_side.png new file mode 100644 index 0000000000000000000000000000000000000000..c23b551a7cc0c6771679dbcfc0ff94f493ae859a GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0FfGl=rhyEDX~wk29NC z=s2~+sjI7N;>3w_=FC~Sa^_HHI~YrX{DK)Ap4~_Tagw~Fdh=kWrprL`GEgz)he~n5THA`|WcZD8bP0l+XkK4xXID literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_mese_post_light_side_dark.png b/mods/default/textures/default_mese_post_light_side_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fc7ceac3c46b6186e313504f2ff17f3c40e62f GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0DI(max{940TkDa@Wia zH7p1>>gwv6IC0{fIdfL7T)An}rb}09FJEc6e6{h))#gXf(jPu8d;Bcp@zbJ5PfH&^ z%YXd5@X7Q1hmRLMd0zbZdG*uhHBX;6K6z31_{qj+FWR5I=y~#D#?u$mp1z5*Qd|BKYiZ!@$<1yUk--OJW&I52V+T)UoeBivm0q3PLj8~3quF1tOt<8 zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifGRpHyvCKGC$_Nw+^K@|xk+|G@!d=M0L4@^y zr2OF%me0@peZTzFsm+&8r@e7J(z%!OvVg$tx)_04Yh8iE73Ty}gUbaxXN3yX%@7xG ulvyjV?QxaBrA;a&XcU;w@Z`l6i*$+GZN;;&{oxklM|d%x!jI3s4b*r>mdKI;Vst0QkEkJpcdz literal 0 HcmV?d00001 From e3dd3d19cdd91bf1d2d5a88ea14093964d322b17 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 6 Feb 2017 18:26:33 +0000 Subject: [PATCH 028/118] Add sfinv.set_page, plus other helper functions --- game_api.txt | 26 +++++++++++++------ mods/sfinv/api.lua | 65 +++++++++++++++++++++++++++------------------- 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/game_api.txt b/game_api.txt index cef46f66..0d518f1c 100644 --- a/game_api.txt +++ b/game_api.txt @@ -412,18 +412,28 @@ Sfinv API ### sfinv Methods -* sfinv.set_player_inventory_formspec(player, context) - builds page formspec - and calls set_inventory_formspec(). - If context is nil, it is either found or created. -* sfinv.get_formspec(player, context) - builds current page's formspec -* sfinv.get_nav_fs(player, context, nav, current_idx) - see above +**Pages** + +* sfinv.set_page(player, pagename) - changes the page * sfinv.get_homepage_name(player) - get the page name of the first page to show to a player -* 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.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 diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index 2fef3c84..b6e97667 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -91,22 +91,42 @@ function sfinv.get_formspec(player, context) end end -function sfinv.set_player_inventory_formspec(player, context) +function sfinv.get_or_create_context(player) + local name = player:get_player_name() + local context = sfinv.contexts[name] if not context then - local name = player:get_player_name() - context = sfinv.contexts[name] - if not context then - context = { - page = sfinv.get_homepage_name(player) - } - sfinv.contexts[name] = context - end + context = { + page = sfinv.get_homepage_name(player) + } + sfinv.contexts[name] = context end + return context +end - local fs = sfinv.get_formspec(player, context) +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 + minetest.register_on_joinplayer(function(player) if sfinv.enabled then minetest.after(0.5, function() @@ -132,30 +152,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return false end - -- Handle Events + -- Was a tab selected? if fields.tabs and context.nav then local tid = tonumber(fields.tabs) if tid and tid > 0 then local id = context.nav[tid] local page = sfinv.pages[id] if id and page then - local oldpage = sfinv.pages[context.page] - if oldpage and oldpage.on_leave then - oldpage:on_leave(player, context) - end - context.page = id - if page.on_enter then - page:on_enter(player, context) - end - sfinv.set_player_inventory_formspec(player, context) + sfinv.set_page(player, id) end end - return - end - - -- Pass 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) + 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) From f6dfa4a1cbb4c9981db94abdf304dc04aab670ef Mon Sep 17 00:00:00 2001 From: octacian Date: Fri, 10 Feb 2017 17:13:13 -0800 Subject: [PATCH 029/118] Waterlily: Avoid z-fighting of base texture with water surface Avoid z-fighting visible from below. Raise the nodebox base 1/64th of a node. --- mods/flowers/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index c7cc670e..da82bb7c 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -264,7 +264,7 @@ minetest.register_node("flowers:waterlily", { node_placement_prediction = "", node_box = { type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, -15 / 32, 0.5} + fixed = {-0.5, -31 / 64, -0.5, 0.5, -15 / 32, 0.5} }, selection_box = { type = "fixed", From 0819d4bade1f4e748d8a219a87b51da78a57732f Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 11 Feb 2017 23:06:47 +0000 Subject: [PATCH 030/118] Visual scale: Update plantlike nodes to post-bugfix values Plantlike drawtype no longer applies 'visual scale' twice, so now we use the actual scale factor desired. Remove unnecessary 'visual_scale = 1.0' lines. --- mods/default/nodes.lua | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index b5e8caa8..76f7ed40 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -516,7 +516,6 @@ minetest.register_node("default:wood", { minetest.register_node("default:sapling", { description = "Sapling", drawtype = "plantlike", - visual_scale = 1.0, tiles = {"default_sapling.png"}, inventory_image = "default_sapling.png", wield_image = "default_sapling.png", @@ -582,7 +581,6 @@ minetest.register_node("default:leaves", { minetest.register_node("default:apple", { description = "Apple", drawtype = "plantlike", - visual_scale = 1.0, tiles = {"default_apple.png"}, inventory_image = "default_apple.png", paramtype = "light", @@ -652,7 +650,6 @@ minetest.register_node("default:jungleleaves", { minetest.register_node("default:junglesapling", { description = "Jungle Sapling", drawtype = "plantlike", - visual_scale = 1.0, tiles = {"default_junglesapling.png"}, inventory_image = "default_junglesapling.png", wield_image = "default_junglesapling.png", @@ -732,7 +729,6 @@ minetest.register_node("default:pine_needles",{ minetest.register_node("default:pine_sapling", { description = "Pine Sapling", drawtype = "plantlike", - visual_scale = 1.0, tiles = {"default_pine_sapling.png"}, inventory_image = "default_pine_sapling.png", wield_image = "default_pine_sapling.png", @@ -813,7 +809,6 @@ minetest.register_node("default:acacia_leaves", { minetest.register_node("default:acacia_sapling", { description = "Acacia Tree Sapling", drawtype = "plantlike", - visual_scale = 1.0, tiles = {"default_acacia_sapling.png"}, inventory_image = "default_acacia_sapling.png", wield_image = "default_acacia_sapling.png", @@ -892,7 +887,6 @@ minetest.register_node("default:aspen_leaves", { minetest.register_node("default:aspen_sapling", { description = "Aspen Tree Sapling", drawtype = "plantlike", - visual_scale = 1.0, tiles = {"default_aspen_sapling.png"}, inventory_image = "default_aspen_sapling.png", wield_image = "default_aspen_sapling.png", @@ -1079,7 +1073,6 @@ minetest.register_node("default:dry_shrub", { description = "Dry Shrub", drawtype = "plantlike", waving = 1, - visual_scale = 1.0, tiles = {"default_dry_shrub.png"}, inventory_image = "default_dry_shrub.png", wield_image = "default_dry_shrub.png", @@ -1099,7 +1092,7 @@ minetest.register_node("default:junglegrass", { description = "Jungle Grass", drawtype = "plantlike", waving = 1, - visual_scale = 1.3, + visual_scale = 1.69, tiles = {"default_junglegrass.png"}, inventory_image = "default_junglegrass.png", wield_image = "default_junglegrass.png", @@ -1223,7 +1216,7 @@ end minetest.register_node("default:bush_stem", { description = "Bush Stem", drawtype = "plantlike", - visual_scale = 1.18, + visual_scale = 1.41, tiles = {"default_bush_stem.png"}, inventory_image = "default_bush_stem.png", wield_image = "default_bush_stem.png", @@ -1250,7 +1243,7 @@ minetest.register_node("default:bush_leaves", { minetest.register_node("default:acacia_bush_stem", { description = "Acacia Bush Stem", drawtype = "plantlike", - visual_scale = 1.18, + visual_scale = 1.41, tiles = {"default_acacia_bush_stem.png"}, inventory_image = "default_acacia_bush_stem.png", wield_image = "default_acacia_bush_stem.png", From 89c45993acae89ee1bc68f42e510f5304f13ffa9 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 12 Feb 2017 11:47:22 +0100 Subject: [PATCH 031/118] Carts: Fix the rail table overwrite behaviour --- mods/carts/functions.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua index 285645cb..a4717194 100644 --- a/mods/carts/functions.lua +++ b/mods/carts/functions.lua @@ -181,8 +181,8 @@ function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) return false end -function carts:register_rail(name, def, railparams) - local def_default = { +function carts:register_rail(name, def_overwrite, railparams) + local def = { drawtype = "raillike", paramtype = "light", sunlight_propagates = true, @@ -194,7 +194,7 @@ function carts:register_rail(name, def, railparams) }, sounds = default.node_sound_metal_defaults() } - for k, v in pairs(def_default) do + for k, v in pairs(def_overwrite) do def[k] = v end if not def.inventory_image then From 37dd91074700f1ae662fea784bf98c9a81e0ac1b Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Fri, 10 Feb 2017 20:35:26 +0100 Subject: [PATCH 032/118] Globalize, rename and change the behaviour of has_locked_chest_privilege * rename to default.can_interact_with_node() * pass pos instead of meta * change order of arguments --- mods/default/functions.lua | 36 ++++++++++++++++++++++++++++++++ mods/default/nodes.lua | 42 +++++--------------------------------- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 957bce60..b9275209 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -516,3 +516,39 @@ minetest.register_abm({ minetest.set_node(pos, {name = "default:coral_skeleton"}) 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 then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + else + return false + end + + local meta = minetest.get_meta(pos) + + -- is player wielding the right key? + local item = player:get_wielded_item() + if item:get_name() == "default:key" then + local key_meta = minetest.parse_json(item:get_metadata()) + local secret = meta:get_string("key_lock_secret") + if secret ~= key_meta.secret then + return false + end + + return true + end + + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + + return true +end \ No newline at end of file diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 76f7ed40..0ce62a49 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1612,34 +1612,6 @@ local function get_locked_chest_formspec(pos) return formspec end -local function has_locked_chest_privilege(meta, player) - if player then - if minetest.check_player_privs(player, "protection_bypass") then - return true - end - else - return false - end - - -- is player wielding the right key? - local item = player:get_wielded_item() - if item:get_name() == "default:key" then - local key_meta = minetest.parse_json(item:get_metadata()) - local secret = meta:get_string("key_lock_secret") - if secret ~= key_meta.secret then - return false - end - - return true - end - - if player:get_player_name() ~= meta:get_string("owner") then - return false - end - - return true -end - minetest.register_node("default:chest", { description = "Chest", tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", @@ -1710,26 +1682,23 @@ minetest.register_node("default:chest_locked", { can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() - return inv:is_empty("main") and has_locked_chest_privilege(meta, player) + return inv:is_empty("main") and default.can_interact_with_node(player, pos) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - if not has_locked_chest_privilege(meta, player) then + if not default.can_interact_with_node(player, pos) then return 0 end return count end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if not has_locked_chest_privilege(meta, player) then + if not default.can_interact_with_node(player, pos) then return 0 end return stack:get_count() end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if not has_locked_chest_privilege(meta, player) then + if not default.can_interact_with_node(player, pos) then return 0 end return stack:get_count() @@ -1745,8 +1714,7 @@ minetest.register_node("default:chest_locked", { " from locked chest at " .. minetest.pos_to_string(pos)) end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - local meta = minetest.get_meta(pos) - if has_locked_chest_privilege(meta, clicker) then + if default.can_interact_with_node(clicker, pos) then minetest.show_formspec( clicker:get_player_name(), "default:chest_locked", From 60e5b299af564f250af8304b5146f79693c314ff Mon Sep 17 00:00:00 2001 From: MarkuBu Date: Tue, 7 Feb 2017 16:28:02 -0800 Subject: [PATCH 033/118] Leafdecay: Node timer based implementation, API This implements a node-timer based leafdecay mechanism, and exposes an API to use it in mods. The API is documented in game_api.txt. `default.register_leafdecay(leafdecaydef)` `leafdecaydef` is a table, with following members: { trunks = { "default:tree"}, -- nodes considered trunks leaves = { "default:leaves", "default:apple"}, -- nodes considered leaves radius = 3, -- activates leafdecay this far from the trunk } The algorithm will drop `leaves` items in the area if no `trunks` are found in the `trunk_radius` sized area around the position of the leaf. If a node listed in `leaves` has a group `leafdecay_drop > 0`, then the item is dropped, otherwise the item is removed but not dropped. The algorithm also implements a value `default.leafdecay_speed` (default 15) which can be modified to increase or decrease of the leaf decay. The algorithm will vary the actual speed a bit to introduce randomness. Leaf decay is randomized by 0.1 seconds to reduce the chance that decay happens many times on the same second interval. This requires nodetimer_interval to be set to values lower than 1.0 to have an effect. The leaves will decay between 2 and 10 seconds after digging the trunk, and happen at non-integer second intervals. -- The API was added by sofar. --- game_api.txt | 36 +++++++++++----- mods/default/functions.lua | 87 +++++++++++++++++++++++--------------- mods/default/nodes.lua | 54 +++++++++++++++++++++++ 3 files changed, 132 insertions(+), 45 deletions(-) diff --git a/game_api.txt b/game_api.txt index 0d518f1c..fa6225a0 100644 --- a/game_api.txt +++ b/game_api.txt @@ -658,20 +658,36 @@ default.player_get_animation(player) Leafdecay --------- -To enable leaf decay for a node, add it to the `leafdecay` group. +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. -The rating of the group determines how far from a node in the group `tree` -the node can be without decaying. +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. -If `param2` of the 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)). -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. -If the node is in the `leafdecay_drop` group then it will always be dropped as an -item. Dyes ---- diff --git a/mods/default/functions.lua b/mods/default/functions.lua index b9275209..03611094 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -325,47 +325,64 @@ default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) end end --- Leafdecay ABM - -minetest.register_abm({ - label = "Leaf decay", - nodenames = {"group:leafdecay"}, - neighbors = {"air"}, - interval = 2, - chance = 10, - catch_up = false, - - action = function(pos, node, _, _) - -- Check if leaf is placed - if node.param2 ~= 0 then - return +-- 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) + if node.param2 == 0 then + minetest.get_node_timer(v):start(math.random(20, 120) / 10) end + end +end - local rad = minetest.registered_nodes[node.name].groups.leafdecay - -- Assume ignore is a trunk, to make this - -- work at the border of a loaded area - if minetest.find_node_near(pos, rad, {"ignore", "group:tree"}) then - return - end - -- Drop stuff - local itemstacks = minetest.get_node_drops(node.name) - for _, itemname in ipairs(itemstacks) do - if itemname ~= node.name or - minetest.get_item_group(node.name, "leafdecay_drop") ~= 0 then - local p_drop = { - x = pos.x - 0.5 + math.random(), - y = pos.y - 0.5 + math.random(), - z = pos.z - 0.5 + math.random(), - } - minetest.add_item(p_drop, itemname) +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 - -- Remove node - minetest.remove_node(pos) - minetest.check_for_falling(pos) + 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) +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 dirt to something that fits the environment diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 0ce62a49..3d74b772 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2072,3 +2072,57 @@ minetest.register_node("default:cloud", { 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, + }) + + default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + 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, + }) + + default.register_leafdecay({ + trunks = {"default:pine_tree"}, + leaves = {"default:pine_needles"}, + radius = 2, + }) +end + +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, +}) From 1ec31d84727a3403ca357d704377f038e214f94d Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 16 Feb 2017 19:17:01 +0000 Subject: [PATCH 034/118] Torches: Reduce light source level from 13 to 12 As part of the original plan for a new lightcurve. With the old lightcurve lights were so dim all light sources had light source level 13 or 14 to compensate, resulting in almost no difference between torchlight and a maximum brightness light. The new lightcurve makes all light sources effectively much brighter by spreading visually-bright light further, torches are now slightly too bright. So now we can reduce the light source level of torches while actually making them effectively brighter than with the old lightcurve. This also creates a desirable difference between torchlight and a maximum-brightness light source. --- mods/default/torch.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/default/torch.lua b/mods/default/torch.lua index e94c5bd6..3c3ae965 100644 --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -50,7 +50,7 @@ minetest.register_node("default:torch", { sunlight_propagates = true, walkable = false, liquids_pointable = false, - light_source = 13, + light_source = 12, groups = {choppy=2, dig_immediate=3, flammable=1, attached_node=1, torch=1}, drop = "default:torch", selection_box = { @@ -97,7 +97,7 @@ minetest.register_node("default:torch_wall", { paramtype2 = "wallmounted", sunlight_propagates = true, walkable = false, - light_source = 13, + 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 = { @@ -118,7 +118,7 @@ minetest.register_node("default:torch_ceiling", { paramtype2 = "wallmounted", sunlight_propagates = true, walkable = false, - light_source = 13, + 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 = { @@ -144,4 +144,3 @@ minetest.register_lbm({ end end }) - From d5f1f964e3e10e07d71c2d81f6837891477e7004 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 25 Feb 2017 01:05:40 +0000 Subject: [PATCH 035/118] Lavacooling: Return to chance = 2 Return to previous parameters interval = 1, chance = 2. Compensates for the increase in default active block radius. Large amounts of lava cooling at once is known to overload sound creation, producing error messages. --- mods/default/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 03611094..9ba0e782 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -136,7 +136,7 @@ minetest.register_abm({ nodenames = {"default:lava_source", "default:lava_flowing"}, neighbors = {"group:cools_lava", "group:water"}, interval = 1, - chance = 1, + chance = 2, catch_up = false, action = function(...) default.cool_lava(...) From bb18eeccaf83d3f15004f1c03a7ca21cdd942492 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 25 Feb 2017 03:22:58 +0000 Subject: [PATCH 036/118] Corals: Smaller, less dense reefs --- mods/default/mapgen.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 14e1fc6d..a78dc0ac 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1632,9 +1632,9 @@ function default.register_decorations() deco_type = "schematic", place_on = {"default:sand"}, noise_params = { - offset = -0.1, + offset = -0.15, scale = 0.1, - spread = {x = 200, y = 200, z = 200}, + spread = {x = 100, y = 100, z = 100}, seed = 7013, octaves = 3, persist = 1, From 9d3a5263244e7cd001a4ad9c2875c4068193392c Mon Sep 17 00:00:00 2001 From: octacian Date: Sun, 26 Feb 2017 09:24:12 -0800 Subject: [PATCH 037/118] Keys: Show owner in description Utilizes several new features allowing the description of an item to be changed using the `description` meta key. This also moves keys from using the old single-value itemstack metadata system to the new node-like metadata system. --- mods/default/nodes.lua | 8 ++++++-- mods/default/tools.lua | 7 ++++--- mods/doors/init.lua | 18 ++++++++++++++---- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 3d74b772..9db04559 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1727,9 +1727,13 @@ minetest.register_node("default:chest_locked", { 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 = minetest.parse_json(itemstack:get_metadata()) + local key_meta = itemstack:get_meta() - if secret ~= key_meta.secret then + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) + end + + if secret ~= key_meta:get_string("secret") then return end diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 9147f9b3..c7ea1619 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -410,9 +410,10 @@ minetest.register_tool("default:skeleton_key", { -- finish and return the new key itemstack:take_item() itemstack:add_item("default:key") - itemstack:set_metadata(minetest.write_json({ - secret = secret - })) + local meta = itemstack:get_meta() + meta:set_string("secret", secret) + meta:set_string("description", "Key to "..placer:get_player_name().."'s " + ..minetest.registered_nodes[node.name].description) return itemstack end end diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 61d48c1d..53e27938 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -144,9 +144,14 @@ function _doors.door_toggle(pos, node, clicker) local item = clicker:get_wielded_item() local owner = meta:get_string("doors_owner") if item:get_name() == "default:key" then - local key_meta = minetest.parse_json(item:get_metadata()) + local key_meta = item:get_meta() local secret = meta:get_string("key_lock_secret") - if secret ~= key_meta.secret then + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) + end + + if secret ~= key_meta:get_string("secret") then return false end @@ -532,9 +537,14 @@ function _doors.trapdoor_toggle(pos, node, clicker) local meta = minetest.get_meta(pos) local owner = meta:get_string("doors_owner") if item:get_name() == "default:key" then - local key_meta = minetest.parse_json(item:get_metadata()) + local key_meta = item:get_meta() local secret = meta:get_string("key_lock_secret") - if secret ~= key_meta.secret then + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) + end + + if secret ~= key_meta:get_string("secret") then return false end From d1b132555b47fa83d6b1cbe0d2c6dd6e48fa54b4 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 26 Feb 2017 01:37:35 +0000 Subject: [PATCH 038/118] Biomes: New surface node for rainforest Moist rainforest plant litter. Textures by npx. --- mods/default/README.txt | 4 ++++ mods/default/mapgen.lua | 8 ++++---- mods/default/nodes.lua | 16 ++++++++++++++++ .../textures/default_rainforest_litter.png | Bin 0 -> 940 bytes .../textures/default_rainforest_litter_side.png | Bin 0 -> 497 bytes 5 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 mods/default/textures/default_rainforest_litter.png create mode 100644 mods/default/textures/default_rainforest_litter_side.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 57f4d4b2..342a8c4f 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -198,6 +198,10 @@ Ferk (CC0 1.0) default_item_smoke.png default_item_smoke.ogg, based on sound by http://opengameart.org/users/bart +npx (CC BY-SA 3.0) + default_rainforest_litter.png + default_rainforest_litter_side.png + 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/ diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index a78dc0ac..f99360ad 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1058,7 +1058,7 @@ function default.register_biomes() minetest.register_biome({ name = "rainforest", --node_dust = "", - node_top = "default:dirt_with_grass", + node_top = "default:dirt_with_rainforest_litter", depth_top = 1, node_filler = "default:dirt", depth_filler = 3, @@ -1322,7 +1322,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", - place_on = {"default:dirt_with_grass", "default:dirt"}, + place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, sidelen = 80, fill_ratio = 0.1, biomes = {"rainforest", "rainforest_swamp"}, @@ -1335,7 +1335,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", - place_on = {"default:dirt_with_grass", "default:dirt"}, + place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, sidelen = 80, fill_ratio = 0.005, biomes = {"rainforest", "rainforest_swamp"}, @@ -1596,7 +1596,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "simple", - place_on = {"default:dirt_with_grass"}, + place_on = {"default:dirt_with_rainforest_litter"}, sidelen = 80, fill_ratio = 0.1, biomes = {"rainforest"}, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 9db04559..82a97c65 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -44,6 +44,7 @@ default:dirt_with_grass default:dirt_with_grass_footsteps default:dirt_with_dry_grass default:dirt_with_snow +default:dirt_with_rainforest_litter default:sand default:desert_sand @@ -386,6 +387,21 @@ minetest.register_node("default:dirt_with_snow", { }), }) +minetest.register_node("default:dirt_with_rainforest_litter", { + description = "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:sand", { description = "Sand", tiles = {"default_sand.png"}, diff --git a/mods/default/textures/default_rainforest_litter.png b/mods/default/textures/default_rainforest_litter.png new file mode 100644 index 0000000000000000000000000000000000000000..d762deb46cdc5c5746128223b9fd0d26e50a11fd GIT binary patch literal 940 zcmWlY_jcL_6vi(CB-xS>7=u-8HX23(WAF%I47LFyS%8dXm*GL|q>k&Pb=#!7O`Fc7 z!%bUv4|ngl>0ar4gXTf{20c~Jx#RbJ=Y0R&dr_;+Q@x&E0HEYbv0-fc|BaiCDa7a{ z07TVPy_D>SOdq73Fv7r;3vzClc0dM884CyndZEvSOkiO6F_Etrko!giNLH6jj>SlA(^11;K#~7$OSM~0EvSH3l$#} z0+ym5E&Gvt5KVB%CVA-e=1LHigO+;0G#i0R$SjK13BfWc zAZiHYFeIW@EeH!Cs~onLBA603mm{bWHVP}TNIB9oCW00Ll{KeDlfn`e4p&*c&LUM7 zud!H_vsMj2elIYzc6ygouK z$87mAa#g~cF{+-RIx&1DPB-IJGfubS^m2l3C+w|JyFBS!P1-t1M>FNxND^yFM{A5+ z8Mm*e9P26PM#`zCo$U$N+Bnmh=sz)L+ZuQ7jMK*_`?u4slNt9`c3?B>-OTz@wID($OAXNf60hMZ|b|jF5L6n zwjGhkLk_SFL5awR{-E+b_o!@!p*ZD_a_f_qVhrYe_{CfP$ z4{mvuVPMmle(TB~kDa-At~Y)7hGE=pvM60^`tazt7aLvM*x}XH_VsgT{@ypf5ad#= JcxASG;Xk&n%v%5e literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_rainforest_litter_side.png b/mods/default/textures/default_rainforest_litter_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccb11de3dd24a3894a2b1aac37eec9cec190204 GIT binary patch literal 497 zcmV41u{;IB??&%q492U(4Ljxo8olEc{_Cf~48!<2ujl6(`HC8Y(P!Pcd*VQ@n z^r^ZICML?}CO+`O2cLTUaFL?#sYBq4^5_7|0ZMJTHLDoAmfMRZ$EGGTiU=Iqnr}L> zOcwLe?YSQmCPgNb3>7>XDG4K@S~88Qe_Y~C!Qdh>CAz4H0>dz3?)gM+45AGuo#UuT zDMF@2i8oj)9G%06a2O(EO8A&qSi>p@W5p1#Sgo;f3|1qem1d;T1aK~p&nk52h~8r}Ltd1)F)RMSM3Wo(;{OoVD~F)~eU+bTbL_C1uMgKGxek0Vl8&1x#-I&yKvMzo>rMttA0 zoKFeIZRqMf(e=Fk%+r%q#YCc>&kB}Rf%vB9#oO)XYTp5Hbdj>EP^KUw@bVK+RJl;m zRzw(^w&%JHJb$;_^e$jT064$+8rJ|1?i4hA&9e{v=IqgO1DwBlf4%0n`sjJ{oi)I2 n-ve;UpHBaZ8~&U2fB(!c=U>}SPA;3(00000NkvXXu0mjfm*(TO literal 0 HcmV?d00001 From 78c632ebd4858c67b850817df5e5a8c4ae4811a1 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 11 Feb 2017 16:23:43 -0800 Subject: [PATCH 039/118] Allow interaction with nodes while wielding these items. - beds - boats - carts - key/skeleton key - seeds All these had on_place handlers that did not allow nodes with an on_rightclick() handler to be used first (if not using sneak). This code is taken from the torches mod and applied everywhere. This allows all these items to e.g. be inserted into the `frame` mod's item frames. --- mods/beds/api.lua | 8 ++++++++ mods/boats/init.lua | 9 +++++++++ mods/carts/cart_entity.lua | 9 +++++++++ mods/default/tools.lua | 21 +++++++++++++++++++-- mods/farming/api.lua | 9 +++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 4df6b4a3..daa6d8e2 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -46,6 +46,14 @@ function beds.register_bed(name, def) 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:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + local pos if minetest.registered_items[minetest.get_node(under).name].buildable_to then pos = under diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 0591ef24..6e1565d4 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -225,6 +225,15 @@ minetest.register_craftitem("boats:boat", { 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: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 diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index e8707fb4..bf0a450d 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -362,6 +362,15 @@ minetest.register_craftitem("carts:cart", { inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"), wield_image = "carts_cart_side.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:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + if not pointed_thing.type == "node" then return end diff --git a/mods/default/tools.lua b/mods/default/tools.lua index c7ea1619..51854b93 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -384,12 +384,21 @@ minetest.register_tool("default:skeleton_key", { inventory_image = "default_key_skeleton.png", groups = {key = 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: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 - local node = minetest.get_node(pos) + node = minetest.get_node(pos) if not node then return itemstack @@ -427,12 +436,20 @@ minetest.register_tool("default:key", { groups = {key = 1, not_in_creative_inventory = 1}, stack_max = 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: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 - local node = minetest.get_node(pos) + node = minetest.get_node(pos) if not node or node.name == "ignore" then return itemstack diff --git a/mods/farming/api.lua b/mods/farming/api.lua index b6e3ee3e..0ba756cc 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -313,6 +313,15 @@ farming.register_plant = function(name, def) }), 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: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", From c68b8274fed183f30bd7609018766a261448b83d Mon Sep 17 00:00:00 2001 From: octacian Date: Sun, 26 Feb 2017 10:37:35 -0800 Subject: [PATCH 040/118] Show title and author of book in description Utilizes the new key-meta (as with nodes) and the ability to set the description of an itemstack with the `description` meta key. Includes code to convert old metadata to new key-meta. --- mods/default/craftitems.lua | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 0c51c713..f002d709 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -15,11 +15,19 @@ minetest.register_craftitem("default:paper", { local lpp = 14 -- Lines per book's page local function book_on_use(itemstack, user) local player_name = user:get_player_name() - local data = minetest.deserialize(itemstack:get_metadata()) + local meta = itemstack:get_meta() local title, text, owner = "", "", player_name local page, page_max, lines, string = 1, 1, {}, "" - if data then + -- Backwards compatibility + local old_data = minetest.deserialize(itemstack:get_metadata()) + if old_data then + meta:from_table({ fields = old_data }) + end + + local data = meta:to_table().fields + + if data.owner then title = data.title text = data.text owner = data.owner @@ -81,35 +89,38 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) new_stack = ItemStack("default:book_written") end else - data = minetest.deserialize(stack:get_metadata()) + data = stack:get_meta():to_table().fields end if not data then data = {} end data.title = fields.title + data.owner = player:get_player_name() + data.description = "\""..fields.title.."\" by "..data.owner data.text = fields.text data.text_len = #data.text data.page = 1 data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) - data.owner = player:get_player_name() - local data_str = minetest.serialize(data) if new_stack then - new_stack:set_metadata(data_str) + 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:getpos(), new_stack) end else - stack:set_metadata(data_str) + stack:get_meta():from_table({ fields = data }) end elseif fields.book_next or fields.book_prev then - local data = minetest.deserialize(stack:get_metadata()) + local data = stack:get_meta():to_table().fields if not data or 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 @@ -249,4 +260,3 @@ minetest.register_craftitem("default:flint", { description = "Flint", inventory_image = "default_flint.png" }) - From 28ecb3b261f5d2b3408692ea9ae11d351b409940 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 4 Mar 2017 05:28:35 +0000 Subject: [PATCH 041/118] Dungeons: Use 'block' instead of 'brick' for nodebox stairs --- mods/default/mapgen.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index f99360ad..f8a84efc 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -36,7 +36,7 @@ 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") minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick") -minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick") +minetest.register_alias("mapgen_stair_sandstone_block", "stairs:stair_sandstone_block") -- From 496521f4a1960cf04ff9ab6414582233abc12cb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Mart=C3=ADnez?= Date: Sun, 5 Mar 2017 04:50:25 -0300 Subject: [PATCH 042/118] Fix some warnings. Also fixes the failing travis checks. --- .luacheckrc | 2 ++ mods/screwdriver/init.lua | 3 ++- mods/tnt/init.lua | 13 +++++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index 52b25132..6f4fdd2c 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -8,6 +8,8 @@ read_globals = { "vector", "VoxelManip", "VoxelArea", "PseudoRandom", "ItemStack", + -- Silence "accessing undefined field copy of global table". + table = { fields = { "copy" } } } -- Overwrites minetest.handle_node_drops diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index e73b618f..d898cb9f 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -52,7 +52,8 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) local new_param2 = preservePart + rotationPart local should_rotate = true - if ndef and ndef.on_rotate then -- Node provides a handler, so let the handler decide instead if the node can be rotated + -- Node provides a handler, so let the handler decide instead if the node can be rotated + if ndef and 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}, diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 5d1de604..5a405566 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -399,7 +399,12 @@ minetest.register_node("tnt:gunpowder", { 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"}, + 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 = { @@ -476,7 +481,11 @@ minetest.register_node("tnt:gunpowder_burning", { 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")}, + groups = { + dig_immediate = 2, + attached_node = 1, + connect_to_raillike = minetest.raillike_group("gunpowder") + }, sounds = default.node_sound_leaves_defaults(), on_timer = function(pos, elapsed) for dx = -1, 1 do From 1d45b27c1257ced84eccc7908bb3347cc22f42c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Mart=C3=ADnez?= Date: Tue, 7 Mar 2017 00:03:30 -0300 Subject: [PATCH 043/118] Add desert/silver sandstone-related blocks. (#1596) Add desert and silver sand-related blocks, and stairs. --- mods/default/README.txt | 10 +++ mods/default/crafting.lua | 82 ++++++++++++++++-- mods/default/license.txt | 2 + mods/default/nodes.lua | 56 +++++++++++- .../textures/default_desert_sandstone.png | Bin 0 -> 275 bytes .../default_desert_sandstone_block.png | Bin 0 -> 587 bytes .../default_desert_sandstone_brick.png | Bin 0 -> 630 bytes .../textures/default_silver_sandstone.png | Bin 0 -> 461 bytes .../default_silver_sandstone_block.png | Bin 0 -> 520 bytes .../default_silver_sandstone_brick.png | Bin 0 -> 612 bytes mods/stairs/init.lua | 60 +++++++++++++ 11 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 mods/default/textures/default_desert_sandstone.png create mode 100644 mods/default/textures/default_desert_sandstone_block.png create mode 100644 mods/default/textures/default_desert_sandstone_brick.png create mode 100644 mods/default/textures/default_silver_sandstone.png create mode 100644 mods/default/textures/default_silver_sandstone_block.png create mode 100644 mods/default/textures/default_silver_sandstone_brick.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 342a8c4f..1ca66e4e 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -202,6 +202,16 @@ npx (CC BY-SA 3.0) default_rainforest_litter.png default_rainforest_litter_side.png +GreenXenith (CC-BY-SA 3.0): + default_silver_sandstone.png + default_silver_sandstone_brick.png + default_silver_sandstone_block.png + +kaeza (CC-BY-SA 3.0): + default_desert_sandstone.png + default_desert_sandstone_brick.png + default_desert_sandstone_block.png + 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/ diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index ce27bb42..b360ddcf 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -503,26 +503,90 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'default:sand 4', + output = "default:sand 4", recipe = { - {'default:sandstone'}, + {"default:sandstone"}, } }) minetest.register_craft({ - output = 'default:sandstonebrick 4', + output = "default:sandstonebrick 4", recipe = { - {'default:sandstone', 'default:sandstone'}, - {'default:sandstone', 'default:sandstone'}, + {"default:sandstone", "default:sandstone"}, + {"default:sandstone", "default:sandstone"}, } }) minetest.register_craft({ - output = 'default:sandstone_block 9', + output = "default:sandstone_block 9", recipe = { - {'default:sandstone', 'default:sandstone', 'default:sandstone'}, - {'default:sandstone', 'default:sandstone', 'default:sandstone'}, - {'default:sandstone', 'default:sandstone', 'default:sandstone'}, + {"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"}, } }) diff --git a/mods/default/license.txt b/mods/default/license.txt index e9267366..09e4225f 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -41,6 +41,8 @@ Copyright (C) 2010-2016: asl97 KevDoy Mito551 + GreenXenith + kaeza You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 82a97c65..34136cb3 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -30,6 +30,12 @@ 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 @@ -275,7 +281,6 @@ minetest.register_node("default:desert_stone_block", { sounds = default.node_sound_stone_defaults(), }) - minetest.register_node("default:sandstone", { description = "Sandstone", tiles = {"default_sandstone.png"}, @@ -301,6 +306,55 @@ minetest.register_node("default:sandstone_block", { sounds = default.node_sound_stone_defaults(), }) +minetest.register_node("default:desert_sandstone", { + description = "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 = "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 = "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 = "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 = "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 = "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 = "Obsidian", diff --git a/mods/default/textures/default_desert_sandstone.png b/mods/default/textures/default_desert_sandstone.png new file mode 100644 index 0000000000000000000000000000000000000000..52e445fa1b0c2f4ad19ab643587d3abd37273f76 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!N`Oy@>$digUA^IZCPwU;8h2<~ z^r0ECM`y>KoSSfbUhL_4@uwCfo?V#W|MB`opn9H?AirRS{|LZ&BtQ))KFQO?F+^gj zY=5Abiz0^;>qnWVZ|nCv2g|R#+mMyM|68{PYJOuJ@iByxrF-{(Pq#!X($3X?*93J>!o)n}qPZ;+=0_KQ}w-`0ShD zjR~$_Sf^iE%(7yN?0!+@g$ITAmKX;*Fope5{x_-h&nNNxmXCK_ Px{krq)z4*}Q$iB}e|B}q literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_desert_sandstone_block.png b/mods/default/textures/default_desert_sandstone_block.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc54e75bc0a0eab48724341a18f42a53829c327 GIT binary patch literal 587 zcmV-R0<`^!P)i_Vr7>zrCP4=%i$R zRQ7}9-*;aNLa|tDC8{{5=X;eg4P*P*9rucxqxvgn@>QGWMFS&to6_`$;M8)n* zV{XSSG1At8ybAhjR{KuV^AY1&Jw*g+F~WIEdI4t^U|r9??hh#Av&1RpnF z03$MJgB`Y8m<|K;#i7r4$K~}6B@{knVipu1n2whFT6kJKi9+&)-gbBwvAyQD1b$u? ZegUJ`SZq;McX|K-002ovPDHLkV1kz<5KjOA literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_desert_sandstone_brick.png b/mods/default/textures/default_desert_sandstone_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..ab58db52350591442c6a84101fa9fd57c84a694a GIT binary patch literal 630 zcmV-+0*U>JP)evs_wbs z^FM!=<@*b|fksN^wJ`RQU(apJkOJe_kxF8-f-jHH=yW@=ouBAi$!RMLeZdC33+Kzm zbnMZ{07MUVxgr6)3tX;_Y~3!hHljq?KeDT58Wh21l++lb$anXw$!cnEG{ev!wcvbO zaWKES6BZ+K_tky_A= z3l9$uxLa*7pDoj!sdYEU$3GkN`S}s=0@Ja_+K5krX;7pXIlWwQAK&B7-?(grX;3^r zC5WE3YpMs{1=_Bu?ivlzGcO4xHDfOkrR*6wpH_yxkYmBSfH4{kU>A=x-Hz(#aW-IG ztXQ?8RfS+PclQV8C1F>Oo{l|s^+4jXDO%wxvMr*!iqnTgjuCTz*m1T>VwYGaFo(8c z%9)5H*o@SIcmt$lI`+&RGCk{~%1g04@Lk0hLKa zK~y-)U6M(X+#nD|ABh;MDt!O5dDAy=bX2HY0zpDAWU%C13jO?3nvaj)ecQfhtzoUD z)`GPQ|Bq?~4AxozYCZV;{KK+sU+nugIq#&Dh%ut77obj1DTNp#Av{QFI~SbWD#vl$ zK*kunkEredwAOIWQA$BoQB`u@ky9FY?{UtNQlhmsWg25x7LSOas)z_V=Sd=9*!S<7 zUu*5O;eDj{(}uN{QVPyFa^BB{XKdq0_niV(uAF@y)s1*G?mF@~HoB66$AIfu1&S{#Q|Yn_$KIGn*` zt(`K5y3x#4$;e6uXfTcBbIxhZdi_FbJy2CrO7q5h z@AIe8z}1HL@voiCvTYmd`kr^cuJ4(0tp|_C>vl||%A9xB_011{FH6fPzLB{A0000< KMNUMnLSTZVKITdQ literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_silver_sandstone_brick.png b/mods/default/textures/default_silver_sandstone_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..711d963539f122cd99f65e4a28f3131a0ea3f45a GIT binary patch literal 612 zcmV-q0-ODbP)pF(v^r^6H zMLB1>uG<>CzrP~Rd7zR~x++ptoNKl>RmFQx&iT^Rp{huXiD^31G!5Q+LI|iT0P~zM z#^79oh)_yFM2In>TDZOaf~YD@(_ZmfYbm7w&@>&jE*REYa?W_~5n29-_l~|lQfoz3 zH{SKkbGpJZCg@Glu~fcQEO$M6SdaOkuhd-6yrqBd6|iwIH4MX%d7dwPEyfsjyEpFdzcY?KAq2el48sW#*^oqJnQn{` z5!u#MO2PX@Erf6tq*X{nkTp2#u&lLs?*XW_Ty17uF zw@#<3oAp&W=X^ Date: Wed, 1 Mar 2017 16:57:27 +0000 Subject: [PATCH 044/118] Screwdriver: Fix crash If 'node_box' is nil 'node_box.type' causes a crash. --- mods/screwdriver/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index d898cb9f..383d29cd 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -67,7 +67,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) if not ndef or not ndef.paramtype2 == "facedir" or ndef.on_rotate == false or (ndef.drawtype == "nodebox" and - not ndef.node_box.type == "fixed") or + (ndef.node_box and ndef.node_box.type ~= "fixed")) or node.param2 == nil then return end From a16413f96c8db7d085591aafa431a8622a6e8324 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 5 Mar 2017 12:37:05 +0000 Subject: [PATCH 045/118] sfinv: Fix wrong tab being highlighted Thank you to @ForbiddenJ for finding cause of the issue. --- mods/sfinv/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index b6e97667..ff6433b9 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -70,7 +70,7 @@ function sfinv.get_formspec(player, context) nav[#nav + 1] = pdef.title nav_ids[#nav_ids + 1] = pdef.name if pdef.name == context.page then - current_idx = i + current_idx = #nav_ids end end end From 1f6d633037341bd58a9e3c445f7d2e46be72fe67 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 6 Mar 2017 07:26:12 +0000 Subject: [PATCH 046/118] Ladder recipe: Make wooden ladder recipe more generous Increase to 5 ladders from 7 sticks. More generous to help with vertical travel. Divide the log core volume of 14 * 14 * 16 cubic pixels by the volume of a ladder node with two 2 * 2 * 16 side pieces and four 2 * 1 * 16 rungs (cut down to length 14), to get 12.25 ladders per log. The recipe of 7 stick items is 7 / 16 = 0.4375 logs. Ladders per 7 stick items = 0.4375 * 12.25 = 5.36. --- mods/default/crafting.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index b360ddcf..1eca8887 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -646,11 +646,11 @@ minetest.register_craft({ }) minetest.register_craft({ - output = 'default:ladder_wood 3', + output = "default:ladder_wood 5", recipe = { - {'group:stick', '', 'group:stick'}, - {'group:stick', 'group:stick', 'group:stick'}, - {'group:stick', '', 'group:stick'}, + {"group:stick", "", "group:stick"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "", "group:stick"}, } }) From 0f0dd0f6e817f58e6501549ab6d34bbfdc1d6548 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 7 Mar 2017 12:00:14 +0000 Subject: [PATCH 047/118] Tree schematics: Alter jungletree, aspen, pine, appletree Denser jungletree for darker rainforest: Highest 'jungletree' nodes now prob 255. Add a 5th lower branch layer. Increase lower branch layer y-slice prob to 191. Aspen: Extend trunk upwards by 1 node to reduce leafdecay radius to 2. Pine: Make lower trunk 1 node longer so that lowest branches are more often higher off the ground, also to make pines taller. Appletree: Make 2 opposite branches prob 255, the other 2 prob 127, to avoid trees with 1 or 0 branches. Therefore also add random rotation. --- mods/default/mapgen.lua | 1 + mods/default/nodes.lua | 2 +- mods/default/schematics/apple_tree.mts | Bin 163 -> 169 bytes .../schematics/apple_tree_from_sapling.mts | Bin 167 -> 173 bytes mods/default/schematics/aspen_tree.mts | Bin 176 -> 174 bytes .../schematics/aspen_tree_from_sapling.mts | Bin 175 -> 174 bytes mods/default/schematics/jungle_tree.mts | Bin 251 -> 255 bytes .../schematics/jungle_tree_from_sapling.mts | Bin 246 -> 247 bytes mods/default/schematics/pine_tree.mts | Bin 175 -> 176 bytes .../schematics/pine_tree_from_sapling.mts | Bin 172 -> 174 bytes mods/default/trees.lua | 2 +- 11 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index f8a84efc..d526b767 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1296,6 +1296,7 @@ function default.register_decorations() y_max = 31000, schematic = minetest.get_modpath("default") .. "/schematics/apple_tree.mts", flags = "place_center_x, place_center_z", + rotation = "random", }) minetest.register_decoration({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 34136cb3..67790dd6 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2198,5 +2198,5 @@ default.register_leafdecay({ default.register_leafdecay({ trunks = {"default:aspen_tree"}, leaves = {"default:aspen_leaves"}, - radius = 3, + radius = 2, }) diff --git a/mods/default/schematics/apple_tree.mts b/mods/default/schematics/apple_tree.mts index ac09b46694037b0824dd4c0e3762d66d0fff1a76..2bd57c1fc4aa36e2f03c6ac2989c86b575e2784e 100644 GIT binary patch delta 33 rcmV++0N($j0jU9yd;|aT`;mVa6Cb;I`{n;*nn%9-h9Up}c91F27*-Hl delta 27 jcmZ3xSVl94NFDkf~JX$QoKTEl<(I%3od%YePY-7{V>o2q)@?3$@%t`}AU;U!QM}lSK>wDhA?uFo~T71^@98 g_5bS`>VZT(b`}r=)lknZ1OesYG72aH04DA`jmYI6RR910 delta 76 zcmV-S0JHzD0k8p(Yej)y44Yf15l++(7izhQ_UXkwzdqj{CyN*WR1C!RU=lkE3jX6G i>i^d>)B}ln3|4(Tm;|Yzo?8e4%EM(8Py_%cayty#a~{C} diff --git a/mods/default/schematics/aspen_tree_from_sapling.mts b/mods/default/schematics/aspen_tree_from_sapling.mts index b7ca161903056454f78f4672000947d2ebf60035..b7ab3ee6b71ff54ed06229486b50a9dd4f918479 100644 GIT binary patch delta 74 zcmV-Q0JZd%YePY-7{V>o2q)@?3$@%t`}AU;U!QM}lSK>wDhA?uFo~T71@$1} gKb(b102PBUgv82%DyEKG2m;E(WfV{Z0L!{I4W+Ffga7~l delta 75 zcmV-R0JQ(E0j~j&Yea!x44Yf15l++(7izhQ_UXkwzdqj{CyN*WR1C!RU=lkE3hF_` he>e-304fGy2#J*iRZJbX5CoKm%P61-0076$HVk1=8^!7|$4yv7NJ1%B5g^Qap r8meX7DB9LcJ0r5Da)VW-m6~JM(;b;E0~;3%XX1mVfBXa<$QDa9du3V% delta 185 zcmV;q07n1+0s8@v6a+s%KR=NeI)4EUgD?nGKI#*A0#EBxdag(Gk_?^;FQ(`iU4%%r)B+7$w=iH82Q!3)*X4Hu? njZcYXd!0%@Z7MeyRhp$abr!YKVc@AHAT*x-@e?=zvUf&fMvquW diff --git a/mods/default/schematics/jungle_tree_from_sapling.mts b/mods/default/schematics/jungle_tree_from_sapling.mts index babaa45f7a11de1fc017b341cea0751974ce2ab4..f93f01419c5dc002519f603b5620dcaa58ecd819 100644 GIT binary patch delta 181 zcmV;m080P%0rvrr6a-&iUtf_JI)7~r!ypK?T+E~N2pr)ZeQOzRBGCH7ELpN=ilBTv zUs}o+u*r%epJ$f^U3x2+l3_|IQ_`+V){f~k_$*_0CcD%0kDtI3@{u|;Tu4`J delta 180 zcmV;l089V(0rmlq6a+s%KR=NeI)4ie!ypK?T+E|*1di~IzA3}j4|HZROP1`BB1(bh ziy?dghnT&a|Ld&>-9|f@Qpc2BrleoX^kPh6Ui9uBc2wt(GB~EJRcmY7YP(z0s*9)H zeVwoAe)#Wfz3!9x0Ss=I7ZNikae9E$#igbInnedC0EGXq0k8oNO;l4&00aO901p5Ke}6xb4nAY;Qd-O92`Wg= dP@p-3ef0m09zCqgE-96V#IAlU!UhRpH4Zn*He3Jz delta 122 zcmV-=0EPds0j~iLO;l4&00aO901f~Je}9n=K4W8GAQ>>iA+=@6a|<%bNHtjyU?Pdd z2xURcV}hGUx-7yixtnqF#N|()B_2i c(*O1NxL{M@CQcLO;l4&00aO901p5Ke}6xb4nSX^05HNKwPh)F6*9?4HCYf~B9p}k zWkF14f}2dbEW%ZkhaGLhiV{~1K)Q<0ug{MsmWvStvw3 Z1cDV4B38S3*H>g(%?;W99Q8UNud7*P*_ XV08q!)N%_BK%H Date: Thu, 9 Mar 2017 19:38:02 +0000 Subject: [PATCH 048/118] Mapgen: Use decoration sidelen 16 for jungletrees and junglegrass Currently jungletrees and junglegrass use sidelen 80 for simplicity, but this results in a more uneven distribution of decorations. A more even distribution helps keep rainforest darker with a more unbroken canopy. This is also more consistent. 80 is based on the default mapchunk size, all other decorations use sidelen 16 or smaller to divide into any mapchunk size. --- mods/default/mapgen.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index d526b767..0fabb2ed 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -1324,7 +1324,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, - sidelen = 80, + sidelen = 16, fill_ratio = 0.1, biomes = {"rainforest", "rainforest_swamp"}, y_min = -1, @@ -1337,7 +1337,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "schematic", place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, - sidelen = 80, + sidelen = 16, fill_ratio = 0.005, biomes = {"rainforest", "rainforest_swamp"}, y_min = 1, @@ -1598,7 +1598,7 @@ function default.register_decorations() minetest.register_decoration({ deco_type = "simple", place_on = {"default:dirt_with_rainforest_litter"}, - sidelen = 80, + sidelen = 16, fill_ratio = 0.1, biomes = {"rainforest"}, y_min = 1, From ad118ea98d5bf9d137bcfd8ee4daef599b5c4141 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 10 Mar 2017 18:43:44 +0000 Subject: [PATCH 049/118] Flint & steel sounds: Fix bugs caused by nil position Usage and tool break sounds were played at 'pointed_thing.above' which can be nil if not pointing at anything or at an entity. This caused sounds to be played to all players on a server non-positionally. Fallback to player pos for sounds if 'pointed_thing.above' is nil. Replace 'pt' variable with 'pointed_thing' in 'register_tool'. --- mods/fire/init.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index a6dc1e5c..a846b289 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -80,27 +80,27 @@ minetest.register_tool("fire:flint_and_steel", { sound = {breaks = "default_tool_breaks"}, on_use = function(itemstack, user, pointed_thing) - local pt = pointed_thing + local sound_pos = pointed_thing.above or user:get_pos() minetest.sound_play( "fire_flint_and_steel", - {pos = pt.above, gain = 0.5, max_hear_distance = 8} + {pos = sound_pos, gain = 0.5, max_hear_distance = 8} ) - if pt.type == "node" then - local node_under = minetest.get_node(pt.under).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 local player_name = user:get_player_name() - if minetest.is_protected(pt.under, player_name) then + if minetest.is_protected(pointed_thing.under, player_name) then minetest.chat_send_player(player_name, "This area is protected") return end if nodedef.on_ignite then - nodedef.on_ignite(pt.under, user) + nodedef.on_ignite(pointed_thing.under, user) elseif minetest.get_item_group(node_under, "flammable") >= 1 - and minetest.get_node(pt.above).name == "air" then - minetest.set_node(pt.above, {name = "fire:basic_flame"}) + and minetest.get_node(pointed_thing.above).name == "air" then + minetest.set_node(pointed_thing.above, {name = "fire:basic_flame"}) end end if not minetest.setting_getbool("creative_mode") then @@ -109,7 +109,7 @@ minetest.register_tool("fire:flint_and_steel", { itemstack:add_wear(1000) -- 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}) + minetest.sound_play(wdef.sound.breaks, {pos = sound_pos, gain = 0.5}) end return itemstack end From 0850314d746c500580f11f7e9a50fad8614b3677 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 10 Mar 2017 11:48:44 -0800 Subject: [PATCH 050/118] luacheck 0.19.0 complains about `unpack()`. --- .luacheckrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.luacheckrc b/.luacheckrc index 6f4fdd2c..fe87fdce 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -8,6 +8,7 @@ read_globals = { "vector", "VoxelManip", "VoxelArea", "PseudoRandom", "ItemStack", + "unpack", -- Silence "accessing undefined field copy of global table". table = { fields = { "copy" } } } From f14b0a6ff5165d2858bd4e4f2586c7eaa29097fe Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 24 Feb 2017 22:44:52 -0800 Subject: [PATCH 051/118] Screwdriver: allow simple wallmounted rotation. Allows rotating things like signs and torches. Axis rotation rotates over all 6 faces, face rotation flips upside down to flat on floor only, and of course in the 4 horizontal directions. Made the code a bit more modular to account for different rotation schemes. Should be easier to extend from here on to other needs, and the functions can be reused by other mods for convenience. --- mods/screwdriver/init.lua | 42 +++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 383d29cd..696637a0 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -19,6 +19,31 @@ screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) end end +screwdriver.rotate = {} + +screwdriver.rotate.facedir = function(node, mode) + -- Compute param2 + local rotationPart = node.param2 % 32 -- get first 4 bits + local preservePart = node.param2 - rotationPart + local axisdir = math.floor(rotationPart / 4) + local rotation = rotationPart - axisdir * 4 + if mode == screwdriver.ROTATE_FACE then + rotationPart = axisdir * 4 + nextrange(rotation, 3) + elseif mode == screwdriver.ROTATE_AXIS then + rotationPart = nextrange(axisdir, 5) * 4 + end + + return preservePart + rotationPart +end + +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(node, mode) + return wallmounted_tbl[mode][node.param2] +end + -- Handles rotation screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) if pointed_thing.type ~= "node" then @@ -34,23 +59,14 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) local node = minetest.get_node(pos) local ndef = minetest.registered_nodes[node.name] - -- verify node is facedir (expected to be rotatable) - if not ndef or ndef.paramtype2 ~= "facedir" then + -- can we rotate this paramtype2? + local fn = screwdriver.rotate[ndef.paramtype2] + if not fn then return end - -- Compute param2 - local rotationPart = node.param2 % 32 -- get first 4 bits - local preservePart = node.param2 - rotationPart - local axisdir = math.floor(rotationPart / 4) - local rotation = rotationPart - axisdir * 4 - if mode == screwdriver.ROTATE_FACE then - rotationPart = axisdir * 4 + nextrange(rotation, 3) - elseif mode == screwdriver.ROTATE_AXIS then - rotationPart = nextrange(axisdir, 5) * 4 - end - local new_param2 = preservePart + rotationPart local should_rotate = true + local new_param2 = fn(node, mode) -- Node provides a handler, so let the handler decide instead if the node can be rotated if ndef and ndef.on_rotate then From 297192dd394f9b6d9413db2ed726dc73b856b385 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 25 Feb 2017 00:27:19 -0800 Subject: [PATCH 052/118] Screwdriver: use table lookup for facedir rotations. The table was generated using the old code. A table lookup should be faster than lots of math and branches. Allows us to drop `nextrange()` as well. --- mods/screwdriver/init.lua | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 696637a0..94964605 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -1,13 +1,5 @@ screwdriver = {} -local function nextrange(x, max) - x = x + 1 - if x > max then - x = 0 - end - return x -end - screwdriver.ROTATE_FACE = 1 screwdriver.ROTATE_AXIS = 2 screwdriver.disallow = function(pos, node, user, mode, new_param2) @@ -21,19 +13,27 @@ end screwdriver.rotate = {} -screwdriver.rotate.facedir = function(node, mode) - -- Compute param2 - local rotationPart = node.param2 % 32 -- get first 4 bits - local preservePart = node.param2 - rotationPart - local axisdir = math.floor(rotationPart / 4) - local rotation = rotationPart - axisdir * 4 - if mode == screwdriver.ROTATE_FACE then - rotationPart = axisdir * 4 + nextrange(rotation, 3) - elseif mode == screwdriver.ROTATE_AXIS then - rotationPart = nextrange(axisdir, 5) * 4 - end +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, + }, +} - return preservePart + rotationPart +screwdriver.rotate.facedir = function(node, mode) + return facedir_tbl[mode][node.param2] end local wallmounted_tbl = { From efb81d188e8dc9f8c4862baab0b5be5fb53c21ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Mon, 27 Feb 2017 10:50:54 +0100 Subject: [PATCH 053/118] Correct rotation of attached nodes, and rotate colored nodes --- mods/screwdriver/init.lua | 46 ++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 94964605..95514094 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -11,6 +11,19 @@ screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) 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 = { @@ -32,18 +45,39 @@ local facedir_tbl = { }, } -screwdriver.rotate.facedir = function(node, mode) - return facedir_tbl[mode][node.param2] +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 + 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(node, mode) - return wallmounted_tbl[mode][node.param2] + +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 @@ -66,7 +100,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) end local should_rotate = true - local new_param2 = fn(node, mode) + local new_param2 = fn(pos, node, mode) -- Node provides a handler, so let the handler decide instead if the node can be rotated if ndef and ndef.on_rotate then @@ -80,7 +114,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) should_rotate = false end else - if not ndef or not ndef.paramtype2 == "facedir" or + if not ndef or ndef.on_rotate == false or (ndef.drawtype == "nodebox" and (ndef.node_box and ndef.node_box.type ~= "fixed")) or From d5e19d70c253f299f155e61d1e5f17585ba5112d Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 8 Mar 2017 21:57:10 -0800 Subject: [PATCH 054/118] Screwdriver: drop nodes if no longer attached. This should be fairly cheap and pops off items if needed. --- mods/screwdriver/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 95514094..f2596437 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -130,6 +130,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) if should_rotate then node.param2 = new_param2 minetest.swap_node(pos, node) + minetest.check_for_falling(pos) end if not minetest.setting_getbool("creative_mode") then From 07a5fca432747043b3df067d4703b471072dce77 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 9 Mar 2017 20:18:58 +0000 Subject: [PATCH 055/118] Leafdecay: Register leafdecay for bush leaves --- mods/default/nodes.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 67790dd6..1eb2f305 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1308,6 +1308,8 @@ minetest.register_node("default:bush_leaves", { paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, }) minetest.register_node("default:acacia_bush_stem", { @@ -1335,6 +1337,8 @@ minetest.register_node("default:acacia_bush_leaves", { paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, }) @@ -2200,3 +2204,15 @@ default.register_leafdecay({ leaves = {"default:aspen_leaves"}, radius = 2, }) + +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, +}) From b87ef5ccde9cfa9096cae1e27774a9c386399b00 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 12 Mar 2017 14:03:37 +0100 Subject: [PATCH 056/118] Keys: Update default.can_interact_with_node to new item meta Completes a forgotten update in 9d3a526 --- mods/default/functions.lua | 28 +++++++++++++++------------- mods/default/nodes.lua | 1 + mods/doors/init.lua | 1 + 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 9ba0e782..eeac0c2a 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -551,21 +551,23 @@ function default.can_interact_with_node(player, pos) local meta = minetest.get_meta(pos) - -- is player wielding the right key? - local item = player:get_wielded_item() - if item:get_name() == "default:key" then - local key_meta = minetest.parse_json(item:get_metadata()) - local secret = meta:get_string("key_lock_secret") - if secret ~= key_meta.secret then - return false - end - + if player:get_player_name() == meta:get_string("owner") then + -- Owner can access the node to any time return true end - if player:get_player_name() ~= meta:get_string("owner") then - return false + -- is player wielding the right key? + local item = player:get_wielded_item() + if item:get_name() == "default:key" then + local key_meta = item:get_meta() + + if key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) + item:set_metadata("") + end + + return meta:get_string("key_lock_secret") == key_meta:get_string("secret") end - return true -end \ No newline at end of file + return false +end diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 1eb2f305..0523097c 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1805,6 +1805,7 @@ minetest.register_node("default:chest_locked", { if key_meta:get_string("secret") == "" then key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata("") end if secret ~= key_meta:get_string("secret") then diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 53e27938..0ed98b33 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -149,6 +149,7 @@ function _doors.door_toggle(pos, node, clicker) if key_meta:get_string("secret") == "" then key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) + item:set_metadata("") end if secret ~= key_meta:get_string("secret") then From 7b900445741f4fc66bf4b058ae88c7065e0dcf4e Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 10 Mar 2017 12:48:41 -0800 Subject: [PATCH 057/118] TNT: start fire nodetimers for created fire nodes. Without this patch, any fire created(placed) by tnt explosions will remain forever on the map. --- mods/tnt/init.lua | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 5a405566..9870f891 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -83,7 +83,10 @@ local function add_drop(drops, item) end end -local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_protection, ignore_on_blast) +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) if not ignore_protection and minetest.is_protected(npos, "") then return cid end @@ -93,9 +96,16 @@ local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_p 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} + 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, "") @@ -306,6 +316,8 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) local drops = {} local on_blast_queue = {} + local on_construct_queue = {} + basic_flame_on_construct = minetest.registered_nodes["fire:basic_flame"].on_construct local c_fire = minetest.get_content_id("fire:basic_flame") for z = -radius, radius do @@ -318,8 +330,8 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} if cid ~= c_air then data[vi] = destroy(drops, p, cid, c_air, c_fire, - on_blast_queue, ignore_protection, - ignore_on_blast) + on_blast_queue, on_construct_queue, + ignore_protection, ignore_on_blast) end end vi = vi + 1 @@ -357,6 +369,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast) end end + for _, queued_data in pairs(on_construct_queue) do + queued_data.fn(queued_data.pos) + end + return drops, radius end From 37c81f70b0b5c9c17ecf632b16dd58f455bea40b Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 12 Mar 2017 15:05:32 +0000 Subject: [PATCH 058/118] Textures: New textures for silver sandstone nodes --- mods/default/README.txt | 8 +++----- .../textures/default_silver_sandstone.png | Bin 461 -> 211 bytes .../textures/default_silver_sandstone_block.png | Bin 520 -> 290 bytes .../textures/default_silver_sandstone_brick.png | Bin 612 -> 314 bytes 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 1ca66e4e..bec8821a 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -118,6 +118,9 @@ paramat (CC BY-SA 3.0): 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) brunob.santos (CC BY-SA 4.0): default_desert_cobble.png @@ -202,11 +205,6 @@ npx (CC BY-SA 3.0) default_rainforest_litter.png default_rainforest_litter_side.png -GreenXenith (CC-BY-SA 3.0): - default_silver_sandstone.png - default_silver_sandstone_brick.png - default_silver_sandstone_block.png - kaeza (CC-BY-SA 3.0): default_desert_sandstone.png default_desert_sandstone_brick.png diff --git a/mods/default/textures/default_silver_sandstone.png b/mods/default/textures/default_silver_sandstone.png index cb4f404a9987e808bb93e64b5c8ef300aa76ec2e..eac62cb19c4e9e9b2bac91f86232e8cbefee96e0 100644 GIT binary patch delta 195 zcmV;!06hQA1JePJ7=Hu<0002(-QrRJ000$GOjJd`ys*H%vckZ%#KO17#k$DGyU54A z^(<%R0001aNkl~w|CRW0-=XqC$L#D9qH76Ucep7Q_z002ovPDHLkV1nEyStbAg delta 447 zcmV;w0YLuK0nG!D7=H)`0000V^Z#K0000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rb3>^{>0O)hJE&u=lT1iAfR5;6Jl0kOGAP7aT5KYeC z|7JSxo}y8qgA`BFGE{h69;EN@FYmpRb0($4d7k8)`5V1=M1KTTMOCS_A|l8$={!%4 z<9HR$IRVHyV`iu-0IG_a-2(2;bzQF_Gh^GzdNVU}&h*}yb0Q+QK&=&kQVKa|YORXBTG3D5qj^pPXOUVgu5@pRCS5}U8R}b9&FooJNj!-MBKxZDBeO; z%xo!-F#y>2ol?q53W|N-*BXOD+?|vXt+o5IektahX1fl|v8Gi!+001a04^sdD076hqR7HGxbC{NlnU{{6nUI{DlAxZIsi>l= zsiVKVu)w{t!oan}!neo8y2!@6$j80X(8$!%%hlA(*VfM1*3a12(BtCWzu2@{0001+ zNklX4J!aH0004%Nkln;5+J^1|m z!?JB(?E5!4@1&H7F`}v$piWRJg%~3tJV=%kBFeEhzL37Ng`m__wSouYwfh*eWdr(hP9Sb3eGul z-p_?+aFyQs41e-Ewf?g<-c=Rv0|3%mdq0_n ziV(uAF@y)s1*G?mF@~HoB66$AIfu1&S{#Q|Yn_$KIC7l9WUZYthq}?sRmsRo252yi z-wH|zpn3@a;*oC$Ln@Xqsp9j*7eN~elJVQD87-o00000NkvXXu0mjf($;-3Ehqkn>Qm_R5Y^xoJ1%8s@3 zT6ek-7VZvrivSk^3*dzJ^BXOMn^kjGe_+sV0_JBlLMe}l+Hx;}0;OH}ofUJ!gzn5N zqAXmg`a}85=UV&smH8+yi+~B6!5P+zpjK+J%go|1C)n4hY_za}>S$HR*jA^jCihtm wOm_M0KZF@Qks~anvTvkAg<0uuh{|C300vkLOsp2sO#lD@07*qoM6N<$f|^E~n*aa+ delta 598 zcmV-c0;&DF0^|gc8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-#v9TF4{Yo}f<0005;Nkl{O>5jR5QZO(B-??| zPzY%+IrabljGod{PCbNP0tswj*P5F*nw5JI5qI)>r&sjzHCIcK`A+Zw#Tzaq|gppsI$ zDpFOPYqmF4#d}ZA`O?&(sz{89X*$z14c>b~2&gIm^PDio;9P@&jE*REYa?W_~5n29-_l~|lQfoz3H{SKkbGpJ zZCg@Glu~fcQEO$M6SdaOkuhd-6yrqBd6|#(e~c<%wIwOnmxUE_+OsyOdG^E_`#pJQvS=d*x_{I^c0s+;vyIp=&yUIy4A zoO9ls)K6NMK&=goF{G48DUtJ%foYnqvasGw(``8JaM&Xvs4BIV4aZu`e!t^<9ylEK kl#(&VUSjP@DIg;J1^c&G9Z+v_pa1{>07*qoM6N<$f*$Y{4gdfE From da69fcdf9130c1b0b918dc6b16b770a5eaff2ada Mon Sep 17 00:00:00 2001 From: Fixer Date: Mon, 13 Mar 2017 16:29:53 +0200 Subject: [PATCH 059/118] TNT: Clarify new TNT receipe Update readme.txt with new TNT crafting recipe. --- mods/tnt/README.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/tnt/README.txt b/mods/tnt/README.txt index c1ca88d5..4e74841c 100644 --- a/mods/tnt/README.txt +++ b/mods/tnt/README.txt @@ -31,7 +31,10 @@ 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 or as fuse for TNT. -To craft TNT surround gunpowder with 4 wood in a + shape. +To craft TNT place items like this: +-- wood - gunpowder -- wood - +gunpowder gunpowder gunpowder +-- wood - gunpowder -- wood - There are different ways to blow up TNT: 1. Hit it with a torch. From 1c78fd346db7cd5bab4569d07ee2cb74e8e88047 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 20 Feb 2017 14:40:37 -0800 Subject: [PATCH 060/118] Sethome: Migrate sethome mod to player attributes. Migrates settings safely and evacuates the `homes` file entirely over time. --- mods/sethome/init.lua | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua index e0fc453d..13a33e57 100644 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -5,9 +5,9 @@ local homes_file = minetest.get_worldpath() .. "/homes" local homepos = {} local function loadhomes() - local input, err = io.open(homes_file, "r") + local input = io.open(homes_file, "r") if not input then - return minetest.log("info", "Could not load player homes file: " .. err) + return -- no longer an error end -- Iterate over all stored positions in the format "x y z player" for each line @@ -24,11 +24,13 @@ sethome.set = function(name, pos) if not player or not pos then return false end + player:set_attribute("sethome:home", minetest.pos_to_string(pos)) + -- remove `name` from the old storage file local data = {} - local output, err = io.open(homes_file, "w") + local output = io.open(homes_file, "w") if output then - homepos[name] = pos + 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 @@ -36,12 +38,18 @@ sethome.set = function(name, pos) io.close(output) return true end - minetest.log("action", "Unable to write to player homes file: " .. err) - return false + return true -- if the file doesn't exist - don't return an error. end sethome.get = function(name) - local pos = homepos[name] + local player = minetest.get_player_by_name(name) + local pos = minetest.string_to_pos(player:get_attribute("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 @@ -50,9 +58,10 @@ sethome.get = function(name) end sethome.go = function(name) + local pos = sethome.get(name) local player = minetest.get_player_by_name(name) - if player and homepos[name] then - player:setpos(homepos[name]) + if player and pos then + player:setpos(pos) return true end return false From 780f991a8775befdbce1253f7a5f6dc1a73f19bf Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 11 Mar 2017 13:52:20 +0100 Subject: [PATCH 061/118] Sapling_on_place: Restore after_place_node() calls --- mods/default/trees.lua | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 5f4d3f1e..3e1bf102 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -457,19 +457,46 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, return itemstack end -- Check tree volume for protection - if not default.intersects_protection( + if default.intersects_protection( vector.add(pos, minp_relative), vector.add(pos, maxp_relative), player_name, interval) then - minetest.set_node(pos, {name = sapling_name}) - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - else minetest.record_protection_violation(pos, player_name) -- Print extra information to explain minetest.chat_send_player(player_name, "Tree will intersect protection") + return itemstack + end + + minetest.log("action", player_name .. " places node " + .. sapling_name .. " at " .. minetest.pos_to_string(pos)) + + local take_item = not minetest.setting_getbool("creative_mode") + 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 From 61d7c43c83bda9c88b9cc257432fb5133c06ee87 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 13 Mar 2017 19:56:08 -0700 Subject: [PATCH 062/118] Skeleton key: Change to use left-click (tool on_use) Instead of right click, the skeleton key is now a true `tool` in the sense that it's default left-click action is to create a key for the locked object. This is far better than the outcome of the patches we've done where the only way to create a key for a locked item was to use sneak+rightclick. Now keys are perhaps a bit more sensible, left for making keys, right for opening stuff with keys. Fixes #1625 --- mods/default/tools.lua | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 51854b93..1a08b918 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -383,22 +383,13 @@ minetest.register_tool("default:skeleton_key", { description = "Skeleton Key", inventory_image = "default_key_skeleton.png", groups = {key = 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:get_player_control().sneak) then - return def.on_rightclick(under, node, placer, itemstack, - pointed_thing) or itemstack - end - + on_use = function(itemstack, user, pointed_thing) if pointed_thing.type ~= "node" then return itemstack end local pos = pointed_thing.under - node = minetest.get_node(pos) + local node = minetest.get_node(pos) if not node then return itemstack @@ -413,7 +404,7 @@ minetest.register_tool("default:skeleton_key", { random(2^16) - 1, random(2^16) - 1, random(2^16) - 1, random(2^16) - 1) - local secret, _, _ = on_skeleton_key_use(pos, placer, newsecret) + local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) if secret then -- finish and return the new key @@ -421,7 +412,7 @@ minetest.register_tool("default:skeleton_key", { itemstack:add_item("default:key") local meta = itemstack:get_meta() meta:set_string("secret", secret) - meta:set_string("description", "Key to "..placer:get_player_name().."'s " + meta:set_string("description", "Key to "..user:get_player_name().."'s " ..minetest.registered_nodes[node.name].description) return itemstack end From bd4d2dff1c7ac097980a9d5131243741844e935a Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 15 Mar 2017 21:23:31 +0000 Subject: [PATCH 063/118] Farming: Add override for default:dirt_with_rainforest_litter --- mods/farming/nodes.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua index 09ad36f5..c969d31b 100644 --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -22,6 +22,14 @@ minetest.override_item("default:dirt_with_dry_grass", { } }) +minetest.override_item("default:dirt_with_rainforest_litter", { + soil = { + base = "default:dirt_with_rainforest_litter", + dry = "farming:soil", + wet = "farming:soil_wet" + } +}) + minetest.register_node("farming:soil", { description = "Soil", tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, From 73e4666f280804b3f4c2c0571603d717d60a2203 Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Tue, 21 Feb 2017 19:43:34 +0100 Subject: [PATCH 064/118] Change doors to default.can_interact_with_node() --- mods/doors/init.lua | 73 ++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 50 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 0ed98b33..2b3d094a 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -6,6 +6,15 @@ local _doors = {} _doors.registered_doors = {} _doors.registered_trapdoors = {} +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 + -- returns an object to a door object or nil function doors.get(pos) local node_name = minetest.get_node(pos).name @@ -139,28 +148,10 @@ function _doors.door_toggle(pos, node, clicker) state = tonumber(state) end - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - -- is player wielding the right key? - local item = clicker:get_wielded_item() - local owner = meta:get_string("doors_owner") - if item:get_name() == "default:key" then - local key_meta = item:get_meta() - local secret = meta:get_string("key_lock_secret") + replace_old_owner_information(pos) - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) - item:set_metadata("") - end - - if secret ~= key_meta:get_string("secret") then - return false - end - - elseif owner ~= "" then - if clicker:get_player_name() ~= owner then - return false - end - end + if not default.can_interact_with_node(clicker, pos) then + return false end -- until Lua-5.2 we have no bitwise operators :( @@ -211,11 +202,8 @@ local function on_place_node(place_to, newnode, end local function can_dig_door(pos, digger) - local digger_name = digger and digger:get_player_name() - if digger_name and minetest.get_player_privs(digger_name).protection_bypass then - return true - end - return minetest.get_meta(pos):get_string("doors_owner") == digger_name + replace_old_owner_information(pos) + return default.can_interact_with_node(digger, pos) end function doors.register(name, def) @@ -330,7 +318,7 @@ function doors.register(name, def) meta:set_int("state", state) if def.protected then - meta:set_string("doors_owner", pn) + meta:set_string("owner", pn) meta:set_string("infotext", "Owned by " .. pn) end @@ -394,8 +382,9 @@ function doors.register(name, def) 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("doors_owner") + local owner = meta:get_string("owner") local pname = player:get_player_name() -- verify placer is owner of lockable door @@ -532,28 +521,11 @@ end function _doors.trapdoor_toggle(pos, node, clicker) node = node or minetest.get_node(pos) - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - -- is player wielding the right key? - local item = clicker:get_wielded_item() - local meta = minetest.get_meta(pos) - local owner = meta:get_string("doors_owner") - if item:get_name() == "default:key" then - local key_meta = item:get_meta() - local secret = meta:get_string("key_lock_secret") - if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) - end + replace_old_owner_information(pos) - if secret ~= key_meta:get_string("secret") then - return false - end - - elseif owner ~= "" then - if clicker:get_player_name() ~= owner then - return false - end - end + if not default.can_interact_with_node(clicker, pos) then + return false end local def = minetest.registered_nodes[node.name] @@ -595,7 +567,7 @@ function doors.register_trapdoor(name, def) 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("doors_owner", pn) + meta:set_string("owner", pn) meta:set_string("infotext", "Owned by "..pn) return minetest.setting_getbool("creative_mode") @@ -607,8 +579,9 @@ function doors.register_trapdoor(name, def) 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("doors_owner") + local owner = meta:get_string("owner") local pname = player:get_player_name() -- verify placer is owner of lockable door From 68212967c0c321244eb3c6b79e333844e6dc7b44 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 12 Mar 2017 10:58:09 +0000 Subject: [PATCH 065/118] Biomes: Add and auto-select mgv7 floatland biomes A simple set of biomes for now: Ocean, coniferous forest, grassland, sandstone desert. Update biome lists for blob ores and decorations. Make sandstone desert filler 1 node deeper to match other deserts. --- mods/default/mapgen.lua | 160 ++++++++++++++++++++++++++++++++++------ mods/flowers/mapgen.lua | 6 +- 2 files changed, 142 insertions(+), 24 deletions(-) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 0fabb2ed..9e359a33 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -187,7 +187,8 @@ function default.register_blob_ores() "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", - "rainforest", "rainforest_swamp", "rainforest_ocean", "underground"} + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", + "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} }) -- Dirt @@ -211,7 +212,8 @@ function default.register_blob_ores() }, biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", "deciduous_forest", "deciduous_forest_shore", "savanna", "savanna_shore", - "rainforest", "rainforest_swamp"} + "rainforest", "rainforest_swamp", "floatland_grassland", + "floatland_coniferous_forest"} }) -- Gravel @@ -239,7 +241,8 @@ function default.register_blob_ores() "coniferous_forest_dunes", "coniferous_forest_ocean", "deciduous_forest", "deciduous_forest_shore", "deciduous_forest_ocean", "cold_desert", "cold_desert_ocean", "savanna", "savanna_shore", "savanna_ocean", - "rainforest", "rainforest_swamp", "rainforest_ocean", "underground"} + "rainforest", "rainforest_swamp", "rainforest_ocean", "underground", + "floatland_ocean", "floatland_grassland", "floatland_coniferous_forest"} }) end @@ -491,7 +494,7 @@ end -- All mapgens except mgv6 -function default.register_biomes() +function default.register_biomes(upper_limit) -- Icesheet @@ -510,7 +513,7 @@ function default.register_biomes() node_riverbed = "default:gravel", depth_riverbed = 2, y_min = -8, - y_max = 31000, + y_max = upper_limit, heat_point = 0, humidity_point = 73, }) @@ -550,7 +553,7 @@ function default.register_biomes() node_riverbed = "default:gravel", depth_riverbed = 2, y_min = 2, - y_max = 31000, + y_max = upper_limit, heat_point = 0, humidity_point = 40, }) @@ -612,7 +615,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 2, - y_max = 31000, + y_max = upper_limit, heat_point = 25, humidity_point = 70, }) @@ -654,7 +657,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 20, humidity_point = 35, }) @@ -696,7 +699,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 6, - y_max = 31000, + y_max = upper_limit, heat_point = 50, humidity_point = 35, }) @@ -758,7 +761,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 6, - y_max = 31000, + y_max = upper_limit, heat_point = 45, humidity_point = 70, }) @@ -820,7 +823,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 1, - y_max = 31000, + y_max = upper_limit, heat_point = 60, humidity_point = 68, }) @@ -882,7 +885,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 92, humidity_point = 16, }) @@ -915,7 +918,7 @@ function default.register_biomes() node_top = "default:sand", depth_top = 1, node_filler = "default:sand", - depth_filler = 0, + depth_filler = 1, node_stone = "default:sandstone", --node_water_top = "", --depth_water_top = , @@ -924,7 +927,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 60, humidity_point = 0, }) @@ -966,7 +969,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 5, - y_max = 31000, + y_max = upper_limit, heat_point = 40, humidity_point = 0, }) @@ -1008,7 +1011,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 1, - y_max = 31000, + y_max = upper_limit, heat_point = 89, humidity_point = 42, }) @@ -1070,7 +1073,7 @@ function default.register_biomes() node_riverbed = "default:sand", depth_riverbed = 2, y_min = 1, - y_max = 31000, + y_max = upper_limit, heat_point = 86, humidity_point = 65, }) @@ -1137,6 +1140,100 @@ function default.register_biomes() end +-- Biomes for floatlands + +function default.register_floatland_biomes(floatland_level, shadow_limit) + + -- Coniferous forest + + minetest.register_biome({ + name = "floatland_coniferous_forest", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 70, + }) + + -- Grassland + + minetest.register_biome({ + name = "floatland_grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 35, + }) + + -- Sandstone desert + + minetest.register_biome({ + name = "floatland_sandstone_desert", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 1, + node_stone = "default:sandstone", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = floatland_level + 2, + y_max = 31000, + heat_point = 50, + humidity_point = 0, + }) + + -- Floatland ocean / underground + + minetest.register_biome({ + name = "floatland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 3, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + --node_riverbed = "", + --depth_riverbed = , + y_min = shadow_limit, + y_max = floatland_level + 1, + heat_point = 50, + humidity_point = 50, + }) +end + + -- -- Register decorations -- @@ -1247,7 +1344,8 @@ local function register_grass_decoration(offset, scale, length) persist = 0.6 }, biomes = {"grassland", "grassland_dunes", "deciduous_forest", - "coniferous_forest", "coniferous_forest_dunes"}, + "coniferous_forest", "coniferous_forest_dunes", + "floatland_grassland", "floatland_coniferous_forest"}, y_min = 1, y_max = 31000, decoration = "default:grass_" .. length, @@ -1361,7 +1459,7 @@ function default.register_decorations() octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest"}, + biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, y_min = 2, y_max = 31000, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", @@ -1549,7 +1647,8 @@ function default.register_decorations() octaves = 3, persist = 0.7, }, - biomes = {"snowy_grassland", "grassland", "deciduous_forest"}, + biomes = {"snowy_grassland", "grassland", "deciduous_forest", + "floatland_grassland"}, y_min = 1, y_max = 31000, schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", @@ -1655,9 +1754,18 @@ end -- --- Detect mapgen to select functions +-- Detect mapgen, flags and parameters to select functions -- +-- Get setting or default +local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or + "mountains, ridges, nofloatlands" +local captures_float = string.match(mgv7_spflags, "floatlands") +local captures_nofloat = string.match(mgv7_spflags, "nofloatlands") + +local mgv7_floatland_level = minetest.get_mapgen_setting("mgv7_floatland_level") or 1280 +local mgv7_shadow_limit = minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024 + minetest.clear_registered_biomes() minetest.clear_registered_ores() minetest.clear_registered_decorations() @@ -1667,8 +1775,16 @@ if mg_name == "v6" then default.register_mgv6_blob_ores() default.register_ores() default.register_mgv6_decorations() +elseif mg_name == "v7" and captures_float == "floatlands" and + captures_nofloat ~= "nofloatlands" then + -- Mgv7 with floatlands + default.register_biomes(mgv7_shadow_limit - 1) + default.register_floatland_biomes(mgv7_floatland_level, mgv7_shadow_limit) + default.register_blob_ores() + default.register_ores() + default.register_decorations() else - default.register_biomes() + default.register_biomes(31000) default.register_blob_ores() default.register_ores() default.register_decorations() diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index ec03c9b2..2b960907 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -94,7 +94,8 @@ local function register_flower(seed, name) octaves = 3, persist = 0.6 }, - biomes = {"grassland", "deciduous_forest", "coniferous_forest"}, + biomes = {"grassland", "deciduous_forest", "coniferous_forest", + "floatland_grassland", "floatland_coniferous_forest"}, y_min = 1, y_max = 31000, decoration = "flowers:"..name, @@ -114,7 +115,8 @@ local function register_mushroom(name) octaves = 3, persist = 0.66 }, - biomes = {"deciduous_forest", "coniferous_forest"}, + biomes = {"deciduous_forest", "coniferous_forest", + "floatland_coniferous_forest"}, y_min = 1, y_max = 31000, decoration = "flowers:"..name, From 07e11427cf86de4554834fe1ebbb72531611774b Mon Sep 17 00:00:00 2001 From: octacian Date: Wed, 15 Mar 2017 22:03:52 -0700 Subject: [PATCH 066/118] Keys: Fix crash when using unconfigured default:key Since meta secret field is blank on any keys (default:key) obtained using /give, the game will crash if you attempt to use one of these. This follows along the principle that the game should never have any reason to crash. --- mods/default/functions.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index eeac0c2a..bf3749a8 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -562,7 +562,12 @@ function default.can_interact_with_node(player, pos) local key_meta = item:get_meta() if key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret) + local key_oldmeta = item:get_metadata() + 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 From 02921baa7a5af3f6c2892cd1a63d1383f070cc76 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 17 Mar 2017 05:06:57 +0000 Subject: [PATCH 067/118] Junglegrass: Prevent seeding of dirt_with_grass Previously you could place junglegrass on dirt to convert that dirt to dirt_with_grass, but this is unsuitable now that rainforest has a surface of dirt_with_rainforest_litter. Remove junglegrass from the 'grass' group. --- mods/default/nodes.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 0523097c..c20a3a88 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1170,7 +1170,7 @@ minetest.register_node("default:junglegrass", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1}, + groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", From d2aae95c3915575f819a89d37f02bb63a5d0f72d Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 17 Mar 2017 05:17:57 +0000 Subject: [PATCH 068/118] Leafdecay: Change Aspen radius back to 3 Although the new aspen tree schematic only requires a radius of 2 the many existing aspen trees in a world require radius 3. --- mods/default/nodes.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c20a3a88..e410172f 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2203,7 +2203,7 @@ default.register_leafdecay({ default.register_leafdecay({ trunks = {"default:aspen_tree"}, leaves = {"default:aspen_leaves"}, - radius = 2, + radius = 3, }) default.register_leafdecay({ From 6a55e150aff0a6f77ed3104add013c03e810043c Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Sat, 18 Mar 2017 17:19:19 +0100 Subject: [PATCH 069/118] Doors: Fix wood/glass doors not opening or closing Some code was lost during a rebase of a recently merged commit (73e4666). --- mods/default/functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index bf3749a8..8e9132d0 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -550,9 +550,9 @@ function default.can_interact_with_node(player, pos) end local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") - if player:get_player_name() == meta:get_string("owner") then - -- Owner can access the node to any time + if not owner or owner == "" or owner == player:get_player_name() then return true end From ecf160d93d678bdaefbbcb5177895e0733069eff Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 13 Mar 2017 12:35:45 -0700 Subject: [PATCH 070/118] Screwdriver: simplify logic, allow wallmounted rotation. - Allow rotation of wallmounted nodeboxes (signs) since they are now rotating properly. - Instead of testing `ndef` several times, do it once, correctly. - Simplify exception logic for nodes that have `on_rotate` set. - For simplicity, return itemstack, always. - Remove a useless nil check. --- mods/screwdriver/init.lua | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index f2596437..49544de3 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -93,38 +93,33 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) 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 then - return + return itemstack end local should_rotate = true local new_param2 = fn(pos, node, mode) -- Node provides a handler, so let the handler decide instead if the node can be rotated - if ndef and ndef.on_rotate then + 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 + return itemstack elseif result == true then should_rotate = false end - else - if not ndef or - ndef.on_rotate == false or - (ndef.drawtype == "nodebox" and - (ndef.node_box and ndef.node_box.type ~= "fixed")) or - node.param2 == nil then - return - end - - if ndef.can_dig and not ndef.can_dig(pos, user) then - return - 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 then From 2a7403274511ba008d4a9427f9e676d21786f074 Mon Sep 17 00:00:00 2001 From: octacian Date: Mon, 13 Mar 2017 22:28:03 -0700 Subject: [PATCH 071/118] Books: Fix backwards compatibility issues Commit c68b8274fed183f30bd7609018766a261448b83d prevented books from being copied in the crafting grid, and made it so that old books, though seemingly successfully transferred to the new format, could not be written to as the old data still persisted. --- mods/default/craftitems.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index f002d709..aa8f56bd 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -71,6 +71,7 @@ local function book_on_use(itemstack, user) end minetest.show_formspec(player_name, "default:book", formspec) + return itemstack end minetest.register_on_player_receive_fields(function(player, formname, fields) @@ -133,11 +134,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - local data_str = minetest.serialize(data) - stack:set_metadata(data_str) - book_on_use(stack, player) + stack:get_meta():from_table(data) + stack = book_on_use(stack, player) end + -- Update stack player:set_wielded_item(stack) end) @@ -178,9 +179,9 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv if not original then return end - local copymeta = original:get_metadata() + local copymeta = original:get_meta():to_table() -- copy of the book held by player's mouse cursor - itemstack:set_metadata(copymeta) + itemstack:get_meta():from_table(copymeta) -- put the book with metadata back in the craft grid craft_inv:set_stack("craft", index, original) end) From 86fd616f3c7ae820934dcd99f4c15342f4eda4ec Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 18 Mar 2017 17:54:03 +0000 Subject: [PATCH 072/118] Flora spread: Allow spread on rainforest litter. Other improvements Use the soil group more instead of checking for multiple node names. Remove 'neighbors' from ABM. Turn any flora to dry shrub if on a non-soil, except when on default:sand to avoid dune grasses being replaced. Search for "group:soil" when searching for a position for the new flora node, instead of searching for multiple node names, however do not spread flora onto desert sand, which is in the soil group. Remove default:dirt_with_snow from the soil group as it would be frozen soil. It can be dug and placed to turn it into dirt (consider this some extra work needed to make it cultivatable). --- mods/default/nodes.lua | 2 +- mods/flowers/init.lua | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index e410172f..c70f614b 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -434,7 +434,7 @@ minetest.register_node("default: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}, + groups = {crumbly = 3, spreading_dirt_type = 1, snowy = 1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.15}, diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index da82bb7c..c71bc29c 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -107,12 +107,11 @@ function flowers.flower_spread(pos, node) pos.y = pos.y - 1 local under = minetest.get_node(pos) pos.y = pos.y + 1 - if under.name == "default:desert_sand" then + if minetest.get_item_group(under.name, "soil") == 0 and + -- Do not replace sand dune grasses + under.name ~= "default:sand" then minetest.set_node(pos, {name = "default:dry_shrub"}) return - elseif under.name ~= "default:dirt_with_grass" and - under.name ~= "default:dirt_with_dry_grass" then - return end local light = minetest.get_node_light(pos) @@ -126,24 +125,26 @@ function flowers.flower_spread(pos, node) return end - local seedling = minetest.find_nodes_in_area_under_air(pos0, pos1, - {"default:dirt_with_grass", "default:dirt_with_dry_grass"}) - if #seedling > 0 then - seedling = seedling[math.random(#seedling)] - seedling.y = seedling.y + 1 - light = minetest.get_node_light(seedling) - if not light or light < 13 then + local soils = minetest.find_nodes_in_area_under_air( + pos0, pos1, "group:soil") + if #soils > 0 then + local seedling = soils[math.random(#soils)] + local seedling_above = + {x = seedling.x, y = seedling.y + 1, z = seedling.z} + light = minetest.get_node_light(seedling_above) + if not light or light < 13 or + -- Desert sand is in the soil group + minetest.get_node(seedling).name == "default:desert_sand" then return end - minetest.set_node(seedling, {name = node.name}) + + minetest.set_node(seedling_above, {name = node.name}) end end minetest.register_abm({ label = "Flower spread", nodenames = {"group:flora"}, - neighbors = {"default:dirt_with_grass", "default:dirt_with_dry_grass", - "default:desert_sand"}, interval = 13, chance = 96, action = function(...) From 91182d6a9ec56c88096c1bad653a85426892c54d Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 22 Mar 2017 17:51:29 +0000 Subject: [PATCH 073/118] Flora spread: Do not replace flora with dry shrub, only 'return' If there is no group:soil node found below, do not replace flora with dry shrub, this was breaking flower pots and other mods. Originally, flora would only turn to dry shrub if in desert sand. --- mods/flowers/init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index c71bc29c..f5955d8c 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -107,10 +107,9 @@ function flowers.flower_spread(pos, node) pos.y = pos.y - 1 local under = minetest.get_node(pos) pos.y = pos.y + 1 - if minetest.get_item_group(under.name, "soil") == 0 and - -- Do not replace sand dune grasses - under.name ~= "default:sand" then - minetest.set_node(pos, {name = "default:dry_shrub"}) + if minetest.get_item_group(under.name, "soil") == 0 then + -- Do not replace with dry shrub here as + -- this breaks flower pots and other mods. return end From 9b45e7b3e92b12791c6d6bc88c28d42fc9bd0858 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 21 Mar 2017 22:34:42 -0700 Subject: [PATCH 074/118] PB&J Pup. Replace possibly trademarked artwork with royalty free and OK for commercial use artwork. The Pup appears by default but does not alias the Nyan Cat nodes away. For that you will have to enable the setting. A settingtypes.txt is provided to make that really easy. This allows people to get an out-of-tree mod and not have their Nyan nodes disappear. The mod can also be disabled entirely this way for those who don't want it. There's some eatser eggs in here as well. Instead of making the nodes burnable, they are edible, and make you bark and howl. And perhaps something else too. --- mods/nyancat/README.txt | 16 --- mods/nyancat/init.lua | 89 ------------ mods/nyancat/license.txt | 50 ------- mods/nyancat/textures/nyancat_back.png | Bin 186 -> 0 bytes mods/nyancat/textures/nyancat_front.png | Bin 204 -> 0 bytes mods/nyancat/textures/nyancat_rainbow.png | Bin 137 -> 0 bytes mods/nyancat/textures/nyancat_side.png | Bin 148 -> 0 bytes mods/{nyancat => pbj_pup}/depends.txt | 0 mods/pbj_pup/init.lua | 136 ++++++++++++++++++ mods/pbj_pup/license.md | 26 ++++ mods/pbj_pup/sounds/pbj_pup_barks.ogg | Bin 0 -> 17192 bytes mods/pbj_pup/sounds/pbj_pup_howl.ogg | Bin 0 -> 15155 bytes mods/pbj_pup/textures/pbj_pup_back.png | Bin 0 -> 301 bytes mods/pbj_pup/textures/pbj_pup_candies.png | Bin 0 -> 326 bytes .../textures/pbj_pup_candies_animated.png | Bin 0 -> 1584 bytes mods/pbj_pup/textures/pbj_pup_front.png | Bin 0 -> 347 bytes mods/pbj_pup/textures/pbj_pup_jelly.png | Bin 0 -> 248 bytes mods/pbj_pup/textures/pbj_pup_sides.png | Bin 0 -> 250 bytes settingtypes.txt | 10 ++ 19 files changed, 172 insertions(+), 155 deletions(-) delete mode 100644 mods/nyancat/README.txt delete mode 100644 mods/nyancat/init.lua delete mode 100644 mods/nyancat/license.txt delete mode 100644 mods/nyancat/textures/nyancat_back.png delete mode 100644 mods/nyancat/textures/nyancat_front.png delete mode 100644 mods/nyancat/textures/nyancat_rainbow.png delete mode 100644 mods/nyancat/textures/nyancat_side.png rename mods/{nyancat => pbj_pup}/depends.txt (100%) create mode 100644 mods/pbj_pup/init.lua create mode 100644 mods/pbj_pup/license.md create mode 100644 mods/pbj_pup/sounds/pbj_pup_barks.ogg create mode 100644 mods/pbj_pup/sounds/pbj_pup_howl.ogg create mode 100644 mods/pbj_pup/textures/pbj_pup_back.png create mode 100644 mods/pbj_pup/textures/pbj_pup_candies.png create mode 100644 mods/pbj_pup/textures/pbj_pup_candies_animated.png create mode 100644 mods/pbj_pup/textures/pbj_pup_front.png create mode 100644 mods/pbj_pup/textures/pbj_pup_jelly.png create mode 100644 mods/pbj_pup/textures/pbj_pup_sides.png diff --git a/mods/nyancat/README.txt b/mods/nyancat/README.txt deleted file mode 100644 index fadc1d23..00000000 --- a/mods/nyancat/README.txt +++ /dev/null @@ -1,16 +0,0 @@ -Minetest Game mod: nyancat -========================== -See license.txt for license information. - -Authors of source code ----------------------- -Originally by celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) - -Authors of media files ----------------------- -VanessaE (CC BY-SA 3.0): - nyancat_front.png - nyancat_back.png - nyancat_side.png - nyancat_rainbow.png diff --git a/mods/nyancat/init.lua b/mods/nyancat/init.lua deleted file mode 100644 index 7192beb8..00000000 --- a/mods/nyancat/init.lua +++ /dev/null @@ -1,89 +0,0 @@ -minetest.register_node("nyancat:nyancat", { - description = "Nyan Cat", - tiles = {"nyancat_side.png", "nyancat_side.png", "nyancat_side.png", - "nyancat_side.png", "nyancat_back.png", "nyancat_front.png"}, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - legacy_facedir_simple = true, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("nyancat:nyancat_rainbow", { - description = "Nyan Cat Rainbow", - tiles = { - "nyancat_rainbow.png^[transformR90", - "nyancat_rainbow.png^[transformR90", - "nyancat_rainbow.png" - }, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - sounds = default.node_sound_defaults(), -}) - -minetest.register_craft({ - type = "fuel", - recipe = "nyancat:nyancat", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "nyancat:nyancat_rainbow", - burntime = 1, -}) - -nyancat = {} - -function nyancat.place(pos, facedir, length) - if facedir > 3 then - facedir = 0 - end - local tailvec = minetest.facedir_to_dir(facedir) - local p = {x = pos.x, y = pos.y, z = pos.z} - minetest.set_node(p, {name = "nyancat:nyancat", param2 = facedir}) - for i = 1, length do - p.x = p.x + tailvec.x - p.z = p.z + tailvec.z - minetest.set_node(p, {name = "nyancat:nyancat_rainbow", param2 = facedir}) - end -end - -function nyancat.generate(minp, maxp, seed) - local height_min = -31000 - local height_max = -32 - if maxp.y < height_min or minp.y > height_max then - return - end - local y_min = math.max(minp.y, height_min) - local y_max = math.min(maxp.y, height_max) - local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) - local pr = PseudoRandom(seed + 9324342) - local max_num_nyancats = math.floor(volume / (16 * 16 * 16)) - for i = 1, max_num_nyancats do - if pr:next(0, 1000) == 0 then - local x0 = pr:next(minp.x, maxp.x) - local y0 = pr:next(minp.y, maxp.y) - local z0 = pr:next(minp.z, maxp.z) - local p0 = {x = x0, y = y0, z = z0} - nyancat.place(p0, pr:next(0, 3), pr:next(3, 15)) - end - end -end - -minetest.register_on_generated(function(minp, maxp, seed) - nyancat.generate(minp, maxp, seed) -end) - --- Legacy -minetest.register_alias("default:nyancat", "nyancat:nyancat") -minetest.register_alias("default:nyancat_rainbow", "nyancat:nyancat_rainbow") -minetest.register_alias("nyancat", "nyancat:nyancat") -minetest.register_alias("nyancat_rainbow", "nyancat:nyancat_rainbow") -default.make_nyancat = nyancat.place -default.generate_nyancats = nyancat.generate diff --git a/mods/nyancat/license.txt b/mods/nyancat/license.txt deleted file mode 100644 index 3aa38617..00000000 --- a/mods/nyancat/license.txt +++ /dev/null @@ -1,50 +0,0 @@ -License of source code ----------------------- - -GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2016 celeron55, Perttu Ahola -Copyright (C) 2012-2016 Various Minetest 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 VanessaE - -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/mods/nyancat/textures/nyancat_back.png b/mods/nyancat/textures/nyancat_back.png deleted file mode 100644 index e479ace8306c8f856da9f8f99f40924ef67a8a9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!T!2rAD;F1+5nr6MvvWg3Lx+3E zp`=4cQ;z=kUGl%-|Ns3B=jZR508|<7>EaktaVzzFAm0H64(1DfB?tcM+XzO+UgH;z z>k5pq5MEs0#8ACi;Thu+l@*S+M07WBZqjNI6K(2SlfhWd@s@@6;91dS3@_4TZ#<}U iv^i(q@!?PHf5y{VEFYHcy`liLg2B_(&t;ucLK6T4Jwjao diff --git a/mods/nyancat/textures/nyancat_front.png b/mods/nyancat/textures/nyancat_front.png deleted file mode 100644 index c9dd6a330ed87cfb410787d9038410c2f1576c54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)eD;F1+5no(lVq#KKQc+P+ zLqo%XhQhRz>~c$0z6YH;*7ce-_ratU0m>^y61`@b-pM#*%d#WU@qGUWA-Ct5>ZuVeVv2^x zMWp!x>~A|X>xczPUU|_J>#|_3p46r7_3!te3ujK5#;SY*XcvR0tDnm{r-UW||3Xcd diff --git a/mods/nyancat/textures/nyancat_rainbow.png b/mods/nyancat/textures/nyancat_rainbow.png deleted file mode 100644 index 685a22ccf53ab659eafcab0dd95e7b031cbdb0af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VWHR6k#Aej4~f#JUc!~X_` z|N9yK|7U0b@fjEn)B{-#4j|z`fj9oKbJqfONqM?BhHykDCp0j*2`F+TaX3lplq6{w bD=;$jy=D@~d2jgysEWbU)z4*}Q$iB}HhU8XVY1U~xGeL-8NP|$YI8_pS% ul^jJEaBkt?c1erqlG2>{|7FXz@8 3 then + facedir = 0 + end + local tailvec = minetest.facedir_to_dir(facedir) + local p = {x = pos.x, y = pos.y, z = pos.z} + minetest.set_node(p, {name = "pbj_pup:pbj_pup", param2 = facedir}) + for i = 1, length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.set_node(p, {name = "pbj_pup:pbj_pup_candies", param2 = facedir}) + end + end + + local function generate(minp, maxp, seed) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) + local pr = PseudoRandom(seed + 9324342) + local max_num = math.floor(volume / (16 * 16 * 16)) + for i = 1, max_num do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x = x0, y = y0, z = z0} + place(p0, pr:next(0, 3), pr:next(3, 15)) + end + end + end + + minetest.register_on_generated(generate) +end +-- +-- compat +-- + +if minetest.setting_getbool("pbj_pup_alias_nyancat") then + minetest.register_alias("default:nyancat", "pbj_pup:pbj_pup") + minetest.register_alias("default:nyancat_rainbow","pbj_pup:pbj_pup_candies") + minetest.register_alias("nyancat", "pbj_pup:pbj_pup") + minetest.register_alias("nyancat_rainbow", "pbj_pup:pbj_pup_candies") + minetest.register_alias("nyancat:nyancat", "pbj_pup:pbj_pup") + minetest.register_alias("nyancat:nyancat_rainbow", "pbj_pup:pbj_pup_candies") +end diff --git a/mods/pbj_pup/license.md b/mods/pbj_pup/license.md new file mode 100644 index 00000000..b5fcf3a2 --- /dev/null +++ b/mods/pbj_pup/license.md @@ -0,0 +1,26 @@ + +## PB&J Pup + +PB&J Pup is a parody on the "Nyan Cat" TM toasted poptart meme. + + +## License and Copyright + +(C) 2017 Vanessa Ezekowitz, Auke Kok, celeron55 + + * All Code: LGPL-2.1+ + * All Images: CC-BY-4.0 + + +## Sounds + + * `pbj_pup_barks.ogg`: + Artist: Tomlija + License: CC-BY-3.0 + Url: http://freesound.org/people/Tomlija/sounds/97392/ + + * `pbj_pup_howl.ogg`: + Copyright 2013 Iwan Gabovitch (qubodup) + License: CC-BY-3.0 + Url: http://freesound.org/people/qubodup/sounds/193394/ + diff --git a/mods/pbj_pup/sounds/pbj_pup_barks.ogg b/mods/pbj_pup/sounds/pbj_pup_barks.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bdd3440e04f455924ef935392eb0209d8a72477e GIT binary patch literal 17192 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 literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/sounds/pbj_pup_howl.ogg b/mods/pbj_pup/sounds/pbj_pup_howl.ogg new file mode 100644 index 0000000000000000000000000000000000000000..15e93bc21e86ce168a0e868a9a88a793131890b4 GIT binary patch literal 15155 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 H{+s>}v~8ou literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/textures/pbj_pup_back.png b/mods/pbj_pup/textures/pbj_pup_back.png new file mode 100644 index 0000000000000000000000000000000000000000..f72fc24620627b2c2fe6f96dae66034b90984d2e GIT binary patch literal 301 zcmV+|0n+}7P)+J08@$vEX_4P$T4H*Cc0FFsSK~xyiU5`mp z!$1%O)3OaJ#%Tj;7`FcZH#r~lJqJBFSqv_rawD#hU!=%y5_^L>vvRtjhDrJEiobndgmm3lzOSI9@J+!bf_ zGvo$Gc`Q7_ErcpwsbW$^2+KlW;Lsg+B00000NkvXXu0mjf3QvLt literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/textures/pbj_pup_candies.png b/mods/pbj_pup/textures/pbj_pup_candies.png new file mode 100644 index 0000000000000000000000000000000000000000..185fa2d8e3da756f2c0246a69e6f1ae8d47de392 GIT binary patch literal 326 zcmV-M0lEH(P)Mg{MudIRLHJtF_?Rx3{;wlD)~<^vU$>%Jj+0%gfQY z9MRVR*4Eb70CCp<*Vjk@;I-i5;^OJP)$Z=@^YqE|$=~$J^z_%s`}_O+*P#8-k^hze z|HJ^k^MO(T005FnL_t&-8C}5(a)Lk*MbXz7P!p8TI73?bT%-G6V+P7fsys(^eM+bL zpZq)Z$uHgJ;x1C3W^TT@#!1X+29|*=#wa$&VIiC1Bv#9C6Ap&} zQn~vmMK*>of004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003* zP)t-s08`fhe)<5{t^nxS0RR61|E>qu00;jg2mh`PT-g?4+AB`tD^u<(Vb?3y*(>F) zG5-KE*DEsR06j^GJ#?%+|NmCy*%=h=&%>36E{N(`uD{=oeasNsB|8D^Q za{&LA0RNU3|CVw8r@sHSkN?B~|HN_s(g6R{lmFLo|JkGe-M;_t0RQhJ|L<}C{Q&>} z0RR76|Nn9S|EvH1uK)l4@eJlP00001VoOIvYf@#Um;e9-UP(kjR9M5Mm+OC1MG%Hx zR}&**3q(B?6%+#A$SFY+I9{sY4MI<1y`)NOy#Q6%|NlEPyF0tHC%vR0zkcYMGrODj z*|`O_@qulxyMIda;tO4{VZB`xWH9FKH(oi_1?=R%f}PBHW6(t(y=p>Eyu|oDs-D_$ zXLcVy4hCa+-ka@I7+kn8$c`N=54$P+$>okwO9+VnFd_O&K$sBlkp@EV z2fs~}xUDI&=-B=LA7~tV+mEITUFCs>rrN|O7!n_6Xs_3|Rzfs*kJ{etw6Z0oX|<0$ zHUeP-SrQN?bgKJW0&@D7SMe6UNIdjiH|p&{pQn+ zQX9Vh*51{ZJ-V^6;__b%YKKElQ9zs_0^!i^a!Lu1;myxMS@o3w8Bgu|98-N+&$T2w zg=jJJH1VF6b_k*;= zt@ipCi80NG#btb0zVLBCyhoj-OpKsjehR%0Z8aSm8ZWF6iXJ+KoS`%?y-tKuXonsc z<^eXG_i9D?u2(1CqFiy!uge0+q|koXBeMhMRWq?S!9nM2UPkqk12K;|FO z51D^NKV<%q`$tmm@Bg`LkRE#u@B4|51HwG4N|`$H2tY>H5uV3>4k3>Q4pv(R9B14- zgg60&c?dH9$UKBN|9Gbo(%t)u-ToY)?cL3z4aaWkfFQ*W17RNNeUIx=@F1}~hfsXM zt9LkD|A$xaqQlKYPLUeHdM@uCO&qHYIV`v^)^r93YSWQUD_kEewQ`{6I*{ml%R=SWXP+&kET^Uisk~q~CM9 zUwv@34a#>Zl;**zDYz&~?Qs1cDmq-fR-5{Mh6bNSTESr+F@|6>LTXd7z%~fY1G=r$ zn}@Uaa4zaM=Ch}dZzIk-+yPgs9_{hT9gl;S_z22>;UaaGrrOZ&k@3mo^NJ;cUmJu_ z@(30kFpdyJn)H8M`#$Io{U6oEpr1S7&g@t8WZoh5K7z8J^VI|m9Jb++^Qbd%j*ph_ i;wSg0PxccqeVzeo(|LLwNtf3E0000ZDBrbX#k6EOBZi%Z*os1djO<>004l1 zfPnz3jA0&)jg5|4ppO8)k9S*^XdszUu%Dlwqj4jus;aw!DZISAy}iA{d)mar#K*_S z=;-M2@$vQb_5T0>|NsA>HdNvO005gwL_t&-8CAj2Qo=wGMA2(7%&I_3jBXHY)WBr_ z{|lwcC(fbQogPh@`C02v&J4RrD35IFYprhtLkbN9{~Wvv5hiR0b|8dJ*V!FmBSZwP z*{uO71VqE8mBK}6=E?SU>l;!iIoJl<2T~|MuutQ7vRPk+&M*cyF~YYHWd-c_z^WjG t3(pVB^7ukALKFOEE=%SYOrqDF{tuUO59RfDvEBdx002ovPDHLkV1lYljQ;=t literal 0 HcmV?d00001 diff --git a/mods/pbj_pup/textures/pbj_pup_jelly.png b/mods/pbj_pup/textures/pbj_pup_jelly.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0c1ebf1b3ed11e4273fdc53780271da8d2c26e GIT binary patch literal 248 zcmVC3^s*j{v@pcUzM&w3$(`o-D+pG0DEZzQTIh!h71%($dt_)Z*ge=;-L{>+9_7 z?D6sO_4V}>MwD>?004AJL_t&-(_N3t5&}U812OchuHrlY|E(UFT}yM|5Yj1#(2pWC zY#*U)`!E!;3liE>$OS9FO5LrH0XQX)b)JcY9#+WC2G|W)AxWsmM4F*IOIKiNrxU$j yAm0i-y(942E`|Cc_Vq&9HA{y#-RzC4*onk9S+2bTOi$qNI2-r-MtgkXW>lS-!r$!KHZA)YRhQ;^X7v=H}+;=;-U~ z>+J08_4W1MumnN?004GLL_t&-(^Zd&4#F@DLqm^cGqAzt|NmBUs8q9h<;kfWk#dtr zX(SgObUj*;LgE8eyaG9}%2f^S0j%i0?7%ZY)nS4G{40}#?1-}KHykzDaBx+fU6CVR z`SE7p#PHj7&0sx}F{6(li0I7;e80)& Date: Thu, 23 Mar 2017 01:19:33 +0000 Subject: [PATCH 075/118] Flora spread: Re-enable dry shrub replacing flora in desert sand Flora is converted to dry shrub in desert sand and silver sand. No conversion in sand to preserve sand dune grasses. Dry shrubs do not spread so this conversion, used by players, is the only way to generate them. --- mods/flowers/init.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index f5955d8c..db7a4eb3 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -107,9 +107,16 @@ 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 - -- Do not replace with dry shrub here as - -- this breaks flower pots and other mods. return end From 7c42c41170996cf477620cbbec97c2a46a397199 Mon Sep 17 00:00:00 2001 From: upsilon Date: Sat, 25 Mar 2017 17:18:17 +0100 Subject: [PATCH 076/118] doors: record protection violation if it cannot be dug --- mods/doors/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 2b3d094a..974e9d3d 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -203,7 +203,12 @@ end local function can_dig_door(pos, digger) replace_old_owner_information(pos) - return default.can_interact_with_node(digger, pos) + if default.can_interact_with_node(digger, pos) then + return true + else + minetest.record_protection_violation(pos, digger:get_player_name()) + return false + end end function doors.register(name, def) From b847888cb7b79787f424dec2c2ee1728cc2c0872 Mon Sep 17 00:00:00 2001 From: cx384 Date: Tue, 28 Mar 2017 19:18:59 +0200 Subject: [PATCH 077/118] doors: add groups to the door craftitem --- mods/doors/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 974e9d3d..4ab40111 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -254,6 +254,7 @@ function doors.register(name, def) minetest.register_craftitem(":" .. name, { description = def.description, inventory_image = def.inventory_image, + groups = def.groups, on_place = function(itemstack, placer, pointed_thing) local pos From 077316b4cd7558eda03e6d3df631ee3aa27bff11 Mon Sep 17 00:00:00 2001 From: zaoqi Date: Wed, 29 Mar 2017 21:02:26 +0200 Subject: [PATCH 078/118] Use creative.is_enabled_for for creative mode if possible (#1558) --- mods/beds/api.lua | 3 ++- mods/boats/init.lua | 6 ++++-- mods/bones/init.lua | 3 ++- mods/carts/cart_entity.lua | 6 ++++-- mods/creative/init.lua | 2 +- mods/default/player.lua | 3 ++- mods/default/trees.lua | 3 ++- mods/doors/init.lua | 4 ++-- mods/farming/api.lua | 6 ++++-- mods/fire/init.lua | 5 +++-- mods/flowers/init.lua | 3 ++- mods/screwdriver/init.lua | 3 ++- mods/stairs/init.lua | 6 ++++-- 13 files changed, 34 insertions(+), 19 deletions(-) diff --git a/mods/beds/api.lua b/mods/beds/api.lua index daa6d8e2..97dde43d 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -89,7 +89,8 @@ function beds.register_bed(name, def) minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 6e1565d4..4d8f4673 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -110,7 +110,8 @@ function boat.on_punch(self, puncher) if not self.driver then self.removed = true local inv = puncher:get_inventory() - if not minetest.setting_getbool("creative_mode") + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_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 @@ -244,7 +245,8 @@ minetest.register_craftitem("boats:boat", { boat = minetest.add_entity(pointed_thing.under, "boats:boat") if boat then boat:setyaw(placer:get_look_horizontal()) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end end diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 9542cab0..56f5fd04 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -167,7 +167,8 @@ minetest.register_on_dieplayer(function(player) end -- return if keep inventory set or in creative mode - if bones_mode == "keep" or minetest.setting_getbool("creative_mode") then + if bones_mode == "keep" or (creative and creative.is_enabled_for + and creative.is_enabled_for(player:get_player_name())) then return end diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index bf0a450d..4d44c873 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -92,7 +92,8 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, end -- Pick up cart local inv = puncher:get_inventory() - if not minetest.setting_getbool("creative_mode") + if not (creative and creative.is_enabled_for ++ and creative.is_enabled_for(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 @@ -385,7 +386,8 @@ minetest.register_craftitem("carts:cart", { minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, {pos = pointed_thing.above}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 7471e603..f9047189 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -8,7 +8,7 @@ end dofile(minetest.get_modpath("creative") .. "/inventory.lua") -if minetest.setting_getbool("creative_mode") then +if creative_mode_cache then -- Dig time is modified according to difference (leveldiff) between tool -- 'maxlevel' and node 'level'. Digtime is divided by the larger of -- leveldiff and 1. diff --git a/mods/default/player.lua b/mods/default/player.lua index fd7341f4..cd89a24c 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -96,7 +96,8 @@ minetest.register_on_joinplayer(function(player) player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) -- set GUI - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player:get_player_name())) then player:set_inventory_formspec(default.gui_survival_form) end player:hud_set_hotbar_image("gui_hotbar.png") diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 3e1bf102..0b829a75 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -471,7 +471,8 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, minetest.log("action", player_name .. " places node " .. sapling_name .. " at " .. minetest.pos_to_string(pos)) - local take_item = not minetest.setting_getbool("creative_mode") + local take_item = not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) local newnode = {name = sapling_name} local ndef = minetest.registered_nodes[sapling_name] minetest.set_node(pos, newnode) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 4ab40111..8ca26dac 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -328,7 +328,7 @@ function doors.register(name, def) meta:set_string("infotext", "Owned by " .. pn) end - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) then itemstack:take_item() end @@ -576,7 +576,7 @@ function doors.register_trapdoor(name, def) meta:set_string("owner", pn) meta:set_string("infotext", "Owned by "..pn) - return minetest.setting_getbool("creative_mode") + return (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) end def.on_blast = function() end diff --git a/mods/farming/api.lua b/mods/farming/api.lua index 0ba756cc..35a77e9f 100644 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -57,7 +57,8 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses) gain = 0.5, }) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(user:get_player_name())) then -- wear tool local wdef = itemstack:get_definition() itemstack:add_wear(65535/(uses-1)) @@ -187,7 +188,8 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname) -- add the node and remove 1 item from the itemstack minetest.add_node(pt.above, {name = plantname, param2 = 1}) tick(pt.above) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack diff --git a/mods/fire/init.lua b/mods/fire/init.lua index a846b289..a9ceb9ea 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -85,13 +85,13 @@ minetest.register_tool("fire:flint_and_steel", { "fire_flint_and_steel", {pos = sound_pos, gain = 0.5, max_hear_distance = 8} ) + 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 - local player_name = user:get_player_name() if minetest.is_protected(pointed_thing.under, player_name) then minetest.chat_send_player(player_name, "This area is protected") return @@ -103,7 +103,8 @@ minetest.register_tool("fire:flint_and_steel", { minetest.set_node(pointed_thing.above, {name = "fire:basic_flame"}) end end - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then -- Wear tool local wdef = itemstack:get_definition() itemstack:add_wear(1000) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index db7a4eb3..cb5b2193 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -289,7 +289,8 @@ minetest.register_node("flowers:waterlily", { if not minetest.is_protected(pos, player_name) then minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(player_name)) then itemstack:take_item() end else diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 49544de3..2a53ae37 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -128,7 +128,8 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) minetest.check_for_falling(pos) end - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(user:get_player_name())) then itemstack:add_wear(65535 / ((uses or 200) - 1)) end diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 86dadf97..1379c8c0 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -150,6 +150,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, on_place = function(itemstack, placer, pointed_thing) local under = minetest.get_node(pointed_thing.under) local wield_item = itemstack:get_name() + local creative_enabled = (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) if under and wield_item == under.name then -- place slab using under node orientation @@ -171,7 +173,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, return end minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2}) - if not minetest.setting_getbool("creative_mode") then + if not creative_enabled then itemstack:take_item() end return itemstack @@ -187,7 +189,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, -- else attempt to place node with proper param2 minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2) - if not minetest.setting_getbool("creative_mode") then + if not creative_enabled then itemstack:take_item() end return itemstack From 2f46103ff8fc6f0e9bf2cf6dc507ccc5f4fb6ea8 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 29 Mar 2017 04:59:19 +0100 Subject: [PATCH 079/118] Glasslike_framed nodes: Add 'glasslikeliquidlevel' paramtype2 --- mods/default/nodes.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c70f614b..db679830 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -2078,6 +2078,7 @@ minetest.register_node("default:glass", { drawtype = "glasslike_framed_optional", tiles = {"default_glass.png", "default_glass_detail.png"}, paramtype = "light", + paramtype2 = "glasslikeliquidlevel", sunlight_propagates = true, is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, @@ -2089,6 +2090,7 @@ minetest.register_node("default:obsidian_glass", { drawtype = "glasslike_framed_optional", tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, paramtype = "light", + paramtype2 = "glasslikeliquidlevel", is_ground_content = false, sunlight_propagates = true, sounds = default.node_sound_glass_defaults(), From 5fe831ed139d882b2838cbd75caa1f5a4d9674ad Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 30 Mar 2017 03:24:43 +0100 Subject: [PATCH 080/118] Carts: Remove '+' added in commit 077316b --- mods/carts/cart_entity.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 4d44c873..a19da648 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -93,7 +93,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, -- Pick up cart local inv = puncher:get_inventory() if not (creative and creative.is_enabled_for -+ and creative.is_enabled_for(puncher:get_player_name())) + and creative.is_enabled_for(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 From b377aaa50d2f8ae1926c2319f17380f8e754f499 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 2 Apr 2017 10:01:01 +0200 Subject: [PATCH 081/118] doors: Fix craftitem not listed in inventory (#1683) Fixes bug caused by b847888 --- mods/doors/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 8ca26dac..39584446 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -254,7 +254,7 @@ function doors.register(name, def) minetest.register_craftitem(":" .. name, { description = def.description, inventory_image = def.inventory_image, - groups = def.groups, + groups = table.copy(def.groups), on_place = function(itemstack, placer, pointed_thing) local pos From acfd58cdebf4b5b99dcf5c32d50b65cab208a781 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 28 Mar 2017 05:37:45 +0100 Subject: [PATCH 082/118] Carts: Make rail recipes more generous As part of making vertical travel easier to reduce reliance on sneak ladders. Calculate using cubic pixels of steel. A steelblock is 16^3 = 4096 cubic pixels steel. 6 ingots is 6/9 steelblocks. A rail is a 2*2*16 pixel length of steel, 64 cubic pixels steel. 6 ingots produces 2*21 rails = 21 rail nodes. Choose 18 for an even number that is a multiple of ingot number. Replace the stick with 2 wood in the recipe to be closer to the amount of wood that would be needed for 20*4 sleepers. Replace 2 mese crystal fragments with 1 mese crystal to compensate for the larger number of nodes returned. The result is the recipe is much more generous with steel usage but slightly less generous with mese usage, keeping power rail cost reasonably high. Replace 2 coal lumps with 1 for a similar recipe to power rails. --- mods/carts/rails.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mods/carts/rails.lua b/mods/carts/rails.lua index 5da4ac4d..066779d1 100644 --- a/mods/carts/rails.lua +++ b/mods/carts/rails.lua @@ -10,11 +10,11 @@ carts:register_rail("carts:rail", { }, {}) minetest.register_craft({ - output = "carts:rail 16", + output = "carts:rail 18", recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, {"default:steel_ingot", "", "default:steel_ingot"}, - {"default:steel_ingot", "group:stick", "default:steel_ingot"}, - {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, } }) @@ -31,11 +31,11 @@ carts:register_rail("carts:powerrail", { }, {acceleration = 5}) minetest.register_craft({ - output = "carts:powerrail 8", + output = "carts:powerrail 18", recipe = { - {"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"}, - {"default:steel_ingot", "group:stick", "default:steel_ingot"}, - {"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"}, + {"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"}, } }) @@ -50,10 +50,10 @@ carts:register_rail("carts:brakerail", { }, {acceleration = -3}) minetest.register_craft({ - output = "carts:brakerail 8", + 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:stick", "default:steel_ingot"}, - {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, } }) From 9e4f0d368969d2b80ac93cf64bc9fe4a5fad614f Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 30 Mar 2017 05:06:49 +0100 Subject: [PATCH 083/118] Leafdecay: Do not restart aready running timers --- mods/default/functions.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 8e9132d0..2268263e 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -330,8 +330,9 @@ 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) - if node.param2 == 0 then - minetest.get_node_timer(v):start(math.random(20, 120) / 10) + local timer = minetest.get_node_timer(v) + if node.param2 == 0 and not timer:is_started() then + timer:start(math.random(20, 120) / 10) end end end From fe021281e62504674f57a196e6dfba83bdd52847 Mon Sep 17 00:00:00 2001 From: LNJ Date: Sat, 8 Apr 2017 11:22:26 +0200 Subject: [PATCH 084/118] Textures: Replace aspen leaves texture with BlockMen's --- mods/default/README.txt | 2 +- mods/default/textures/default_aspen_leaves.png | Bin 761 -> 873 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index bec8821a..4e41479a 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -126,6 +126,7 @@ brunob.santos (CC BY-SA 4.0): default_desert_cobble.png BlockMen (CC BY-SA 3.0): + default_aspen_leaves.png default_wood.png default_clay_brick.png default_iron_ingot.png @@ -152,7 +153,6 @@ Wuzzy (CC BY-SA 3.0): sofar (CC BY-SA 3.0): default_book_written.png, based on default_book.png default_aspen_sapling - default_aspen_leaves 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) diff --git a/mods/default/textures/default_aspen_leaves.png b/mods/default/textures/default_aspen_leaves.png index 17a708d1783819a4acdd09e730a2c1a9698dd686..73064237c4cce5b5dc8fa13283ef23ddd09350eb 100644 GIT binary patch delta 851 zcmV-Z1FZb{1?dKmBYyx1a7bBm000XU000XU0RWnu7ytkO1ZP1_K>z@;j(q!3lK=n! zAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ;-$_J4RCwBi zlTC=@7|l-B)wCcnKYBXPHLrg1}TV}0o}|_To^hi+J8lVC=P-mAzc+q>qbxn zkur)FaiQ2v-Lw?Ckcx^Mk%2B0TA@~F+GH|Gnq-=}levGn$3sII6!xC6lD_wK1|GQ$1N3d;?L zwRN9y%OJZa!gA9k9??+8&KAXUa(wl{j|$-A`G5WL#oNpO06O#Hgv>sk!*6QJkpf{zalHKgb?9R@-GslZH zOI6V4>U?p|;dvebsJ(qyjavlqxpd~b0GwQTPNUf2%Gw|Yn15NE)S_P?Ni)7)zasz+ zKrS9z^&PS-Vt(ZX1^9itLA$-h!_eH)>U1$)ftTJqq5#9~#}_8F0Jz2sw;w`IqfXMZT=snu!ibYWxdx*&op8CNg- z`nN*@P+OYRzRii_ggxO1#t*r8`kKtVaaaqYY(DheKfN$)yz&=Wd7ks+_&Dc2xGHn+ zO=*3n#oq7{V%x%IDGK!Bgwb+9mg&Gq02^y}WV9UMI1by*HUO7Cz9C^?XmlRXY;}lw zeMX87<$oZc*^clEip;M}skKEepZQ^6;ngX<@ZpVr5&HaV2lU|n$B2^-d7jhjXQbBR zG+JGfq&^(Hx3$fS3ln-`VM2FnCl)5u_$AJN^rMu6J%|YVDi!uu4-810Sv;h1zmK(+ zlJAqL;yDhUF^oUDk3Z^lqJGMEpWl_arD<))4_k2DfX($=;s6A`N1iD^UA`}4qXy%; z^kR$e30w6#U!1)uB{QHarb~vQXrQ+Aj8a=Zs=HF|I&yaTh`#*RQ+jOvpz=TX6W_x~ U5082tu>b%707*qoM6N<$g5be= Date: Fri, 7 Apr 2017 22:03:11 -0600 Subject: [PATCH 085/118] Screwdriver: Allow non-native rotations if supported by targeted node This also allows custom actions (such as using the screwdriver as a wrench). --- mods/screwdriver/init.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 2a53ae37..e76f0545 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -98,12 +98,17 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) end -- can we rotate this paramtype2? local fn = screwdriver.rotate[ndef.paramtype2] - if not fn then + if not fn and not ndef.on_rotate then return itemstack end local should_rotate = true - local new_param2 = fn(pos, node, mode) + local new_param2 + if fn then + new_param2 = fn(pos, node, mode) + 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 @@ -122,7 +127,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) return itemstack end - if should_rotate then + if should_rotate and new_param2 ~= node.param2 then node.param2 = new_param2 minetest.swap_node(pos, node) minetest.check_for_falling(pos) From e6d0d775e3533b7b91b292e13c800b9737e057fd Mon Sep 17 00:00:00 2001 From: MarkuBu Date: Tue, 11 Apr 2017 08:51:13 +0200 Subject: [PATCH 086/118] Stairs: Improve stair and slab rotation on placement Slabs are placed horizontal instead of vertical, even if they are placed on a wall. Slabs are rotated automatically if they are placed to another slab, no matter which material. Slabs are placed at the lower position if the placer points into the lower half of the pointed node and to the upper position if pointed to the upper half. Stairs are placed normal if the placer points to the lower half of the pointed node and rotated upside down if pointed to the upper half. --- mods/stairs/init.lua | 68 +++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 1379c8c0..835b2193 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -17,6 +17,30 @@ minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") local replace = minetest.setting_getbool("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 + + local placer_pos = placer:getpos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + 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 + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end -- Register stairs. -- Node will be called stairs:stair_ @@ -52,30 +76,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, return itemstack end - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local param2 = 0 - - local placer_pos = placer:getpos() - if placer_pos then - local dir = { - x = p1.x - placer_pos.x, - y = p1.y - placer_pos.y, - z = p1.z - placer_pos.z - } - param2 = minetest.dir_to_facedir(dir) - end - - if p0.y - 1 == p1.y then - param2 = param2 + 20 - if param2 == 21 then - param2 = 23 - elseif param2 == 23 then - param2 = 21 - end - end - - return minetest.item_place(itemstack, placer, pointed_thing, param2) + return rotate_and_place(itemstack, placer, pointed_thing) end, }) @@ -126,8 +127,6 @@ end -- Slab facedir to placement 6d matching table local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} --- Slab facedir when placing initial slab against other surface -local slab_trans_dir_place = {[0] = 0, 20, 12, 16, 4, 8} -- Register slabs. -- Node will be called stairs:slab_ @@ -153,7 +152,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local creative_enabled = (creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name())) - if under and wield_item == under.name then + 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) @@ -161,7 +160,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local p2 = under.param2 -- combine two slabs if possible - if slab_trans_dir[math.floor(p2 / 4)] == dir then + if slab_trans_dir[math.floor(p2 / 4)] == dir + and wield_item == under.name then + if not recipeitem then return itemstack end @@ -194,16 +195,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, end return itemstack else - -- place slab using look direction of player - local dir = minetest.dir_to_wallmounted(vector.subtract( - pointed_thing.above, pointed_thing.under), true) - - local rot = slab_trans_dir_place[dir] - if rot == 0 or rot == 20 then - rot = rot + minetest.dir_to_facedir(placer:get_look_dir()) - end - - return minetest.item_place(itemstack, placer, pointed_thing, rot) + return rotate_and_place(itemstack, placer, pointed_thing) end end, }) From e2b3ab768a35012e8ad910d5f0f9640156c4a47e Mon Sep 17 00:00:00 2001 From: Ekdohibs Date: Tue, 11 Apr 2017 16:28:26 +0200 Subject: [PATCH 087/118] Fix .luacheckrc (missing Settings class) --- .luacheckrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.luacheckrc b/.luacheckrc index fe87fdce..3c7ec693 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -8,6 +8,7 @@ read_globals = { "vector", "VoxelManip", "VoxelArea", "PseudoRandom", "ItemStack", + "Settings", "unpack", -- Silence "accessing undefined field copy of global table". table = { fields = { "copy" } } From d68d2c08ef1bef29b2d38520a26576cb301afe08 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 11 Apr 2017 02:45:34 +0100 Subject: [PATCH 088/118] PB&J Pup: Remove mod Also delete nyancat API documentation from game_api.txt. --- game_api.txt | 12 -- mods/pbj_pup/depends.txt | 1 - mods/pbj_pup/init.lua | 136 ------------------ mods/pbj_pup/license.md | 26 ---- mods/pbj_pup/sounds/pbj_pup_barks.ogg | Bin 17192 -> 0 bytes mods/pbj_pup/sounds/pbj_pup_howl.ogg | Bin 15155 -> 0 bytes mods/pbj_pup/textures/pbj_pup_back.png | Bin 301 -> 0 bytes mods/pbj_pup/textures/pbj_pup_candies.png | Bin 326 -> 0 bytes .../textures/pbj_pup_candies_animated.png | Bin 1584 -> 0 bytes mods/pbj_pup/textures/pbj_pup_front.png | Bin 347 -> 0 bytes mods/pbj_pup/textures/pbj_pup_jelly.png | Bin 248 -> 0 bytes mods/pbj_pup/textures/pbj_pup_sides.png | Bin 250 -> 0 bytes settingtypes.txt | 10 -- 13 files changed, 185 deletions(-) delete mode 100644 mods/pbj_pup/depends.txt delete mode 100644 mods/pbj_pup/init.lua delete mode 100644 mods/pbj_pup/license.md delete mode 100644 mods/pbj_pup/sounds/pbj_pup_barks.ogg delete mode 100644 mods/pbj_pup/sounds/pbj_pup_howl.ogg delete mode 100644 mods/pbj_pup/textures/pbj_pup_back.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_candies.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_candies_animated.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_front.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_jelly.png delete mode 100644 mods/pbj_pup/textures/pbj_pup_sides.png diff --git a/game_api.txt b/game_api.txt index fa6225a0..d9b88f48 100644 --- a/game_api.txt +++ b/game_api.txt @@ -282,18 +282,6 @@ Give Initial Stuff API ^ str is a comma separated list of initial stuff ^ Adds items to the list of items to be given -Nyancat API ------------ - -`nyancat.place(pos, facedir, length)` - -^ Place a cat at `pos` facing `facedir` with tail length `length` - Only accepts facedir 0-3, if facedir > 3 then it will be interpreted as facedir = 0 - -`nyancat.generate(minp, maxp, seed)` - -^ Called by `minetest.register_on_generated`. To disable nyancat generation, - you can redefine nyancat.generate() to be an empty function TNT API ---------- diff --git a/mods/pbj_pup/depends.txt b/mods/pbj_pup/depends.txt deleted file mode 100644 index 4ad96d51..00000000 --- a/mods/pbj_pup/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/pbj_pup/init.lua b/mods/pbj_pup/init.lua deleted file mode 100644 index 76eb1ac4..00000000 --- a/mods/pbj_pup/init.lua +++ /dev/null @@ -1,136 +0,0 @@ - ---[[ - - Minetest's official Peanut Butter & Jelly Pup mod - -]]-- - -local enable = minetest.setting_getbool("pbj_pup_enable") -if enable == false then - return -end - -local function howl(ttl, player) - if not player then - return - end - ttl = ttl - 15 - if ttl < 0 then - return - end - - minetest.sound_play("pbj_pup_howl", {object = player, loop = false}) - minetest.do_item_eat(5, nil, ItemStack("pbj_pup:pbj_pup"), player, nil) - - minetest.after(15, howl, ttl, player) -end - --- --- nodes --- -minetest.register_node("pbj_pup:pbj_pup", { - description = "PB&J Pup", - tiles = { - "pbj_pup_sides.png", - "pbj_pup_jelly.png", - "pbj_pup_sides.png", - "pbj_pup_sides.png", - "pbj_pup_back.png", - "pbj_pup_front.png" - }, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - legacy_facedir_simple = true, - sounds = default.node_sound_defaults(), - stack_max = 1, - on_use = function(itemstack, user, pointed_thing) - howl(300, user) - itemstack:take_item() - return itemstack - end, -}) - -minetest.register_node("pbj_pup:pbj_pup_candies", { - description = "PB&J Pup Candies", - tiles = {{ - name = "pbj_pup_candies_animated.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1.6 - } - }}, - paramtype = "light", - light_source = default.LIGHT_MAX, - paramtype2 = "facedir", - groups = {cracky = 2}, - is_ground_content = false, - stack_max = 5, - sounds = default.node_sound_defaults(), - on_use = function(itemstack, user, pointed_thing) - minetest.do_item_eat(5, nil, itemstack, user, pointed_thing) - minetest.sound_play("pbj_pup_barks", {object = user, loop = false}) - itemstack:take_item() - return itemstack - end, -}) - --- --- mapgen --- -local gen = minetest.setting_getbool("pbj_pup_generate") -if gen == nil or gen then - local function place(pos, facedir, length) - if facedir > 3 then - facedir = 0 - end - local tailvec = minetest.facedir_to_dir(facedir) - local p = {x = pos.x, y = pos.y, z = pos.z} - minetest.set_node(p, {name = "pbj_pup:pbj_pup", param2 = facedir}) - for i = 1, length do - p.x = p.x + tailvec.x - p.z = p.z + tailvec.z - minetest.set_node(p, {name = "pbj_pup:pbj_pup_candies", param2 = facedir}) - end - end - - local function generate(minp, maxp, seed) - local height_min = -31000 - local height_max = -32 - if maxp.y < height_min or minp.y > height_max then - return - end - local y_min = math.max(minp.y, height_min) - local y_max = math.min(maxp.y, height_max) - local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) - local pr = PseudoRandom(seed + 9324342) - local max_num = math.floor(volume / (16 * 16 * 16)) - for i = 1, max_num do - if pr:next(0, 1000) == 0 then - local x0 = pr:next(minp.x, maxp.x) - local y0 = pr:next(minp.y, maxp.y) - local z0 = pr:next(minp.z, maxp.z) - local p0 = {x = x0, y = y0, z = z0} - place(p0, pr:next(0, 3), pr:next(3, 15)) - end - end - end - - minetest.register_on_generated(generate) -end --- --- compat --- - -if minetest.setting_getbool("pbj_pup_alias_nyancat") then - minetest.register_alias("default:nyancat", "pbj_pup:pbj_pup") - minetest.register_alias("default:nyancat_rainbow","pbj_pup:pbj_pup_candies") - minetest.register_alias("nyancat", "pbj_pup:pbj_pup") - minetest.register_alias("nyancat_rainbow", "pbj_pup:pbj_pup_candies") - minetest.register_alias("nyancat:nyancat", "pbj_pup:pbj_pup") - minetest.register_alias("nyancat:nyancat_rainbow", "pbj_pup:pbj_pup_candies") -end diff --git a/mods/pbj_pup/license.md b/mods/pbj_pup/license.md deleted file mode 100644 index b5fcf3a2..00000000 --- a/mods/pbj_pup/license.md +++ /dev/null @@ -1,26 +0,0 @@ - -## PB&J Pup - -PB&J Pup is a parody on the "Nyan Cat" TM toasted poptart meme. - - -## License and Copyright - -(C) 2017 Vanessa Ezekowitz, Auke Kok, celeron55 - - * All Code: LGPL-2.1+ - * All Images: CC-BY-4.0 - - -## Sounds - - * `pbj_pup_barks.ogg`: - Artist: Tomlija - License: CC-BY-3.0 - Url: http://freesound.org/people/Tomlija/sounds/97392/ - - * `pbj_pup_howl.ogg`: - Copyright 2013 Iwan Gabovitch (qubodup) - License: CC-BY-3.0 - Url: http://freesound.org/people/qubodup/sounds/193394/ - diff --git a/mods/pbj_pup/sounds/pbj_pup_barks.ogg b/mods/pbj_pup/sounds/pbj_pup_barks.ogg deleted file mode 100644 index bdd3440e04f455924ef935392eb0209d8a72477e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17192 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 diff --git a/mods/pbj_pup/sounds/pbj_pup_howl.ogg b/mods/pbj_pup/sounds/pbj_pup_howl.ogg deleted file mode 100644 index 15e93bc21e86ce168a0e868a9a88a793131890b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15155 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 H{+s>}v~8ou diff --git a/mods/pbj_pup/textures/pbj_pup_back.png b/mods/pbj_pup/textures/pbj_pup_back.png deleted file mode 100644 index f72fc24620627b2c2fe6f96dae66034b90984d2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+}7P)+J08@$vEX_4P$T4H*Cc0FFsSK~xyiU5`mp z!$1%O)3OaJ#%Tj;7`FcZH#r~lJqJBFSqv_rawD#hU!=%y5_^L>vvRtjhDrJEiobndgmm3lzOSI9@J+!bf_ zGvo$Gc`Q7_ErcpwsbW$^2+KlW;Lsg+B00000NkvXXu0mjf3QvLt diff --git a/mods/pbj_pup/textures/pbj_pup_candies.png b/mods/pbj_pup/textures/pbj_pup_candies.png deleted file mode 100644 index 185fa2d8e3da756f2c0246a69e6f1ae8d47de392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmV-M0lEH(P)Mg{MudIRLHJtF_?Rx3{;wlD)~<^vU$>%Jj+0%gfQY z9MRVR*4Eb70CCp<*Vjk@;I-i5;^OJP)$Z=@^YqE|$=~$J^z_%s`}_O+*P#8-k^hze z|HJ^k^MO(T005FnL_t&-8C}5(a)Lk*MbXz7P!p8TI73?bT%-G6V+P7fsys(^eM+bL zpZq)Z$uHgJ;x1C3W^TT@#!1X+29|*=#wa$&VIiC1Bv#9C6Ap&} zQn~vmMK*>of004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0003* zP)t-s08`fhe)<5{t^nxS0RR61|E>qu00;jg2mh`PT-g?4+AB`tD^u<(Vb?3y*(>F) zG5-KE*DEsR06j^GJ#?%+|NmCy*%=h=&%>36E{N(`uD{=oeasNsB|8D^Q za{&LA0RNU3|CVw8r@sHSkN?B~|HN_s(g6R{lmFLo|JkGe-M;_t0RQhJ|L<}C{Q&>} z0RR76|Nn9S|EvH1uK)l4@eJlP00001VoOIvYf@#Um;e9-UP(kjR9M5Mm+OC1MG%Hx zR}&**3q(B?6%+#A$SFY+I9{sY4MI<1y`)NOy#Q6%|NlEPyF0tHC%vR0zkcYMGrODj z*|`O_@qulxyMIda;tO4{VZB`xWH9FKH(oi_1?=R%f}PBHW6(t(y=p>Eyu|oDs-D_$ zXLcVy4hCa+-ka@I7+kn8$c`N=54$P+$>okwO9+VnFd_O&K$sBlkp@EV z2fs~}xUDI&=-B=LA7~tV+mEITUFCs>rrN|O7!n_6Xs_3|Rzfs*kJ{etw6Z0oX|<0$ zHUeP-SrQN?bgKJW0&@D7SMe6UNIdjiH|p&{pQn+ zQX9Vh*51{ZJ-V^6;__b%YKKElQ9zs_0^!i^a!Lu1;myxMS@o3w8Bgu|98-N+&$T2w zg=jJJH1VF6b_k*;= zt@ipCi80NG#btb0zVLBCyhoj-OpKsjehR%0Z8aSm8ZWF6iXJ+KoS`%?y-tKuXonsc z<^eXG_i9D?u2(1CqFiy!uge0+q|koXBeMhMRWq?S!9nM2UPkqk12K;|FO z51D^NKV<%q`$tmm@Bg`LkRE#u@B4|51HwG4N|`$H2tY>H5uV3>4k3>Q4pv(R9B14- zgg60&c?dH9$UKBN|9Gbo(%t)u-ToY)?cL3z4aaWkfFQ*W17RNNeUIx=@F1}~hfsXM zt9LkD|A$xaqQlKYPLUeHdM@uCO&qHYIV`v^)^r93YSWQUD_kEewQ`{6I*{ml%R=SWXP+&kET^Uisk~q~CM9 zUwv@34a#>Zl;**zDYz&~?Qs1cDmq-fR-5{Mh6bNSTESr+F@|6>LTXd7z%~fY1G=r$ zn}@Uaa4zaM=Ch}dZzIk-+yPgs9_{hT9gl;S_z22>;UaaGrrOZ&k@3mo^NJ;cUmJu_ z@(30kFpdyJn)H8M`#$Io{U6oEpr1S7&g@t8WZoh5K7z8J^VI|m9Jb++^Qbd%j*ph_ i;wSg0PxccqeVzeo(|LLwNtf3E0000ZDBrbX#k6EOBZi%Z*os1djO<>004l1 zfPnz3jA0&)jg5|4ppO8)k9S*^XdszUu%Dlwqj4jus;aw!DZISAy}iA{d)mar#K*_S z=;-M2@$vQb_5T0>|NsA>HdNvO005gwL_t&-8CAj2Qo=wGMA2(7%&I_3jBXHY)WBr_ z{|lwcC(fbQogPh@`C02v&J4RrD35IFYprhtLkbN9{~Wvv5hiR0b|8dJ*V!FmBSZwP z*{uO71VqE8mBK}6=E?SU>l;!iIoJl<2T~|MuutQ7vRPk+&M*cyF~YYHWd-c_z^WjG t3(pVB^7ukALKFOEE=%SYOrqDF{tuUO59RfDvEBdx002ovPDHLkV1lYljQ;=t diff --git a/mods/pbj_pup/textures/pbj_pup_jelly.png b/mods/pbj_pup/textures/pbj_pup_jelly.png deleted file mode 100644 index ec0c1ebf1b3ed11e4273fdc53780271da8d2c26e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmVC3^s*j{v@pcUzM&w3$(`o-D+pG0DEZzQTIh!h71%($dt_)Z*ge=;-L{>+9_7 z?D6sO_4V}>MwD>?004AJL_t&-(_N3t5&}U812OchuHrlY|E(UFT}yM|5Yj1#(2pWC zY#*U)`!E!;3liE>$OS9FO5LrH0XQX)b)JcY9#+WC2G|W)AxWsmM4F*IOIKiNrxU$j yAm0i-y(942E`|Cc_Vq&9HA{y#-RzC4*onk9S+2bTOi$qNI2-r-MtgkXW>lS-!r$!KHZA)YRhQ;^X7v=H}+;=;-U~ z>+J08_4W1MumnN?004GLL_t&-(^Zd&4#F@DLqm^cGqAzt|NmBUs8q9h<;kfWk#dtr zX(SgObUj*;LgE8eyaG9}%2f^S0j%i0?7%ZY)nS4G{40}#?1-}KHykzDaBx+fU6CVR z`SE7p#PHj7&0sx}F{6(li0I7;e80)& Date: Wed, 12 Apr 2017 09:25:21 +0100 Subject: [PATCH 089/118] Bushes: Add saplings Bush saplings grow in half the time of tree saplings. Bushes do not need 'from sapling' schematic variants because only the stem node is force-placed in the mapgen schematic, so only the sapling is force-replaced. Bush leaves drop saplings with a rarity that ensures at least 1 sapling per bush on average. --- game_api.txt | 10 +- mods/default/README.txt | 4 +- mods/default/crafting.lua | 12 +++ mods/default/nodes.lua | 86 ++++++++++++++++++ .../textures/default_acacia_bush_sapling.png | Bin 0 -> 151 bytes .../default/textures/default_bush_sapling.png | Bin 0 -> 165 bytes mods/default/trees.lua | 31 +++++++ 7 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 mods/default/textures/default_acacia_bush_sapling.png create mode 100644 mods/default/textures/default_bush_sapling.png diff --git a/game_api.txt b/game_api.txt index d9b88f48..8b6bf839 100644 --- a/game_api.txt +++ b/game_api.txt @@ -766,14 +766,20 @@ Trees * `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_new_snowy_pine_tree(pos)` - * Grows a new design snowy pine tree at pos + * `default.grow_bush(pos)` + * Grows a bush at pos + + * `default.grow_acacia_bush(pos)` + * Grows an acaia bush at pos Carts ----- diff --git a/mods/default/README.txt b/mods/default/README.txt index 4e41479a..fc6def98 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -17,6 +17,7 @@ Cisoun's texture pack (CC BY-SA 3.0): default_lava.png default_leaves.png default_sapling.png + default_bush_sapling.png default_stone.png default_tree.png default_tree_top.png @@ -90,6 +91,7 @@ paramat (CC BY-SA 3.0): default_acacia_leaves.png default_acacia_leaves_simple.png default_acacia_sapling.png + default_acacia_bush_sapling.png default_acacia_tree.png default_acacia_tree_top.png default_acacia_wood.png @@ -126,7 +128,7 @@ brunob.santos (CC BY-SA 4.0): default_desert_cobble.png BlockMen (CC BY-SA 3.0): - default_aspen_leaves.png + default_aspen_leaves.png -- Derived from Sofar's texture default_wood.png default_clay_brick.png default_iron_ingot.png diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 1eca8887..721f4132 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -966,6 +966,18 @@ minetest.register_craft({ burntime = 10, }) +minetest.register_craft({ + type = "fuel", + recipe = "default:bush_sapling", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:acacia_bush_sapling", + burntime = 7, +}) + minetest.register_craft({ type = "fuel", recipe = "default:aspen_sapling", diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index db679830..b7309e12 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -140,8 +140,10 @@ default:dry_grass_5 default:bush_stem default:bush_leaves +default:bush_sapling default:acacia_bush_stem default:acacia_bush_leaves +default:acacia_bush_sapling Corals ------ @@ -1307,11 +1309,53 @@ minetest.register_node("default:bush_leaves", { 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 = default.after_place_leaves, }) +minetest.register_node("default:bush_sapling", { + description = "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 = default.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(1200, 2400)) + 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:acacia_bush_stem", { description = "Acacia Bush Stem", drawtype = "plantlike", @@ -1336,11 +1380,53 @@ minetest.register_node("default:acacia_bush_leaves", { 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 = default.after_place_leaves, }) +minetest.register_node("default:acacia_bush_sapling", { + description = "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 = default.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(1200, 2400)) + 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, +}) + -- -- Corals diff --git a/mods/default/textures/default_acacia_bush_sapling.png b/mods/default/textures/default_acacia_bush_sapling.png new file mode 100644 index 0000000000000000000000000000000000000000..940b3aacb8df878a5d49d274791cff1c396066f5 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r8pbG3^J3&_hz@T$~{ zoUhk5?e`m?EMrNKUoeBivm0qZjD(XY_i3u<=T%O449&%cs6ley6r>mdK II;Vst06Lv3;{X5v literal 0 HcmV?d00001 diff --git a/mods/default/trees.lua b/mods/default/trees.lua index 0b829a75..81c9831e 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -77,6 +77,14 @@ function default.grow_sapling(pos) minetest.log("action", "An aspen sapling grows into a tree at ".. minetest.pos_to_string(pos)) default.grow_new_aspen_tree(pos) + elseif node.name == "default:bush_sapling" then + minetest.log("action", "A bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_bush(pos) + elseif node.name == "default:acacia_bush_sapling" then + minetest.log("action", "An acacia bush sapling grows into a bush at ".. + minetest.pos_to_string(pos)) + default.grow_acacia_bush(pos) end end @@ -426,6 +434,29 @@ function default.grow_new_aspen_tree(pos) 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 + + +-- 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 + + -- -- Sapling 'on place' function to check protection of node and resulting tree volume -- From 98216810ef7779473c596d25c32406d00ed92bff Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Wed, 12 Apr 2017 22:27:58 +0200 Subject: [PATCH 090/118] nodebox -> node_box Seems like this was a typo --- mods/doors/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 39584446..a1bfc092 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -91,7 +91,7 @@ minetest.register_node("doors:hidden", { on_blast = function() end, tiles = {"doors_blank.png"}, -- 1px transparent block inside door hinge near node top. - nodebox = { + node_box = { type = "fixed", fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, }, From 701abc2d2f8a45b850adc25e748dac0adec0b1dc Mon Sep 17 00:00:00 2001 From: octacian Date: Wed, 15 Mar 2017 22:20:44 -0700 Subject: [PATCH 091/118] Keys: Allow skeleton keys to be stacked Allow skeleton keys to be stacked by converting them to craftitems and adding a few lines of code to add a new itemstack to the inventory with the new key or drop it at the player position if the inventory is full. --- mods/default/tools.lua | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 1a08b918..f105a8fb 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -379,7 +379,7 @@ minetest.register_tool("default:sword_diamond", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_tool("default:skeleton_key", { +minetest.register_craftitem("default:skeleton_key", { description = "Skeleton Key", inventory_image = "default_key_skeleton.png", groups = {key = 1}, @@ -407,13 +407,25 @@ minetest.register_tool("default:skeleton_key", { local secret, _, _ = on_skeleton_key_use(pos, user, newsecret) if secret then - -- finish and return the new key + -- update original itemstack itemstack:take_item() - itemstack:add_item("default:key") - local meta = itemstack:get_meta() + + -- finish and return the new key + local new_stack = ItemStack("default:key") + local meta = new_stack:get_meta() + local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) meta:set_string("secret", secret) meta:set_string("description", "Key to "..user:get_player_name().."'s " ..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:getpos(), new_stack) + end + end + return itemstack end end From c54a7e882f161155641267e63dfb4365f94b4ac1 Mon Sep 17 00:00:00 2001 From: octacian Date: Wed, 15 Mar 2017 22:22:09 -0700 Subject: [PATCH 092/118] Keys: Move skeleton key to craftitems.lua Commit 73d61cbb103415c9a3970eaf2c48aeadabfff828 makes skeleton keys craftitems rather than tools, warranting the move from tools.lua to craftitems.lua. --- mods/default/craftitems.lua | 56 +++++++++++++++++++++++++++++++++++++ mods/default/tools.lua | 54 ----------------------------------- 2 files changed, 56 insertions(+), 54 deletions(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index aa8f56bd..a0db6554 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -186,6 +186,62 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv craft_inv:set_stack("craft", index, original) end) +minetest.register_craftitem("default:skeleton_key", { + description = "Skeleton Key", + inventory_image = "default_key_skeleton.png", + groups = {key = 1}, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local pos = pointed_thing.under + local node = minetest.get_node(pos) + + if not node then + return itemstack + end + + local on_skeleton_key_use = minetest.registered_nodes[node.name].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("default:key") + local meta = new_stack:get_meta() + meta:set_string("secret", secret) + meta:set_string("description", "Key to "..user:get_player_name().."'s " + ..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:getpos(), new_stack) + end -- else: added to inventory successfully + end + + return itemstack + end + end +}) + minetest.register_craftitem("default:coal_lump", { description = "Coal Lump", inventory_image = "default_coal_lump.png", diff --git a/mods/default/tools.lua b/mods/default/tools.lua index f105a8fb..45c779f1 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -379,60 +379,6 @@ minetest.register_tool("default:sword_diamond", { sound = {breaks = "default_tool_breaks"}, }) -minetest.register_craftitem("default:skeleton_key", { - description = "Skeleton Key", - inventory_image = "default_key_skeleton.png", - groups = {key = 1}, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - - local pos = pointed_thing.under - local node = minetest.get_node(pos) - - if not node then - return itemstack - end - - local on_skeleton_key_use = minetest.registered_nodes[node.name].on_skeleton_key_use - if on_skeleton_key_use then - -- 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 - -- update original itemstack - itemstack:take_item() - - -- finish and return the new key - local new_stack = ItemStack("default:key") - local meta = new_stack:get_meta() - local inv = minetest.get_inventory({type="player", name=user:get_player_name()}) - meta:set_string("secret", secret) - meta:set_string("description", "Key to "..user:get_player_name().."'s " - ..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:getpos(), new_stack) - end - end - - return itemstack - end - end - return nil - end -}) - minetest.register_tool("default:key", { description = "Key", inventory_image = "default_key.png", From 6335525757c68e8697c0db992d9774d3c7febd01 Mon Sep 17 00:00:00 2001 From: upsilon Date: Mon, 17 Apr 2017 12:56:27 +0200 Subject: [PATCH 093/118] Doors: Ignore permission check if player parameter is omitted As written in game_api.txt. --- mods/doors/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index a1bfc092..05aa3e2f 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -150,7 +150,7 @@ function _doors.door_toggle(pos, node, clicker) replace_old_owner_information(pos) - if not default.can_interact_with_node(clicker, pos) then + if clicker and not default.can_interact_with_node(clicker, pos) then return false end @@ -530,7 +530,7 @@ function _doors.trapdoor_toggle(pos, node, clicker) replace_old_owner_information(pos) - if not default.can_interact_with_node(clicker, pos) then + if clicker and not default.can_interact_with_node(clicker, pos) then return false end From 26686196383df71e5634ee4c5af479668d83ee7e Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 19 Apr 2017 02:48:00 +0100 Subject: [PATCH 094/118] Ores: Add tin ore, lump, ingot and block Use Calinou's textures from moreores mod. Craft bronze from tin and copper instead of steel and copper. Match ore density to the moreores mod but start ore at a depth of y = -32 to be part of the depth progression of other ores. --- mods/default/README.txt | 4 ++ mods/default/crafting.lua | 37 +++++++++++++++--- mods/default/craftitems.lua | 10 +++++ mods/default/mapgen.lua | 35 +++++++++++++++++ mods/default/nodes.lua | 22 +++++++++++ mods/default/textures/default_mineral_tin.png | Bin 0 -> 171 bytes mods/default/textures/default_tin_block.png | Bin 0 -> 274 bytes mods/default/textures/default_tin_ingot.png | Bin 0 -> 198 bytes mods/default/textures/default_tin_lump.png | Bin 0 -> 166 bytes 9 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 mods/default/textures/default_mineral_tin.png create mode 100644 mods/default/textures/default_tin_block.png create mode 100644 mods/default/textures/default_tin_ingot.png create mode 100644 mods/default/textures/default_tin_lump.png diff --git a/mods/default/README.txt b/mods/default/README.txt index fc6def98..3c104a00 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -53,6 +53,10 @@ Calinou (CC BY-SA 3.0): default_papyrus.png default_mineral_copper.png default_glass_detail.png + default_mineral_tin.png + default_tin_block.png + default_tin_ingot.png + default_tin_lump.png MirceaKitsune (CC BY-SA 3.0): character.x diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 721f4132..50ffb1ae 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -392,12 +392,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - type = "shapeless", - output = "default:bronze_ingot", - recipe = {"default:steel_ingot", "default:copper_ingot"}, -}) - minetest.register_craft({ output = 'default:coalblock', recipe = { @@ -446,6 +440,31 @@ minetest.register_craft({ } }) +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:tin_ingot 9", + recipe = { + {"default:tinblock"}, + } +}) + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + minetest.register_craft({ output = 'default:bronzeblock', recipe = { @@ -849,6 +868,12 @@ minetest.register_craft({ recipe = "default:copper_lump", }) +minetest.register_craft({ + type = "cooking", + output = "default:tin_ingot", + recipe = "default:tin_lump", +}) + minetest.register_craft({ type = "cooking", output = "default:gold_ingot", diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index a0db6554..0c42fc37 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -258,6 +258,11 @@ minetest.register_craftitem("default:copper_lump", { inventory_image = "default_copper_lump.png", }) +minetest.register_craftitem("default:tin_lump", { + description = "Tin Lump", + inventory_image = "default_tin_lump.png", +}) + minetest.register_craftitem("default:mese_crystal", { description = "Mese Crystal", inventory_image = "default_mese_crystal.png", @@ -288,6 +293,11 @@ minetest.register_craftitem("default:copper_ingot", { inventory_image = "default_copper_ingot.png", }) +minetest.register_craftitem("default:tin_ingot", { + description = "Tin Ingot", + inventory_image = "default_tin_ingot.png", +}) + minetest.register_craftitem("default:bronze_ingot", { description = "Bronze Ingot", inventory_image = "default_bronze_ingot.png", diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 9e359a33..fff889fa 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -357,6 +357,41 @@ function default.register_ores() y_max = -64, }) + -- Tin + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 9, + clust_size = 3, + y_min = 1025, + y_max = 31000, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 7, + clust_size = 3, + y_min = -31000, + y_max = -32, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_tin", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 9, + clust_size = 3, + y_min = -31000, + y_max = -128, + }) + -- Gold minetest.register_ore({ diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index b7309e12..facb28e0 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -107,6 +107,10 @@ default:steelblock default:stone_with_copper default:copperblock + +default:stone_with_tin +default:tinblock + default:bronzeblock default:stone_with_gold @@ -1046,6 +1050,24 @@ minetest.register_node("default:copperblock", { sounds = default.node_sound_metal_defaults(), }) + +minetest.register_node("default:stone_with_tin", { + description = "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 = "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 = "Bronze Block", tiles = {"default_bronze_block.png"}, diff --git a/mods/default/textures/default_mineral_tin.png b/mods/default/textures/default_mineral_tin.png new file mode 100644 index 0000000000000000000000000000000000000000..232d4b537c1d5e93736577096f23f8d558bb4387 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=6QZow{)0!nuoQjvhaK z{J^mThxT8;ar4BXlLwC<6JPN=8mNM?B*-tA!Qt7BG$6;?)5S4_<9f0KQxk{UVumSU z2~3?Zzopr04g>;umAu6 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_tin_block.png b/mods/default/textures/default_tin_block.png new file mode 100644 index 0000000000000000000000000000000000000000..72759b0456246db5be2a6938ac2a20a356ee006d GIT binary patch literal 274 zcmV+t0qy>YP)pB1c0GCNbK~xyiC5;IV#2^dso6wUy0yl>5$pl|UfpaXw8q0pr;FLZ#(jC;KVqf83l|Z4hSkS*}S$~_@5wT;$j4Y4% Y112E^EmuPPX#fBK07*qoM6N<$f_89pc>n+a literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_tin_ingot.png b/mods/default/textures/default_tin_ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..eed536105bf934d6274d31c28e6e98360f1cc5c1 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ1=8W+;Rg>MoHc#ws^v?z zY~HwU@1BbClEn+=B_zb}*uJH%rYa*NZQA7izV7y#*&j9lH87S0`2{mLJiCzwmW!Mb3}ghdQ3VL?or4s5v>!f3EIPAcidff>ad9_G?U9XhA)aV=q$Xz`uq s%XrCQ>mjvZJ*N_G=|g9PQx5PmT*&2Jw`WP+Dxi@Jp00i_>zopr0IQlvvH$=8 literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_tin_lump.png b/mods/default/textures/default_tin_lump.png new file mode 100644 index 0000000000000000000000000000000000000000..72bd339bf6247bebfc74f1a4385136509acd557d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=0%_F5I$Z%gU82=ggV2 zVZ(;QhYue(aNu;f!eXEtV@Z%-FoVOh8)-m}ji-xa2*>qg1wjL8X=e$yl`Gj27=ueo zT@9RlHA5pAP9%tM1qqcf7)7v5m1RBH<;ue9dVt4G(DBbRW`8nU4a^VeoYI Kb6Mw<&;$SvKr+h! literal 0 HcmV?d00001 From 24559d012e11fae3f6f32a5221b460f6999002b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Sat, 22 Apr 2017 14:34:51 +0200 Subject: [PATCH 095/118] Creative: Automatic item colorization for creative mode --- mods/creative/init.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/creative/init.lua b/mods/creative/init.lua index f9047189..bba9b34e 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -55,8 +55,7 @@ function minetest.handle_node_drops(pos, drops, digger) local inv = digger:get_inventory() if inv then for _, item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then + if not inv:contains_item("main", item, true) then inv:add_item("main", item) end end From 4d9fd7ad61fd9946e2ec7a09f1f107d4ef6ffedb Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 23 Apr 2017 03:48:12 +0100 Subject: [PATCH 096/118] Textures: Reduce contrast of snow ripples --- mods/default/textures/default_snow.png | Bin 4577 -> 522 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_snow.png b/mods/default/textures/default_snow.png index 4ac359381234d8d6cfe85244cf4413ea9b57e0de..fcbef0e5839e699d222479131c00cf058901d8fc 100644 GIT binary patch delta 497 zcmVr&BYyzfP)t-s%gfly&DhP(+0M_}&(GS=&)d(?+tAV6($e12)85n6 z-_+FL)YahB)#26F;@8*X*VyFO*yY&R<=ENg*xKgV+UDBY=i1xn+S};c+v(ff>D%1u z+}!Eh-Rj-l>D}Jz-rwuq-|XMt?BCz*-{9%r;O*bw?&0C;;D6!n;o z;o|S&;_%|*@#Ey};^gt<l_=&O~=k(|3@#yIC=jiq5 z==SL8_vz~N>+ALF?Dp*K_wDWX?e6#P?)mfd|NZ^{y`VmP0002$Nkl5U;YGV@Zi_y z&r&LvODBKGNDdct6mN) n>bMecJ1ze=A==Y-(uBz$E4C{e(UBy000000NkvXXu0mjfid#R7 literal 4577 zcmeHKX*65w8cyRn#vHu|rK(Pv7Bxh~SRqsmrLC!E)m9`y3=t8;(1A``QyuN8sv63n zR5_-iiq_C$u6d|vhy-aQL=ANmck4at+&}kEf7~B;t?u=F@7~|H-~H_Oeb%?${qEcL zwkIK?a-tv*2x4tzeik_I-5tULfISMAa0Gz_pGG;kQO;r_pd@mz4p{6YU#aG%L3~t357~L#hfOgqwTP33BW?dAe>ywiNg^TJHXVW=lCWRXU z2;T(lSjS{V%LLb>xwUspUu;%4b==%^yzF)`X1wPiNi#BLb4&X|MPqaCyPHz29~!wz zVf?hV)Tn*8E#rvGQFliM*b&u6wR(hu!Pe4`oVOJj*`Q?nWW zj7@1|q%GZk-rMPBvQ<{D?fV(Ln0R4qTs3?La--Z~U#pCzxAL}bxc&*m$O^Me zyHTO=&}5^z>dI$_z(syXRBTuZm_x@z4|(qJ(oUDPKuqkn4=3X+74Sm|8dhvknTz~Wu8p0}%2j$>;%UB_ zgjshVbcx6_dP#pm9lg@B`MtL~jWf_9*R4_{=E1!#4|}BI&UM3k z`_>(#7GBHoVZMFd;^H?G_a`wu9yTgI6rm=?Fn$!!%gtil&5h0l{niJ(%l3Fl+ z_D#ouytf+WXk;NAtg0N{A+0~_Q{v-L;tqC&{}?hWFQ0G`Tpj0VBR6QP;j$2JD>E_@GTK#=U)4CD%?L?FDSnxE&DC7HC9inW((y`{gv5DAe$a`c)yt`P;(EO* z@A+s%vEDulk8{pTWyzs6s-Kd4PzulA?se+-lyGsDJi;~XwUX20{pm5O;a@q}oPWzi z`U~5308v?vZ0Tn0X27DiosD_K5t zCF|uD^D*mm3I9#mH4nQ59eZ?$nVW^`&p{W_ga35-n(L53tf(M zQ)v&U9yvbu5}9#)P|5C6X0$86t~bqek-lu;uf5^9=u)rk-7Y84V5r&VYHxcVKF}f^ zZXxZX{?U+7@DW<9(EFHOF_5woX^Ffd@JPKIBLDMI7oc=|{nwgJAW^WpH5+}q9CG!z zxInbs8)0jC{yWqW$fV2y;tBM3JUej4Bf=}7E_Sd-!j8X;uz?_xo2~Qg>s+h+RwP$5 z8(t}?H^JhBG;c_CpLYz&27yHU3BdQk&E^aW8yuv8!3BHcHK;)(AP5l1$b?G5U<2?J zs5jo1Kt#h9>ziOu0uBvx)wR*IA(`R*2v$*KyknHD6E-RUYk-597>gQFQ2;>@o`Qi= zg93@6C@LEEl@|qE?=B-?(626(05r_a#vW=GOvXcXG;}mH;TBXvxE9P<6lz4q`Jm34 zTmD4>%+N4D3WbD1AR;0nG$OP$g2}!Jq=A6}LQ@N&r3D8(;GvO33Wf?Nh92If_&0|+ zJ`_s^lp_Qap}U+I@8B>B8U_RIL;oVjVgKePg^>flGUKoad>}puPo#t*kQzwDSAQH9 zWf@Ek!T`?`f-t^#1c~SiL+nP2_$yo>d&J-A@5b=IKfb@@n>79|*LS(TNr7*2{=U1u z%k@nPe3SF{-Sz(^m*{^QC_EA9nj(Pq2()wcIM7-#?aw$_w6^xOw)M5W?SK2nz#qF9 z{G)xay<@1ebELCtq^oItG9>HqIK~#q9fux%U(EG#Z;W`El|C=K~$U0(}=;`V^Z!#hae~I5o|i0{#LR z90r3k%~)hGmKZbq877y(1T3G)I1>3B0{oq4+Vk5 zBzMOiP)4RKuqZ^awy_YJ5)+aXgH%?4hJhunwYjO2>>#8&_CzyuFQ~7pf9On)f6;Gs z6(vgh`Y;OdfjT`ec6PF(eqQogenoyL-b`M85hHsXRfdl|>fjRlsZ2*OcDvm}x!Ik! zmS-xuve{9pD{Z+Hc*!KaMae(W!FM3$!G?1ZST4v1JS=ES{OMe+qK=_ikapqyA+-Qw z+20M1s7jPZ!G7B^ycX^-9ipR7I*>W3YpD67mfe7tKuz_Zw|l3wO5R<}AG&;~j(Sbj zZ}icoSN Date: Sun, 23 Apr 2017 04:09:46 +0100 Subject: [PATCH 097/118] Tin: Tune mapgen, bugfix, fix texture credits Previously i had matched ore density to moreores, but this density was too high and out of balance with MTGame, reduce density to be similar to copper ore. The 2 levels of underground ore were overlapping, fix. Textures are actually by kilbith, update credits. Also credit kilbith for bronze, copper, gold and steel blocks, credits had not been updated at the time. --- mods/default/README.txt | 18 ++++++++++-------- mods/default/license.txt | 1 + mods/default/mapgen.lua | 8 ++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/mods/default/README.txt b/mods/default/README.txt index 3c104a00..8d1357c8 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -53,10 +53,6 @@ Calinou (CC BY-SA 3.0): default_papyrus.png default_mineral_copper.png default_glass_detail.png - default_mineral_tin.png - default_tin_block.png - default_tin_ingot.png - default_tin_lump.png MirceaKitsune (CC BY-SA 3.0): character.x @@ -82,10 +78,6 @@ Splizard (CC BY-SA 3.0): Zeg9 (CC BY-SA 3.0): default_coal_block.png - default_steel_block.png - default_copper_block.png - default_bronze_block.png - default_gold_block.png paramat (CC BY-SA 3.0): wieldhand.png -- Copied from character.png by Jordach (CC BY-SA 3.0) @@ -216,6 +208,16 @@ kaeza (CC-BY-SA 3.0): 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 + 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/ diff --git a/mods/default/license.txt b/mods/default/license.txt index 09e4225f..72af7284 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -43,6 +43,7 @@ Copyright (C) 2010-2016: Mito551 GreenXenith kaeza + kilbith You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index fff889fa..1305226a 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -364,7 +364,7 @@ function default.register_ores() ore = "default:stone_with_tin", wherein = "default:stone", clust_scarcity = 10 * 10 * 10, - clust_num_ores = 9, + clust_num_ores = 5, clust_size = 3, y_min = 1025, y_max = 31000, @@ -375,9 +375,9 @@ function default.register_ores() ore = "default:stone_with_tin", wherein = "default:stone", clust_scarcity = 13 * 13 * 13, - clust_num_ores = 7, + clust_num_ores = 4, clust_size = 3, - y_min = -31000, + y_min = -127, y_max = -32, }) @@ -386,7 +386,7 @@ function default.register_ores() ore = "default:stone_with_tin", wherein = "default:stone", clust_scarcity = 10 * 10 * 10, - clust_num_ores = 9, + clust_num_ores = 5, clust_size = 3, y_min = -31000, y_max = -128, From 2917562728927eda925d3e9ba17bd3cf945dae2a Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 26 Apr 2017 00:15:15 +0100 Subject: [PATCH 098/118] Fix owner not being checked on write to book --- mods/default/craftitems.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 0c42fc37..75ac5507 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -12,6 +12,7 @@ minetest.register_craftitem("default:paper", { groups = {flammable = 3}, }) + local lpp = 14 -- Lines per book's page local function book_on_use(itemstack, user) local player_name = user:get_player_name() @@ -93,6 +94,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) data = stack:get_meta():to_table().fields end + if data and data.owner and data.owner ~= player:get_player_name() then + return + end + if not data then data = {} end data.title = fields.title data.owner = player:get_player_name() From ae7206c0064cbb5c0e5434c19893d4bf3fa2b388 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 26 Apr 2017 20:19:59 -0700 Subject: [PATCH 099/118] Remove dye craft recipe conflict. We have enough gray recipes, but brown is more difficult. Fixes #1710 --- mods/dye/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/dye/init.lua b/mods/dye/init.lua index 87f31d12..80284576 100644 --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -81,7 +81,6 @@ local dye_recipes = { {"yellow", "red", "orange"}, {"yellow", "blue", "green"}, -- RYB complementary mixes - {"red", "green", "dark_grey"}, {"yellow", "violet", "dark_grey"}, {"blue", "orange", "dark_grey"}, -- CMY mixes - approximation From 67b13a5942783a52134572414680dc40a479bb30 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 28 Apr 2017 20:56:51 -0700 Subject: [PATCH 100/118] Fix books getting erased on page button use. Changing the book page caused the entire itemstack meta to get wiped due to improper calling of meta:from_table(). Fixes #1711 --- mods/default/craftitems.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 75ac5507..33cdd5f6 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -139,7 +139,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - stack:get_meta():from_table(data) + stack:get_meta():from_table({fields = data}) stack = book_on_use(stack, player) end From 4ec0fd974bcda2f0ea59084cfd4421ab00c3d38f Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 28 Apr 2017 21:09:07 -0700 Subject: [PATCH 101/118] Doors: place sound when placing a door. Due to door items being the thing that's placed, we need to explicitly play a sound when placing a door. Fixes #1363 --- mods/doors/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 05aa3e2f..5189dec7 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -332,6 +332,8 @@ function doors.register(name, def) itemstack:take_item() end + minetest.sound_play(def.sounds.place, {pos = pos}) + on_place_node(pos, minetest.get_node(pos), placer, node, itemstack, pointed_thing) From 011ad78b42146725d93761473c7fd06698b2ca73 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 17 Jan 2016 15:32:50 -0800 Subject: [PATCH 102/118] Improve Chest appearance - opening chests. Adds a mesh model that appears when a chest is opened. The chest stays visibly open as long as the player keeps it open. When the player closes the formspec, the chest returns back to the closed shape. While opening and closing, a sound plays. A second person inspecting the chest will trigger a second sound open. However, only after the last player closes the chest, does the chest actually visually close and is the sound close played. This keeps mesh updates to a minimum. While it's possible that a server shutting down may cause chests to remain open, this does not affect the chests' working matter, and opening or closing them should fix them. Old chests are converted to the new style by LBM. I previously had them converted on open but this was unreliable, and LBMs don't have that problem. Open chests cannot be dug up. This prevents people from keeping a chest open and digging it out as well, since closing a chest would place a chest back (swap) at the spot. We could protect against this, but it still messes up the client and causes a lot of "missing node inventory" error messages otherwise. It's unlikely but possible that a player lagging out causes a chest to stay "open" and thus unremovable by digging, but there are other ways of dealing with that - a server restart fixes that issue. If the lid of the chest is obstructed, the sounds continue to play, but the lid isn't opened. Obstructed means that a node is present above the chest lid, however, we ignore several node types like signs, torches (not 3d) and wallmounted nodeboxes (typically signs) since they don't pose any major obstruction in almost any case, and are typically found above chests. Additionally, the selection box of the opened chest does not include the lid, and so one can still interact with e.g. a sign behind an open lid. Due to the fact that chests now have 7+ textures, we can no longer use materials (limit: 6) to texture the chest, and so there is now a single UV mapped image that applies both to open and closed chests. While this does mean texture pack makers need to create it, this is extremely simple and consists of a simple cut'n'paste over the template and should be really easy to do. Only one texture file is now then used for both open and closed chests. --- mods/default/README.txt | 13 + mods/default/models/chest_open.obj | 82 ++++ mods/default/models/cube.obj | 38 ++ mods/default/nodes.lua | 390 +++++++++++------- mods/default/sounds/default_chest_close.ogg | Bin 0 -> 10099 bytes mods/default/sounds/default_chest_open.ogg | Bin 0 -> 10578 bytes mods/default/textures/default_chest_front.png | Bin 423 -> 0 bytes mods/default/textures/default_chest_lock.png | Bin 469 -> 0 bytes mods/default/textures/default_chest_side.png | Bin 375 -> 0 bytes mods/default/textures/default_chest_top.png | Bin 422 -> 0 bytes mods/default/textures/default_chest_wood.png | Bin 0 -> 2320 bytes .../textures/default_chest_wood_locked.png | Bin 0 -> 2418 bytes 12 files changed, 372 insertions(+), 151 deletions(-) create mode 100644 mods/default/models/chest_open.obj create mode 100644 mods/default/models/cube.obj create mode 100644 mods/default/sounds/default_chest_close.ogg create mode 100644 mods/default/sounds/default_chest_open.ogg delete mode 100644 mods/default/textures/default_chest_front.png delete mode 100644 mods/default/textures/default_chest_lock.png delete mode 100644 mods/default/textures/default_chest_side.png delete mode 100644 mods/default/textures/default_chest_top.png create mode 100644 mods/default/textures/default_chest_wood.png create mode 100644 mods/default/textures/default_chest_wood_locked.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 8d1357c8..8e8541c9 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -154,6 +154,9 @@ sofar (CC BY-SA 3.0): 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_wood, default_chest_wood_locked derived from default_chest_* textures by BlockMen + +sofar (WTFPL): default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel Neuromancer (CC BY-SA 2.0): @@ -285,3 +288,13 @@ https://www.freesound.org/people/AGFX/packs/1253/ 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 + diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj new file mode 100644 index 00000000..a1dcce8d --- /dev/null +++ b/mods/default/models/chest_open.obj @@ -0,0 +1,82 @@ +# Blender v2.76 (sub 0) OBJ File: 'chest_open.blend' +# www.blender.org +mtllib chest_open.mtl +o Bottom_Cube.001 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.187500 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.187500 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.187500 -0.500000 +vt 0.750000 0.343750 +vt 0.500000 0.343750 +vt 0.500000 0.000000 +vt 0.750000 0.000000 +vt 0.250000 0.343750 +vt 0.250000 0.000000 +vt 0.000000 0.343750 +vt 0.000000 0.000000 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.500000 +vt 0.750000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +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 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/2/2 8/5/2 7/6/2 3/3/2 +f 8/5/3 6/7/3 5/8/3 7/6/3 +f 6/9/4 2/10/4 1/11/4 5/12/4 +f 1/13/5 3/14/5 7/15/5 5/16/5 +f 6/4/6 8/12/6 4/17/6 2/18/6 +o Top_Cube.002 +v -0.499900 0.187501 0.499900 +v -0.499900 0.408471 0.720970 +v -0.499900 0.894607 -0.207108 +v -0.499900 1.115578 0.013863 +v 0.499900 0.187501 0.499900 +v 0.499900 0.408471 0.720970 +v 0.499900 0.894607 -0.207108 +v 0.499900 1.115578 0.013863 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.343750 +vt 0.750000 0.343750 +vt 0.250000 0.500000 +vt 0.250000 0.343750 +vt 0.000000 0.500000 +vt 0.000000 0.343750 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.843750 +vt 0.750000 0.843750 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.707100 -0.707100 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.707100 0.707100 +vn 0.000000 -0.707100 -0.707100 +vn 0.000000 0.707100 0.707100 +usemtl None +s off +f 10/19/7 12/20/7 11/21/7 9/22/7 +f 12/20/8 16/23/8 15/24/8 11/21/8 +f 16/23/9 14/25/9 13/26/9 15/24/9 +f 14/27/10 10/28/10 9/29/10 13/30/10 +f 9/31/11 11/32/11 15/27/11 13/19/11 +f 14/33/12 16/23/12 12/20/12 10/28/12 diff --git a/mods/default/models/cube.obj b/mods/default/models/cube.obj new file mode 100644 index 00000000..7bbec5de --- /dev/null +++ b/mods/default/models/cube.obj @@ -0,0 +1,38 @@ +# Blender v2.76 (sub 0) OBJ File: 'chest_close.blend' +# www.blender.org +mtllib chest_close.mtl +o Cube_Cube.001 +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 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 -0.000000 +vt 0.750000 0.000000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.000000 0.500000 +vt -0.000000 0.000000 +vt 0.750000 1.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt -0.000000 1.000000 +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 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/2/2 8/5/2 7/6/2 3/3/2 +f 8/5/3 6/7/3 5/8/3 7/6/3 +f 6/9/4 2/10/4 1/2/4 5/1/4 +f 1/5/5 3/11/5 7/12/5 5/7/5 +f 6/11/6 8/5/6 4/2/6 2/10/6 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index facb28e0..c410b213 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1766,188 +1766,276 @@ minetest.register_node("default:lava_flowing", { -- Tools / "Advanced" crafting / Non-"natural" -- -local chest_formspec = - "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "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 function get_locked_chest_formspec(pos) +local function get_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots .. - "list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" .. + "list[nodemeta:" .. spos .. ";default:chest;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[nodemeta:" .. spos .. ";default:chest]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) - return formspec + return formspec end -minetest.register_node("default:chest", { - description = "Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, - paramtype2 = "facedir", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - legacy_facedir_simple = true, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), +local function 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.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 - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", chest_formspec) - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - on_metadata_inventory_move = function(pos, from_list, from_index, +local open_chests = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "default:chest" then + return + end + if not fields.quit then + return + end + local pn = player:get_player_name() + + local pos = open_chests[pn].pos + local sound = open_chests[pn].sound + local swap = open_chests[pn].swap + local node = minetest.get_node(pos) + + open_chests[pn] = nil + for k, v in pairs(open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + param2 = node.param2 }) + minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) + return true +end) + +function default.register_chest(name, d) + 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", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("default:chest", 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", "Locked Chest (owned by " .. + 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("default:chest") 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 + + minetest.sound_play(def.sound_open, {gain = 0.3, + pos = pos, max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, + { name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { 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 key_meta:get_string("secret") == "" then + key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).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", + 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, "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, "a locked chest", owner + end + else + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("default:chest", 8*4) + end + def.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("default:chest") + end + def.on_rightclick = function(pos, node, clicker) + minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, + max_hear_distance = 10}) + if not chest_lid_obstructed(pos) then + minetest.swap_node(pos, { + name = "default:" .. name .. "_open", + param2 = node.param2 }) + end + minetest.after(0.2, minetest.show_formspec, + clicker:get_player_name(), + "default:chest", get_chest_formspec(pos)) + open_chests[clicker:get_player_name()] = { pos = pos, + sound = def.sound_close, swap = name } + end + end + + def.on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name() .. " moves stuff in chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " moves " .. stack:get_name() .. " to chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name() .. " takes " .. stack:get_name() .. " from chest at " .. minetest.pos_to_string(pos)) - end, - on_blast = function(pos) + end + def.on_blast = function(pos) local drops = {} default.get_inventory_drops(pos, "main", drops) drops[#drops+1] = "default:chest" minetest.remove_node(pos) return drops - end, -}) + end -minetest.register_node("default:chest_locked", { - description = "Locked Chest", - tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, - paramtype2 = "facedir", - groups = {choppy = 2, oddly_breakable_by_hand = 2}, - legacy_facedir_simple = true, - is_ground_content = false, + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_opened.mesh = "chest_open.obj" + def_opened.drop = "default:" .. 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_closed.mesh = "cube.obj" + + minetest.register_node("default:" .. name, def_closed) + minetest.register_node("default:" .. name .. "_open", def_opened) + + -- convert old chests to this new variant + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name, + nodenames = {"default:" .. name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("main") + inv:set_list("main", nil) + inv:set_size("default:chest", 8*4) + inv:set_list("default:chest", list) + end + }) +end + + +default.register_chest("chest", { + description = "Chest", + tiles = { "default_chest_wood.png" }, sounds = default.node_sound_wood_defaults(), - - 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", "Locked Chest (owned by " .. - meta:get_string("owner") .. ")") - end, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("owner", "") - local inv = meta:get_inventory() - inv:set_size("main", 8 * 4) - end, - 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, - 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, - 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, - 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, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " moves " .. stack:get_name() .. - " to locked chest at " .. minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes " .. stack:get_name() .. - " from locked chest at " .. minetest.pos_to_string(pos)) - end, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if default.can_interact_with_node(clicker, pos) then - minetest.show_formspec( - clicker:get_player_name(), - "default:chest_locked", - get_locked_chest_formspec(pos) - ) - end - return itemstack - end, - on_blast = function() end, - 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 key_meta:get_string("secret") == "" then - key_meta:set_string("secret", minetest.parse_json(itemstack:get_metadata()).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", - get_locked_chest_formspec(pos) - ) - end, - on_skeleton_key_use = function(pos, player, newsecret) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - local name = player:get_player_name() - - -- verify placer is owner of lockable chest - if owner ~= name then - minetest.record_protection_violation(pos, name) - minetest.chat_send_player(name, "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, "a locked chest", owner - end, + sound_open = "default_chest_open", + sound_close = "default_chest_close", + groups = {choppy = 2, oddly_breakable_by_hand = 2}, }) +default.register_chest("chest_locked", { + description = "Locked Chest", + tiles = { "default_chest_wood_locked.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, +}) local bookshelf_formspec = "size[8,7;]" .. diff --git a/mods/default/sounds/default_chest_close.ogg b/mods/default/sounds/default_chest_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..53ff23d219cec9d3a10778cd797ff6cbde79bd13 GIT binary patch literal 10099 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 oI%2I^rHkG7UHiYQ^0NTEfZvX%Q literal 0 HcmV?d00001 diff --git a/mods/default/sounds/default_chest_open.ogg b/mods/default/sounds/default_chest_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c73c072c05d0b42e5e9ed50e3d7398dcc476fa16 GIT binary patch literal 10578 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 iVWAi&K4LJ(h4fd|)}Lf=h&H zLXT)Oby_pmu656)Y`~XZu7*#Kb4!G4MT>1goOVBpWiV}2FKSRK-QC@|u%qC!dc~Y& zzLs61d_{+CM1p2Nz__cUqocE{p6j=Mc6N54fmoDxPm^{|mw8KwZcBJ!K5tn$lWaGU zYBh#mEPz=jWJ@J{RU=tkP^|y}0JKR&K~xyiWzI#i!!Qs<(JxtGvCM3T^TSO0-&i_h z-{GmQuJfE_l-{oE`T}5=5$C4V3&q&H0!WvEqLgLXY__8{K&+!MG8kioLN@@6 zN>kDk@*aBGOD_RVl&R|knQ6>5Cjg{HdNti|CKb)I1AvErQM3I&FVvh>0Bdbfh?>Um zAmA$iTLe&1C`R-A2rxJ}fDLU}me>LiC%WV=gmA9K@ef4uc|E)2k#quJ)ECCe4HTG& R7=Qo(002ovPDHLkV1m!~wG03N diff --git a/mods/default/textures/default_chest_lock.png b/mods/default/textures/default_chest_lock.png deleted file mode 100644 index 73f46c7864e7878d4724cc166d9035291eee845f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmV;`0V@89P)3qathbYJkPalU4KY$ zo(v(wjJkwUVo50a8i}pw7PnfbP?unvz=vBQjzdT%^Y5WrZN2=?)vE9Nn^kk4O+BxW z&T6L^bts{$4D~S)P}eN%+kNse%wn2hF{)00000 LNkvXXu0mjfS`O4= diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png deleted file mode 100644 index 44a65a43d3c3f2ba44bceb519a0696e1ba441800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmV--0f_#IP)n`5knO{RcJoOVB!a5-&MFKSRK;In$zuXoa@aHD)h zf@VK%ST=rFCF{3-pn+J3ZcC(oM}}W4WJ@JsV)uan0065=L_t&-(`C+A5`!=dMbXH@ z-MB%3P}BSV*B6mr?&lfJ= zdsUum4#6X1C?EZJP^f8bSOa-|wF`=iC+qn|{rj V3gJ4$MZo|7002ovPDHLkV1iD9pBn%G diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png deleted file mode 100644 index f1a5cb594f4ee6ef23813aeb68ddd38a472c4801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 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 Date: Sun, 13 Nov 2016 16:08:07 +0100 Subject: [PATCH 103/118] TNT: Gunpowder (and tnt.burn) will trigger the on_ignite of nodes The previous behaviour is kept as fallback for compatibility, for when the on_ignite is not defined in the node. --- game_api.txt | 6 ++++-- mods/tnt/init.lua | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/game_api.txt b/game_api.txt index 8b6bf839..887f394e 100644 --- a/game_api.txt +++ b/game_api.txt @@ -312,8 +312,10 @@ TNT API `tnt.burn(position, [nodename])` -^ Ignite TNT at position, nodename isn't required unless already known. - +^ 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': diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 9870f891..e5ad5b16 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -260,13 +260,15 @@ end function tnt.burn(pos, nodename) local name = nodename or minetest.get_node(pos).name - local group = minetest.get_item_group(name, "tnt") - if group > 0 then + 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.sound_play("tnt_ignite", {pos = pos}) minetest.set_node(pos, {name = name .. "_burning"}) minetest.get_node_timer(pos):start(1) - elseif name == "tnt:gunpowder" then - minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) end end From 519d166ce34d5516b0b20dd86ca0bf5ce5bf658c Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 27 Mar 2017 21:55:53 +0100 Subject: [PATCH 104/118] Stairs: Add snowblock and ice stairs and slabs --- mods/stairs/init.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 835b2193..a88ea014 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -587,3 +587,27 @@ stairs.register_stair_and_slab( "Gold Block Slab", default.node_sound_metal_defaults() ) + +stairs.register_stair_and_slab( + "ice", + "default:ice", + {cracky = 3, puts_out_fire = 1, cools_lava = 1}, + {"default_ice.png"}, + "Ice Stair", + "Ice Slab", + default.node_sound_glass_defaults() +) + +stairs.register_stair_and_slab( + "snowblock", + "default:snowblock", + {crumbly = 3, puts_out_fire = 1, cools_lava = 1, snowy = 1}, + {"default_snow.png"}, + "Snow Block Stair", + "Snow Block Slab", + default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.15}, + dug = {name = "default_snow_footstep", gain = 0.2}, + dig = {name = "default_snow_footstep", gain = 0.2} + }), +) From 6737952fbf290e995810cfcb0559c7514738d473 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 1 May 2017 21:23:44 +0200 Subject: [PATCH 105/118] Fix merging mistake (crash in "stairs") --- mods/stairs/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index a88ea014..0ce35218 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -609,5 +609,5 @@ stairs.register_stair_and_slab( footstep = {name = "default_snow_footstep", gain = 0.15}, dug = {name = "default_snow_footstep", gain = 0.2}, dig = {name = "default_snow_footstep", gain = 0.2} - }), + }) ) From 08706313f47075599106d04ad864866c0e50dd39 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Sun, 7 May 2017 17:25:53 +0100 Subject: [PATCH 106/118] Add option to disable lavacooling (#1726) --- minetest.conf.example | 3 +++ mods/default/functions.lua | 25 +++++++++++++------------ settingtypes.txt | 3 +++ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/minetest.conf.example b/minetest.conf.example index 3f20eb77..9393b1a5 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -27,6 +27,9 @@ # 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 diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 2268263e..936712ca 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -131,18 +131,19 @@ default.cool_lava = function(pos, node) {pos = pos, max_hear_distance = 16, gain = 0.25}) end -minetest.register_abm({ - label = "Lava cooling", - nodenames = {"default:lava_source", "default:lava_flowing"}, - neighbors = {"group:cools_lava", "group:water"}, - interval = 1, - chance = 2, - catch_up = false, - action = function(...) - default.cool_lava(...) - end, -}) - +if minetest.setting_getbool("enable_lavacooling") ~= false then + minetest.register_abm({ + label = "Lava cooling", + nodenames = {"default:lava_source", "default:lava_flowing"}, + neighbors = {"group:cools_lava", "group:water"}, + interval = 1, + 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 diff --git a/settingtypes.txt b/settingtypes.txt index eeea0bfc..855235c2 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -16,6 +16,9 @@ enable_fire (Fire) bool true # Enable flame sound. flame_sound (Flame sound) bool true +# Enable lavacooling. +enable_lavacooling (Lavacooling) bool true + # If enabled, steel tools, torches and cobblestone will be given to new # players. give_initial_stuff (Give initial items) bool false From a533434b58d836b90fd2435b64b0394e768f0304 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 7 May 2017 08:33:26 +0200 Subject: [PATCH 107/118] Chests: Keep old textures for mod compability Prevents generating ugly looking dummy images for mods that weren't updated yet. --- mods/default/README.txt | 8 ++++---- mods/default/textures/default_chest_front.png | Bin 0 -> 423 bytes mods/default/textures/default_chest_lock.png | Bin 0 -> 469 bytes mods/default/textures/default_chest_side.png | Bin 0 -> 375 bytes mods/default/textures/default_chest_top.png | Bin 0 -> 422 bytes 5 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 mods/default/textures/default_chest_front.png create mode 100644 mods/default/textures/default_chest_lock.png create mode 100644 mods/default/textures/default_chest_side.png create mode 100644 mods/default/textures/default_chest_top.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 8e8541c9..350c4b74 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -136,10 +136,10 @@ BlockMen (CC BY-SA 3.0): 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_chest_front.png -- Texture kept for mod compability + default_chest_lock.png -- Texture kept for mod compability + default_chest_side.png -- Texture kept for mod compability + default_chest_top.png -- Texture kept for mod compability default_mineral_mese.png default_meselamp.png bubble.png diff --git a/mods/default/textures/default_chest_front.png b/mods/default/textures/default_chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..85227d8fd636ace9592070a2f7e86df531dc03a8 GIT binary patch literal 423 zcmV;Y0a*TtP)i&K4LJ(h4fd|)}Lf=h&H zLXT)Oby_pmu656)Y`~XZu7*#Kb4!G4MT>1goOVBpWiV}2FKSRK-QC@|u%qC!dc~Y& zzLs61d_{+CM1p2Nz__cUqocE{p6j=Mc6N54fmoDxPm^{|mw8KwZcBJ!K5tn$lWaGU zYBh#mEPz=jWJ@J{RU=tkP^|y}0JKR&K~xyiWzI#i!!Qs<(JxtGvCM3T^TSO0-&i_h z-{GmQuJfE_l-{oE`T}5=5$C4V3&q&H0!WvEqLgLXY__8{K&+!MG8kioLN@@6 zN>kDk@*aBGOD_RVl&R|knQ6>5Cjg{HdNti|CKb)I1AvErQM3I&FVvh>0Bdbfh?>Um zAmA$iTLe&1C`R-A2rxJ}fDLU}me>LiC%WV=gmA9K@ef4uc|E)2k#quJ)ECCe4HTG& R7=Qo(002ovPDHLkV1m!~wG03N literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_lock.png b/mods/default/textures/default_chest_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..73f46c7864e7878d4724cc166d9035291eee845f GIT binary patch literal 469 zcmV;`0V@89P)3qathbYJkPalU4KY$ zo(v(wjJkwUVo50a8i}pw7PnfbP?unvz=vBQjzdT%^Y5WrZN2=?)vE9Nn^kk4O+BxW z&T6L^bts{$4D~S)P}eN%+kNse%wn2hF{)00000 LNkvXXu0mjfS`O4= literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..44a65a43d3c3f2ba44bceb519a0696e1ba441800 GIT binary patch literal 375 zcmV--0f_#IP)n`5knO{RcJoOVB!a5-&MFKSRK;In$zuXoa@aHD)h zf@VK%ST=rFCF{3-pn+J3ZcC(oM}}W4WJ@JsV)uan0065=L_t&-(`C+A5`!=dMbXH@ z-MB%3P}BSV*B6mr?&lfJ= zdsUum4#6X1C?EZJP^f8bSOa-|wF`=iC+qn|{rj V3gJ4$MZo|7002ovPDHLkV1iD9pBn%G literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a5cb594f4ee6ef23813aeb68ddd38a472c4801 GIT binary patch literal 422 zcmV;X0a^ZuP)nsh*fXFYILEX|{8#G7NJgI1=1NtAU-k#a-k;In$zuXoa@aJiCM zwU1VxfK#S~QIT*zdtp40Y&wEtIDB0)iDE8wS1oK%C}&9`>$iThkYbm5Q>TGSifA}x zPAvL-GKl~H0KZ8@K~xyiWzRpvO*Xn4gj!}X-yqMA^g3&c<+Tw>6G+$>&I~@9(`XF=Y0PBA6xtl!a Date: Sat, 6 May 2017 21:15:34 -0700 Subject: [PATCH 108/118] Fix nil deref issue with people hitting chests too often. --- mods/default/nodes.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index c410b213..a1da9216 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1801,11 +1801,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "default:chest" then return end - if not fields.quit then + if not player or not fields.quit then return end local pn = player:get_player_name() + if not open_chests[pn] then + return + end + local pos = open_chests[pn].pos local sound = open_chests[pn].sound local swap = open_chests[pn].swap From c7d558c09ec5d5cd3b52849ad1c209c87124b6e8 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 6 May 2017 22:01:31 -0700 Subject: [PATCH 109/118] Chest open model: UV map fix. The back side had a UV mapping issue which caused the bottom rear part to "shrink" when opened. --- mods/default/models/chest_open.obj | 128 +++++++++++++++-------------- 1 file changed, 67 insertions(+), 61 deletions(-) diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj index a1dcce8d..1bfed076 100644 --- a/mods/default/models/chest_open.obj +++ b/mods/default/models/chest_open.obj @@ -1,4 +1,4 @@ -# Blender v2.76 (sub 0) OBJ File: 'chest_open.blend' +# Blender v2.78 (sub 0) OBJ File: 'chest_open.blend' # www.blender.org mtllib chest_open.mtl o Bottom_Cube.001 @@ -10,30 +10,33 @@ v 0.500000 -0.500000 0.500000 v 0.500000 0.187500 0.500000 v 0.500000 -0.500000 -0.500000 v 0.500000 0.187500 -0.500000 -vt 0.750000 0.343750 -vt 0.500000 0.343750 -vt 0.500000 0.000000 -vt 0.750000 0.000000 -vt 0.250000 0.343750 -vt 0.250000 0.000000 -vt 0.000000 0.343750 -vt 0.000000 0.000000 -vt 0.750000 0.875000 -vt 0.500000 0.875000 -vt 0.500000 0.500000 -vt 0.750000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.000000 -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 +vt 0.7500 0.3438 +vt 0.5000 0.3438 +vt 0.5000 0.0000 +vt 0.7500 0.0000 +vt 0.2500 0.3438 +vt 0.2500 0.0000 +vt 0.0000 0.3438 +vt 0.0000 0.0000 +vt 0.7500 0.8438 +vt 0.5000 0.8438 +vt 0.5000 0.5000 +vt 0.7500 0.5000 +vt 0.2500 0.5000 +vt 0.2500 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.7500 -0.0000 +vt 0.7500 0.5000 +vt 1.0000 0.5000 +vt 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Bottom_Cube.001_None usemtl None s off f 2/1/1 4/2/1 3/3/1 1/4/1 @@ -41,42 +44,45 @@ f 4/2/2 8/5/2 7/6/2 3/3/2 f 8/5/3 6/7/3 5/8/3 7/6/3 f 6/9/4 2/10/4 1/11/4 5/12/4 f 1/13/5 3/14/5 7/15/5 5/16/5 -f 6/4/6 8/12/6 4/17/6 2/18/6 +f 6/17/6 8/18/6 4/19/6 2/20/6 o Top_Cube.002 -v -0.499900 0.187501 0.499900 -v -0.499900 0.408471 0.720970 -v -0.499900 0.894607 -0.207108 -v -0.499900 1.115578 0.013863 -v 0.499900 0.187501 0.499900 -v 0.499900 0.408471 0.720970 -v 0.499900 0.894607 -0.207108 -v 0.499900 1.115578 0.013863 -vt 0.750000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 0.343750 -vt 0.750000 0.343750 -vt 0.250000 0.500000 -vt 0.250000 0.343750 -vt 0.000000 0.500000 -vt 0.000000 0.343750 -vt 0.750000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 0.843750 -vt 0.750000 0.843750 -vt 1.000000 0.500000 -vt 1.000000 1.000000 -vt 0.250000 1.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.707100 -0.707100 -vn 1.000000 0.000000 0.000000 -vn 0.000000 -0.707100 0.707100 -vn 0.000000 -0.707100 -0.707100 -vn 0.000000 0.707100 0.707100 +v -0.500000 0.187501 0.499999 +v -0.500000 0.408471 0.720970 +v -0.500000 0.894607 -0.207108 +v -0.500000 1.115578 0.013863 +v 0.500000 0.187501 0.499999 +v 0.500000 0.408471 0.720970 +v 0.500000 0.894607 -0.207108 +v 0.500000 1.115578 0.013863 +vt 0.7500 0.5000 +vt 0.5000 0.5000 +vt 0.5000 0.3438 +vt 0.7500 0.3438 +vt 0.2500 0.5000 +vt 0.2500 0.3438 +vt 0.0000 0.5000 +vt 0.0000 0.3438 +vt 0.7500 1.0000 +vt 0.5000 1.0000 +vt 0.5000 0.8438 +vt 0.7500 0.8438 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.7500 1.0000 +vt 0.7500 0.5000 +vt 0.2500 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +g Top_Cube.002_None usemtl None s off -f 10/19/7 12/20/7 11/21/7 9/22/7 -f 12/20/8 16/23/8 15/24/8 11/21/8 -f 16/23/9 14/25/9 13/26/9 15/24/9 -f 14/27/10 10/28/10 9/29/10 13/30/10 -f 9/31/11 11/32/11 15/27/11 13/19/11 -f 14/33/12 16/23/12 12/20/12 10/28/12 +f 10/21/7 12/22/7 11/23/7 9/24/7 +f 12/22/8 16/25/8 15/26/8 11/23/8 +f 16/25/9 14/27/9 13/28/9 15/26/9 +f 14/29/10 10/30/10 9/31/10 13/32/10 +f 9/33/11 11/34/11 15/35/11 13/36/11 +f 14/37/12 16/25/12 12/22/12 10/30/12 From 5bd44c21efb71fa6f0850ff2fe1e76af7ce42b3a Mon Sep 17 00:00:00 2001 From: cx384 Date: Sat, 13 May 2017 12:49:04 +0200 Subject: [PATCH 110/118] Change the selection_box of bush stems (#1733) This is needed because you can't place a node above a bush stem when you are pointing at the bush stem. --- mods/default/nodes.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index a1da9216..76e88afd 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1320,7 +1320,7 @@ minetest.register_node("default:bush_stem", { sounds = default.node_sound_wood_defaults(), selection_box = { type = "fixed", - fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16}, + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, }, }) @@ -1391,7 +1391,7 @@ minetest.register_node("default:acacia_bush_stem", { sounds = default.node_sound_wood_defaults(), selection_box = { type = "fixed", - fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16}, + fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, }, }) From 63b3542d00805bf976fc809f2e8f092ea1f5c942 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Mon, 8 May 2017 12:47:53 +0100 Subject: [PATCH 111/118] Chests: Revert inventory name Revert the new 'default:game' inventory back to the old 'main' and use the lbm to restore the contents of the chest. Change the name of the conversion LBM to ensure it is run again on already converted chests. --- mods/default/nodes.lua | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 76e88afd..7fa8d2ca 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1773,10 +1773,10 @@ local function get_chest_formspec(pos) default.gui_bg .. default.gui_bg_img .. default.gui_slots .. - "list[nodemeta:" .. spos .. ";default:chest;0,0.3;8,4;]" .. + "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 .. ";default:chest]" .. + "listring[nodemeta:" .. spos .. ";main]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) return formspec @@ -1842,7 +1842,7 @@ function default.register_chest(name, d) meta:set_string("infotext", "Locked Chest") meta:set_string("owner", "") local inv = meta:get_inventory() - inv:set_size("default:chest", 8*4) + inv:set_size("main", 8*4) end def.after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) @@ -1853,7 +1853,7 @@ function default.register_chest(name, d) def.can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() - return inv:is_empty("default:chest") and + 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, @@ -1939,12 +1939,12 @@ function default.register_chest(name, d) local meta = minetest.get_meta(pos) meta:set_string("infotext", "Chest") local inv = meta:get_inventory() - inv:set_size("default:chest", 8*4) + 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("default:chest") + return inv:is_empty("main") end def.on_rightclick = function(pos, node, clicker) minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, @@ -2007,16 +2007,18 @@ function default.register_chest(name, d) -- convert old chests to this new variant minetest.register_lbm({ label = "update chests to opening chests", - name = "default:upgrade_" .. name, + name = "default:upgrade_" .. name .. "_v2", nodenames = {"default:" .. name}, action = function(pos, node) local meta = minetest.get_meta(pos) meta:set_string("formspec", nil) local inv = meta:get_inventory() - local list = inv:get_list("main") - inv:set_list("main", nil) - inv:set_size("default:chest", 8*4) - inv:set_list("default:chest", list) + 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 From 758d5010b8a6555fc7faedfb06b3d7c0cf3d0c4a Mon Sep 17 00:00:00 2001 From: ezhh Date: Mon, 10 Apr 2017 02:23:00 +0100 Subject: [PATCH 112/118] Fire: Disable fire by default in multiplayer --- mods/fire/init.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/fire/init.lua b/mods/fire/init.lua index a9ceb9ea..2dbf5dfd 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -292,9 +292,14 @@ minetest.register_abm({ local fire_enabled = minetest.setting_getbool("enable_fire") if fire_enabled == nil then - -- New setting not specified, check for old setting. - -- If old setting is also not specified, 'not nil' is true. - fire_enabled = not minetest.setting_getbool("disable_fire") + -- enable_fire setting not specified, check for disable_fire + local fire_disabled = minetest.setting_getbool("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 if not fire_enabled then From d104b9b10ffc2ee2dd16bd2f2a6aaa5296913ebc Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Mon, 8 May 2017 15:29:07 -0400 Subject: [PATCH 113/118] Chest: Redo new chests to use single-tile textures where possible This keeps the filenames the same, but adds a new "inside" double texture for the open chest. Use regular drawtype for closed chest and delete the "cube.obj" model. X-flip the right-side texture for the closed chest. --- mods/default/README.txt | 10 +- mods/default/models/chest_open.obj | 151 ++++++++---------- mods/default/models/cube.obj | 38 ----- mods/default/nodes.lua | 24 ++- .../default/textures/default_chest_inside.png | Bin 0 -> 102 bytes mods/default/textures/default_chest_top.png | Bin 422 -> 423 bytes mods/default/textures/default_chest_wood.png | Bin 2320 -> 0 bytes .../textures/default_chest_wood_locked.png | Bin 2418 -> 0 bytes 8 files changed, 97 insertions(+), 126 deletions(-) delete mode 100644 mods/default/models/cube.obj create mode 100644 mods/default/textures/default_chest_inside.png delete mode 100644 mods/default/textures/default_chest_wood.png delete mode 100644 mods/default/textures/default_chest_wood_locked.png diff --git a/mods/default/README.txt b/mods/default/README.txt index 350c4b74..8af65a9c 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -136,10 +136,10 @@ BlockMen (CC BY-SA 3.0): default_lava_source_animated.png default_lava_flowing_animated.png default_stick.png - default_chest_front.png -- Texture kept for mod compability - default_chest_lock.png -- Texture kept for mod compability - default_chest_side.png -- Texture kept for mod compability - default_chest_top.png -- Texture kept for mod compability + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png default_mineral_mese.png default_meselamp.png bubble.png @@ -154,7 +154,7 @@ sofar (CC BY-SA 3.0): 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_wood, default_chest_wood_locked derived from default_chest_* textures by BlockMen + default_chest_inside sofar (WTFPL): default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel diff --git a/mods/default/models/chest_open.obj b/mods/default/models/chest_open.obj index 1bfed076..72ba175a 100644 --- a/mods/default/models/chest_open.obj +++ b/mods/default/models/chest_open.obj @@ -1,88 +1,79 @@ -# Blender v2.78 (sub 0) OBJ File: 'chest_open.blend' +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' # www.blender.org -mtllib chest_open.mtl -o Bottom_Cube.001 -v -0.500000 -0.500000 0.500000 -v -0.500000 0.187500 0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.187500 -0.500000 -v 0.500000 -0.500000 0.500000 -v 0.500000 0.187500 0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.187500 -0.500000 -vt 0.7500 0.3438 -vt 0.5000 0.3438 -vt 0.5000 0.0000 -vt 0.7500 0.0000 -vt 0.2500 0.3438 -vt 0.2500 0.0000 -vt 0.0000 0.3438 -vt 0.0000 0.0000 -vt 0.7500 0.8438 -vt 0.5000 0.8438 -vt 0.5000 0.5000 -vt 0.7500 0.5000 -vt 0.2500 0.5000 -vt 0.2500 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.5000 -vt 0.7500 -0.0000 -vt 0.7500 0.5000 -vt 1.0000 0.5000 -vt 1.0000 0.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 1.0000 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -g Bottom_Cube.001_None -usemtl None -s off -f 2/1/1 4/2/1 3/3/1 1/4/1 -f 4/2/2 8/5/2 7/6/2 3/3/2 -f 8/5/3 6/7/3 5/8/3 7/6/3 -f 6/9/4 2/10/4 1/11/4 5/12/4 -f 1/13/5 3/14/5 7/15/5 5/16/5 -f 6/17/6 8/18/6 4/19/6 2/20/6 -o Top_Cube.002 -v -0.500000 0.187501 0.499999 +o Top_Cube.002_None_Top_Cube.002_None_bottom v -0.500000 0.408471 0.720970 -v -0.500000 0.894607 -0.207108 v -0.500000 1.115578 0.013863 -v 0.500000 0.187501 0.499999 -v 0.500000 0.408471 0.720970 -v 0.500000 0.894607 -0.207108 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 v 0.500000 1.115578 0.013863 -vt 0.7500 0.5000 -vt 0.5000 0.5000 -vt 0.5000 0.3438 -vt 0.7500 0.3438 -vt 0.2500 0.5000 -vt 0.2500 0.3438 -vt 0.0000 0.5000 -vt 0.0000 0.3438 -vt 0.7500 1.0000 -vt 0.5000 1.0000 -vt 0.5000 0.8438 -vt 0.7500 0.8438 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 vt 1.0000 0.5000 vt 1.0000 1.0000 -vt 0.7500 1.0000 -vt 0.7500 0.5000 -vt 0.2500 1.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.7071 -0.7071 -vn 1.0000 0.0000 0.0000 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 -0.7071 -0.7071 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 vn 0.0000 0.7071 0.7071 -g Top_Cube.002_None -usemtl None +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top s off -f 10/21/7 12/22/7 11/23/7 9/24/7 -f 12/22/8 16/25/8 15/26/8 11/23/8 -f 16/25/9 14/27/9 13/28/9 15/26/9 -f 14/29/10 10/30/10 9/31/10 13/32/10 -f 9/33/11 11/34/11 15/35/11 13/36/11 -f 14/37/12 16/25/12 12/22/12 10/30/12 +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/mods/default/models/cube.obj b/mods/default/models/cube.obj deleted file mode 100644 index 7bbec5de..00000000 --- a/mods/default/models/cube.obj +++ /dev/null @@ -1,38 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'chest_close.blend' -# www.blender.org -mtllib chest_close.mtl -o Cube_Cube.001 -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 -v 0.500000 0.500000 0.500000 -v 0.500000 -0.500000 -0.500000 -v 0.500000 0.500000 -0.500000 -vt 0.750000 0.500000 -vt 0.500000 0.500000 -vt 0.500000 -0.000000 -vt 0.750000 0.000000 -vt 0.250000 0.500000 -vt 0.250000 0.000000 -vt 0.000000 0.500000 -vt -0.000000 0.000000 -vt 0.750000 1.000000 -vt 0.500000 1.000000 -vt 0.250000 1.000000 -vt -0.000000 1.000000 -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 -usemtl None -s off -f 2/1/1 4/2/1 3/3/1 1/4/1 -f 4/2/2 8/5/2 7/6/2 3/3/2 -f 8/5/3 6/7/3 5/8/3 7/6/3 -f 6/9/4 2/10/4 1/2/4 5/1/4 -f 1/5/5 3/11/5 7/12/5 5/7/5 -f 6/11/6 8/5/6 4/2/6 2/10/6 diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 7fa8d2ca..be87dde1 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1999,7 +1999,11 @@ function default.register_chest(name, d) return false end - def_closed.mesh = "cube.obj" + 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("default:" .. name, def_closed) minetest.register_node("default:" .. name .. "_open", def_opened) @@ -2026,7 +2030,14 @@ end default.register_chest("chest", { description = "Chest", - tiles = { "default_chest_wood.png" }, + 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", @@ -2035,7 +2046,14 @@ default.register_chest("chest", { default.register_chest("chest_locked", { description = "Locked Chest", - tiles = { "default_chest_wood_locked.png" }, + 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", diff --git a/mods/default/textures/default_chest_inside.png b/mods/default/textures/default_chest_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..5f7b6b13270890618c6a6332eee1c6c721b91f1b GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!2~3yyw0Buq;x%9978NlCvUkPo}j=vVadU` z_{Ppg7lT!aA;@D3{h6xK;WWK5B?*(dP@O1TaS?83{1OQEB B9=-qo literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png index f1a5cb594f4ee6ef23813aeb68ddd38a472c4801..f4a92ee07edb9c3b6b8e33320082ca222656c252 100644 GIT binary patch delta 221 zcmV<303!dU1E&L!(tp57L_t&-(`C;`5`!=d1<=Ud#+VL)(9;{F-v4S5>u9BUqmjN= ztG_z=m!_$YS>xB6@`d2Dm~*QmZ>?0YN4Nl48>7ad?;mD^aEM~|wv^Hen7kt#nUg7N zMUo0Bt_bG@8*yu81rTQlrBUHlgXNs>_yV7_iU;~U#ufeyf9G9*?MPz z0o9fhvOO%pJc8w6uA(SPgh}E6085zG)JMpLyR~QMoRA4!l76q+<}R{XhQ$ XTl@{es#0}<00000NkvXXu0mjfU?gjW delta 220 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 Date: Wed, 17 May 2017 20:56:39 +0200 Subject: [PATCH 114/118] Remove set_inventory_formspec in default, remove delay in sfinv --- mods/creative/inventory.lua | 10 ++++------ mods/default/player.lua | 5 ----- mods/sfinv/api.lua | 4 +--- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 1363e294..0e1d813e 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -33,16 +33,14 @@ function creative.init_creative_inventory(player) end, }, player_name) - creative.update_creative_inventory(player_name, minetest.registered_items) + return player_inventory[player_name] end function creative.update_creative_inventory(player_name, tab_content) local creative_list = {} + 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}) - local inv = player_inventory[player_name] - if not inv then - creative.init_creative_inventory(minetest.get_player_by_name(player_name)) - end for name, def in pairs(tab_content) do if not (def.groups.not_in_creative_inventory == 1) and @@ -161,7 +159,7 @@ function creative.register_tab(name, title, items) end minetest.register_on_joinplayer(function(player) - creative.init_creative_inventory(player) + creative.update_creative_inventory(player:get_player_name(), minetest.registered_items) end) creative.register_tab("all", "All", minetest.registered_items) diff --git a/mods/default/player.lua b/mods/default/player.lua index cd89a24c..0a2078d6 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -95,11 +95,6 @@ minetest.register_on_joinplayer(function(player) default.player_set_model(player, "character.b3d") player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) - -- set GUI - if not (creative and creative.is_enabled_for - and creative.is_enabled_for(player:get_player_name())) then - player:set_inventory_formspec(default.gui_survival_form) - end player:hud_set_hotbar_image("gui_hotbar.png") player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") end) diff --git a/mods/sfinv/api.lua b/mods/sfinv/api.lua index ff6433b9..bd6de1ed 100644 --- a/mods/sfinv/api.lua +++ b/mods/sfinv/api.lua @@ -129,9 +129,7 @@ end minetest.register_on_joinplayer(function(player) if sfinv.enabled then - minetest.after(0.5, function() - sfinv.set_player_inventory_formspec(player) - end) + sfinv.set_player_inventory_formspec(player) end end) From e523c3a2965afe76b9102b67992e15fafba1594a Mon Sep 17 00:00:00 2001 From: theFox6 Date: Sat, 20 May 2017 14:32:52 +0200 Subject: [PATCH 115/118] Default: Shorter and better ABMs (#1739) Action of some abm's call functions directly, instead of calling the function inside a function. --- mods/default/functions.lua | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 936712ca..6d93f428 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -139,9 +139,7 @@ if minetest.setting_getbool("enable_lavacooling") ~= false then interval = 1, chance = 2, catch_up = false, - action = function(...) - default.cool_lava(...) - end, + action = default.cool_lava, }) end @@ -224,9 +222,7 @@ minetest.register_abm({ neighbors = {"group:sand"}, interval = 12, chance = 83, - action = function(...) - default.grow_cactus(...) - end + action = default.grow_cactus }) minetest.register_abm({ @@ -235,9 +231,7 @@ minetest.register_abm({ neighbors = {"default:dirt", "default:dirt_with_grass"}, interval = 14, chance = 71, - action = function(...) - default.grow_papyrus(...) - end + action = default.grow_papyrus }) From eec1c5a03bae544e5ac149d5affa2a1b5e229e31 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 22 May 2017 14:41:17 +0100 Subject: [PATCH 116/118] Settings: Use new settings object --- mods/beds/functions.lua | 4 ++-- mods/bones/init.lua | 6 +++--- mods/creative/init.lua | 2 +- mods/default/functions.lua | 2 +- mods/fire/init.lua | 6 +++--- mods/give_initial_stuff/init.lua | 4 ++-- mods/killme/init.lua | 2 +- mods/stairs/init.lua | 2 +- mods/tnt/init.lua | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 896844e5..78df9a18 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -1,7 +1,7 @@ local pi = math.pi local player_in_bed = 0 local is_sp = minetest.is_singleplayer() -local enable_respawn = minetest.setting_getbool("enable_bed_respawn") +local enable_respawn = minetest.settings:get_bool("enable_bed_respawn") if enable_respawn == nil then enable_respawn = true end @@ -22,7 +22,7 @@ local function get_look_yaw(pos) end local function is_night_skip_enabled() - local enable_night_skip = minetest.setting_getbool("enable_bed_night_skip") + local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") if enable_night_skip == nil then enable_night_skip = true end diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 56f5fd04..9583bc29 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -21,8 +21,8 @@ local bones_formspec = "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) -local share_bones_time = tonumber(minetest.setting_get("share_bones_time")) or 1200 -local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_early")) or share_bones_time / 4 +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 minetest.register_node("bones:bones", { description = "Bones", @@ -161,7 +161,7 @@ end minetest.register_on_dieplayer(function(player) - local bones_mode = minetest.setting_get("bones_mode") or "bones" + 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 diff --git a/mods/creative/init.lua b/mods/creative/init.lua index bba9b34e..51d6f792 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,6 +1,6 @@ creative = {} -local creative_mode_cache = minetest.setting_getbool("creative_mode") +local creative_mode_cache = minetest.settings:get_bool("creative_mode") function creative.is_enabled_for(name) return creative_mode_cache diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 6d93f428..5dc22cab 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -131,7 +131,7 @@ default.cool_lava = function(pos, node) {pos = pos, max_hear_distance = 16, gain = 0.25}) end -if minetest.setting_getbool("enable_lavacooling") ~= false then +if minetest.settings:get_bool("enable_lavacooling") ~= false then minetest.register_abm({ label = "Lava cooling", nodenames = {"default:lava_source", "default:lava_flowing"}, diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 2dbf5dfd..f97636b5 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -148,7 +148,7 @@ minetest.override_item("default:coalblock", { -- Sound -- -local flame_sound = minetest.setting_getbool("flame_sound") +local flame_sound = minetest.settings:get_bool("flame_sound") if flame_sound == nil then -- Enable if no setting present flame_sound = true @@ -290,10 +290,10 @@ minetest.register_abm({ -- Enable the following ABMs according to 'enable fire' setting -local fire_enabled = minetest.setting_getbool("enable_fire") +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.setting_getbool("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() diff --git a/mods/give_initial_stuff/init.lua b/mods/give_initial_stuff/init.lua index 022b7438..4815bd84 100644 --- a/mods/give_initial_stuff/init.lua +++ b/mods/give_initial_stuff/init.lua @@ -1,4 +1,4 @@ -local stuff_string = minetest.setting_get("initial_stuff") or +local stuff_string = minetest.settings:get("initial_stuff") or "default:pick_steel,default:axe_steel,default:shovel_steel," .. "default:torch 99,default:cobble 99" @@ -39,6 +39,6 @@ function give_initial_stuff.get_list() end give_initial_stuff.add_from_csv(stuff_string) -if minetest.setting_getbool("give_initial_stuff") then +if minetest.settings:get_bool("give_initial_stuff") then minetest.register_on_newplayer(give_initial_stuff.give) end diff --git a/mods/killme/init.lua b/mods/killme/init.lua index 06aa39de..9b674754 100644 --- a/mods/killme/init.lua +++ b/mods/killme/init.lua @@ -3,7 +3,7 @@ minetest.register_chatcommand("killme", { func = function(name) local player = minetest.get_player_by_name(name) if player then - if minetest.setting_getbool("enable_damage") then + if minetest.settings:get_bool("enable_damage") then player:set_hp(0) return true else diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 0ce35218..90172ef0 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -15,7 +15,7 @@ minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") -- Get setting for replace ABM -local replace = minetest.setting_getbool("enable_stairs_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 diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index e5ad5b16..f54b2f1a 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -1,7 +1,7 @@ tnt = {} -- Default to enabled when in singleplayer -local enable_tnt = minetest.setting_getbool("enable_tnt") +local enable_tnt = minetest.settings:get_bool("enable_tnt") if enable_tnt == nil then enable_tnt = minetest.is_singleplayer() end @@ -12,7 +12,7 @@ local loss_prob = {} loss_prob["default:cobble"] = 3 loss_prob["default:dirt"] = 4 -local tnt_radius = tonumber(minetest.setting_get("tnt_radius") or 3) +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 = {} From a8a60d33a3891fe764babc41d720f3f56f74f787 Mon Sep 17 00:00:00 2001 From: Michael Bargatin Date: Thu, 25 May 2017 13:34:14 +0300 Subject: [PATCH 117/118] Resize book textures from 16x17 to 16x16 --- mods/default/textures/default_book.png | Bin 201 -> 255 bytes mods/default/textures/default_book_written.png | Bin 228 -> 282 bytes .../default/textures/default_bookshelf_slot.png | Bin 216 -> 191 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/default/textures/default_book.png b/mods/default/textures/default_book.png index 15af2b699894ac23e1f8121870a879bd44128b7d..448a7df0287088582d9e12eaa1189052ace175e2 100644 GIT binary patch delta 183 zcmX@f_@8ltIF|qmGXn#|+q;i~CMw$2GbVYvyD)UH%6b3=ISV`@iy0WWg+Z8+Vb&Z8 zpdfpRr>`sfLsm&%F6~v@%Bz7w;hrvzAsp9}6CBu@m;$0a1>LMU8!}bh1s4b`o-}Du z*Mdn5%?l<^nlxe3B8KJ*BB~4K6fiYUSSmch%r_x{M~v}Or$eq#o4~BbjY>CH2_$W@ hn39$tl5l{FLH9j(h`>t6c|bcDJYD@<);T3K0RWd)IFkSX delta 128 zcmV-`0Du4g0m%W77YY#s0{{R3CV?^cks&>6R!KxbR0!8&zzzfjptO=AjCK+L(@Ksa zKp{pYB}ElMB>@IOCnY5zB}D-Sp(#p0IpG8bAxkG9ZJNNq7%T#$6M@EJNbb^j3q&S!3+-1Zlr-Y zN#5=*3>~bp9zYIffk$L90|U1(2s1Lwnj--eWH0gbb!C6ZD#^uXYB+1=OrTJjr;B3< z$Mxg{2eu}rfGAHv7el5@^$8OeY@D!|BcLPDvtnJ>f=LX`3ntI{sG{o1$hJ_~>paiI g`8tv%*^LYge~kE4)~`-+1DeF(>FVdQ&MBb@08srkb^rhX delta 112 zcmbQm^n`JOxTqitGXn#ITBG52Af+4N6XFV_C+cV!fBp83706^P3GxeOaCmkj4aiCL zba4#fxSo7~kA-!?mPtw-Ni3KAm=yMHoUph_i5JKh}II0(&Alfm#?m MUHx3vIVCg!0QCGJq5uE@ diff --git a/mods/default/textures/default_bookshelf_slot.png b/mods/default/textures/default_bookshelf_slot.png index 31c4eb5e6e25b208782e7ec11c8b527a125ebb02..715a3dce79d22d9e3d73db7cb18d1ab4dd435a29 100644 GIT binary patch delta 105 zcmcb?xSw%?IF|q;GXn#Is%@^)L_M#NhpdvkTNPLBJ#7K~6$Kasvayp+0tBo^=M*K-~GZx^prwCn|a+Jm6;IGhy}o`gJZ)%Fffp zF+}2Wa)N@CfsxUoB1aas>4Kfy3lHdMi0d&KcMC4;5 Date: Wed, 24 May 2017 14:22:17 -0700 Subject: [PATCH 118/118] Change "Junglewood" to "Jungle Wood" --- mods/default/nodes.lua | 4 ++-- mods/doors/init.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index be87dde1..f14e8b21 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -693,7 +693,7 @@ minetest.register_node("default:jungletree", { }) minetest.register_node("default:junglewood", { - description = "Junglewood Planks", + description = "Jungle Wood Planks", paramtype2 = "facedir", place_param2 = 0, tiles = {"default_junglewood.png"}, @@ -2264,7 +2264,7 @@ default.register_fence("default:fence_acacia_wood", { }) default.register_fence("default:fence_junglewood", { - description = "Junglewood Fence", + description = "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", diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 5189dec7..371b43a2 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -787,7 +787,7 @@ doors.register_fencegate("doors:gate_acacia_wood", { }) doors.register_fencegate("doors:gate_junglewood", { - description = "Junglewood Fence Gate", + description = "Jungle Wood Fence Gate", texture = "default_junglewood.png", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}