diff --git a/game_api.txt b/game_api.txt index bdb2450b..02ee58e0 100644 --- a/game_api.txt +++ b/game_api.txt @@ -241,6 +241,23 @@ tnt.register_tnt(definition) ^ Ignite TNT at position + +To make dropping items from node inventories easier, you can use the +following helper function from 'default': + +default.get_inventory_drops(pos, inventory, drops) + +^ Return drops from node inventory "inventory" in drops. + +* `pos` - the node position +* `inventory` - the name of the inventory (string) +* `drops` - an initialized list + +The function returns no values. The drops are returned in the `drops` +parameter, and drops is not reinitialized so you can call it several +times in a row to add more inventory items to it. + + Screwdriver API --------------- diff --git a/mods/bones/init.lua b/mods/bones/init.lua index afa56eca..661bbab8 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -123,6 +123,8 @@ minetest.register_node("bones:bones", { return true end end, + on_blast = function(pos) + end, }) local function may_replace(pos, player) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index c0ea1f5b..d0164cd6 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -110,6 +110,21 @@ minetest.register_abm({ }) +-- +-- optimized helper to put all items in an inventory into a drops list +-- +function default.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n+1] = stack:to_table() + n = n + 1 + end + end +end + -- -- Papyrus and cactus growing -- diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 4fb2071a..3047dc41 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -260,6 +260,15 @@ minetest.register_node("default:furnace", { local timer = minetest.get_node_timer(pos) timer:start(1.0) end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "src", drops) + default.get_inventory_drops(pos, "fuel", drops) + default.get_inventory_drops(pos, "dst", drops) + drops[#drops+1] = "default:furnace" + minetest.remove_node(pos) + return drops + end, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 36ae5861..506dd0ad 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1474,6 +1474,13 @@ minetest.register_node("default:chest", { " takes " .. stack:get_name() .. " from chest at " .. minetest.pos_to_string(pos)) end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "main", drops) + drops[#drops+1] = "default:chest" + minetest.remove_node(pos) + return drops + end, }) minetest.register_node("default:chest_locked", { @@ -1597,6 +1604,13 @@ minetest.register_node("default:bookshelf", { minetest.log("action", player:get_player_name() .. " takes stuff from bookshelf at " .. minetest.pos_to_string(pos)) end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "books", drops) + drops[#drops+1] = "default:bookshelf" + minetest.remove_node(pos) + return drops + end, }) local function register_sign(material, desc, def) diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index a8deeb0c..66b01f1a 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -55,7 +55,9 @@ local function eject_drops(drops, pos, radius) item:get_count(), item:get_stack_max())) rand_pos(pos, drop_pos, radius) - local obj = minetest.add_item(drop_pos, item:get_name() .. " " .. take) + local dropitem = ItemStack(item) + dropitem:set_count(take) + local obj = minetest.add_item(drop_pos, dropitem) if obj then obj:get_luaentity().collect = true obj:setacceleration({x = 0, y = -10, z = 0}) diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua index d5378919..165efbd5 100644 --- a/mods/vessels/init.lua +++ b/mods/vessels/init.lua @@ -48,6 +48,13 @@ minetest.register_node("vessels:shelf", { minetest.log("action", player:get_player_name() .. " takes stuff from vessels shelf at ".. minetest.pos_to_string(pos)) end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "vessels", drops) + drops[#drops+1] = "vessels:shelf" + minetest.remove_node(pos) + return drops + end, }) minetest.register_craft({