local function get_inventory_auth_string(player, meta, pos, label) local name = player:get_player_name() local owner = meta:get_string("owner") local pos_str = minetest.pos_to_string(pos) return ("%s tried to access a locked %s belonging to %s at %s"):format(name, label, owner, pos_str) end local function has_locked_chest_privilege(meta, player) if player:get_player_name() ~= meta:get_string("owner") then return false end return true end local function get_allow_metadata_inventory_move(t) setmetatable(t, {__index={check_privs=has_locked_chest_privilege}}) local label, check_privs = t[1], t.check_privs return function(pos, from_list, from_index, to_list, to_index, count, player) local meta = minetest.get_meta(pos) if not check_privs(meta, player) then minetest.log("action", get_inventory_auth_string(player, meta, pos, label)) return 0 end return count end end local function get_allow_metadata_inventory_put(t) setmetatable(t, {__index={check_privs=has_locked_chest_privilege}}) local label, check_privs = t[1], t.check_privs return function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) if not check_privs(meta, player) then minetest.log("action", get_inventory_auth_string(player, meta, pos, label)) return 0 end return stack:get_count() end end local function get_allow_metadata_inventory_take(t) setmetatable(t, {__index={check_privs=has_locked_chest_privilege}}) local label, check_privs = t[1], t.check_privs return function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) if not check_privs(meta, player) then minetest.log("action", get_inventory_auth_string(player, meta, pos, label)) return 0 end return stack:get_count() end end local function get_inventory_action_string(player, pos, action, label) local name = player:get_player_name() local pos_str = minetest.pos_to_string(pos) return ("%s moves stuff %s locked %s at %s"):format(name, action, label, pos_str) end local function get_on_metadata_inventory_move(label) return function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", get_inventory_action_string(player, pos, "in", label) ) end end local function get_on_metadata_inventory_put(label) return function(pos, listname, index, stack, player) minetest.log("action", get_inventory_action_string(player, pos, "to", label)) end end local function get_on_metadata_inventory_take(label) return function(pos, listname, index, stack, player) minetest.log("action", get_inventory_action_string(player, pos, "from", label)) end end local actions = { has_locked_chest_privilege = has_locked_chest_privilege, get_allow_metadata_inventory_move = get_allow_metadata_inventory_move, get_allow_metadata_inventory_put = get_allow_metadata_inventory_put, get_allow_metadata_inventory_take = get_allow_metadata_inventory_take, get_on_metadata_inventory_move = get_on_metadata_inventory_move, get_on_metadata_inventory_put = get_on_metadata_inventory_put, get_on_metadata_inventory_take = get_on_metadata_inventory_take, } return actions