forked from VoxeLibre/VoxeLibre
Improve dig_node simulation and fix duplication
This commit is contained in:
parent
918b8eee38
commit
058684f17f
|
@ -246,6 +246,15 @@ function mesecon.mergetable(source, dest)
|
||||||
return rval
|
return rval
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
function mesecon.join_table(t1, t2)
|
||||||
|
local rval = mesecon.tablecopy(t2)
|
||||||
|
for i, v in ipairs(t1) do
|
||||||
|
table.insert(rval, mesecon.tablecopy(v))
|
||||||
|
end
|
||||||
|
return rval
|
||||||
|
end
|
||||||
|
|
||||||
function mesecon.register_node(name, spec_common, spec_off, spec_on)
|
function mesecon.register_node(name, spec_common, spec_off, spec_on)
|
||||||
spec_common.drop = spec_common.drop or name .. "_off"
|
spec_common.drop = spec_common.drop or name .. "_off"
|
||||||
spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode
|
spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode
|
||||||
|
|
|
@ -234,7 +234,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
||||||
end
|
end
|
||||||
|
|
||||||
if not nodes then return end
|
if not nodes then return end
|
||||||
|
|
||||||
local newpos={}
|
local newpos={}
|
||||||
-- check node availability to push/pull into, and fill newpos[i]
|
-- check node availability to push/pull into, and fill newpos[i]
|
||||||
for i in ipairs(nodes) do
|
for i in ipairs(nodes) do
|
||||||
|
@ -259,7 +259,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
||||||
end
|
end
|
||||||
|
|
||||||
local all_nodes = nodes
|
local all_nodes = nodes
|
||||||
if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.mergetable(dig_nodes, nodes) end
|
if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.join_table(dig_nodes, nodes) end
|
||||||
if are_protected(all_nodes, player_name) then
|
if are_protected(all_nodes, player_name) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -270,13 +270,11 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
||||||
n.meta = minetest.get_meta(n.pos):to_table()
|
n.meta = minetest.get_meta(n.pos):to_table()
|
||||||
local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, all_nodes, id)
|
local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, all_nodes, id)
|
||||||
if is_dropper then
|
if is_dropper then
|
||||||
-- minetest.dig_node has been shown to be buggy (https://git.minetest.land/MineClone2/MineClone2/issues/3547)
|
-- if current node has already been destroyed (e.g. chain reaction of sugar cane breaking), skip it
|
||||||
if minetest.get_item_group(n.node.name, "dig_immediate") == 3 then
|
if minetest.get_node(n.pos).name == n.node.name then
|
||||||
-- should dig as normal
|
-- simulate dig_node using handle_node_drops
|
||||||
minetest.dig_node(n.pos)
|
|
||||||
else
|
|
||||||
-- simulate dig_node because nothing drops otherwise
|
|
||||||
local drops = minetest.get_node_drops(n.node.name, "")
|
local drops = minetest.get_node_drops(n.node.name, "")
|
||||||
|
local counted_drops = {}
|
||||||
minetest.remove_node(n.pos)
|
minetest.remove_node(n.pos)
|
||||||
for _, callback in pairs(minetest.registered_on_dignodes) do
|
for _, callback in pairs(minetest.registered_on_dignodes) do
|
||||||
callback(n.pos, n)
|
callback(n.pos, n)
|
||||||
|
@ -285,8 +283,9 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
|
||||||
if type(item) ~= "string" then
|
if type(item) ~= "string" then
|
||||||
item = item:get_name() .. item:get_count()
|
item = item:get_name() .. item:get_count()
|
||||||
end
|
end
|
||||||
minetest.add_item(n.pos, item)
|
table.insert(counted_drops, item)
|
||||||
end
|
end
|
||||||
|
minetest.handle_node_drops(n.pos, counted_drops)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
minetest.remove_node(n.pos)
|
minetest.remove_node(n.pos)
|
||||||
|
|
Loading…
Reference in New Issue