diff --git a/wrench/api.lua b/wrench/api.lua deleted file mode 100644 index bd369819..00000000 --- a/wrench/api.lua +++ /dev/null @@ -1,38 +0,0 @@ ---[[ -supported_nodes -This table stores all nodes that are compatible with the wrench mod. -Syntax: - [] = { - lists = {""}, - metas = {[""] = STRING, - [""] = INT, - [""] = FLOAT}, - owned = true, - store_meta_always = true, - } - owned - nodes that are protected by owner requirements (Ex. locked chests) - store_meta_always - when nodes are broken this ensures metadata and - inventory is always stored (Ex. active state for machines) ---]] - -wrench.META_TYPE_FLOAT = 1 -wrench.META_TYPE_STRING = 2 -wrench.META_TYPE_INT = 3 - -function wrench:original_name(name) - for key, value in pairs(self.registered_nodes) do - if name == value.name then - return key - end - end -end - -function wrench:register_node(name, def) - assert(type(name) == "string", "wrench:register_node invalid type for name") - assert(type(def) == "table", "wrench:register_node invalid type for def") - if minetest.registered_nodes[name] then - self.registered_nodes[name] = def - else - minetest.log("warning", "Attempt to register unknown node for wrench: "..tostring(name)) - end -end diff --git a/wrench/functions.lua b/wrench/functions.lua new file mode 100644 index 00000000..78ece2d4 --- /dev/null +++ b/wrench/functions.lua @@ -0,0 +1,128 @@ + +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +local SERIALIZATION_VERSION = 1 + +local errors = { + owned = S("Cannot pickup node. Owned by %s."), + full_inv = S("Not enough room in inventory to pickup node."), + bad_item = S("Cannot pickup node containing %s."), + nested = S("Cannot pickup node. Nesting inventories is not allowed."), + metadata = S("Cannot pickup node. Node contains too much metadata."), +} + +local function get_stored_metadata(itemstack) + local meta = itemstack:get_meta() + local data = meta:get("data") or meta:get("") + data = minetest.deserialize(data) + if not data or not data.version or not data.name then + return + end + return data +end + +local function get_description(def, pos, meta, node, player) + local t = type(def.description) + if t == "string" then + return def.description + elseif t == "function" then + local desc = def.description(pos, meta, node, player) + if desc then + return desc + end + end + return S("%s with items"):format(minetest.registered_nodes[node.name].description) +end + +function wrench.pickup_node(pos, player) + local node = minetest.get_node(pos) + local def = wrench.registered_nodes[node.name] + if not def then + return + end + local meta = minetest.get_meta(pos) + if def.owned and not minetest.check_player_privs(player, "protection_bypass") then + local owner = meta:get_string("owner") + if owner ~= "" and owner ~= player:get_player_name() then + return false, errors.owned:format(owner) + end + end + local data = { + name = node.name, + version = SERIALIZATION_VERSION, + lists = {}, + metas = {}, + } + local inv = meta:get_inventory() + for _, listname in pairs(def.lists or {}) do + local list = inv:get_list(listname) + for i, stack in pairs(list) do + if wrench.blacklisted_items[stack:get_name()] then + local desc = stack:get_definition().description + return false, errors.bad_item:format(desc) + end + local sdata = get_stored_metadata(stack) + if sdata and sdata.lists and next(sdata.lists) ~= nil then + return false, errors.nested + end + list[i] = stack:to_string() + end + data.lists[listname] = list + end + for name, meta_type in pairs(def.metas or {}) do + if meta_type == wrench.META_TYPE_FLOAT then + data.metas[name] = meta:get_float(name) + elseif meta_type == wrench.META_TYPE_STRING then + data.metas[name] = meta:get_string(name) + elseif meta_type == wrench.META_TYPE_INT then + data.metas[name] = meta:get_int(name) + end + end + local stack = ItemStack(node.name) + local item_meta = stack:get_meta() + item_meta:set_string("data", minetest.serialize(data)) + item_meta:set_string("description", get_description(def, pos, meta, node, player)) + if #stack:to_string() > 65000 then + return false, errors.metadata + end + local player_inv = player:get_inventory() + if not player_inv:room_for_item("main", stack) then + return false, errors.full_inv + end + player_inv:add_item("main", stack) + minetest.remove_node(pos) + return true +end + +function wrench.restore_node(pos, player, stack) + if not stack then + return + end + local data = get_stored_metadata(stack) + if not data then + return + end + local def = wrench.registered_nodes[data.name] + if not def then + return + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for listname, list in pairs(data.lists) do + inv:set_list(listname, list) + end + for name, value in pairs(data.metas) do + local meta_type = def.metas and def.metas[name] + if meta_type == wrench.META_TYPE_INT then + meta:set_int(name, value) + elseif meta_type == wrench.META_TYPE_FLOAT then + meta:set_float(name, value) + elseif meta_type == wrench.META_TYPE_STRING then + meta:set_string(name, value) + end + end + if def.after_place then + def.after_place(pos, player, stack) + end + return true +end diff --git a/wrench/init.lua b/wrench/init.lua index dc43ac8b..2b0e2bd0 100644 --- a/wrench/init.lua +++ b/wrench/init.lua @@ -1,202 +1,58 @@ ---[[ -Wrench mod -Adds a wrench that allows the player to pickup nodes that contain an inventory -with items or metadata that needs perserving. -The wrench has the same tool capability as the normal hand. -To pickup a node simply right click on it. If the node contains a formspec, -you will need to shift+right click instead. -Because it enables arbitrary nesting of chests, and so allows the player -to carry an unlimited amount of material at once, this wrench is not -available to survival-mode players. ---]] - -local LATEST_SERIALIZATION_VERSION = 1 +local modpath = minetest.get_modpath("wrench") wrench = { - registered_nodes = {} + registered_nodes = {}, + blacklisted_items = {}, + META_TYPE_FLOAT = 1, + META_TYPE_STRING = 2, + META_TYPE_INT = 3, } -local modpath = minetest.get_modpath(minetest.get_current_modname()) -dofile(modpath.."/api.lua") - -local function register_mod_nodes(modname) - if minetest.get_modpath(modname) then - dofile(modpath.."/nodes/"..modname..".lua") +dofile(modpath.."/legacy.lua") +dofile(modpath.."/functions.lua") +dofile(modpath.."/tool.lua") + +function wrench.register_node(name, def) + assert(type(name) == "string", "wrench.register_node invalid type for name") + assert(type(def) == "table", "wrench.register_node invalid type for def") + local node_def = minetest.registered_nodes[name] + if node_def then + wrench.registered_nodes[name] = table.copy(def) + local old_after_place = node_def.after_place_node + minetest.override_item(name, { + after_place_node = function(...) + if not wrench.restore_node(...) and old_after_place then + return old_after_place(...) + end + end + }) + else + minetest.log("warning", "Attempt to register unknown node for wrench: "..name) end end -register_mod_nodes("default") -register_mod_nodes("technic") -register_mod_nodes("technic_cnc") -register_mod_nodes("technic_chests") -register_mod_nodes("drawers") - --- Boilerplate to support localized strings if intllib mod is installed. -local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end - -local function get_meta_type(name, metaname) - local def = wrench.registered_nodes[name] - return def and def.metas and def.metas[metaname] or nil -end - -local function get_pickup_name(name) - return "wrench:picked_up_"..(name:gsub(":", "_")) -end - -local function restore(pos, placer, itemstack) - local itemname = itemstack:get_name() - local node = minetest.get_node(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local data = itemstack:get_meta():get_string("data") - data = (data ~= "" and data) or itemstack:get_metadata() - data = minetest.deserialize(data) - if not data then - minetest.remove_node(pos) - minetest.log("error", placer:get_player_name().." wanted to place ".. - itemname.." at "..minetest.pos_to_string(pos).. - ", but it had no data.") - minetest.log("verbose", "itemstack: "..itemstack:to_string()) - return true - end - minetest.set_node(pos, {name = data.name, param2 = node.param2}) - for name, value in pairs(data.metas) do - local meta_type = get_meta_type(data.name, name) - if meta_type == wrench.META_TYPE_INT then - meta:set_int(name, value) - elseif meta_type == wrench.META_TYPE_FLOAT then - meta:set_float(name, value) - elseif meta_type == wrench.META_TYPE_STRING then - meta:set_string(name, value) - end +function wrench.blacklist_item(name) + assert(type(name) == "string", "wrench:blacklist_item invalid type for name") + local node_def = minetest.registered_items[name] + if node_def then + wrench.blacklisted_items[name] = true + else + minetest.log("warning", "Attempt to blacklist unknown item for wrench: "..name) end - local lists = data.lists - for listname, list in pairs(lists) do - inv:set_list(listname, list) - end - itemstack:take_item() - return itemstack end -for name, info in pairs(wrench.registered_nodes) do - local olddef = minetest.registered_nodes[name] - if olddef then - local newdef = {} - for key, value in pairs(olddef) do - newdef[key] = value - end - newdef.stack_max = 1 - newdef.description = S("%s with items"):format(newdef.description) - newdef.groups = {} - newdef.groups.not_in_creative_inventory = 1 - newdef.on_construct = nil - newdef.on_destruct = nil - newdef.after_place_node = function(pos, placer, itemstack) - - -- call restoration function with on_plcae callbacks - local new_stack = restore(pos, placer, itemstack) - - if type(info.after_place) == "function" then - -- call custom after_place function - info.after_place(pos) - end +local mods = { + "default", + "digtron", + "drawers", + "technic", + "technic_chests", + "technic_cnc", +} - return new_stack - end - minetest.register_node(":"..get_pickup_name(name), newdef) +for _, modname in pairs(mods) do + if minetest.get_modpath(modname) then + dofile(modpath.."/nodes/"..modname..".lua") end end - -minetest.register_tool("wrench:wrench", { - description = S("Wrench"), - inventory_image = "technic_wrench.png", - tool_capabilities = { - full_punch_interval = 0.9, - max_drop_level = 0, - groupcaps = { - crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, - snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, - oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, - uses=0, maxlevel=3} - }, - damage_groups = {fleshy=1}, - }, - on_place = function(itemstack, placer, pointed_thing) - local pos = pointed_thing.under - if not placer or not pos then - return - end - local player_name = placer:get_player_name() - if minetest.is_protected(pos, player_name) then - minetest.record_protection_violation(pos, player_name) - return - end - local nname = minetest.get_node(pos).name - local def = wrench.registered_nodes[nname] - if not def then - return - end - - local stack = ItemStack(get_pickup_name(nname)) - local player_inv = placer:get_inventory() - if not player_inv:room_for_item("main", stack) then - return - end - local meta = minetest.get_meta(pos) - if def.owned and not minetest.check_player_privs(placer, "protection_bypass") then - local owner = meta:get_string("owner") - if owner and owner ~= player_name then - minetest.log("action", player_name.. - " tried to pick up an owned node belonging to ".. - owner.." at ".. - minetest.pos_to_string(pos)) - return - end - end - - local metadata = {} - metadata.name = nname - metadata.version = LATEST_SERIALIZATION_VERSION - - local inv = meta:get_inventory() - local lists = {} - for _, listname in pairs(def.lists or {}) do - local list = inv:get_list(listname) - for i, s in pairs(list) do - list[i] = s:to_string() - end - lists[listname] = list - end - metadata.lists = lists - - local item_meta = stack:get_meta() - metadata.metas = {} - for name, meta_type in pairs(def.metas or {}) do - if meta_type == wrench.META_TYPE_INT then - metadata.metas[name] = meta:get_int(name) - elseif meta_type == wrench.META_TYPE_FLOAT then - metadata.metas[name] = meta:get_float(name) - elseif meta_type == wrench.META_TYPE_STRING then - metadata.metas[name] = meta:get_string(name) - end - end - - item_meta:set_string("data", minetest.serialize(metadata)) - minetest.remove_node(pos) - itemstack:add_wear(65535 / 20) - player_inv:add_item("main", stack) - return itemstack - end, -}) - -if technic.config:get_bool("enable_wrench_crafting") then - minetest.register_craft({ - output = "wrench:wrench", - recipe = { - {"technic:carbon_steel_ingot", "", "technic:carbon_steel_ingot"}, - {"", "technic:carbon_steel_ingot", ""}, - {"", "technic:carbon_steel_ingot", ""}, - }, - }) -end diff --git a/wrench/legacy.lua b/wrench/legacy.lua new file mode 100644 index 00000000..01b2c077 --- /dev/null +++ b/wrench/legacy.lua @@ -0,0 +1,126 @@ + +-- Register aliases for old wrench:picked_up_* nodes + +local all_nodes = { + default = { + "default:chest", + "default:chest_locked", + "default:furnace", + "default:furnace_active" + }, + drawers = { + "drawers:acacia_wood1", + "drawers:acacia_wood2", + "drawers:acacia_wood4", + "drawers:aspen_wood1", + "drawers:aspen_wood2", + "drawers:aspen_wood4", + "drawers:junglewood1", + "drawers:junglewood2", + "drawers:junglewood4", + "drawers:pine_wood1", + "drawers:pine_wood2", + "drawers:pine_wood4", + "drawers:wood1", + "drawers:wood2", + "drawers:wood4" + }, + technic_chests = { + "technic:copper_chest", + "technic:copper_locked_chest", + "technic:gold_chest", + "technic:gold_chest_black", + "technic:gold_chest_blue", + "technic:gold_chest_brown", + "technic:gold_chest_cyan", + "technic:gold_chest_dark_green", + "technic:gold_chest_dark_grey", + "technic:gold_chest_green", + "technic:gold_chest_grey", + "technic:gold_chest_magenta", + "technic:gold_chest_orange", + "technic:gold_chest_pink", + "technic:gold_chest_red", + "technic:gold_chest_violet", + "technic:gold_chest_white", + "technic:gold_chest_yellow", + "technic:gold_locked_chest", + "technic:gold_locked_chest_black", + "technic:gold_locked_chest_blue", + "technic:gold_locked_chest_brown", + "technic:gold_locked_chest_cyan", + "technic:gold_locked_chest_dark_green", + "technic:gold_locked_chest_dark_grey", + "technic:gold_locked_chest_green", + "technic:gold_locked_chest_grey", + "technic:gold_locked_chest_magenta", + "technic:gold_locked_chest_orange", + "technic:gold_locked_chest_pink", + "technic:gold_locked_chest_red", + "technic:gold_locked_chest_violet", + "technic:gold_locked_chest_white", + "technic:gold_locked_chest_yellow", + "technic:iron_chest", + "technic:iron_locked_chest", + "technic:mithril_chest", + "technic:mithril_locked_chest", + "technic:silver_chest", + "technic:silver_locked_chest" + }, + technic = { + "technic:cnc", + "technic:cnc_active", + "technic:coal_alloy_furnace", + "technic:coal_alloy_furnace_active", + "technic:hv_battery_box0", + "technic:hv_battery_box1", + "technic:hv_battery_box2", + "technic:hv_battery_box3", + "technic:hv_battery_box4", + "technic:hv_battery_box5", + "technic:hv_battery_box6", + "technic:hv_battery_box7", + "technic:hv_battery_box8", + "technic:lv_battery_box0", + "technic:lv_battery_box1", + "technic:lv_battery_box2", + "technic:lv_battery_box3", + "technic:lv_battery_box4", + "technic:lv_battery_box5", + "technic:lv_battery_box6", + "technic:lv_battery_box7", + "technic:lv_battery_box8", + "technic:lv_electric_furnace", + "technic:lv_electric_furnace_active", + "technic:mv_alloy_furnace", + "technic:mv_alloy_furnace_active", + "technic:mv_battery_box0", + "technic:mv_battery_box1", + "technic:mv_battery_box2", + "technic:mv_battery_box3", + "technic:mv_battery_box4", + "technic:mv_battery_box5", + "technic:mv_battery_box6", + "technic:mv_battery_box7", + "technic:mv_battery_box8", + "technic:mv_centrifuge", + "technic:mv_centrifuge_active", + "technic:mv_compressor", + "technic:mv_compressor_active", + "technic:mv_electric_furnace", + "technic:mv_electric_furnace_active", + "technic:mv_extractor", + "technic:mv_extractor_active", + "technic:mv_grinder", + "technic:mv_grinder_active", + "technic:tool_workshop" + } +} + +for mod, nodes in pairs(all_nodes) do + if minetest.get_modpath(mod) then + for _,n in pairs(nodes) do + minetest.register_alias("wrench:picked_up_"..n:gsub(":", "_"), n) + end + end +end diff --git a/wrench/mod.conf b/wrench/mod.conf index cb7547bb..b0261bb0 100644 --- a/wrench/mod.conf +++ b/wrench/mod.conf @@ -1,2 +1,2 @@ name = wrench -optional_depends = technic, technic_chests, technic_worldgen, intllib, drawers, default +optional_depends = technic, technic_chests, technic_worldgen, intllib, drawers, default, digtron diff --git a/wrench/nodes/default.lua b/wrench/nodes/default.lua index 3f929aee..17902e00 100644 --- a/wrench/nodes/default.lua +++ b/wrench/nodes/default.lua @@ -1,11 +1,11 @@ -- Register nodes from default / minetest_game -wrench:register_node("default:chest", { +wrench.register_node("default:chest", { lists = {"main"}, }) -wrench:register_node("default:chest_locked", { +wrench.register_node("default:chest_locked", { lists = {"main"}, metas = { owner = wrench.META_TYPE_STRING, @@ -14,7 +14,7 @@ wrench:register_node("default:chest_locked", { owned = true, }) -wrench:register_node("default:furnace", { +wrench.register_node("default:furnace", { lists = {"fuel", "src", "dst"}, metas = { infotext = wrench.META_TYPE_STRING, @@ -25,7 +25,7 @@ wrench:register_node("default:furnace", { }, }) -wrench:register_node("default:furnace_active", { +wrench.register_node("default:furnace_active", { lists = {"fuel", "src", "dst"}, metas = { infotext = wrench.META_TYPE_STRING, @@ -37,16 +37,27 @@ wrench:register_node("default:furnace_active", { store_meta_always = true, }) -wrench:register_node("default:sign_wall_wood", { +local function get_sign_description(pos, meta, node) + local desc = minetest.registered_nodes[node.name].description + local text = meta:get_string("text") + if #text > 32 then + text = text:sub(1, 24).."..." + end + return string.format("%s with text \"%s\"", desc, text) +end + +wrench.register_node("default:sign_wall_wood", { metas = { infotext = wrench.META_TYPE_STRING, text = wrench.META_TYPE_STRING }, + description = get_sign_description, }) -wrench:register_node("default:sign_wall_steel", { +wrench.register_node("default:sign_wall_steel", { metas = { infotext = wrench.META_TYPE_STRING, text = wrench.META_TYPE_STRING }, + description = get_sign_description, }) diff --git a/wrench/nodes/digtron.lua b/wrench/nodes/digtron.lua new file mode 100644 index 00000000..2273d669 --- /dev/null +++ b/wrench/nodes/digtron.lua @@ -0,0 +1,23 @@ + +-- Register wrench support for digtron + +wrench.register_node("digtron:battery_holder", { + lists = {"batteries"} +}) + +wrench.register_node("digtron:inventory", { + lists = {"main"} +}) + +wrench.register_node("digtron:fuelstore", { + lists = {"fuel"} +}) + +wrench.register_node("digtron:combined_storage", { + lists = {"main", "fuel"} +}) + +-- Blacklist loaded crates to prevent nesting of inventories + +wrench.blacklist_item("digtron:loaded_crate") +wrench.blacklist_item("digtron:loaded_locked_crate") diff --git a/wrench/nodes/drawers.lua b/wrench/nodes/drawers.lua index f6e1958a..e5c4e851 100644 --- a/wrench/nodes/drawers.lua +++ b/wrench/nodes/drawers.lua @@ -3,8 +3,8 @@ local INT, STRING = wrench.META_TYPE_INT, wrench.META_TYPE_STRING --- assemble definitions for drawer type 1,2 and 4 -for _, drawer_type in ipairs({1,2,4}) do +-- Assemble definitions for drawer type 1, 2 and 4 +for _, drawer_type in ipairs({1, 2, 4}) do local def = { lists = {"upgrades"}, @@ -12,15 +12,12 @@ for _, drawer_type in ipairs({1,2,4}) do after_place = drawers.spawn_visuals } - for i=1,drawer_type do + for i=1, drawer_type do - local suffix - if drawer_type == 1 then - -- no suffix for base type - suffix = "" - else - -- index as suffix - suffix = i + local suffix = "" + if drawer_type ~= 1 then + -- Index as suffix + suffix = i end def.metas["name" .. suffix] = STRING @@ -29,14 +26,11 @@ for _, drawer_type in ipairs({1,2,4}) do def.metas["base_stack_max" .. suffix] = INT def.metas["entity_infotext" .. suffix] = STRING def.metas["stack_max_factor" .. suffix] = INT - def.metas["meta_itemstack" .. suffix] = INT - def.metas["itemstack_wear" .. suffix] = INT end - wrench:register_node("drawers:wood" .. drawer_type, def) - wrench:register_node("drawers:acacia_wood" .. drawer_type, def) - wrench:register_node("drawers:aspen_wood" .. drawer_type, def) - wrench:register_node("drawers:junglewood" .. drawer_type, def) - wrench:register_node("drawers:pine_wood" .. drawer_type, def) - + wrench.register_node("drawers:wood" .. drawer_type, def) + wrench.register_node("drawers:acacia_wood" .. drawer_type, def) + wrench.register_node("drawers:aspen_wood" .. drawer_type, def) + wrench.register_node("drawers:junglewood" .. drawer_type, def) + wrench.register_node("drawers:pine_wood" .. drawer_type, def) end diff --git a/wrench/nodes/technic.lua b/wrench/nodes/technic.lua index e81594d9..288b8573 100644 --- a/wrench/nodes/technic.lua +++ b/wrench/nodes/technic.lua @@ -14,7 +14,7 @@ local function register_machine_node(nodename, tier) tube_time = tier ~= "LV" and wrench.META_TYPE_INT or nil, src_time = wrench.META_TYPE_INT, } - wrench:register_node(nodename, {lists = lists, metas = metas}) + wrench.register_node(nodename, {lists = lists, metas = metas}) end -- base_machines table row format: name = { extra meta fields } @@ -42,7 +42,7 @@ end --------------------------------------------------------------------- -- Special nodes -wrench:register_node("technic:coal_alloy_furnace", { +wrench.register_node("technic:coal_alloy_furnace", { lists = {"fuel", "src", "dst"}, metas = { infotext = wrench.META_TYPE_STRING, @@ -53,7 +53,7 @@ wrench:register_node("technic:coal_alloy_furnace", { }, }) -wrench:register_node("technic:coal_alloy_furnace_active", { +wrench.register_node("technic:coal_alloy_furnace_active", { lists = {"fuel", "src", "dst"}, metas = { infotext = wrench.META_TYPE_STRING, @@ -64,7 +64,7 @@ wrench:register_node("technic:coal_alloy_furnace_active", { }, }) -wrench:register_node("technic:tool_workshop", { +wrench.register_node("technic:tool_workshop", { lists = {"src", "upgrade1", "upgrade2"}, metas = { infotext = wrench.META_TYPE_STRING, @@ -75,9 +75,9 @@ wrench:register_node("technic:tool_workshop", { }, }) -for tier, _ in pairs(technic.machines) do +for _, tier in pairs({"LV", "MV", "HV"}) do for i = 0, 8 do - wrench:register_node("technic:"..tier:lower().."_battery_box"..i, { + wrench.register_node("technic:"..tier:lower().."_battery_box"..i, { lists = tier ~= "LV" and machine_invlist_upgrades or machine_invlist, metas = { infotext = wrench.META_TYPE_STRING, diff --git a/wrench/nodes/technic_chests.lua b/wrench/nodes/technic_chests.lua index a1c6b31c..9e97b14e 100644 --- a/wrench/nodes/technic_chests.lua +++ b/wrench/nodes/technic_chests.lua @@ -1,6 +1,14 @@ -- Register wrench support for technic_chests +local function get_chest_description(pos, meta, node) + local desc = minetest.registered_nodes[node.name].description + local text = meta:get_string("infotext") + if text ~= desc then + return text + end +end + local function with_owner_field(metas) local result = table.copy(metas) result.owner = wrench.META_TYPE_STRING @@ -46,17 +54,20 @@ local chests_meta = { } for name, metas in pairs(chests_meta) do - wrench:register_node("technic:"..name.."_chest", { + wrench.register_node("technic:"..name.."_chest", { lists = {"main"}, metas = metas, + description = get_chest_description, }) - wrench:register_node("technic:"..name.."_protected_chest", { + wrench.register_node("technic:"..name.."_protected_chest", { lists = {"main"}, metas = metas, + description = get_chest_description, }) - wrench:register_node("technic:"..name.."_locked_chest", { + wrench.register_node("technic:"..name.."_locked_chest", { lists = {"main"}, metas = with_owner_field(metas), + description = get_chest_description, owned = true, }) end @@ -82,17 +93,20 @@ local chest_mark_colors = { } for i = 1, 15 do - wrench:register_node("technic:gold_chest"..chest_mark_colors[i], { + wrench.register_node("technic:gold_chest"..chest_mark_colors[i], { lists = {"main"}, metas = chests_meta.gold, + description = get_chest_description, }) - wrench:register_node("technic:gold_protected_chest"..chest_mark_colors[i], { + wrench.register_node("technic:gold_protected_chest"..chest_mark_colors[i], { lists = {"main"}, metas = chests_meta.gold, + description = get_chest_description, }) - wrench:register_node("technic:gold_locked_chest"..chest_mark_colors[i], { + wrench.register_node("technic:gold_locked_chest"..chest_mark_colors[i], { lists = {"main"}, metas = with_owner_field(chests_meta.gold), + description = get_chest_description, owned = true, }) end diff --git a/wrench/nodes/technic_cnc.lua b/wrench/nodes/technic_cnc.lua index 15de109a..3adf8bb6 100644 --- a/wrench/nodes/technic_cnc.lua +++ b/wrench/nodes/technic_cnc.lua @@ -2,10 +2,10 @@ -- Register wrench support for Technic CNC local function register_cnc(name, def) - wrench:register_node(name, def) + wrench.register_node(name, def) if minetest.registered_nodes[name.."_active"] then -- Only available if technic is active - wrench:register_node(name.."_active", def) + wrench.register_node(name.."_active", def) end end diff --git a/wrench/tool.lua b/wrench/tool.lua new file mode 100644 index 00000000..12b0488d --- /dev/null +++ b/wrench/tool.lua @@ -0,0 +1,37 @@ + +local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end + +minetest.register_tool("wrench:wrench", { + description = S("Wrench"), + inventory_image = "technic_wrench.png", + on_use = function(itemstack, player, pointed_thing) + if not player or not pointed_thing then + return + end + local name = player:get_player_name() + local pos = pointed_thing.under + if minetest.is_protected(pos, name) then + return + end + local picked_up, err_msg = wrench.pickup_node(pos, player) + if not picked_up then + if err_msg then + minetest.chat_send_player(name, err_msg) + end + return + end + itemstack:add_wear(65535 / 20) + return itemstack + end, +}) + +if minetest.get_modpath("technic") and technic.config:get_bool("enable_wrench_crafting") then + minetest.register_craft({ + output = "wrench:wrench", + recipe = { + {"technic:carbon_steel_ingot", "", "technic:carbon_steel_ingot"}, + {"", "technic:carbon_steel_ingot", ""}, + {"", "technic:carbon_steel_ingot", ""} + } + }) +end