Skip to content

Commit

Permalink
TNT: Add on_blast to all nodes with an inventory
Browse files Browse the repository at this point in the history
Adds a minor helper function that allows efficient retrieval of
several inventories from a node inventory. We use this helper to
quickly retrieve the items in chests, vessel shelves, book shelves
and furnaces, and return these with the nodes itself to the TNT caller.

The TNT caller then performs the entity physics, and we don't need
to do anything else.

We disable TNT doing anything with bones.

We expose a bug in the code that drops the items - metadata was lost
entirely. This patch corrects that by properly copying the metadata
and creating the drops list inclusive metadata.
  • Loading branch information
sofar authored and paramat committed Apr 26, 2016
1 parent f32a3ff commit 54b87e9
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 1 deletion.
17 changes: 17 additions & 0 deletions game_api.txt
Expand Up @@ -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
---------------

Expand Down
2 changes: 2 additions & 0 deletions mods/bones/init.lua
Expand Up @@ -123,6 +123,8 @@ minetest.register_node("bones:bones", {
return true
end
end,
on_blast = function(pos)
end,
})

local function may_replace(pos, player)
Expand Down
15 changes: 15 additions & 0 deletions mods/default/functions.lua
Expand Up @@ -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
--
Expand Down
9 changes: 9 additions & 0 deletions mods/default/furnace.lua
Expand Up @@ -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,
Expand Down
14 changes: 14 additions & 0 deletions mods/default/nodes.lua
Expand Up @@ -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", {
Expand Down Expand Up @@ -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)
Expand Down
4 changes: 3 additions & 1 deletion mods/tnt/init.lua
Expand Up @@ -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})
Expand Down
7 changes: 7 additions & 0 deletions mods/vessels/init.lua
Expand Up @@ -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({
Expand Down

0 comments on commit 54b87e9

Please sign in to comment.