diff --git a/api.lua b/api.lua index c7e65de..517e4ff 100644 --- a/api.lua +++ b/api.lua @@ -359,7 +359,9 @@ end -- axe dig upwards function obsidianmese.dig_up(pos, node, digger) - if not digger then return end + if not digger then + return + end local wielditemname = digger:get_wielded_item():get_name() local whitelist = { @@ -367,100 +369,36 @@ function obsidianmese.dig_up(pos, node, digger) ["obsidianmese:enchanted_axe_durable"] = true, ["obsidianmese:enchanted_axe_fast"] = true } - if not whitelist[wielditemname] then return end + + if not whitelist[wielditemname] then + return + end + local np = {x = pos.x, y = pos.y + 1, z = pos.z} local nn = minetest.get_node(np) if nn.name == node.name then - local branches = minetest.find_nodes_in_area( + local branches_pos = minetest.find_nodes_in_area( {x = np.x - 1, y = np.y, z = np.z - 1}, {x = np.x + 1, y = np.y + 1, z = np.z + 1}, node.name ) + minetest.node_dig(np, nn, digger) - local branches_length = #branches - if branches_length > 0 then - -- limit - if branches_length > 4 then - branches_length = 4 - end + if #branches_pos > 0 then + for i = 1, #branches_pos do + -- prevent infinite loop when node protected + if minetest.is_protected(branches_pos[i], digger:get_player_name()) then + break + end - for i = 1, branches_length do - obsidianmese.dig_up({x = branches[i].x, y = branches[i].y - 1, z = branches[i].z}, node, digger) + obsidianmese.dig_up({x = branches_pos[i].x, y = branches_pos[i].y - 1, z = branches_pos[i].z}, node, digger) end end end end --- WIP --- local positions = {} --- function obsidianmese.dig_up_new(pos, node, digger) --- if not digger then return end --- local wielded = digger:get_wielded_item() --- local wielditemname = wielded:get_name() --- local whitelist = { --- ["obsidianmese:axe"] = true, --- ["obsidianmese:enchanted_axe_durable"] = true, --- ["obsidianmese:enchanted_axe_fast"] = true --- } --- if not whitelist[wielditemname] then return end --- local increase = 1 --- local nn_name = node.name - --- while nn_name == node.name do --- local np = {x = pos.x, y = pos.y + increase, z = pos.z} --- local nn = minetest.get_node(np) --- nn_name = nn.name --- local branches = minetest.find_nodes_in_area( --- {x = np.x - 1, y = np.y, z = np.z - 1}, --- {x = np.x + 1, y = np.y + 1, z = np.z + 1}, --- node.name --- ) --- table.insert(positions, np) - --- if #branches > 0 then --- for i = 1, #branches do --- table.insert(positions, branches[i]) --- obsidianmese.dig_up(branches[i], node, digger) --- end --- end --- increase = increase + 1 --- -- print(dump(positions)) --- end - --- -- done --- print("done") --- for i = 1, #positions do --- local drops = minetest.get_node_drops(node.name, wielditemname) --- -- minetest.add_item(positions[i], node.name) --- minetest.handle_node_drops(positions[i], drops, digger) --- minetest.remove_node(positions[i]) --- -- get hungry from cutting down the whole tree --- hbhunger.handle_node_actions(positions[i], node, digger) --- -- Wear out tool --- local wielded = digger:get_wielded_item() --- local wdef = wielded:get_definition() --- local tp = wielded:get_tool_capabilities() --- local dp = core.get_dig_params(def and def.groups, tp) --- print(dump(dp)) - --- if wdef and wdef.after_use then --- wielded = wdef.after_use(wielded, digger, node, dp) or wielded --- else --- -- if not minetest.settings:get_bool("creative_mode") then --- wielded:add_wear(65535 / (30 - 1)) --- if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then --- minetest.sound_play(wdef.sound.breaks, {pos = pos, gain = 0.5}) --- end --- -- end --- end --- digger:set_wielded_item(wielded) --- end --- -- reset --- positions = {} --- end - function obsidianmese.register_capitator() local trees = { "default:tree",