123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- -- NOTE: `require` is not allowed with mod security on
- -- `dofile` with a return on the module is used instead
- generate_formspec_string = dofile(minetest.get_modpath("more_chests").."/utils/formspec.lua")
- local actions = dofile(minetest.get_modpath("more_chests").."/utils/actions.lua")
- local S = minetest.get_translator("more_chests")
- local function parse_action(value, default_getter)
- if value == false then -- model disabled this attribute
- return nil
- elseif value == nil then -- model wants the default attribute
- return default_getter()
- else -- model provided its own attribute
- return value
- end
- end
- function generate_chest_def(def)
- -- TODO assert def.size in ("big", "small")
- local out = {
- description = def.description,
- tiles = {
- def.tiles.top or def.tiles.side,
- def.tiles.top or def.tiles.side,
- def.tiles.side,
- def.tiles.side,
- def.tiles.side,
- def.tiles.front
- },
- paramtype2 = "facedir",
- legacy_facedir_simple = true,
- groups = {
- snappy=2,
- choppy=2,
- oddly_breakable_by_hand=2
- },
- sounds = def.sounds or default.node_sound_wood_defaults(),
- after_place_node = function(pos, placer)
- local meta = minetest.get_meta(pos)
- meta:set_string("owner", placer:get_player_name() or "")
- meta:set_string("infotext", S("@1 (owned by @2)", def.description, meta:get_string("owner")))
- end,
- on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- local formspec_str = def.formspec or generate_formspec_string(def.size, def.inventory_name or nil)
- meta:set_string("formspec", formspec_str)
- meta:set_string("infotext", def.description)
- meta:set_string("owner", "")
- if def.inventory_name == nil or def.inventory_name == "main" then
- local inv = meta:get_inventory()
- local chest_size = def.size == "big" and 14*5 or 8*4
- inv:set_size("main", chest_size)
- end
- end,
- can_dig = function(pos,player)
- local meta = minetest.get_meta(pos)
- local inv = meta:get_inventory()
- return inv:is_empty("main")
- end,
- }
- -- register log actions, NOTE passing an anonymous function to avoid getting the default if not necessary
- out.allow_metadata_inventory_move = parse_action(def.allow_metadata_inventory_move, function() actions.get_allow_metadata_inventory_move{def.type} end)
- out.allow_metadata_inventory_put = parse_action(def.allow_metadata_inventory_put, function() actions.get_allow_metadata_inventory_put{def.type} end)
- out.allow_metadata_inventory_take = parse_action(def.allow_metadata_inventory_take, function() actions.get_allow_metadata_inventory_take{def.type} end)
- out.on_metadata_inventory_move = parse_action(def.on_metadata_inventory_move, function() actions.get_on_metadata_inventory_move(def.type) end)
- out.on_metadata_inventory_put = parse_action(def.on_metadata_inventory_put, function() actions.get_on_metadata_inventory_put(def.type) end)
- out.on_metadata_inventory_take = parse_action(def.on_metadata_inventory_take, function() actions.get_on_metadata_inventory_take(def.type) end)
- -- if model is not a simple block handle node_box attribute
- if def.node_box then
- out.drawtype = "nodebox"
- out.node_box = {
- type = "fixed",
- fixed = def.node_box,
- }
- end
- -- add pipeworks compatibility, TODO needs proper testing
- if def.pipeworks_enabled == true then
- out.groups.tubedevice = 1
- out.groups.tubedevice_receiver = 1
- out.tube = {
- insert_object = function(pos, node, stack, direction)
- local meta = minetest.get_meta(pos)
- local inv = meta:get_inventory()
- return inv:add_item("main", stack)
- end,
- can_insert = function(pos, node, stack, direction)
- local meta = minetest.get_meta(pos)
- local inv = meta:get_inventory()
- return inv:room_for_item("main", stack)
- end,
- input_inventory = "main",
- connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}
- }
- end
- return out
- end
- return generate_chest_def
|