Containers drop stuff when mined

master
Wuzzy 2022-08-25 16:20:44 +02:00
parent b4df17d664
commit 390e03898a
5 changed files with 52 additions and 41 deletions

View File

@ -42,13 +42,8 @@ minetest.register_node(
inv:set_size("main", 8 * 4)
end,
-- Unlike other inventory nodes in this game, chests are NOT subject to protection.
-- This is done to allow something like "public chests" in protected areas.
-- To protect their belongings, players are supposed locked chests instead.
can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:is_empty("main")
on_destruct = function(pos)
item_drop.drop_items_from_container(pos, {"main"})
end,
write_name = function(pos, text)
--[[ TODO: Bring back container naming
@ -95,10 +90,8 @@ minetest.register_node(
allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_put = protection_check_put_take,
allow_metadata_inventory_take = protection_check_put_take,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
on_destruct = function(pos)
item_drop.drop_items_from_container(pos, {"main"})
end,
write_name = function(pos, text)
--[[ TODO: Bring back container naming

View File

@ -61,6 +61,15 @@ form_furnace = form_furnace .. "image[3.25,1.75;1,1;ui_arrow_bg.png^[transformR2
rp_formspec.register_page("rp_default:furnace_inactive", form_furnace)
local after_dig_node = function(pos, nodenode, oldmetadata, digger)
item_drop.drop_items_from_container_meta_table(pos, {"fuel", "src", "dst"}, oldmetadata)
end
local on_blast = function(pos)
item_drop.drop_items_from_container(pos, {"fuel", "src", "dst"})
minetest.remove_node(pos)
end
local check_put = function(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
@ -123,18 +132,8 @@ minetest.register_node(
allow_metadata_inventory_move = check_move,
allow_metadata_inventory_put = check_put,
allow_metadata_inventory_take = check_take,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("fuel") then
return false
elseif not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
after_dig_node = after_dig_node,
on_blast = on_blast,
})
minetest.register_node(
@ -163,18 +162,8 @@ minetest.register_node(
allow_metadata_inventory_move = check_move,
allow_metadata_inventory_put = check_put,
allow_metadata_inventory_take = check_take,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("fuel") then
return false
elseif not inv:is_empty("dst") then
return false
elseif not inv:is_empty("src") then
return false
end
return true
end,
after_dig_node = after_dig_node,
on_blast = on_blast,
})
local function swap_node(pos, name)

View File

@ -35,6 +35,38 @@ function item_drop.drop_item(pos, itemstack)
end
end
function item_drop.drop_items_from_container(pos, invlists)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
for l=1, #invlists do
local list = invlists[l]
for i=1, inv:get_size(list) do
local item = inv:get_stack(list, i)
if not item:is_empty() then
item_drop.drop_item(pos, item)
end
end
end
end
function item_drop.drop_items_from_container_meta_table(pos, invlists, meta_table)
if not meta_table or not meta_table.inventory then
return
end
for l=1, #invlists do
local list = invlists[l]
local list_table = meta_table.inventory[list]
if list_table then
for i=1, #list_table do
local item = ItemStack(list_table[i])
if not item:is_empty() then
item_drop.drop_item(pos, item)
end
end
end
end
end
-- Overwrite Minetest's item_drop function
minetest.item_drop = function(itemstack, dropper, pos)
local dropper_is_player = dropper and dropper:is_player()

View File

@ -305,11 +305,8 @@ minetest.register_node(
local inv = meta:get_inventory()
inv:set_size("main", 1)
end,
can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:is_empty("main")
on_destruct = function(pos)
item_drop.drop_items_from_container(pos, {"main"})
end,
allow_metadata_inventory_move = check_move,
allow_metadata_inventory_put = check_put,

View File

@ -1,3 +1,3 @@
name = rp_jewels
depends = rp_sounds, rp_default, rp_formspec, rp_crafting, rp_achievements
depends = rp_sounds, rp_default, rp_formspec, rp_crafting, rp_achievements, rp_item_drop
optional_depends = tt