Fix broken blast handling for chest/shulkerbox

This commit is contained in:
Wuzzy 2020-06-06 16:57:19 +02:00
parent 83055d18e2
commit 6f12adcb03
2 changed files with 37 additions and 47 deletions

View file

@ -36,9 +36,10 @@ local N_EXPOSURE_RAYS = 16
minetest.register_on_mods_loaded(function() minetest.register_on_mods_loaded(function()
-- Store blast resistance values by content ids to improve performance. -- Store blast resistance values by content ids to improve performance.
for name, def in pairs(minetest.registered_nodes) do for name, def in pairs(minetest.registered_nodes) do
node_blastres[minetest.get_content_id(name)] = def._mcl_blast_resistance or 0 local id = minetest.get_content_id(name)
node_on_blast[minetest.get_content_id(name)] = def.on_blast node_blastres[id] = def._mcl_blast_resistance or 0
node_walkable[minetest.get_content_id(name)] = def.walkable node_on_blast[id] = def.on_blast
node_walkable[id] = def.walkable
end end
end) end)
@ -314,7 +315,8 @@ local function trace_explode(pos, strength, raydirs, radius, drop_chance, fire,
if do_drop or on_blast ~= nil then if do_drop or on_blast ~= nil then
local npos = minetest.get_position_from_hash(hash) local npos = minetest.get_position_from_hash(hash)
if on_blast ~= nil then if on_blast ~= nil then
remove = on_blast(npos, 1.0) on_blast(npos, 1.0)
remove = false
else else
local name = minetest.get_name_from_content_id(data[idx]) local name = minetest.get_name_from_content_id(data[idx])
local drop = minetest.get_node_drops(name, "") local drop = minetest.get_node_drops(name, "")

View file

@ -123,6 +123,29 @@ local double_chest_add_item = function(top_inv, bottom_inv, listname, stack)
end end
end end
local drop_items_chest = function(pos, oldnode, oldmetadata)
local meta = minetest.get_meta(pos)
local meta2 = meta
if oldmetadata then
meta:from_table(oldmetadata)
end
local inv = meta:get_inventory()
for i=1,inv:get_size("main") do
local stack = inv:get_stack("main", i)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2:to_table())
end
local on_chest_blast = function(pos)
local node = minetest.get_node(pos)
drop_items_chest(pos, node)
minetest.remove_node(pos)
end
minetest.register_node("mcl_chests:"..basename, { minetest.register_node("mcl_chests:"..basename, {
description = desc, description = desc,
_tt_help = tt_help, _tt_help = tt_help,
@ -174,20 +197,8 @@ minetest.register_node("mcl_chests:"..basename, {
minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename, param2 = param2 }) minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename, param2 = param2 })
end end
end, end,
after_dig_node = function(pos, oldnode, oldmetadata, digger) after_dig_node = drop_items_chest,
local meta = minetest.get_meta(pos) on_blast = on_chest_blast,
local meta2 = meta
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for i=1,inv:get_size("main") do
local stack = inv:get_stack("main", i)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2:to_table())
end,
allow_metadata_inventory_move = protection_check_move, allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_take = protection_check_put_take,
allow_metadata_inventory_put = protection_check_put_take, allow_metadata_inventory_put = protection_check_put_take,
@ -280,20 +291,8 @@ minetest.register_node("mcl_chests:"..basename.."_left", {
end end
minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 })
end, end,
after_dig_node = function(pos, oldnode, oldmetadata, digger) after_dig_node = drop_items_chest,
local meta = minetest.get_meta(pos) on_blast = on_chest_blast,
local meta2 = meta
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for i=1,inv:get_size("main") do
local stack = inv:get_stack("main", i)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2:to_table())
end,
allow_metadata_inventory_move = protection_check_move, allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_take = protection_check_put_take,
allow_metadata_inventory_put = function(pos, listname, index, stack, player) allow_metadata_inventory_put = function(pos, listname, index, stack, player)
@ -414,21 +413,10 @@ minetest.register_node("mcl_chests:"..basename.."_right", {
minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z) minetest.close_formspec(players[pl]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..p.x.."_"..p.y.."_"..p.z)
end end
minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 }) minetest.swap_node(p, { name = "mcl_chests:"..basename, param2 = param2 })
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local meta2 = meta
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for i=1,inv:get_size("main") do
local stack = inv:get_stack("main", i)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2:to_table())
end, end,
after_dig_node = drop_items_chest,
on_blast = on_chest_blast,
allow_metadata_inventory_move = protection_check_move, allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_take = protection_check_put_take,
allow_metadata_inventory_put = function(pos, listname, index, stack, player) allow_metadata_inventory_put = function(pos, listname, index, stack, player)
@ -903,8 +891,8 @@ for color, desc in pairs(boxtypes) do
return 0 return 0
end end
end, end,
_mcl_blast_resistance = 30, _mcl_blast_resistance = 6,
_mcl_hardness = 6, _mcl_hardness = 2,
}) })
if mod_doc and not is_canonical then if mod_doc and not is_canonical then