From e5c5c2637e6fba63c724096d4591d45c4c2cacc9 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 14 Dec 2016 23:45:48 -0800 Subject: [PATCH 01/62] Furnace: Attempt to fix exploits The fuel would remain active even if source went empty, giving free cook time to newly inserted items. This patch is supposed to stop this. --- mods/default/furnace.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index fed7cf2e..4b822058 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -116,6 +116,7 @@ local function furnace_node_timer(pos, elapsed) local srclist, fuellist local cookable, cooked + local fuel local update = true while update do @@ -154,7 +155,8 @@ local function furnace_node_timer(pos, elapsed) -- Furnace ran out of fuel if cookable then -- We need to get new fuel - local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) if fuel.time == 0 then -- No valid fuel in fuel list @@ -164,7 +166,6 @@ local function furnace_node_timer(pos, elapsed) -- Take fuel from fuel list inv:set_stack("fuel", 1, afterfuel.items[1]) update = true - fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime) src_time = src_time + elapsed end @@ -179,6 +180,13 @@ local function furnace_node_timer(pos, elapsed) elapsed = 0 end + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist[1]:is_empty() then + src_time = 0 + end + -- -- Update formspec, infotext and node -- From 12b154197170c626e75986d7c0f6c2b1c9960957 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 15 Dec 2016 08:13:36 +0000 Subject: [PATCH 02/62] Sounds: Edit some sound gains, mostly footsteps I recently made glass footstep and dig gains too low, raise slightly. Change dirt dug gain from above-maximum 1.5 to maximum 1.0. Reduce gain of footsteps: stone, dirt, gravel, wood, metal Raise gain of leaves footstep. --- mods/default/functions.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index a8e3355f..3bda4bf0 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -18,7 +18,7 @@ end function default.node_sound_stone_defaults(table) table = table or {} table.footstep = table.footstep or - {name = "default_hard_footstep", gain = 0.5} + {name = "default_hard_footstep", gain = 0.3} table.dug = table.dug or {name = "default_hard_footstep", gain = 1.0} default.node_sound_defaults(table) @@ -28,9 +28,9 @@ end function default.node_sound_dirt_defaults(table) table = table or {} table.footstep = table.footstep or - {name = "default_dirt_footstep", gain = 1.0} + {name = "default_dirt_footstep", gain = 0.4} table.dug = table.dug or - {name = "default_dirt_footstep", gain = 1.5} + {name = "default_dirt_footstep", gain = 1.0} table.place = table.place or {name = "default_place_node", gain = 1.0} default.node_sound_defaults(table) @@ -52,7 +52,7 @@ end function default.node_sound_gravel_defaults(table) table = table or {} table.footstep = table.footstep or - {name = "default_gravel_footstep", gain = 0.5} + {name = "default_gravel_footstep", gain = 0.4} table.dug = table.dug or {name = "default_gravel_footstep", gain = 1.0} table.place = table.place or @@ -64,7 +64,7 @@ end function default.node_sound_wood_defaults(table) table = table or {} table.footstep = table.footstep or - {name = "default_wood_footstep", gain = 0.5} + {name = "default_wood_footstep", gain = 0.3} table.dug = table.dug or {name = "default_wood_footstep", gain = 1.0} default.node_sound_defaults(table) @@ -74,7 +74,7 @@ end function default.node_sound_leaves_defaults(table) table = table or {} table.footstep = table.footstep or - {name = "default_grass_footstep", gain = 0.35} + {name = "default_grass_footstep", gain = 0.45} table.dug = table.dug or {name = "default_grass_footstep", gain = 0.7} table.dig = table.dig or @@ -88,9 +88,9 @@ end function default.node_sound_glass_defaults(table) table = table or {} table.footstep = table.footstep or - {name = "default_glass_footstep", gain = 0.25} + {name = "default_glass_footstep", gain = 0.3} table.dig = table.dig or - {name = "default_glass_footstep", gain = 0.45} + {name = "default_glass_footstep", gain = 0.5} table.dug = table.dug or {name = "default_break_glass", gain = 1.0} default.node_sound_defaults(table) @@ -100,7 +100,7 @@ end function default.node_sound_metal_defaults(table) table = table or {} table.footstep = table.footstep or - {name = "default_metal_footstep", gain = 0.5} + {name = "default_metal_footstep", gain = 0.4} table.dig = table.dig or {name = "default_dig_metal", gain = 0.5} table.dug = table.dug or From 3c9d0893ee82cf1d68fa7366e14435ea5009fa51 Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 21 Dec 2016 07:38:27 +0000 Subject: [PATCH 03/62] Boats: Avoid crash if boat pos over limit If the boat pos is over limit, 'add entity' will not add an entity, causing 'boat' to be nil. --- mods/boats/init.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 9f1264b1..0591ef24 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -233,9 +233,11 @@ minetest.register_craftitem("boats:boat", { end pointed_thing.under.y = pointed_thing.under.y + 0.5 boat = minetest.add_entity(pointed_thing.under, "boats:boat") - boat:setyaw(placer:get_look_horizontal()) - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() + if boat then + boat:setyaw(placer:get_look_horizontal()) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end end return itemstack end, From f07c4dcd839c5be09e83cae47126927bb86cb676 Mon Sep 17 00:00:00 2001 From: DS-Minetest Date: Mon, 2 Jan 2017 00:41:04 +0100 Subject: [PATCH 04/62] 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 05/62] 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 06/62] 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 07/62] 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 08/62] 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 09/62] 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 10/62] 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 11/62] 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 12/62] 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 13/62] 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 14/62] 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 15/62] 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 16/62] 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 17/62] 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 18/62] 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 19/62] 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 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 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 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 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 20/62] 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 21/62] 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 22/62] 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 23/62] 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 24/62] 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 25/62] 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 26/62] 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 27/62] 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 28/62] 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 29/62] 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 30/62] 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 31/62] 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 32/62] 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 33/62] 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 34/62] 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 35/62] 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 36/62] 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 37/62] 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 38/62] 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 39/62] 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 40/62] 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 41/62] 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 42/62] 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 43/62] 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 44/62] 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 45/62] 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 46/62] 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 47/62] 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 48/62] 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 49/62] 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 50/62] 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 51/62] 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 52/62] 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 53/62] 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 54/62] 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 55/62] 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 56/62] 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 57/62] 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 58/62] 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 59/62] 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 60/62] 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 61/62] 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 62/62] 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.