From 9db2602def1edf61c50105fcc9735af592e782ab Mon Sep 17 00:00:00 2001 From: h-v-smacker Date: Sat, 28 Oct 2017 20:43:45 +0300 Subject: [PATCH] Better check for node removal --- technic/tools/lawn_trimmer.lua | 46 +++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/technic/tools/lawn_trimmer.lua b/technic/tools/lawn_trimmer.lua index 653a3bc..68c1843 100644 --- a/technic/tools/lawn_trimmer.lua +++ b/technic/tools/lawn_trimmer.lua @@ -32,12 +32,13 @@ local lawn_trimmer_charge_per_object = 25 local S = technic.getter local lawn_trimmer_mode_text = { - S("immediately around the user"), - S("sweep 1 block wide"), - S("sweep 2 blocks wide"), - S("sweep 3 blocks wide") + S("sweep a single block under the user"), + S("sweep 1 block around the user"), + S("sweep 2 blocks around the user"), + S("sweep 3 blocks around the user") } +local node_removed -- Mode switcher for the tool local function lawn_trimmer_setmode(user, itemstack) @@ -76,15 +77,15 @@ local function trim_the_lawn(itemstack, user) return end - if meta.charge > lawn_trimmer_charge_per_object then - minetest.sound_play("technic_lawn_trimmer", { - to_player = user:get_player_name(), - gain = 0.4, - }) - else + if meta.charge < lawn_trimmer_charge_per_object then return -- no charge for even a single node, aborting end + minetest.sound_play("technic_lawn_trimmer", { + to_player = user:get_player_name(), + gain = 0.4, + }) + local pos = user:get_pos() -- Defining the area for the search needs two positions -- The tool has a limited range in the vertical axis, which is capped at +/- 1 node @@ -103,15 +104,17 @@ local function trim_the_lawn(itemstack, user) -- find_node_near() and removing found nodes local found_flora = minetest.find_nodes_in_area(start_pos, end_pos, {"group:flora"}) for _, f in ipairs(found_flora) do - -- Only dig the node if not protected, otherwise skip to the next one. - if not minetest.is_protected(f, user:get_player_name()) then + node_removed = false + -- Callback will set the flag to true if the node is dug successfully, + -- otherwise skip to the next one. + minetest.node_dig(f, minetest.get_node(f), user) + if node_removed then meta.charge = meta.charge - lawn_trimmer_charge_per_object - minetest.node_dig(f, minetest.get_node(f), user) + -- Abort if no charge left for another node + if meta.charge < lawn_trimmer_charge_per_object then break end end - -- Abort if no charge left for another node - if meta.charge < lawn_trimmer_charge_per_object then break end end - + -- The charge won't expire in creative mode, but the tool still -- has to be charged prior to use if not technic.creative_mode then @@ -121,6 +124,10 @@ local function trim_the_lawn(itemstack, user) return itemstack end +function check_removal(itemstack, user, node, digparams) + node_removed = true + return itemstack +end -- Register the tool and its varieties in the game technic.register_power_tool("technic:lawn_trimmer", lawn_trimmer_max_charge) @@ -130,7 +137,9 @@ minetest.register_tool("technic:lawn_trimmer", { stack_max = 1, wear_represents = "technic_RE_charge", on_refill = technic.refill_RE_charge, - on_use = trim_the_lawn + on_use = trim_the_lawn, + after_use = check_removal + }) for i = 1, 4 do @@ -142,7 +151,8 @@ for i = 1, 4 do wear_represents = "technic_RE_charge", on_refill = technic.refill_RE_charge, groups = {not_in_creative_inventory = 1}, - on_use = trim_the_lawn + on_use = trim_the_lawn, + after_use = check_removal }) end