summaryrefslogtreecommitdiff
path: root/homedecor_common/inventory.lua
diff options
context:
space:
mode:
Diffstat (limited to 'homedecor_common/inventory.lua')
-rw-r--r--homedecor_common/inventory.lua189
1 files changed, 189 insertions, 0 deletions
diff --git a/homedecor_common/inventory.lua b/homedecor_common/inventory.lua
new file mode 100644
index 0000000..2a49228
--- /dev/null
+++ b/homedecor_common/inventory.lua
@@ -0,0 +1,189 @@
+
+local S = homedecor.gettext
+
+local default_can_dig = function(pos,player)
+ local meta = minetest.get_meta(pos)
+ return meta:get_inventory():is_empty("main")
+end
+
+local background = default.gui_bg .. default.gui_bg_img .. default.gui_slots
+local default_inventory_formspecs = {
+ ["4"]="size[8,6]".. background ..
+ "list[context;main;2,0;4,1;]" ..
+ "list[current_player;main;0,2;8,4;]" ..
+ "listring[]",
+
+ ["6"]="size[8,6]".. background ..
+ "list[context;main;1,0;6,1;]"..
+ "list[current_player;main;0,2;8,4;]" ..
+ "listring[]",
+
+ ["8"]="size[8,6]".. background ..
+ "list[context;main;0,0;8,1;]"..
+ "list[current_player;main;0,2;8,4;]" ..
+ "listring[]",
+
+ ["12"]="size[8,7]".. background ..
+ "list[context;main;1,0;6,2;]"..
+ "list[current_player;main;0,3;8,4;]" ..
+ "listring[]",
+
+ ["16"]="size[8,7]".. background ..
+ "list[context;main;0,0;8,2;]"..
+ "list[current_player;main;0,3;8,4;]" ..
+ "listring[]",
+
+ ["24"]="size[8,8]".. background ..
+ "list[context;main;0,0;8,3;]"..
+ "list[current_player;main;0,4;8,4;]" ..
+ "listring[]",
+
+ ["32"]="size[8,9]".. background ..
+ "list[context;main;0,0.3;8,4;]"..
+ "list[current_player;main;0,4.85;8,1;]"..
+ "list[current_player;main;0,6.08;8,3;8]"..
+ "listring[context;main]" ..
+ "listring[current_player;main]" ..
+ default.get_hotbar_bg(0,4.85),
+
+ ["50"]="size[10,10]".. background ..
+ "list[context;main;0,0;10,5;]"..
+ "list[current_player;main;1,6;8,4;]" ..
+ "listring[]",
+}
+
+local function get_formspec_by_size(size)
+ --TODO heuristic to use the "next best size"
+ local formspec = default_inventory_formspecs[tostring(size)]
+ return formspec or default_inventory_formspecs
+end
+
+----
+-- handle inventory setting
+-- inventory = {
+-- size = 16,
+-- formspec = …,
+-- locked = false,
+-- lockable = true,
+-- }
+--
+function homedecor.handle_inventory(name, def, original_def)
+ local inventory = def.inventory
+ if not inventory then return end
+ def.inventory = nil
+
+ if inventory.size then
+ local on_construct = def.on_construct
+ def.on_construct = function(pos)
+ local size = inventory.size
+ local meta = minetest.get_meta(pos)
+ meta:get_inventory():set_size("main", size)
+ meta:set_string("formspec", inventory.formspec or get_formspec_by_size(size))
+ if on_construct then on_construct(pos) end
+ end
+ end
+
+ def.can_dig = def.can_dig or default_can_dig
+ def.on_metadata_inventory_move = def.on_metadata_inventory_move or function(pos, from_list, from_index, to_list, to_index, count, player)
+ minetest.log("action", S("@1 moves stuff in @2 at @3",
+ player:get_player_name(), name, minetest.pos_to_string(pos)
+ ))
+ end
+ def.on_metadata_inventory_put = def.on_metadata_inventory_put or function(pos, listname, index, stack, player)
+ minetest.log("action", S("@1 moves @2 to @3 at @4",
+ player:get_player_name(), stack:get_name(), name, minetest.pos_to_string(pos)
+ ))
+ end
+ def.on_metadata_inventory_take = def.on_metadata_inventory_take or function(pos, listname, index, stack, player)
+ minetest.log("action", S("@1 takes @2 from @3 at @4",
+ player:get_player_name(), stack:get_name(), name, minetest.pos_to_string(pos)
+ ))
+ end
+
+ local locked = inventory.locked
+ if locked then
+ local after_place_node = def.after_place_node
+ def.after_place_node = function(pos, placer)
+ local meta = minetest.get_meta(pos)
+ local owner = placer:get_player_name() or ""
+
+ meta:set_string("owner", owner)
+ meta:set_string("infotext", S("@1 (owned by @2)", def.infotext or def.description, owner))
+ return after_place_node and after_place_node(pos, placer)
+ end
+
+ local allow_move = def.allow_metadata_inventory_move
+ def.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+ local meta = minetest.get_meta(pos)
+ local owner = meta:get_string("owner")
+ local playername = player:get_player_name()
+
+ if playername == owner or
+ minetest.check_player_privs(playername, "protection_bypass") then
+ return allow_move and
+ allow_move(pos, from_list, from_index, to_list, to_index, count, player) or
+ count
+ end
+
+ minetest.log("action", S("@1 tried to access a @2 belonging to @3 at @4",
+ playername, name, owner, minetest.pos_to_string(pos)
+ ))
+ return 0
+ end
+
+ local allow_put = def.allow_metadata_inventory_put
+ def.allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta(pos)
+ local owner = meta:get_string("owner")
+ local playername = player:get_player_name()
+
+ if playername == owner or
+ minetest.check_player_privs(playername, "protection_bypass") then
+ return allow_put and allow_put(pos, listname, index, stack, player) or
+ stack:get_count()
+ end
+
+ minetest.log("action", S("@1 tried to access a @2 belonging to @3 at @4",
+ playername, name, owner, minetest.pos_to_string(pos)
+ ))
+ return 0
+ end
+
+ local allow_take = def.allow_metadata_inventory_take
+ def.allow_metadata_inventory_take = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta(pos)
+ local owner = meta:get_string("owner")
+ local playername = player:get_player_name()
+
+ if playername == owner or
+ minetest.check_player_privs(playername, "protection_bypass") then
+ return allow_take and allow_take(pos, listname, index, stack, player) or
+ stack:get_count()
+ end
+
+ minetest.log("action", S("@1 tried to access a @2 belonging to @3 at @4",
+ playername, name, owner, minetest.pos_to_string(pos)
+ ))
+ return 0
+ end
+ end
+
+ local lockable = inventory.lockable
+ if lockable then
+ local locked_def = table.copy(original_def)
+ locked_def.description = S("@1 (Locked)", def.description or name)
+
+ local locked_inventory = locked_def.inventory
+ locked_inventory.locked = true
+ locked_inventory.lockable = nil -- avoid loops of locked locked stuff
+
+ local locked_name = name .. "_locked"
+ homedecor.register(locked_name, locked_def)
+ minetest.register_craft({
+ type = "shapeless",
+ output = "homedecor:" .. locked_name,
+ recipe = { "homedecor:" .. name, "basic_materials:padlock" }
+ })
+ end
+
+end