diff --git a/.luacheckrc b/.luacheckrc index a31b01a..0c6c352 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,2 +1,2 @@ -read_globals = {"minetest", "table", "default", "pipeworks"} +read_globals = {"minetest", "table", "vector", "default", "hopper", "pipeworks"} globals = {"connected_chests"} diff --git a/init.lua b/init.lua index 6aa60d6..98490b9 100644 --- a/init.lua +++ b/init.lua @@ -1,3 +1,6 @@ +-- for translation +local S = minetest.get_translator("connected_chests") + -- param_tab maps the x and z offset to a param2 value local param_tab = { ["-1 0"] = 0, @@ -136,6 +139,8 @@ end connected_chests = {chestdata = chestdata} --[[ connected_chests.register_chest(, { + description = , -- The name of the connected chest as shown to the + -- player, i.e. the node metadata infotext get_formspec = function(metatable, pos) return end, @@ -156,6 +161,13 @@ function connected_chests.register_chest(fromname, data) data.left = name_left data.right = name_right + local description = data.description + if not description then + minetest.log("deprecated", + "Missing connected chest description for " .. fromname) + description = "Big " .. minetest.registered_nodes[fromname].description + end + -- executed when connecting the chest data.on_connect = function(pu, pa, par, metatable) minetest.add_node(pu, {name=name_left, param2=par}) @@ -164,7 +176,7 @@ function connected_chests.register_chest(fromname, data) if not data.add_open_chest then metatable.fields.formspec = data.get_formspec(metatable, pu) end - metatable.fields.infotext = "Big " .. metatable.fields.infotext + metatable.fields.infotext = description local meta = minetest.get_meta(pu) meta:from_table(metatable) local inv = meta:get_inventory() @@ -215,7 +227,7 @@ function connected_chests.register_chest(fromname, data) local inside_texture - chest.description = "Big " .. chest.description + chest.description = description chest.groups = table.copy(chest.groups) chest.groups.not_in_creative_inventory = 1 chest.legacy_facedir_simple = nil @@ -365,14 +377,6 @@ function connected_chests.register_chest(fromname, data) end end - --~ def_opened.tiles[1] = "default_mese.png" -- top, passt - --~ def_opened.tiles[2] = "default_wood.png" -- bottom - --~ def_opened.tiles[3] = "default_stone.png" -- right and left side or so - --~ def_opened.tiles[4] = "default_obsidian.png" -- back side - - --~ def_opened.tiles[5] = "default_cobble.png" -- front side - --~ def_opened.tiles[6] = "default_leaves.png" -- inside - -- fix right side, somehow def_opened.tiles[4] = def_opened.tiles[3] def_opened.tiles[4].name = def_opened.tiles[4].name .. "^[transformFX" @@ -515,6 +519,7 @@ end) local chest_lid_obstructed = default.chest and default.chest.chest_lid_obstructed connected_chests.register_chest("default:chest", { + description = S("Big Chest"), add_open_chest = true, on_rightclick = function(pos, _, player) minetest.sound_play("default_chest_open", @@ -556,6 +561,7 @@ connected_chests.register_chest("default:chest", { }) connected_chests.register_chest("default:chest_locked", { + description = S("Big Locked Chest"), lock = true, add_open_chest = true, on_rightclick = function(pos, _, player) @@ -618,7 +624,8 @@ if not chest_lid_obstructed then (def.drawtype == "airlike" or def.drawtype == "signlike" or def.drawtype == "torchlike" or - (def.drawtype == "nodebox" and def.paramtype2 == "wallmounted")) then + (def.drawtype == "nodebox" + and def.paramtype2 == "wallmounted")) then return false end return true @@ -631,7 +638,80 @@ minetest.register_alias("connected_chests:chest_left", "default:chest_connected_left") minetest.register_alias("connected_chests:chest_right", "default:chest_connected_right") -minetest.register_alias("connected_chests:chest_left_locked", "default:chest_locked_connected_left") -minetest.register_alias("connected_chests:chest_right_locked", "default:chest_locked_connected_right") -minetest.register_alias("connected_chests:chest_locked_left", "default:chest_locked_connected_left") -minetest.register_alias("connected_chests:chest_locked_right", "default:chest_locked_connected_right") +minetest.register_alias("connected_chests:chest_left_locked", + "default:chest_locked_connected_left") +minetest.register_alias("connected_chests:chest_right_locked", + "default:chest_locked_connected_right") +minetest.register_alias("connected_chests:chest_locked_left", + "default:chest_locked_connected_left") +minetest.register_alias("connected_chests:chest_locked_right", + "default:chest_locked_connected_right") + +if minetest.global_exists("hopper") and hopper.set_extra_container_info then + local function get_inventory(chest_right_pos) + local node_right = minetest.get_node(chest_right_pos) + if node_right.param2 > 3 then + -- The right connected chest node has an invalid param2 value + -- Cannot determine the inventory + return + end + local x, z = unpack(param_tab2[node_right.param2]) + local chest_left_pos = {x=chest_right_pos.x+x, y=chest_right_pos.y, + z=chest_right_pos.z+z} + local node_left = minetest.get_node(chest_left_pos) + if node_left.name ~= "default:chest_connected_left" + and node_left.name ~= "default:chest_connected_left_open" then + minetest.log("error","The left chest is not a chest: " .. + node_left.name .. " at " .. vector.to_string(chest_left_pos)) + return + end + if node_left.param2 ~= node_right.param2 then + minetest.log("error", "The chests are pointing in different " .. + "directions: node_left.param2:" .. node_left.param2 .. + ", node_right.param2:" .. node_right.param2) + return + end + return minetest.get_meta(chest_left_pos):get_inventory() + end + hopper:add_container({ + {"top", "default:chest_connected_left", "main"}, + {"bottom", "default:chest_connected_left", "main"}, + {"side", "default:chest_connected_left", "main"}, + {"top", "default:chest_connected_right", "main", + get_inventory = get_inventory}, + {"bottom", "default:chest_connected_right", "main", + get_inventory = get_inventory}, + {"side", "default:chest_connected_right", "main", + get_inventory = get_inventory}, + {"top", "default:chest_connected_left_open", "main"}, + {"bottom", "default:chest_connected_left_open", "main"}, + {"side", "default:chest_connected_left_open", "main"}, + {"top", "default:chest_connected_right_open", "main", + get_inventory = get_inventory}, + {"bottom", "default:chest_connected_right_open", "main", + get_inventory = get_inventory}, + {"side", "default:chest_connected_right_open", "main", + get_inventory = get_inventory}, + }) + local function set_hopper_param2(hopper_pos, chest_left_pos) + local param2_by_offset = { + [vector.new(-1, 0, 0):to_string()] = 0, + [vector.new( 0, 0, 1):to_string()] = 1, + [vector.new( 1, 0, 0):to_string()] = 2, + [vector.new( 0, 0,-1):to_string()] = 3, + } + local hopper_param2 = param2_by_offset[ + (chest_left_pos - hopper_pos):to_string()] + if hopper_param2 then + return hopper_param2 + end + local x, z = unpack( + param_tab2[minetest.get_node(chest_left_pos).param2]) + local chest_right_pos = {x=chest_left_pos.x-x, y=chest_left_pos.y, + z=chest_left_pos.z-z} + return param2_by_offset[(chest_right_pos - hopper_pos):to_string()] + end + hopper:set_extra_container_info({ + {"default:chest_connected_left", set_hopper_param2 = set_hopper_param2}, + }) +end diff --git a/locale/connected_chests.eo.tr b/locale/connected_chests.eo.tr new file mode 100644 index 0000000..9dab6a0 --- /dev/null +++ b/locale/connected_chests.eo.tr @@ -0,0 +1,3 @@ +# textdomain: connected_chests +Big Chest=Kestego +Big Locked Chest=Ŝlosita kestego diff --git a/locale/connected_chests.ru.tr b/locale/connected_chests.ru.tr new file mode 100644 index 0000000..5eb3b98 --- /dev/null +++ b/locale/connected_chests.ru.tr @@ -0,0 +1,3 @@ +# textdomain: connected_chests +Big Chest=Большой сундук +Big Locked Chest=Большой запертый сундук diff --git a/locale/template.txt b/locale/template.txt new file mode 100644 index 0000000..2f94e47 --- /dev/null +++ b/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: connected_chests +Big Chest= +Big Locked Chest= diff --git a/mod.conf b/mod.conf index a874c1a..bad5138 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,3 @@ name = connected_chests depends = default -optional_depends = pipeworks,technic +optional_depends = pipeworks,technic,hopper