tree capitator - prevent infinite loop and crash when tree partialy protected
parent
a416587a21
commit
0e1673686b
96
api.lua
96
api.lua
|
@ -359,7 +359,9 @@ end
|
||||||
|
|
||||||
-- axe dig upwards
|
-- axe dig upwards
|
||||||
function obsidianmese.dig_up(pos, node, digger)
|
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 wielditemname = digger:get_wielded_item():get_name()
|
||||||
local whitelist = {
|
local whitelist = {
|
||||||
|
@ -367,100 +369,36 @@ function obsidianmese.dig_up(pos, node, digger)
|
||||||
["obsidianmese:enchanted_axe_durable"] = true,
|
["obsidianmese:enchanted_axe_durable"] = true,
|
||||||
["obsidianmese:enchanted_axe_fast"] = 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 np = {x = pos.x, y = pos.y + 1, z = pos.z}
|
||||||
local nn = minetest.get_node(np)
|
local nn = minetest.get_node(np)
|
||||||
|
|
||||||
if nn.name == node.name then
|
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, z = np.z - 1},
|
||||||
{x = np.x + 1, y = np.y + 1, z = np.z + 1},
|
{x = np.x + 1, y = np.y + 1, z = np.z + 1},
|
||||||
node.name
|
node.name
|
||||||
)
|
)
|
||||||
|
|
||||||
minetest.node_dig(np, nn, digger)
|
minetest.node_dig(np, nn, digger)
|
||||||
|
|
||||||
local branches_length = #branches
|
if #branches_pos > 0 then
|
||||||
if branches_length > 0 then
|
for i = 1, #branches_pos do
|
||||||
-- limit
|
-- prevent infinite loop when node protected
|
||||||
if branches_length > 4 then
|
if minetest.is_protected(branches_pos[i], digger:get_player_name()) then
|
||||||
branches_length = 4
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, branches_length do
|
obsidianmese.dig_up({x = branches_pos[i].x, y = branches_pos[i].y - 1, z = branches_pos[i].z}, node, digger)
|
||||||
obsidianmese.dig_up({x = branches[i].x, y = branches[i].y - 1, z = branches[i].z}, node, digger)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
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()
|
function obsidianmese.register_capitator()
|
||||||
local trees = {
|
local trees = {
|
||||||
"default:tree",
|
"default:tree",
|
||||||
|
|
Loading…
Reference in New Issue