From 705dccfabb69fff7b4c50ddcef65f0fda684bf91 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Tue, 28 Jul 2020 21:32:41 +0200 Subject: [PATCH] Fix the good positions searching loop and take items from the player inventory --- README.md | 3 -- init.lua | 106 ++++++++++++++++++++++++++++++++---------------------- 2 files changed, 64 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 98a5533..fd3f831 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,2 @@ For a description of this Minetest mod, please refer to [the forum topic](https://forum.minetest.net/viewtopic.php?f=9&t=12616). - -TODO: -* Take inventory items diff --git a/init.lua b/init.lua index dec33bb..55a26ec 100644 --- a/init.lua +++ b/init.lua @@ -18,6 +18,13 @@ local function get_node_loaded(pos) return minetest.get_node(pos) end +-- Places a node with the same effects than the player's placing +local function place_node(def, wi, stack, player, pt, inv) + local leftover = def.on_place(stack, player, pt) + inv:set_stack("main", wi, leftover) + return leftover +end + -- Tests if theres a node an e.g. torch is allowed to be placed on local function pos_placeable(pos) local undernode = get_node_loaded(pos).name @@ -104,18 +111,21 @@ local function place_torches(pos, maxlight, player) -- Get the light_source item local inv = player:get_inventory() local wi = player:get_wield_index() - local node = inv:get_stack("main", wi):get_name() - local data = minetest.registered_nodes[node] - if not data then + local stack = inv:get_stack("main", wi) + local node_name = stack:get_name() + local def = minetest.registered_nodes[node_name] + if not def then -- Support the chatcommand tool - node = inv:get_stack("main", wi+1):get_name() - data = minetest.registered_nodes[node] - if not data then + wi = wi+1 + stack = inv:get_stack("main", wi) + node_name = stack:get_name() + def = minetest.registered_nodes[node_name] + if not def then return false, "You need to have a node next to or as your wielded item." end end - local nodelight = data.light_source + local nodelight = def.light_source if not nodelight or nodelight < maxlight then return false, "You need a node emitting light (enough light)." @@ -125,7 +135,7 @@ local function place_torches(pos, maxlight, player) if not ps then return false, "It doesn't seem to be dark there or the cave is too big." end - local sound = data.sounds + local sound = def.sounds if sound then sound = sound.place end @@ -138,26 +148,34 @@ local function place_torches(pos, maxlight, player) -- where the light is 3: (6,7,6,5,6,7) local l1 = math.max(maxlight - (nodelight - maxlight) + 2, 0) local n = #ps - for k = n, 1, -1 do - local pt = ps[k] - local pos = pt.above - local light = minetest.get_node_light(pos, 0.5) or 0 - if light == l1 then - count = count+1 - if sound - and count < 50 then - minetest.sound_play(sound.name, {pos = pos, - gain = sound.gain / count}) + local found = true + while found do + found = false + for k = n, 1, -1 do + local pt = ps[k] + local pos = pt.above + local light = minetest.get_node_light(pos, 0.5) or 0 + if light == l1 then + pt.type = "node" + stack = place_node(def, wi, stack, player, pt, inv) + if stack:get_name() ~= node_name then + return false, "No remaining light nodes" + end + count = count+1 + if sound + and count < 50 then + minetest.sound_play(sound.name, {pos = pos, + gain = sound.gain / count}) + end + found = true + ps[k] = ps[n] + ps[n] = nil + n = n-1 + elseif light > maxlight then + ps[k] = ps[n] + ps[n] = nil + n = n-1 end - pt.type = "node" - minetest.item_place_node(ItemStack(node), player, pt) - ps[k] = ps[n] - ps[n] = nil - n = n-1 - elseif light > maxlight then - ps[k] = ps[n] - ps[n] = nil - n = n-1 end end--]] @@ -166,18 +184,21 @@ local function place_torches(pos, maxlight, player) local pos = pt.above local light = minetest.get_node_light(pos, 0.5) or 0 if light <= maxlight then + pt.type = "node" + stack = place_node(def, wi, stack, player, pt, inv) + if stack:get_name() ~= node_name then + return false, "No remaining light nodes" + end count = count+1 if sound and count < 50 then minetest.sound_play(sound.name, {pos = pos, gain = sound.gain / count}) end - pt.type = "node" - minetest.item_place_node(ItemStack(node), player, pt) end end - return {count, data.description or node, nodelight} + return {count, def.description or stack:get_name(), nodelight} end -- Returns the camera position of the player; it does not include @@ -287,23 +308,24 @@ local function autoplace_step() local pt = {type = "node"} pt.above, pt.under = get_pointed_target(player) if pt.above then - local node = player:get_inventory():get_stack("main", - player:get_wield_index()):get_name() - local data = minetest.registered_nodes[node] + local wi = player:get_wield_index() + local inv = player:get_inventory() + local stack = inv:get_stack("main", wi) + local def = minetest.registered_nodes[stack:get_name()] local failed - if not data then + if not def then -- support the chatcommand tool - node = player:get_inventory():get_stack("main", - player:get_wield_index()+1):get_name() - data = minetest.registered_nodes[node] - if not data then + wi = wi + 1 + stack = inv:get_stack("main", wi) + def = minetest.registered_nodes[stack:get_name()] + if not def then inform(pname, "You need to have a node next to or as " .. "your wielded item.") failed = true end end - if data then - local nodelight = data.light_source + if def then + local nodelight = def.light_source if not nodelight or nodelight < maxlight then inform(pname, @@ -313,7 +335,7 @@ local function autoplace_step() local light = minetest.get_node_light(pt.above, 0.5) or 0 if light <= maxlight and get_node_loaded(pt.above).name == "air" then - local sound = data.sounds + local sound = def.sounds if sound then sound = sound.place end @@ -321,7 +343,7 @@ local function autoplace_step() minetest.sound_play(sound.name, {pos = pt.above, gain = sound.gain}) end - minetest.item_place_node(ItemStack(node), player, pt) + place_node(def, wi, stack, player, pt, inv) end end if failed then