54b87e955d
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.
185 lines
5.1 KiB
Lua
185 lines
5.1 KiB
Lua
-- Minetest 0.4 mod: vessels
|
|
-- See README.txt for licensing and other information.
|
|
|
|
local vessels_shelf_formspec =
|
|
"size[8,7;]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
"list[context;vessels;0,0.3;8,2;]"..
|
|
"list[current_player;main;0,2.85;8,1;]"..
|
|
"list[current_player;main;0,4.08;8,3;8]"..
|
|
"listring[context;vessels]"..
|
|
"listring[current_player;main]"..
|
|
default.get_hotbar_bg(0,2.85)
|
|
|
|
minetest.register_node("vessels:shelf", {
|
|
description = "Vessels shelf",
|
|
tiles = {"default_wood.png", "default_wood.png", "vessels_shelf.png"},
|
|
is_ground_content = false,
|
|
groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", vessels_shelf_formspec)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("vessels", 8 * 2)
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
return inv:is_empty("vessels")
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
if minetest.get_item_group(stack:get_name(), "vessel") ~= 0 then
|
|
return stack:get_count()
|
|
end
|
|
return 0
|
|
end,
|
|
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
minetest.log("action", player:get_player_name() ..
|
|
" moves stuff in vessels shelf at ".. minetest.pos_to_string(pos))
|
|
end,
|
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
minetest.log("action", player:get_player_name() ..
|
|
" moves stuff to vessels shelf at ".. minetest.pos_to_string(pos))
|
|
end,
|
|
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
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({
|
|
output = 'vessels:shelf',
|
|
recipe = {
|
|
{'group:wood', 'group:wood', 'group:wood'},
|
|
{'group:vessel', 'group:vessel', 'group:vessel'},
|
|
{'group:wood', 'group:wood', 'group:wood'},
|
|
}
|
|
})
|
|
|
|
minetest.register_node("vessels:glass_bottle", {
|
|
description = "Glass Bottle (empty)",
|
|
drawtype = "plantlike",
|
|
tiles = {"vessels_glass_bottle.png"},
|
|
inventory_image = "vessels_glass_bottle_inv.png",
|
|
wield_image = "vessels_glass_bottle.png",
|
|
paramtype = "light",
|
|
is_ground_content = false,
|
|
walkable = false,
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
|
|
},
|
|
groups = {vessel=1,dig_immediate=3,attached_node=1},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
})
|
|
|
|
minetest.register_craft( {
|
|
output = "vessels:glass_bottle 10",
|
|
recipe = {
|
|
{ "default:glass", "", "default:glass" },
|
|
{ "default:glass", "", "default:glass" },
|
|
{ "", "default:glass", "" }
|
|
}
|
|
})
|
|
|
|
minetest.register_node("vessels:drinking_glass", {
|
|
description = "Drinking Glass (empty)",
|
|
drawtype = "plantlike",
|
|
tiles = {"vessels_drinking_glass.png"},
|
|
inventory_image = "vessels_drinking_glass_inv.png",
|
|
wield_image = "vessels_drinking_glass.png",
|
|
paramtype = "light",
|
|
is_ground_content = false,
|
|
walkable = false,
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
|
|
},
|
|
groups = {vessel=1,dig_immediate=3,attached_node=1},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
})
|
|
|
|
minetest.register_craft( {
|
|
output = "vessels:drinking_glass 14",
|
|
recipe = {
|
|
{ "default:glass", "", "default:glass" },
|
|
{ "default:glass", "", "default:glass" },
|
|
{ "default:glass", "default:glass", "default:glass" }
|
|
}
|
|
})
|
|
|
|
minetest.register_node("vessels:steel_bottle", {
|
|
description = "Heavy Steel Bottle (empty)",
|
|
drawtype = "plantlike",
|
|
tiles = {"vessels_steel_bottle.png"},
|
|
inventory_image = "vessels_steel_bottle_inv.png",
|
|
wield_image = "vessels_steel_bottle.png",
|
|
paramtype = "light",
|
|
is_ground_content = false,
|
|
walkable = false,
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
|
|
},
|
|
groups = {vessel=1,dig_immediate=3,attached_node=1},
|
|
sounds = default.node_sound_defaults(),
|
|
})
|
|
|
|
minetest.register_craft( {
|
|
output = "vessels:steel_bottle 5",
|
|
recipe = {
|
|
{ "default:steel_ingot", "", "default:steel_ingot" },
|
|
{ "default:steel_ingot", "", "default:steel_ingot" },
|
|
{ "", "default:steel_ingot", "" }
|
|
}
|
|
})
|
|
|
|
|
|
-- Make sure we can recycle them
|
|
|
|
minetest.register_craftitem("vessels:glass_fragments", {
|
|
description = "Pile of Glass Fragments",
|
|
inventory_image = "vessels_glass_fragments.png",
|
|
})
|
|
|
|
minetest.register_craft( {
|
|
type = "shapeless",
|
|
output = "vessels:glass_fragments",
|
|
recipe = {
|
|
"vessels:glass_bottle",
|
|
"vessels:glass_bottle",
|
|
},
|
|
})
|
|
|
|
minetest.register_craft( {
|
|
type = "shapeless",
|
|
output = "vessels:glass_fragments",
|
|
recipe = {
|
|
"vessels:drinking_glass",
|
|
"vessels:drinking_glass",
|
|
},
|
|
})
|
|
|
|
minetest.register_craft({
|
|
type = "cooking",
|
|
output = "default:glass",
|
|
recipe = "vessels:glass_fragments",
|
|
})
|
|
|
|
minetest.register_craft( {
|
|
type = "cooking",
|
|
output = "default:steel_ingot",
|
|
recipe = "vessels:steel_bottle",
|
|
})
|
|
|