From e35935a1190d20d2e52c44bb8fb5955bd10e9160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikita=20Wi=C5=9Bniewski?= Date: Sat, 22 Jun 2024 16:35:52 +0700 Subject: [PATCH] Refactor mcl_chests.register_chest AGAIN + cleanup Now you can define custom groups for the chests, as shown in the trapped chests example (now they show up under "Mechanisms" tab in creative!). I'm a bit suspicious of the new return-wrapped functions, as in *they might break under some circumstances I didn't observe*. It will require some heavy testing to make sure nothing crashes in the future. Also, `on_rightclick` for double chests is something I really want to return-wrap as well, but failed to do so. :shrug: --- mods/ITEMS/mcl_chests/api.lua | 531 +++++++++++++++---------------- mods/ITEMS/mcl_chests/chests.lua | 1 + mods/ITEMS/mcl_chests/init.lua | 15 +- 3 files changed, 262 insertions(+), 285 deletions(-) diff --git a/mods/ITEMS/mcl_chests/api.lua b/mods/ITEMS/mcl_chests/api.lua index 42e0a901d..0eb313c25 100644 --- a/mods/ITEMS/mcl_chests/api.lua +++ b/mods/ITEMS/mcl_chests/api.lua @@ -10,11 +10,23 @@ local math = math local sf = string.format +-- Recursively merge tables with eachother +local function table_merge(tbl, ...) + local t = table.copy(tbl) + for k,v in pairs(...) do + if type(t[k]) == "table" and type(v) == "table" then + table_merge(t[k], v) + else + t[k] = v + end + end + return t +end + -- Chest Entity -- ============ --- This is necessary to show the chest as an animated mesh, as Minetest doesn't --- support assigning animated meshes to nodes directly. We're bypassing this --- limitation by giving each chest its own entity, and making the chest node +-- This is necessary to show the chest as an animated mesh, as Minetest doesn't support assigning animated meshes to +-- nodes directly. We're bypassing this limitation by giving each chest its own entity, and making the chest node -- itself fully transparent. local animated_chests = (minetest.settings:get_bool("animated_chests") ~= false) local entity_animations = { @@ -154,7 +166,8 @@ local function create_entity(pos, node_name, textures, param2, double, sound_pre if obj and obj:get_pos() then return obj:get_luaentity() else - minetest.log("warning", "[mcl_chests] Failed to create entity at " .. (entity_pos and minetest.pos_to_string(entity_pos, 1) or "nil")) + minetest.log("warning", "[mcl_chests] Failed to create entity at " .. + (entity_pos and minetest.pos_to_string(entity_pos, 1) or "nil")) end end mcl_chests.create_entity = create_entity @@ -209,9 +222,8 @@ local function player_chest_open(player, pos, node_name, textures, param2, doubl } if animated_chests then local dir = minetest.facedir_to_dir(param2) - find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, shulker and "shulker" or "chest", - dir): - open(name) + find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, + shulker and "shulker" or "chest", dir):open(name) end end mcl_chests.player_chest_open = player_chest_open @@ -228,7 +240,7 @@ local function protection_check_move(pos, from_list, from_index, to_list, to_ind end mcl_chests.protection_check_move = protection_check_move -local function protection_check_put_take(pos, listname, index, stack, player) +local function protection_check_take(pos, listname, index, stack, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then minetest.record_protection_violation(pos, name) @@ -237,7 +249,29 @@ local function protection_check_put_take(pos, listname, index, stack, player) return stack:get_count() end end -mcl_chests.protection_check_put_take = protection_check_put_take +mcl_chests.protection_check_put_take = protection_check_take + +-- Logging functions +local function log_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name() .. + " moves stuff to chest at " .. minetest.pos_to_string(pos)) +end + +local function log_inventory_put(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves stuff to chest at " .. minetest.pos_to_string(pos)) + -- BEGIN OF LISTRING WORKAROUND + if listname == "input" then + local inv = minetest.get_inventory({ type = "node", pos = pos }) + inv:add_item("main", stack) + end + -- END OF LISTRING WORKAROUND +end + +local function log_inventory_take(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " takes stuff from chest at " .. minetest.pos_to_string(pos)) +end -- To be called when a chest is closed (only relevant for trapped chest atm) local function chest_update_after_close(pos) @@ -337,7 +371,7 @@ local function limit_put_list(stack, list) end local function limit_put(stack, inv1, inv2) - local leftover = ItemStack(stack) + local leftover = ItemStack(staick) leftover = limit_put_list(leftover, inv1:get_list("main")) leftover = limit_put_list(leftover, inv2:get_list("main")) return stack:get_count() - leftover:get_count() @@ -353,6 +387,108 @@ local function close_forms(canonical_basename, pos) end end +-- Functions used in double chest registration code +-- ================================================ +-- The `return function` wrapping is necessary to avoid stacking up parameters. +-- `side` is either "left" or "right". +local function hopper_pull_double(side) return function(pos, hop_pos, hop_inv, hop_list) + local node = minetest.get_node(pos) + local pos_other = get_double_container_neighbor_pos(pos, node.param2, side) + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + + local stack_id = mcl_util.select_stack(inv_other, "main", hop_inv, hop_list) + if stack_id ~= nil then + return inv_other, "main", stack_id + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + stack_id = mcl_util.select_stack(inv, "main", hop_inv, hop_list) + return inv, "main", stack_id +end end + +local function hopper_push_double(side) return function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main", nil, 1) + if stack_id ~= nil then + return inv, "main", stack_id + end + + local node = minetest.get_node(pos) + local pos_other = get_double_container_neighbor_pos(pos, node.param2, side) + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main", nil, 1) + return inv_other, "main", stack_id +end end + +local function construct_double_chest(side, names) return function(pos) + local n = minetest.get_node(pos) + local param2 = n.param2 + local p = get_double_container_neighbor_pos(pos, param2, side) + -- Turn into a small chest if the neighbor is gone + if not p or minetest.get_node(p).name ~= names[side].cr then + n.name = names.small.a + minetest.swap_node(pos, n) + end +end end + +local function destruct_double_chest(side, names, canonical_basename, small_textures) return function(pos) + local n = minetest.get_node(pos) + if n.name == names.small.a then + return + end + + close_forms(canonical_basename, pos) + + local param2 = n.param2 + local p = get_double_container_neighbor_pos(pos, param2, side) + if not p or minetest.get_node(p).name ~= names[side].r then + return + end + close_forms(canonical_basename, p) + + minetest.swap_node(p, { name = names.small.a, param2 = param2 }) + create_entity(p, names.small.a, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") +end end + +-- Small chests use `protection_check_take` for both put and take actions. +local function protection_check_put(side) return function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + -- BEGIN OF LISTRING WORKAROUND + elseif listname == "input" then + local other_pos = get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, side) + local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) + local inv = minetest.get_inventory({ type = "node", pos = pos }) + return limit_put(stack, other_inv, inv) + -- END OF LISTRING WORKAROUND + else + return stack:get_count() + end +end end + +local function log_inventory_put_double(side) return function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves stuff to chest at " .. minetest.pos_to_string(pos)) + -- BEGIN OF LISTRING WORKAROUND + if listname == "input" then + local inv = minetest.get_inventory({ type = "node", pos = pos }) + local other_pos = get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, side) + local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) + + inv:set_stack("input", 1, nil) + + double_chest_add_item(inv, other_inv, "main", stack) + end + -- END OF LISTRING WORKAROUND +end end + -- This is a helper function to register regular chests (both small and double variants). -- Some parameters here are only utilized by trapped chests. function mcl_chests.register_chest(basename, d) @@ -364,20 +500,75 @@ function mcl_chests.register_chest(basename, d) else d.drop = "mcl_chests:" .. d.drop end + + local drop_items_chest = mcl_util.drop_items_from_meta_container("main") + + if not d.groups then d.groups = {} end + + local on_rightclick_side = { + left = d.on_rightclick_left, + right = d.on_rightclick_right + } + -- The basename of the "canonical" version of the node, if set (e.g.: trapped_chest_on → trapped_chest). -- Used to get a shared formspec ID and to swap the node back to the canonical version in on_construct. if not d.canonical_basename then d.canonical_basename = basename end - local drop_items_chest = mcl_util.drop_items_from_meta_container("main") + -- Names table + -- =========== + -- Accessed through names["kind"].x (names.kind.x), where x can be: + -- a = "actual" + -- c = canonical + -- r = reverse (only for double chests) + -- cr = canonical, reverse (only for double chests) + local names = { + small = { + a = "mcl_chests:" .. basename .. "_small", + c = "mcl_chests:" .. d.canonical_basename .. "_small", + }, + left = { + a = "mcl_chests:" .. basename .. "_left", + c = "mcl_chests:" .. d.canonical_basename .. "_left", + }, + right = { + a = "mcl_chests:" .. basename .. "_right", + c = "mcl_chests:" .. d.canonical_basename .. "_right", + }, + } + names.left.r = names.right.a + names.right.r = names.left.a + names.left.cr = names.right.c + names.right.cr = names.left.c - local small_name = "mcl_chests:" .. basename .. "_small" local small_textures = d.tiles.small - local left_name = "mcl_chests:" .. basename .. "_left" - local right_name = "mcl_chests:" .. basename .. "_right" local double_textures = d.tiles.double + -- Construct groups + local groups_inv = table_merge({ deco_block = 1 }, d.groups) + local groups_small = table_merge(groups_inv, { + handy = 1, + axey = 1, + container = 2, + deco_block = 1, + material_wood = 1, + flammable = -1, + chest_entity = 1, + not_in_creative_inventory = 1 + }, d.groups) + local groups_left = table_merge(groups_small, { + double_chest = 1 + }, d.groups) + local groups_right = table_merge(groups_small, { + -- In a double chest, the entity is assigned to the left side, but not the right one. + chest_entity = 0, + double_chest = 2 + }, d.groups) + + + + -- Register minetest.register_node("mcl_chests:" .. basename, { description = d.desc, _tt_help = d.tt_help, @@ -391,10 +582,10 @@ function mcl_chests.register_chest(basename, d) paramtype = "light", paramtype2 = "facedir", sounds = d.sounds, - groups = { deco_block = 1 }, + groups = groups_inv, on_construct = function(pos, node) local node = minetest.get_node(pos) - node.name = small_name + node.name = names.small.a minetest.set_node(pos, node) end, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -402,7 +593,7 @@ function mcl_chests.register_chest(basename, d) end, }) - minetest.register_node(small_name, { + minetest.register_node(names.small.a, { description = d.desc, _tt_help = d.tt_help, _doc_items_longdesc = d.longdesc, @@ -422,16 +613,7 @@ function mcl_chests.register_chest(basename, d) paramtype = "light", paramtype2 = "facedir", drop = d.drop, - groups = { - handy = 1, - axey = 1, - container = 2, - deco_block = 1, - material_wood = 1, - flammable = -1, - chest_entity = 1, - not_in_creative_inventory = 1 - }, + groups = groups_small, is_ground_content = false, sounds = d.sounds, on_construct = function(pos) @@ -465,22 +647,22 @@ function mcl_chests.register_chest(basename, d) -- Combine into a double chest if neighbouring another small chest if minetest.get_node(get_double_container_neighbor_pos(pos, param2, "right")).name == - small_name then - minetest.swap_node(pos, { name = right_name, param2 = param2 }) + names.small.a then + minetest.swap_node(pos, { name = names.right.a, param2 = param2 }) local p = get_double_container_neighbor_pos(pos, param2, "right") - minetest.swap_node(p, { name = left_name, param2 = param2 }) - create_entity(p, left_name, double_textures, param2, true, "default_chest", + minetest.swap_node(p, { name = names.left.a, param2 = param2 }) + create_entity(p, names.left.a, double_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") elseif minetest.get_node(get_double_container_neighbor_pos(pos, param2, "left")).name == - small_name then - minetest.swap_node(pos, { name = left_name, param2 = param2 }) - create_entity(pos, left_name, double_textures, param2, true, "default_chest", + names.small.a then + minetest.swap_node(pos, { name = names.left.a, param2 = param2 }) + create_entity(pos, names.left.a, double_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") local p = get_double_container_neighbor_pos(pos, param2, "left") - minetest.swap_node(p, { name = right_name, param2 = param2 }) + minetest.swap_node(p, { name = names.right.a, param2 = param2 }) else - minetest.swap_node(pos, { name = small_name, param2 = param2 }) - create_entity(pos, small_name, small_textures, param2, false, "default_chest", + minetest.swap_node(pos, { name = names.small.a, param2 = param2 }) + create_entity(pos, names.small.a, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") end end, @@ -490,26 +672,11 @@ function mcl_chests.register_chest(basename, d) after_dig_node = drop_items_chest, on_blast = on_chest_blast, allow_metadata_inventory_move = protection_check_move, - allow_metadata_inventory_take = protection_check_put_take, - allow_metadata_inventory_put = protection_check_put_take, - 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 chest 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 chest at " .. minetest.pos_to_string(pos)) - -- BEGIN OF LISTRING WORKAROUND - if listname == "input" then - local inv = minetest.get_inventory({ type = "node", pos = pos }) - inv:add_item("main", stack) - end - -- END OF LISTRING WORKAROUND - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes stuff from chest at " .. minetest.pos_to_string(pos)) - end, + allow_metadata_inventory_take = protection_check_take, + allow_metadata_inventory_put = protection_check_take, + on_metadata_inventory_move = log_inventory_move, + on_metadata_inventory_put = log_inventory_put, + on_metadata_inventory_take = log_inventory_take, _mcl_blast_resistance = d.hardness, _mcl_hardness = d.hardness, @@ -550,7 +717,7 @@ function mcl_chests.register_chest(basename, d) d.on_rightclick(pos, node, clicker) end - player_chest_open(clicker, pos, small_name, small_textures, node.param2, false, "default_chest", + player_chest_open(clicker, pos, names.small.a, small_textures, node.param2, false, "default_chest", "mcl_chests_chest") end, @@ -561,7 +728,7 @@ function mcl_chests.register_chest(basename, d) on_rotate = simple_rotate, }) - minetest.register_node(left_name, { + minetest.register_node(names.left.a, { drawtype = "nodebox", node_box = { type = "fixed", @@ -575,93 +742,23 @@ function mcl_chests.register_chest(basename, d) _chest_entity_animation_type = "chest", paramtype = "light", paramtype2 = "facedir", - groups = { - handy = 1, - axey = 1, - container = 2, - not_in_creative_inventory = 1, - material_wood = 1, - flammable = -1, - chest_entity = 1, - double_chest = 1 - }, + groups = groups_left, drop = d.drop, is_ground_content = false, sounds = d.sounds, - on_construct = function(pos) - local n = minetest.get_node(pos) - local param2 = n.param2 - local p = get_double_container_neighbor_pos(pos, param2, "left") - if not p or minetest.get_node(p).name ~= "mcl_chests:" .. d.canonical_basename .. "_right" then - n.name = "mcl_chests:" .. d.canonical_basename .. "_small" - minetest.swap_node(pos, n) - end - create_entity(pos, left_name, double_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") - end, + on_construct = construct_double_chest("left", names), after_place_node = function(pos, placer, itemstack, pointed_thing) minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) end, - on_destruct = function(pos) - local n = minetest.get_node(pos) - if n.name == small_name then - return - end - - close_forms(d.canonical_basename, pos) - - local param2 = n.param2 - local p = get_double_container_neighbor_pos(pos, param2, "left") - if not p or minetest.get_node(p).name ~= "mcl_chests:" .. basename .. "_right" then - return - end - close_forms(d.canonical_basename, p) - - minetest.swap_node(p, { name = small_name, param2 = param2 }) - create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") - end, + on_destruct = destruct_double_chest("left", names, d.canonical_basename, small_textures), after_dig_node = drop_items_chest, on_blast = on_chest_blast, allow_metadata_inventory_move = protection_check_move, - allow_metadata_inventory_take = protection_check_put_take, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - -- BEGIN OF LISTRING WORKAROUND - elseif listname == "input" then - local inv = minetest.get_inventory({ type = "node", pos = pos }) - local other_pos = get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") - local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) - return limit_put(stack, inv, other_inv) - -- END OF LISTRING WORKAROUND - else - return stack:get_count() - end - 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 chest 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 chest at " .. minetest.pos_to_string(pos)) - -- BEGIN OF LISTRING WORKAROUND - if listname == "input" then - local inv = minetest.get_inventory({ type = "node", pos = pos }) - local other_pos = get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") - local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) - - inv:set_stack("input", 1, nil) - - double_chest_add_item(inv, other_inv, "main", stack) - end - -- END OF LISTRING WORKAROUND - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes stuff from chest at " .. minetest.pos_to_string(pos)) - end, + allow_metadata_inventory_take = protection_check_take, + allow_metadata_inventory_put = protection_check_put("left"), + on_metadata_inventory_move = log_inventory_move, + on_metadata_inventory_put = log_inventory_put_double("left"), + on_metadata_inventory_take = log_inventory_take, _mcl_blast_resistance = d.hardness, _mcl_hardness = d.hardness, @@ -721,46 +818,16 @@ function mcl_chests.register_chest(basename, d) d.on_rightclick_left(pos, node, clicker) end - player_chest_open(clicker, pos, left_name, double_textures, node.param2, true, "default_chest", + player_chest_open(clicker, pos, names.left.a, double_textures, node.param2, true, "default_chest", "mcl_chests_chest") end, mesecons = d.mesecons, on_rotate = no_rotate, - _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - local stack_id = mcl_util.select_stack(inv, "main", hop_inv, hop_list) - if stack_id ~= nil then - return inv, "main", stack_id - end - - local node = minetest.get_node(pos) - local pos_other = get_double_container_neighbor_pos(pos, node.param2, "left") - local meta_other = minetest.get_meta(pos_other) - local inv_other = meta_other:get_inventory() - stack_id = mcl_util.select_stack(inv_other, "main", hop_inv, hop_list) - return inv_other, "main", stack_id - end, - _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main", nil, 1) - if stack_id ~= nil then - return inv, "main", stack_id - end - - local node = minetest.get_node(pos) - local pos_other = get_double_container_neighbor_pos(pos, node.param2, "left") - local meta_other = minetest.get_meta(pos_other) - local inv_other = meta_other:get_inventory() - stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main", nil, 1) - return inv_other, "main", stack_id - end, + _mcl_hoppers_on_try_pull = hopper_pull_double("left"), + _mcl_hoppers_on_try_push = hopper_push_double("left"), }) - minetest.register_node(right_name, { + minetest.register_node(names.right.a, { drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -770,91 +837,23 @@ function mcl_chests.register_chest(basename, d) }, tiles = { "blank.png^[resize:16x16" }, use_texture_alpha = "clip", - groups = { - handy = 1, - axey = 1, - container = 2, - not_in_creative_inventory = 1, - material_wood = 1, - flammable = -1, - double_chest = 2 - }, + groups = groups_right, drop = d.drop, is_ground_content = false, sounds = d.sounds, - on_construct = function(pos) - local n = minetest.get_node(pos) - local param2 = n.param2 - local p = get_double_container_neighbor_pos(pos, param2, "right") - if not p or minetest.get_node(p).name ~= left_name then - n.name = small_name - minetest.swap_node(pos, n) - end - end, + on_construct = construct_double_chest("right", names), after_place_node = function(pos, placer, itemstack, pointed_thing) minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) end, - on_destruct = function(pos) - local n = minetest.get_node(pos) - if n.name == small_name then - return - end - - close_forms(d.canonical_basename, pos) - - local param2 = n.param2 - local p = get_double_container_neighbor_pos(pos, param2, "right") - if not p or minetest.get_node(p).name ~= left_name then - return - end - close_forms(d.canonical_basename, p) - - minetest.swap_node(p, { name = small_name, param2 = param2 }) - create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") - end, + on_destruct = destruct_double_chest("right", names, d.canonical_basename, small_textures), after_dig_node = drop_items_chest, on_blast = on_chest_blast, allow_metadata_inventory_move = protection_check_move, - allow_metadata_inventory_take = protection_check_put_take, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - -- BEGIN OF LISTRING WORKAROUND - elseif listname == "input" then - local other_pos = get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") - local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) - local inv = minetest.get_inventory({ type = "node", pos = pos }) - return limit_put(stack, other_inv, inv) - -- END OF LISTRING WORKAROUND - else - return stack:get_count() - end - 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 chest 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 chest at " .. minetest.pos_to_string(pos)) - -- BEGIN OF LISTRING WORKAROUND - if listname == "input" then - local other_pos = get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") - local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) - local inv = minetest.get_inventory({ type = "node", pos = pos }) - - inv:set_stack("input", 1, nil) - - double_chest_add_item(other_inv, inv, "main", stack) - end - -- END OF LISTRING WORKAROUND - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes stuff from chest at " .. minetest.pos_to_string(pos)) - end, + allow_metadata_inventory_take = protection_check_take, + allow_metadata_inventory_put = protection_check_put("right"), + on_metadata_inventory_move = log_inventory_move, + on_metadata_inventory_put = log_inventory_put_double("right"), + on_metadata_inventory_take = log_inventory_take, _mcl_blast_resistance = d.hardness, _mcl_hardness = d.hardness, @@ -919,43 +918,13 @@ function mcl_chests.register_chest(basename, d) end, mesecons = d.mesecons, on_rotate = no_rotate, - _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) - local node = minetest.get_node(pos) - local pos_other = get_double_container_neighbor_pos(pos, node.param2, "right") - local meta_other = minetest.get_meta(pos_other) - local inv_other = meta_other:get_inventory() - - local stack_id = mcl_util.select_stack(inv_other, "main", hop_inv, hop_list) - if stack_id ~= nil then - return inv_other, "main", stack_id - end - - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - stack_id = mcl_util.select_stack(inv, "main", hop_inv, hop_list) - return inv, "main", stack_id - end, - _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) - local node = minetest.get_node(pos) - local pos_other = get_double_container_neighbor_pos(pos, node.param2, "right") - local meta_other = minetest.get_meta(pos_other) - local inv_other = meta_other:get_inventory() - - local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main", nil, 1) - if stack_id ~= nil then - return inv_other, "main", stack_id - end - - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main", nil, 1) - return inv, "main", stack_id - end, + _mcl_hoppers_on_try_pull = hopper_pull_double("right"), + _mcl_hoppers_on_try_push = hopper_push_double("right"), }) if doc then - doc.add_entry_alias("nodes", small_name, "nodes", left_name) - doc.add_entry_alias("nodes", small_name, "nodes", right_name) + doc.add_entry_alias("nodes", names.small.a, "nodes", names.left.a) + doc.add_entry_alias("nodes", names.small.a, "nodes", names.right.a) end end diff --git a/mods/ITEMS/mcl_chests/chests.lua b/mods/ITEMS/mcl_chests/chests.lua index 0215dc825..11e0e2942 100644 --- a/mods/ITEMS/mcl_chests/chests.lua +++ b/mods/ITEMS/mcl_chests/chests.lua @@ -42,6 +42,7 @@ mcl_chests.register_chest("trapped_chest", { tt_help = S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest") .. "\n" .. S("Emits a redstone signal when opened"), tiles = traptiles, + groups = { mesecon = 2 }, sounds = mcl_sounds.node_sound_wood_defaults(), hardness = 2.5, hidden = false, diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 3ca1cf4da..741a3a523 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -78,9 +78,13 @@ minetest.register_lbm({ minetest.register_lbm({ label = "Replace old chest nodes", name = "mcl_chests:replace_old", - nodenames = { "mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", + nodenames = { + "mcl_chests:chest", + "mcl_chests:trapped_chest", + "mcl_chests:trapped_chest_on", "mcl_chests:ender_chest", - "group:old_shulker_box_node" }, + "group:old_shulker_box_node" + }, run_at_every_load = true, action = function(pos, node) local node_name = node.name @@ -102,8 +106,11 @@ minetest.register_lbm({ minetest.register_lbm({ label = "Disable active trapped chests", name = "mcl_chests:reset_trapped_chests", - nodenames = { "mcl_chests:trapped_chest_on_small", "mcl_chests:trapped_chest_on_left", - "mcl_chests:trapped_chest_on_right" }, + nodenames = { + "mcl_chests:trapped_chest_on_small", + "mcl_chests:trapped_chest_on_left", + "mcl_chests:trapped_chest_on_right" + }, run_at_every_load = true, action = function(pos, node) minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " .. minetest.pos_to_string(pos))