diff --git a/.luacheckrc b/.luacheckrc index da8f149..1f5066d 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,16 +1,22 @@ unused_args = false allow_defined_top = true -max_line_length = 999 globals = { - "technic", "minetest", + "minetest", } read_globals = { - string = {fields = {"split", "trim"}}, - table = {fields = {"copy", "getn"}}, + string = {fields = {"split"}}, + table = {fields = {"copy"}}, - "intllib", "ItemStack", "drawers", -} + -- Minetest + "ItemStack", -files["init.lua"].ignore = { "name", "stack" } + -- Mods + "digilines", + "drawers", + "mesecon", + "pipeworks", + "signs_lib", + "xdecor", +} diff --git a/API.md b/API.md new file mode 100644 index 0000000..0c8214c --- /dev/null +++ b/API.md @@ -0,0 +1,88 @@ +# API + +## Node registration + +Schematic: +```lua +wrench.register_node(node.name, { + lists = list, + -- inventory list + + lists_ignore = lists_ignore, + -- ignored and not saved inventory list + + metas = table, + -- Table for node metadata: + -- name: Meta name + -- type: Data type: + -- `wrench.META_TYPE_IGNORE` ignored and not saved + -- `wrench.META_TYPE_FLOAT` for float + -- `wrench.META_TYPE_STRING` for string + -- `wrench.META_TYPE_INT` for integer + + description = nil, + -- Default behavior: + -- when `lists` is not `nil` + -- `minetest.registered_nodes[node.name].description` + " with items" + -- when `lists` is `nil` and only `metas.channel` is defined + -- `minetest.registered_nodes[node.name].description` + " with channel ''" + -- when `lists` is `nil` + -- `minetest.registered_nodes[node.name].description` + " with configuration" + description = `wrench.description_with_items`, + -- Description of the node + " with items" + description = `wrench.description_with_configuration`, + -- Description of the node + " with configuration" + description = `wrench.description_with_channel`, + -- Description of the node + " with channel " + channel + description = `wrench.description_with_text`, + -- Description of the node + " with text " + text + description = function(pos, meta, node, player), + -- Function returns description + + drop = nil, + -- Default dropped item is the node itself + drop = true, + -- Use `minetest.registered_nodes[node.name].drop` + drop = "default:cobble", + -- Name of dropped item + + owned = nil, + -- Default: anyone can pickup this node + owned = true, + -- Only `metas["owner"]` can pickup this node + + timer = nil, + -- Default + timer = true, + -- Save node timers + + before_pickup = nil, + -- Default + before_pickup = function(pos, meta, node, player) + -- Function called before pickup node + + after_pickup = nil, + -- default + after_pickup = function(pos, node, meta_table, player) + -- Function called after pickup node + + after_place = nil, + -- Default + after_place = function(pos, player, itemstack, pointed_thing), + -- Function called after place node +}) +``` + +Example: +```lua +wrench.register_node("bones:bones", { + lists = {"main"}, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + time = wrench.META_TYPE_INT, + }, + owned = true, +}) +``` diff --git a/README.md b/README.md index 1cc8872..7205815 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,161 @@ ![](https://github.com/mt-mods/wrench/workflows/luacheck/badge.svg) [![License](https://img.shields.io/badge/license-LGPLv2.0%2B-purple.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.0.en.html) + + + +# Wrench + + + +The wrench tool allows you to left-click on nodes with inventories to pick them up. + +This mod is a fork from wrench/ in https://github.com/mt-mods/technic + +# Supported Mods and Nodes + +* https://github.com/minetest/minetest_game + - bones:bones + - default:chest + - default:chest_locked + - default:furnace + - default:sign_wall_wood + - default:sign_wall_steel + - vessels:shelf +* https://github.com/minetest-mods/3d_armor + - 3d_armor_stand:armor_stand + - 3d_armor_stand:locked_armor_stand +* https://github.com/mt-mods/basic_signs + - basic_signs:sign_wall_glass + - basic_signs:sign_wall_locked + - basic_signs:sign_wall_obsidian_glass + - basic_signs:sign_wall_plastic + - basic_signs:sign_wall_steel_\* +* https://notabug.org/TenPlus1/bees + - bees:hive_wild +* https://github.com/Lokrates/Biofuel + - biofuel:refinery +* https://github.com/HybridDog/connected_chests +* https://github.com/minetest-mods/digilines + - digilines:chest + - digilines:lcd + - digilines:lightsensor + - digilines:rtc +* https://cheapiesystems.com/git/digiscreen/ +* https://github.com/mt-mods/digistuff + - digistuff:advtouchscreen + - digistuff:button_\* + - digistuff:camera + - digistuff:card_reader + - digistuff:controller_programmed + - digistuff:detector + - digistuff:eeprom + - digistuff:gpu + - digistuff:ioexpander_\* + - digistuff:light_\* + - digistuff:movestone + - digistuff:nic + - digistuff:noteblock + - digistuff:panel + - digistuff:piezo + - digistuff:piston\* + - digistuff:ram + - digistuff:timer + - digistuff:touchscreen + - digistuff:wall_knob_configured +* https://github.com/minetest-mods/digtron + - digtron:battery_holder + - digtron:inventory + - digtron:fuelstore + - digtron:combined_storage +* https://github.com/minetest-mods/drawers + - drawers:wood + - drawers:acacia_wood + - drawers:aspen_wood + - drawers:junglewood + - drawers:pine_wood +* https://github.com/minetest-mods/mesecons + - mesecons_commandblock:commandblock_\* + - mesecons_detector:node_detector_\* + - mesecons_detector:object_detector_\* + - mesecons_luacontroller:luacontroller\* + - mesecons_microcontroller:microcontroller\* +* https://notabug.org/tenplus1/mobs_redo + - mobs:spawner +* https://github.com/minetest-mods/more_chests + - more_chests:cobble + - more_chests:dropbox + - more_chests:fridge + - more_chests:big_fridge + - more_chests:shared + - more_chests:secret + - more_chests:toolbox_\* +* https://github.com/mt-mods/pipeworks + - pipeworks:autocrafter + - pipeworks:deployer_\* + - pipeworks:digiline_detector_tube_\* + - pipeworks:dispenser_\* + - pipeworks:nodebreaker_\* + - pipeworks:\*filter + - pipeworks:lua_tube\* + - pipeworks:mese_sand_tube_\* + - pipeworks:mese_tube_\* + - pipeworks:teleport_tube_\* +* https://notabug.org/tenplus1/protector + - protector:chest + - protector:protect + - protector:protect2 +* https://github.com/mt-mods/signs_lib +* https://github.com/mt-mods/technic + - technic:cnc\* + - technic:coal_alloy_furnace\* + - technic:\*chest\* + - technic:injector + - technic:power_monitor + - technic:supply_converter + - technic:switching_station + - technic:tool_workshop + - technic:\*_alloy_furnace\* + - technic:\*_battery_box\* + - technic:\*_centrifuge\* + - technic:\*_compressor\* + - technic:\*_electric_furnace\* + - technic:\*_extractor\* + - technic:\*_freezer\* + - technic:\*_generator\* + - technic:\*_grinder\* +* https://github.com/minetest-mods/xdecor + - realchess:chessboard + - xdecor:cabinet + - xdecor:cabinet_half + - xdecor:empty_shelf + - xdecor:multishelf + - xdecor:cauldron_\* + - xdecor:enchantment_table + - xdecor:itemframe + - xdecor:mailbox + +# Settings in `minetest.conf` +```ini +# Allows the wrench to be crafted if either the 'technic' or 'default' mod is installed. +wrench.enable_crafting = true +``` + +# Contributors + +* Nekogloop +* ShadowNinja +* BuckarooBanzay +* OgelGames +* int-ua +* S-S-X +* H-V-Smacker +* groxxda +* And many others... + +# License + +Unless otherwise stated, all components of this modpack are licensed under the +LGPL, V2 or later. See also the individual mod folders for their +secondary/alternate licenses, if any. diff --git a/api.lua b/api.lua new file mode 100644 index 0000000..667e422 --- /dev/null +++ b/api.lua @@ -0,0 +1,59 @@ + +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) + else + minetest.log("warning", "[wrench] Attempt to register unknown node: "..name) + end +end + +function wrench.unregister_node(name) + assert(type(name) == "string", "wrench.unregister_node invalid type for name") + if wrench.registered_nodes[name] then + wrench.registered_nodes = nil + else + minetest.log("warning", "[wrench] Attempt to unregister unsupported node: "..name) + end +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", "[wrench] Attempt to blacklist unknown item: "..name) + end +end + +minetest.register_on_mods_loaded(function() + for name, def in pairs(wrench.registered_nodes) do + local node_def = minetest.registered_nodes[name] + if node_def then + 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 + }) + if def.drop == true and type(node_def.drop) == "string" then + def.drop = node_def.drop + elseif def.drop and type(def.drop) ~= "string" then + minetest.log("warning", "[wrench] Ignoring invalid type for drop in definition for "..name) + def.drop = nil + end + if def.drop and not wrench.registered_nodes[def.drop] then + minetest.log("warning", "[wrench] Ignoring unsupported node for drop in definition for "..name) + def.drop = nil + end + else + minetest.log("warning", "[wrench] Registered node is now unknown: "..name) + wrench.registered_nodes[name] = nil + end + end +end) diff --git a/debug/debug.lua b/debug/debug.lua new file mode 100644 index 0000000..0d9e59a --- /dev/null +++ b/debug/debug.lua @@ -0,0 +1,138 @@ + +local S = wrench.translator + +local get_keys = function(list) + local keys = {} + for k, _ in pairs(list) do + keys[#keys+1] = k + end + return keys +end + +local spairs = function(tbl, order_func) + local ptrs = {} + for p in pairs(tbl) do ptrs[#ptrs +1] = p end + table.sort(ptrs, order_func and function(a, b) return order_func(a, b) end) + local i = 0 + return function() + i = i +1 + if ptrs[i] then return ptrs[i], tbl[ptrs[i]] end + end +end + +local strip_esc = function(text) + text = minetest.strip_colors(text) + -- strip translation foo + local ESCAPE_CHAR = string.char(0x1b) + text = string.gsub(text, ESCAPE_CHAR .. "%(T@[^%)]+%)", "") + return string.gsub(text, ESCAPE_CHAR .. "[ET]", "") +end + +-- use wrench with sneak to show node propperies (useful to add new nodes) + +local orig_wrench_pickup_node = wrench.pickup_node +wrench.pickup_node = function(pos, player) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + if not player:get_player_control().sneak then + local inventory = meta:get_inventory() + local lists = get_keys(inventory:get_lists()) + local metatable = meta:to_table() + local metas = get_keys(metatable.fields) + local rc, message = orig_wrench_pickup_node(pos, player) + if rc == nil then + if #lists == 0 and #metas == 0 then + return false, S("can't pickup node: @1, no inventory and no meta.fields", node.name) + else + return false, S("can't pickup unsupported node: @1", node.name) + end + end + return rc, message + end + local def = minetest.registered_nodes[node.name] + print("wrench.register_node(\"" .. node.name .. "\", {"); + -- timer + local timer = minetest.get_node_timer(pos) + if timer:get_timeout() ~= 0 then + print("\ttimer = true,") + end + -- drop + if def.drop then + if type(def.drop) ~= "string" then + print("\t-- has drop " .. type(def.drop) .. "!") + elseif def.drop == node.name or def.drop == node.name .. " 1" then + print("\t-- drop = \"" .. def.drop .. "\",") + else + print("\tdrop = true, -- " .. def.drop) + end + end + if def.after_place_node then + print("\t-- has after_place " .. type(def.after_place_node)) + end + if def.after_dig_node then + print("\t-- has after_dig " .. type(def.after_dig_node)) + end + if def.can_dig then + print("\t-- has can_dig " .. type(def.can_dig) .. " " .. + ((type(def.can_dig) == "function") and + (def.can_dig(pos, player) and ', returns true' or ', returns false') or "" + ) + ) + end + -- owner + local owner = meta:get_string("owner") + if owner and owner ~= "" then + print("\towned = true, -- '" .. owner .. "' FIXME:?") + end + -- lists + local inventory = meta:get_inventory() +-- print(dump(inventory)) + local lists = get_keys(inventory:get_lists()) + if #lists > 0 then + print("\tlists = {\"" .. table.concat(lists, "\", \"") .. "\"},") + end + -- metas + local metatable = meta:to_table() + local metas = get_keys(metatable.fields) +-- print(dump(metatable)) + if #metas > 0 then + print("\tmetas = {") + for k, v in pairs(metatable.fields) do + local t = "--[[FIXME:!]]--" + if meta:get_int(k) .. "" == v .. "" then + t = "wrench.META_TYPE_INT" + elseif meta:get_float(k) .. "" == v .. "" then + t = "wrench.META_TYPE_FLOAT" + elseif meta:get_string(k) == v then + t = "wrench.META_TYPE_STRING" + end + local x = (k ~= "infotext" and k ~= "formspec") and + (" -- " .. v) or "" + print("\t\t" .. k .. " = " .. t .. "," .. x) + end + print("\t},") + end + print("})") +end + +-- list supported modnames and nodes (useful to update README.md) + +minetest.register_on_mods_loaded(function() + print("wrench registered_nodes:") + local last_mod = "?" + for name, def in spairs(wrench.registered_nodes, function(a,b) +-- return minetest.registered_nodes[a].mod_origin < minetest.registered_nodes[b].mod_origin or a < b + return a < b + end) do + if not def.drop then + local node = minetest.registered_nodes[name] + local mod = node.mod_origin + if last_mod ~= mod then + last_mod = mod + print("* "..mod) + end + local desc = strip_esc(node.description or "") + print(string.format(" - %-40s %q", name, desc)) + end + end +end) diff --git a/functions.lua b/functions.lua index 78ece2d..12ea354 100644 --- a/functions.lua +++ b/functions.lua @@ -1,14 +1,22 @@ -local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end +local S = wrench.translator local SERIALIZATION_VERSION = 1 local errors = { - owned = S("Cannot pickup node. Owned by %s."), + owned = function(owner) return S("Cannot pickup node. Owned by @1.", owner) end, full_inv = S("Not enough room in inventory to pickup node."), - bad_item = S("Cannot pickup node containing %s."), + bad_item = function(item) return S("Cannot pickup node containing @1.", item) end, nested = S("Cannot pickup node. Nesting inventories is not allowed."), metadata = S("Cannot pickup node. Node contains too much metadata."), + no_list = S("Cannot pickup node. Node has no inventory."), + missing = function(node, missing_lists, missing_metas) + return S("Cannot pickup @1, unknown value(s) in lists: @2 metas: @3", + node.name, + table.concat(missing_lists, ","), + table.concat(missing_metas, ", ") + ) + end } local function get_stored_metadata(itemstack) @@ -21,6 +29,18 @@ local function get_stored_metadata(itemstack) return data end +local function other_keys_than(list, keys) + local list2 = table.copy(list) + for _, k in ipairs(keys) do + list2[k] = nil + end + local other_keys = {} + for k, _ in pairs(list2) do + other_keys[#other_keys+1] = k + end + return other_keys +end + local function get_description(def, pos, meta, node, player) local t = type(def.description) if t == "string" then @@ -31,7 +51,74 @@ local function get_description(def, pos, meta, node, player) return desc end end - return S("%s with items"):format(minetest.registered_nodes[node.name].description) + if def.lists then + return wrench.description_with_items(pos, meta, node, player) + elseif def.metas and def.metas.text then + return wrench.description_with_text(pos, meta, node, player) + elseif def.metas and def.metas.channel and + #other_keys_than(def.metas, {"channel", "formspec", "infotext", "owner"}) == 0 then + return wrench.description_with_channel(pos, meta, node, player) + else + return wrench.description_with_configuration(pos, meta, node, player) + end +end + +function wrench.description_with_items(pos, meta, node, player) + return S("@1 with items", minetest.registered_nodes[node.name].description) +end + +function wrench.description_with_channel(pos, meta, node, player) + local desc = minetest.registered_nodes[node.name].description + return S("@1 with channel \"@2\"", desc, meta:get_string("channel")) +end + +function wrench.description_with_configuration(pos, meta, node, player) + return S("@1 with configuration", minetest.registered_nodes[node.name].description) +end + +function wrench.description_with_text(pos, meta, node, player) + local text = meta:get_string("text") + if #text > 32 then + text = text:sub(1, 24).."..." + end + return S("@1 with text \"@2\"", minetest.registered_nodes[node.name].description, text) +end + +local function check_dev_lists(def, inventory) + local array_find = function(list, val) + for i, _ in ipairs(list) do + if list[i] == val then return i end + end + end + local get_keys = function(list) + local keys = {} + for k, _ in pairs(list) do + keys[#keys+1] = k + end + return keys + end + local def_lists = def.lists or {} + local lists = get_keys(inventory:get_lists()) + local missing_lists = {} + for _, v in ipairs(lists) do + if not array_find(def_lists, v) + and not (def.lists_ignore and array_find(def.lists_ignore, v)) then + table.insert(missing_lists, v) + end + end + return missing_lists +end + +local function check_dev_metas(def, meta) + local def_metas = def.metas or {} + local metatable = meta:to_table() + local missing_metas = {} + for k, v in pairs(metatable.fields) do + if not def_metas[k] then + table.insert(missing_metas, k) + end + end + return missing_metas end function wrench.pickup_node(pos, player) @@ -44,22 +131,30 @@ function wrench.pickup_node(pos, player) 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) + return false, errors.owned(owner) end end local data = { - name = node.name, + name = def.drop or node.name, version = SERIALIZATION_VERSION, lists = {}, metas = {}, } local inv = meta:get_inventory() + local missing_lists = check_dev_lists(def, inv) + local missing_metas = check_dev_metas(def, meta) + if #missing_metas > 0 or #missing_lists > 0 then + return false, errors.missing(node, missing_lists, missing_metas) + end for _, listname in pairs(def.lists or {}) do local list = inv:get_list(listname) + if not list then + return false, errors.no_list + end 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) + return false, errors.bad_item(desc) end local sdata = get_stored_metadata(stack) if sdata and sdata.lists and next(sdata.lists) ~= nil then @@ -78,10 +173,22 @@ function wrench.pickup_node(pos, player) data.metas[name] = meta:get_int(name) end end - local stack = ItemStack(node.name) + if def.timer then + local timer = minetest.get_node_timer(pos) + data.timer = { + timeout = timer:get_timeout(), + elapsed = timer:get_elapsed() + } + end + local drop_node = node + if def.drop then + drop_node = table.copy(node) + drop_node.name = def.drop + end + local stack = ItemStack(drop_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)) + item_meta:set_string("description", get_description(def, pos, meta, drop_node, player)) if #stack:to_string() > 65000 then return false, errors.metadata end @@ -90,11 +197,28 @@ function wrench.pickup_node(pos, player) return false, errors.full_inv end player_inv:add_item("main", stack) + if def.before_pickup then + def.before_pickup(pos, meta, node, player) + end + local meta_table = meta:to_table() minetest.remove_node(pos) + if def.after_pickup then + def.after_pickup(pos, node, meta_table, player) + end + local node_def = minetest.registered_nodes[node.name] + if wrench.has_pipeworks and node_def.tube then + pipeworks.after_dig(pos) + end + if wrench.has_mesecons and node_def.mesecons then + mesecon.on_dignode(pos, node) + end + if wrench.has_digilines and node_def.digiline or node_def.digilines then + digilines.update_autoconnect(pos) + end return true end -function wrench.restore_node(pos, player, stack) +function wrench.restore_node(pos, player, stack, pointed) if not stack then return end @@ -121,8 +245,26 @@ function wrench.restore_node(pos, player, stack) meta:set_string(name, value) end end + if data.timer then + local timer = minetest.get_node_timer(pos) + if data.timer.timeout == 0 then + timer:stop() + else + timer:set(data.timer.timeout, data.timer.elapsed) + end + end if def.after_place then - def.after_place(pos, player, stack) + def.after_place(pos, player, stack, pointed) + end + local node_def = minetest.registered_nodes[data.name] + if wrench.has_pipeworks and node_def.tube then + pipeworks.after_place(pos) + end + if wrench.has_mesecons and node_def.mesecons then + mesecon.on_placenode(pos, minetest.get_node(pos)) + end + if wrench.has_digilines and node_def.digiline or node_def.digilines then + digilines.update_autoconnect(pos) end return true end diff --git a/init.lua b/init.lua index 2b0e2bd..1d94f66 100644 --- a/init.lua +++ b/init.lua @@ -2,57 +2,64 @@ local modpath = minetest.get_modpath("wrench") wrench = { + translator = minetest.get_translator("wrench"), + plus = true, registered_nodes = {}, blacklisted_items = {}, + META_TYPE_IGNORE = 0, META_TYPE_FLOAT = 1, META_TYPE_STRING = 2, META_TYPE_INT = 3, + has_pipeworks = minetest.get_modpath("pipeworks"), + has_mesecons = minetest.get_modpath("mesecons"), + has_digilines = minetest.get_modpath("digilines"), } -dofile(modpath.."/legacy.lua") +dofile(modpath.."/api.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 - -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 -end +dofile(modpath.."/legacy.lua") local mods = { + "3d_armor_stand", + "basic_signs", + "bees", + "biofuel", + "bones", + "connected_chests", "default", + "digilines", + "digiscreen", + "digistuff", "digtron", "drawers", + "mesecons_commandblock", + "mesecons_detector", + "mesecons_luacontroller", + "mesecons_microcontroller", + "mobs", + "more_chests", + "pipeworks", + "protector", + "signs_lib", "technic", "technic_chests", "technic_cnc", + "vessels", + "xdecor", } -for _, modname in pairs(mods) do - if minetest.get_modpath(modname) then - dofile(modpath.."/nodes/"..modname..".lua") +for _, mod in pairs(mods) do + if minetest.get_modpath(mod) then + dofile(modpath.."/nodes/"..mod..".lua") + end +end + +if minetest.settings:get_bool("wrench.enable_debug", false) then + local file = modpath.."/debug/debug.lua" + local f = io.open(file, "r") + if f then + io.close(f) + dofile(file) end end diff --git a/legacy.lua b/legacy.lua index 01b2c07..edf3eea 100644 --- a/legacy.lua +++ b/legacy.lua @@ -1,4 +1,16 @@ +-- Compatibility for old function signature + +local register_node = wrench.register_node + +function wrench.register_node(self, ...) + if self == wrench then + register_node(...) + else + register_node(self, ...) + end +end + -- Register aliases for old wrench:picked_up_* nodes local all_nodes = { @@ -119,7 +131,7 @@ local all_nodes = { for mod, nodes in pairs(all_nodes) do if minetest.get_modpath(mod) then - for _,n in pairs(nodes) do + for _, n in pairs(nodes) do minetest.register_alias("wrench:picked_up_"..n:gsub(":", "_"), n) end end diff --git a/locale/de.txt b/locale/de.txt deleted file mode 100644 index b285cd3..0000000 --- a/locale/de.txt +++ /dev/null @@ -1,7 +0,0 @@ -# German Translation for technic_wrench -# Deutsche Ãœbersetzung von technic_wrench -# by Xanthin - -Wrench = Schraubenschluessel -%s with items = %s mit Gegenstaenden - diff --git a/locale/es.txt b/locale/es.txt deleted file mode 100644 index 1d79a96..0000000 --- a/locale/es.txt +++ /dev/null @@ -1,5 +0,0 @@ -# technic_wrench traducido por Carlos Barraza - -Wrench = Llave Inglesa -%s with items = %s con elementos - diff --git a/locale/fr.txt b/locale/fr.txt deleted file mode 100644 index a66b6e3..0000000 --- a/locale/fr.txt +++ /dev/null @@ -1,5 +0,0 @@ -# technic_wrench translation template - -Wrench = Clé -%s with items = %s avec des objets - diff --git a/locale/pl.txt b/locale/pl.txt deleted file mode 100644 index 272eaa0..0000000 --- a/locale/pl.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Polish Translation for technic_wrench -# Polskie tÅ‚umaczenie technic_wrench -# by mat9117 - -Wrench = Klucz -%s with items = %s z rzeczami - diff --git a/locale/pt_BR.txt b/locale/pt_BR.txt deleted file mode 100644 index 670c3eb..0000000 --- a/locale/pt_BR.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Braziliam portuguese translation for wrench -# Tradução portuguesa brasileira para wrench -# By Sires - -Wrench = Chave Inglesa -%s with items = %s com items - diff --git a/locale/template.txt b/locale/template.txt index eff2da2..a5e893c 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -1,5 +1,24 @@ +# textdomain: wrench + # technic_wrench translation template -Wrench = -%s with items = +Wrench= +@1 with items= + +Cannot pickup node. Owned by @1.= +Not enough room in inventory to pickup node.= +Cannot pickup node containing @1.= +Cannot pickup node. Nesting inventories is not allowed.= +Cannot pickup node. Node contains too much metadata.= +@1 with channel "@2"= +@1 with armor= +@1 with configuration= +@1 with code= +@1 "@2" vs. "@3"= +@1 with "@2"= +@1 with text "@2"= +unknown list value: @1= +unknown meta key: @1= +light level @1= +@1 (@2) with channel "@3"= diff --git a/locale/tr.txt b/locale/tr.txt deleted file mode 100644 index 2050bce..0000000 --- a/locale/tr.txt +++ /dev/null @@ -1,5 +0,0 @@ -# Turkish translation by mahmutelmas06 -# mahmutelmas06@hotmail.com - -Wrench = Ä°ngiliz anahtarı -%s with items = Araçlarla birlikte %s diff --git a/locale/wrench.de.tr b/locale/wrench.de.tr new file mode 100644 index 0000000..efa6e87 --- /dev/null +++ b/locale/wrench.de.tr @@ -0,0 +1,28 @@ +# textdomain: wrench + +# German Translation for technic_wrench +# Deutsche Ãœbersetzung von technic_wrench +# by Xanthin and others +# Siehe auch https://dev.minetest.net/Translating/de ".. der Konsistenz zuliebe" + +Wrench=Schraubenschluessel +@1 with items=@1 mit Gegenstaenden + +Cannot pickup node. Owned by @1.=Block kann nicht genommen werden. Dieser gehört @1. +Not enough room in inventory to pickup node.=Nicht genug Platz im Inventar um diesen Block zu nehmen. +Cannot pickup node containing @1.=Block mit @1 kann nicht genommen werden. +Cannot pickup node. Nesting inventories is not allowed.=Block kann nicht genommen werden. Verschalteltes Inventar ist nicht erlaubt. +Cannot pickup node. Node contains too much metadata.=Block kann nicht genommen werden. Der Block enthält zu viele Metadaten. + +@1 with channel "@2"=@1 mit Kanal "@2" +@1 with armor=@1 mit Rüstung +@1 with configuration=@1 mit Konfiguration +@1 with code=@1 mit Code +@1 "@2" vs. "@3"=@1 "@2" gegen "@3" +@1 with "@2"=@1 mit "@2" +@1 with text "@2"=@1 mit Text "@2" +@1 (@2) with channel "@3"=@1 (@2) mit Kanal "@3" +light level @1=Lichtlevel @1 + +unknown list value: @1=Unbekannter "list value": @1 +unknown meta key: @1=Unbekannter "meta key": @1 diff --git a/locale/wrench.es.tr b/locale/wrench.es.tr new file mode 100644 index 0000000..51df7dd --- /dev/null +++ b/locale/wrench.es.tr @@ -0,0 +1,24 @@ +# textdomain: wrench + +# technic_wrench traducido por Carlos Barraza + +Wrench=Llave Inglesa +@1 with items=@1 con elementos + +Cannot pickup node. Owned by @1.= +Not enough room in inventory to pickup node.= +Cannot pickup node containing @1.= +Cannot pickup node. Nesting inventories is not allowed.= +Cannot pickup node. Node contains too much metadata.= +@1 with channel "@2"= +@1 with armor= +@1 with configuration= +@1 with code= +@1 "@2" vs. "@3"= +@1 with "@2"= +@1 with text "@2"= + +unknown list value: @1= +unknown meta key: @1= +light level @1= +@1 (@2) with channel "@3"= diff --git a/locale/wrench.fr.tr b/locale/wrench.fr.tr new file mode 100644 index 0000000..d8b831c --- /dev/null +++ b/locale/wrench.fr.tr @@ -0,0 +1,24 @@ +# textdomain: wrench + +# technic_wrench translation template + +Wrench=Clé +@1 with items=@1 avec des objets + +Cannot pickup node. Owned by @1.= +Not enough room in inventory to pickup node.= +Cannot pickup node containing @1.= +Cannot pickup node. Nesting inventories is not allowed.= +Cannot pickup node. Node contains too much metadata.= +@1 with channel "@2"= +@1 with armor= +@1 with configuration= +@1 with code= +@1 "@2" vs. "@3"= +@1 with "@2"= +@1 with text "@2"= + +unknown list value: @1= +unknown meta key: @1= +light level @1= +@1 (@2) with channel "@3"= diff --git a/locale/wrench.pl.tr b/locale/wrench.pl.tr new file mode 100644 index 0000000..d7ebf78 --- /dev/null +++ b/locale/wrench.pl.tr @@ -0,0 +1,26 @@ +# textdomain: wrench + +# Polish Translation for technic_wrench +# Polskie tÅ‚umaczenie technic_wrench +# by mat9117 + +Wrench=Klucz +@1 with items=@1 z rzeczami + +Cannot pickup node. Owned by @1.= +Not enough room in inventory to pickup node.= +Cannot pickup node containing @1.= +Cannot pickup node. Nesting inventories is not allowed.= +Cannot pickup node. Node contains too much metadata.= +@1 with channel "@2"= +@1 with armor= +@1 with configuration= +@1 with code= +@1 "@2" vs. "@3"= +@1 with "@2"= +@1 with text "@2"= + +unknown list value: @1= +unknown meta key: @1= +light level @1= +@1 (@2) with channel "@3"= diff --git a/locale/wrench.pt_BR.tr b/locale/wrench.pt_BR.tr new file mode 100644 index 0000000..e619129 --- /dev/null +++ b/locale/wrench.pt_BR.tr @@ -0,0 +1,26 @@ +# textdomain: wrench + +# Braziliam portuguese translation for wrench +# Tradução portuguesa brasileira para wrench +# By Sires + +Wrench=Chave Inglesa +@1 with items=@1 com items + +Cannot pickup node. Owned by @1.= +Not enough room in inventory to pickup node.= +Cannot pickup node containing @1.= +Cannot pickup node. Nesting inventories is not allowed.= +Cannot pickup node. Node contains too much metadata.= +@1 with channel "@2"= +@1 with armor= +@1 with configuration= +@1 with code= +@1 "@2" vs. "@3"= +@1 with "@2"= +@1 with text "@2"= + +unknown list value: @1= +unknown meta key: @1= +light level @1= +@1 (@2) with channel "@3"= diff --git a/locale/wrench.tr.tr b/locale/wrench.tr.tr new file mode 100644 index 0000000..4e4625e --- /dev/null +++ b/locale/wrench.tr.tr @@ -0,0 +1,24 @@ +# textdomain: wrench + +# Turkish translation by mahmutelmas06 +# mahmutelmas06@hotmail.com + +Wrench=Ä°ngiliz anahtarı +@1 with items=Araçlarla birlikte @1 +Cannot pickup node. Owned by @1.= +Not enough room in inventory to pickup node.= +Cannot pickup node containing @1.= +Cannot pickup node. Nesting inventories is not allowed.= +Cannot pickup node. Node contains too much metadata.= +@1 with channel "@2"= +@1 with armor= +@1 with configuration= +@1 with code= +@1 "@2" vs. "@3"= +@1 with "@2"= +@1 with text "@2"= + +unknown list value: @1= +unknown meta key: @1= +light level @1= +@1 (@2) with channel "@3"= diff --git a/locale/wrench.zh_CN.tr b/locale/wrench.zh_CN.tr new file mode 100644 index 0000000..cd3c9d4 --- /dev/null +++ b/locale/wrench.zh_CN.tr @@ -0,0 +1,21 @@ +# textdomain: wrench + +Wrench=°âÊÖ +@1 with items=@1´øÎïÆ· +Cannot pickup node. Owned by @1.= +Not enough room in inventory to pickup node.= +Cannot pickup node containing @1.= +Cannot pickup node. Nesting inventories is not allowed.= +Cannot pickup node. Node contains too much metadata.= +@1 with channel "@2"= +@1 with armor= +@1 with configuration= +@1 with code= +@1 "@2" vs. "@3"= +@1 with "@2"= +@1 with text "@2"= + +unknown list value: @1= +unknown meta key: @1= +light level @1= +@1 (@2) with channel "@3"= diff --git a/locale/zh_CN.txt b/locale/zh_CN.txt deleted file mode 100644 index 34ed504..0000000 --- a/locale/zh_CN.txt +++ /dev/null @@ -1,2 +0,0 @@ -Wrench =°âÊÖ -%s with items =%s´øÎïÆ· diff --git a/mod.conf b/mod.conf index b0261bb..b169a07 100644 --- a/mod.conf +++ b/mod.conf @@ -1,2 +1,30 @@ name = wrench -optional_depends = technic, technic_chests, technic_worldgen, intllib, drawers, default, digtron +optional_depends = """ + 3d_armor_stand, + basic_signs, + bees, + biofuel, + bones, + connected_chests, + default, + digtron, + digilines, + digiscreen, + digistuff, + drawers, + mesecons_commandblock, + mesecons_detector, + mesecons_luacontroller, + mesecons_microcontroller, + mobs, + more_chests, + pipeworks, + protector, + signs_lib, + technic, + technic_chests, + technic_cnc, + technic_worldgen, + vessels, + xdecor, +""" diff --git a/nodes/3d_armor_stand.lua b/nodes/3d_armor_stand.lua new file mode 100644 index 0000000..13512b8 --- /dev/null +++ b/nodes/3d_armor_stand.lua @@ -0,0 +1,43 @@ + +-- Register wrench support for armor stands + +local S = wrench.translator + +local def = minetest.registered_nodes["3d_armor_stand:armor_stand"] + +local add_entity_and_node = def and def.after_place_node +local update_entity = def and def.on_metadata_inventory_put + +local lists = { + "armor_head", + "armor_torso", + "armor_legs", + "armor_feet", +} + +local function after_place(pos, player) + add_entity_and_node(pos, player) + update_entity(pos) +end + +local function description(pos, meta, node) + local desc = minetest.registered_nodes[node.name].description + return S("@1 with armor", desc) +end + +wrench.register_node("3d_armor_stand:armor_stand", { + lists = lists, + after_place = after_place, + description = description, +}) + +wrench.register_node("3d_armor_stand:locked_armor_stand", { + lists = lists, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + }, + owned = true, + after_place = after_place, + description = description, +}) diff --git a/nodes/basic_signs.lua b/nodes/basic_signs.lua new file mode 100644 index 0000000..8e70edd --- /dev/null +++ b/nodes/basic_signs.lua @@ -0,0 +1,72 @@ + +-- Register wrench support for basic_signs + +local function remove_glow(pos, meta) + meta:set_string("glow", "") +end + +local function register_all(name, def) + wrench.register_node(name, def) + name = name:gsub("_wall", "") + wrench.register_node(name.."_hanging", def) + wrench.register_node(name.."_onpole", def) + wrench.register_node(name.."_onpole_horiz", def) + wrench.register_node(name.."_yard", def) +end + +local sign_def = { + metas = { + text = wrench.META_TYPE_STRING, + glow = wrench.META_TYPE_STRING, + widefont = wrench.META_TYPE_INT, + unifont = wrench.META_TYPE_INT, + infotext = wrench.META_TYPE_IGNORE, + }, + before_pickup = remove_glow, + after_place = function(pos, player, stack, pointed) + signs_lib.after_place_node(pos, player, stack, pointed) + signs_lib.update_sign(pos) + end, + drop = true, +} + +register_all("basic_signs:sign_wall_glass", sign_def) +register_all("basic_signs:sign_wall_obsidian_glass", sign_def) +register_all("basic_signs:sign_wall_plastic", sign_def) + +-- Colored signs + +local sign_colors = { + "green", + "yellow", + "red", + "white_red", + "white_black", + "orange", + "blue", + "brown", +} + +for _, color in pairs(sign_colors) do + register_all("basic_signs:sign_wall_steel_"..color, sign_def) +end + +-- Locked sign + +register_all("basic_signs:sign_wall_locked", { + metas = { + text = wrench.META_TYPE_STRING, + glow = wrench.META_TYPE_STRING, + widefont = wrench.META_TYPE_INT, + unifont = wrench.META_TYPE_INT, + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_IGNORE, + }, + before_pickup = remove_glow, + after_place = function(pos, player, stack, pointed) + signs_lib.after_place_node(pos, player, stack, pointed, true) + signs_lib.update_sign(pos) + end, + drop = true, + owned = true, +}) diff --git a/nodes/bees.lua b/nodes/bees.lua new file mode 100644 index 0000000..19fc42a --- /dev/null +++ b/nodes/bees.lua @@ -0,0 +1,10 @@ + +-- Register wrench support for bees + +wrench.register_node("bees:hive_wild", { + timer = true, + lists = {"combs", "queen"}, + metas = { + agressive = wrench.META_TYPE_INT, + }, +}) diff --git a/nodes/biofuel.lua b/nodes/biofuel.lua new file mode 100644 index 0000000..0f451f0 --- /dev/null +++ b/nodes/biofuel.lua @@ -0,0 +1,20 @@ + +-- Register wrench support for biofuel refinery + +wrench.register_node("biofuel:refinery", { + lists = {"src", "dst"}, + metas = { + infotext = wrench.META_TYPE_STRING, + progress = wrench.META_TYPE_INT, + }, + timer = true, +}) + +wrench.register_node("biofuel:refinery_active", { + lists = {"src", "dst"}, + metas = { + infotext = wrench.META_TYPE_STRING, + progress = wrench.META_TYPE_INT, + }, + timer = true, +}) diff --git a/nodes/bones.lua b/nodes/bones.lua new file mode 100644 index 0000000..3162387 --- /dev/null +++ b/nodes/bones.lua @@ -0,0 +1,14 @@ + +-- Register wrench support for bones + +wrench.register_node("bones:bones", { + lists = {"main"}, + metas = { + owner = wrench.META_TYPE_STRING, + _owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + time = wrench.META_TYPE_INT, + }, + owned = true, +}) diff --git a/nodes/connected_chests.lua b/nodes/connected_chests.lua new file mode 100644 index 0000000..1b7d8ad --- /dev/null +++ b/nodes/connected_chests.lua @@ -0,0 +1,28 @@ + +-- Register wrench support for connected_chests + +wrench.register_node("default:chest_connected_left", { + lists = {"main"}, +}) + +wrench.register_node("default:chest_connected_right", { + lists = {"main"}, +}) + +wrench.register_node("default:chest_locked_connected_left", { + lists = {"main"}, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING + }, + owned = true, +}) + +wrench.register_node("default:chest_locked_connected_right", { + lists = {"main"}, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING + }, + owned = true, +}) diff --git a/nodes/default.lua b/nodes/default.lua index 17902e0..8bd2b09 100644 --- a/nodes/default.lua +++ b/nodes/default.lua @@ -1,15 +1,25 @@ -- Register nodes from default / minetest_game +local splitstacks = wrench.has_pipeworks and wrench.META_TYPE_INT +local formspec = wrench.has_pipeworks and wrench.META_TYPE_STRING + wrench.register_node("default:chest", { lists = {"main"}, + metas = { + splitstacks = splitstacks, + formspec = formspec, + infotext = wrench.META_TYPE_IGNORE, + } }) wrench.register_node("default:chest_locked", { lists = {"main"}, metas = { owner = wrench.META_TYPE_STRING, - infotext = wrench.META_TYPE_STRING + infotext = wrench.META_TYPE_STRING, + splitstacks = splitstacks, + formspec = formspec, }, owned = true, }) @@ -21,7 +31,9 @@ wrench.register_node("default:furnace", { fuel_totaltime = wrench.META_TYPE_FLOAT, fuel_time = wrench.META_TYPE_FLOAT, src_totaltime = wrench.META_TYPE_FLOAT, - src_time = wrench.META_TYPE_FLOAT + src_time = wrench.META_TYPE_FLOAT, + splitstacks = splitstacks, + formspec = formspec, }, }) @@ -32,26 +44,17 @@ wrench.register_node("default:furnace_active", { fuel_totaltime = wrench.META_TYPE_FLOAT, fuel_time = wrench.META_TYPE_FLOAT, src_totaltime = wrench.META_TYPE_FLOAT, - src_time = wrench.META_TYPE_FLOAT + src_time = wrench.META_TYPE_FLOAT, + splitstacks = splitstacks, + formspec = formspec, }, - store_meta_always = true, }) -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", { @@ -59,5 +62,4 @@ wrench.register_node("default:sign_wall_steel", { infotext = wrench.META_TYPE_STRING, text = wrench.META_TYPE_STRING }, - description = get_sign_description, }) diff --git a/nodes/digilines.lua b/nodes/digilines.lua new file mode 100644 index 0000000..c32541e --- /dev/null +++ b/nodes/digilines.lua @@ -0,0 +1,43 @@ + +-- Register wrench support for digilines + +wrench.register_node("digilines:chest", { + lists = {"main"}, + metas = { + infotext = wrench.META_TYPE_IGNORE, + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +}) + +wrench.register_node("digilines:lightsensor", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +}) + +wrench.register_node("digilines:rtc", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +}) + +local update_lcd = minetest.registered_nodes["digilines:lcd"].after_place_node + +wrench.register_node("digilines:lcd", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + text = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + }, + after_place = function(pos) + local param2 = minetest.get_node(pos).param2 + if param2 == 0 or param2 == 1 then + minetest.swap_node(pos, {name = "digilines:lcd", param2 = 3}) + end + update_lcd(pos) + end, +}) diff --git a/nodes/digiscreen.lua b/nodes/digiscreen.lua new file mode 100644 index 0000000..9e49229 --- /dev/null +++ b/nodes/digiscreen.lua @@ -0,0 +1,18 @@ + +-- Register wrench support for digiscreen + +local update_screen +for _,lbm in pairs(minetest.registered_lbms) do + if lbm.name == "digiscreen:respawn" then + update_screen = lbm.action + end +end + +wrench.register_node("digiscreen:digiscreen", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + data = wrench.META_TYPE_STRING, + }, + after_place = update_screen, +}) diff --git a/nodes/digistuff.lua b/nodes/digistuff.lua new file mode 100644 index 0000000..dfe1804 --- /dev/null +++ b/nodes/digistuff.lua @@ -0,0 +1,269 @@ + +-- Register wrench support for digistuff + +local S = wrench.translator + +function desc_stripped(node) + local desc = minetest.registered_nodes[node.name].description + desc = string.gsub(desc, " %(you hacker you!%)", "") + return string.gsub(desc, " %- you hacker you!%)", ")") +end + +function desc_stripped_with_channel(pos, meta, node, player) + return S("@1 with channel \"@2\"", desc_stripped(node), meta:get_string("channel")) +end + +-- Buttons +-- Unconfigured node cannot be picked up (digistuff:button) + +local nodes = { + "digistuff:button_off", + "digistuff:button_off_pushed", + "digistuff:button_on_pushed", +} + +for _, node in ipairs(nodes) do + wrench.register_node(node, { + drop = "digistuff:button_off", + metas = { + channel = wrench.META_TYPE_STRING, + protected = wrench.META_TYPE_INT, + msg = wrench.META_TYPE_STRING, + mlight = wrench.META_TYPE_INT, + }, + description = desc_stripped_with_channel, + }) +end + +-- Camera + +wrench.register_node("digistuff:camera", { + metas = { + formspec = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + radius = wrench.META_TYPE_INT, + distance = wrench.META_TYPE_INT, + }, +}) + +-- Card Reader + +wrench.register_node("digistuff:card_reader", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + infotext = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + writepending = wrench.META_TYPE_INT, + writedata = wrench.META_TYPE_STRING, + writedescription = wrench.META_TYPE_STRING, + }, +}) + +-- Game Controller +-- Unconfigured node cannot be picked up (digistuff:controller) + +wrench.register_node("digistuff:controller_programmed", { + metas = { + infotext = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + }, + description = desc_stripped_with_channel, +}) + +-- Detector + +wrench.register_node("digistuff:detector", { + metas = { + formspec = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + radius = wrench.META_TYPE_INT, + }, +}) + +-- GPU + +local gpu_def = { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +} + +for i = 0, 7 do + gpu_def.metas["buffer"..i] = wrench.META_TYPE_STRING +end + +wrench.register_node("digistuff:gpu", gpu_def) + +-- Memory: EEPROM & SRAM + +local mem_def = { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +} + +for i = 0, 31 do + mem_def.metas[string.format("data%02i", i)] = wrench.META_TYPE_STRING +end + +wrench.register_node("digistuff:eeprom", mem_def) +wrench.register_node("digistuff:ram", mem_def) + +-- I/O Expander +-- Inputs are not saved because they depend adjacent nodes. + +for i = 0, 15 do + wrench.register_node("digistuff:ioexpander_"..i, { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + aon = wrench.META_TYPE_IGNORE, + bon = wrench.META_TYPE_IGNORE, + con = wrench.META_TYPE_IGNORE, + don = wrench.META_TYPE_IGNORE, + outstate = wrench.META_TYPE_INT, + }, + description = i > 0 and desc_stripped_with_channel or nil, + }) +end + +-- Light + +for i = 0, 14 do + wrench.register_node("digistuff:light_"..i, { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, + description = function(pos, meta, node, player) + local state = S("light level @1", i) + local channel = meta:get_string("channel") + return S("@1 (@2) with channel \"@3\"", desc_stripped(node), state, channel) + end, + }) +end + +-- Movestone +-- Moving movestones will be stopped when picked up. + +wrench.register_node("digistuff:movestone", { + owned = true, + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + owner = wrench.META_TYPE_STRING, + state = wrench.META_TYPE_IGNORE, + active = wrench.META_TYPE_IGNORE, + }, +}) + +-- Nic + +wrench.register_node("digistuff:nic", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +}) + +-- Noteblock + +wrench.register_node("digistuff:noteblock", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +}) + +-- Panel + +wrench.register_node("digistuff:panel", { + metas = { + formspec = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + locked = wrench.META_TYPE_INT, + text = wrench.META_TYPE_STRING, + }, +}) + +-- Piezo +-- Sounds will be stopped when picked up. + +wrench.register_node("digistuff:piezo", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + }, +}) + +-- Pistons +-- Extended pistons will be retracted when picked up. + +wrench.register_node("digistuff:piston", { + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + owner = wrench.META_TYPE_STRING, + }, +}) + +wrench.register_node("digistuff:piston_ext", { + drop = true, + before_pickup = function(pos, meta, node, player) + -- Remove piston head + local def = minetest.registered_nodes[node.name] + def.after_dig_node(pos, node) + end, + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + owner = wrench.META_TYPE_STRING, + }, + description = desc_stripped_with_channel, +}) + +-- Timer + +wrench.register_node("digistuff:timer", { + timer = true, + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + loop = wrench.META_TYPE_INT, + }, +}) + +-- Touchscreens + +wrench.register_node("digistuff:touchscreen", { + metas = { + formspec = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + data = wrench.META_TYPE_STRING, + init = wrench.META_TYPE_INT, + locked = wrench.META_TYPE_INT, + no_prepend = wrench.META_TYPE_INT, + real_coordinates = wrench.META_TYPE_INT, + fixed_size = wrench.META_TYPE_INT, + width = wrench.META_TYPE_STRING, + height = wrench.META_TYPE_STRING, + }, +}) + +-- Wall Knob +-- Unconfigured node cannot be picked up (digistuff:wall_knob) + +wrench.register_node("digistuff:wall_knob_configured", { + drop = false, + metas = { + infotext = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + min = wrench.META_TYPE_INT, + max = wrench.META_TYPE_INT, + value = wrench.META_TYPE_INT, + protected = wrench.META_TYPE_INT, + }, + description = desc_stripped_with_channel, +}) diff --git a/nodes/drawers.lua b/nodes/drawers.lua index e5c4e85..5990993 100644 --- a/nodes/drawers.lua +++ b/nodes/drawers.lua @@ -20,17 +20,17 @@ for _, drawer_type in ipairs({1, 2, 4}) do suffix = i end - def.metas["name" .. suffix] = STRING - def.metas["count" .. suffix] = INT - def.metas["max_count" .. suffix] = INT - def.metas["base_stack_max" .. suffix] = INT - def.metas["entity_infotext" .. suffix] = STRING - def.metas["stack_max_factor" .. suffix] = INT + def.metas["name"..suffix] = STRING + def.metas["count"..suffix] = INT + def.metas["max_count"..suffix] = INT + def.metas["base_stack_max"..suffix] = INT + def.metas["entity_infotext"..suffix] = STRING + def.metas["stack_max_factor"..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/nodes/mesecons_commandblock.lua b/nodes/mesecons_commandblock.lua new file mode 100644 index 0000000..d0e4abd --- /dev/null +++ b/nodes/mesecons_commandblock.lua @@ -0,0 +1,17 @@ + +-- Register wrench support for mesecons_commandblock + +local states = { "off", "on" } +for _, state in ipairs(states) do + wrench.register_node("mesecons_commandblock:commandblock_"..state, { + -- ignore after_place function: sets owner + owned = true, + drop = state == "on", + metas = { + infotext = wrench.META_TYPE_STRING, + commands = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + owner = wrench.META_TYPE_STRING, + }, + }) +end diff --git a/nodes/mesecons_detector.lua b/nodes/mesecons_detector.lua new file mode 100644 index 0000000..11cec21 --- /dev/null +++ b/nodes/mesecons_detector.lua @@ -0,0 +1,22 @@ + +-- Register wrench support for mesecons_detector + +for _, state in pairs({"on", "off"}) do + wrench.register_node("mesecons_detector:node_detector_"..state, { + drop = state == "on", + metas = { + formspec = wrench.META_TYPE_IGNORE, + distance = wrench.META_TYPE_STRING, + digiline_channel = wrench.META_TYPE_STRING, + scanname = wrench.META_TYPE_STRING, + }, + }) + wrench.register_node("mesecons_detector:object_detector_"..state, { + drop = state == "on", + metas = { + formspec = wrench.META_TYPE_IGNORE, + digiline_channel = wrench.META_TYPE_STRING, + scanname = wrench.META_TYPE_STRING, + }, + }) +end diff --git a/nodes/mesecons_luacontroller.lua b/nodes/mesecons_luacontroller.lua new file mode 100644 index 0000000..aa107aa --- /dev/null +++ b/nodes/mesecons_luacontroller.lua @@ -0,0 +1,34 @@ + +-- Register wrench support for mesecons_luacontroller + +local S = wrench.translator + +local luacontroller_def = { + drop = true, + metas = { + code = wrench.META_TYPE_STRING, + lc_memory = wrench.META_TYPE_STRING, + luac_id = wrench.META_TYPE_INT, + formspec = wrench.META_TYPE_STRING, + real_portstates = wrench.META_TYPE_INT, + ignore_offevents = wrench.META_TYPE_STRING, + }, + description = function(pos, meta, node, player) + local desc = minetest.registered_nodes["mesecons_luacontroller:luacontroller0000"].description + return S("@1 with code", desc) + end, +} + +for a = 0, 1 do +for b = 0, 1 do +for c = 0, 1 do +for d = 0, 1 do + local state = d..c..b..a + wrench.register_node("mesecons_luacontroller:luacontroller"..state, luacontroller_def) +end +end +end +end + +luacontroller_def.drop = nil +wrench.register_node("mesecons_luacontroller:luacontroller_burnt", luacontroller_def) diff --git a/nodes/mesecons_microcontroller.lua b/nodes/mesecons_microcontroller.lua new file mode 100644 index 0000000..d92badf --- /dev/null +++ b/nodes/mesecons_microcontroller.lua @@ -0,0 +1,25 @@ + +-- Register wrench support for mesecons_microcontroller + +for a = 0, 1 do +for b = 0, 1 do +for c = 0, 1 do +for d = 0, 1 do + local state = d..c..b..a + wrench.register_node("mesecons_microcontroller:microcontroller"..state, { + metas = { + infotext = wrench.META_TYPE_STRING, + code = wrench.META_TYPE_STRING, + afterid = wrench.META_TYPE_INT, + eeprom = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + real_portstates = wrench.META_TYPE_INT, + }, + description = function(pos, meta, node, player) + return meta:get_string("infotext") + end, + }) +end +end +end +end diff --git a/nodes/mobs.lua b/nodes/mobs.lua new file mode 100644 index 0000000..6d25658 --- /dev/null +++ b/nodes/mobs.lua @@ -0,0 +1,13 @@ + +-- Register wrench support for mobs_redo + +wrench.register_node("mobs:spawner", { + metas = { + command = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + }, + description = function(pos, meta, node, player) + return meta:get_string("infotext") + end, +}) diff --git a/nodes/more_chests.lua b/nodes/more_chests.lua new file mode 100644 index 0000000..233e90e --- /dev/null +++ b/nodes/more_chests.lua @@ -0,0 +1,41 @@ + +-- Register wrench support for more_chests + +local basic_chests = { + "more_chests:cobble", + "more_chests:dropbox", + "more_chests:fridge", + "more_chests:big_fridge", + "more_chests:secret", + "more_chests:toolbox_acacia", + "more_chests:toolbox_aspen", + "more_chests:toolbox_jungle", + "more_chests:toolbox_pine", + "more_chests:toolbox_steel", + "more_chests:toolbox_wood", +} + +for _, chest in pairs(basic_chests) do + wrench.register_node(chest, { + lists = {"main"}, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_IGNORE, + }, + owned = true, + }) +end + +-- Shared Chest + +wrench.register_node("more_chests:shared", { + lists = {"main"}, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + shared = wrench.META_TYPE_STRING, + }, + owned = true, +}) diff --git a/nodes/pipeworks.lua b/nodes/pipeworks.lua new file mode 100644 index 0000000..3aadaa7 --- /dev/null +++ b/nodes/pipeworks.lua @@ -0,0 +1,160 @@ + +-- Register wrench support for pipeworks + +local S = wrench.translator + +local desc_infotext = function(pos, meta, node, player) + return meta:get_string("infotext") +end + +-- Autocrafter + +wrench.register_node("pipeworks:autocrafter", { + lists = {"src", "dst", "recipe", "output"}, + metas = { + enabled = wrench.META_TYPE_INT, + channel = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + splitstacks = wrench.META_TYPE_INT, + }, + description = desc_infotext, + timer = true, +}) + +local wielder_data = { + lists = {"main"}, + metas = { + infotext = wrench.META_TYPE_IGNORE, + formspec = wrench.META_TYPE_IGNORE, + owner = wrench.META_TYPE_STRING, + }, + drop = true, +} + +wrench.register_node("pipeworks:deployer_off", wielder_data) +wrench.register_node("pipeworks:deployer_on", wielder_data) + +wrench.register_node("pipeworks:dispenser_off", wielder_data) +wrench.register_node("pipeworks:dispenser_on", wielder_data) + +table.insert(wielder_data.lists, "pick") +table.insert(wielder_data.lists, "ghost_pick") +wrench.register_node("pipeworks:nodebreaker_off", wielder_data) +wrench.register_node("pipeworks:nodebreaker_on", wielder_data) + +-- Filters + +local filter_data = { + lists = {"main"}, + metas = { + slotseq_mode = wrench.META_TYPE_INT, + slotseq_index = wrench.META_TYPE_INT, + exmatch_mode = wrench.META_TYPE_INT, + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + }, + description = wrench.description_with_configuration, +} + +wrench.register_node("pipeworks:filter", filter_data) +wrench.register_node("pipeworks:mese_filter", filter_data) + +filter_data.metas["channel"] = wrench.META_TYPE_STRING +wrench.register_node("pipeworks:digiline_filter", filter_data) + +-- Tubes (6d style): 'mese_sand_tube','teleport_tube', 'digiline_detector_tube' + +for i = 1, 10 do + wrench.register_node("pipeworks:mese_sand_tube_"..i, { + drop = true, + metas = { + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_IGNORE, + dist = wrench.META_TYPE_INT, + adjlist = wrench.META_TYPE_IGNORE, + tubedir = wrench.META_TYPE_IGNORE, + }, + description = desc_infotext, + }) + wrench.register_node("pipeworks:teleport_tube_"..i, { + drop = true, + metas = { + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + can_receive = wrench.META_TYPE_INT, + adjlist = wrench.META_TYPE_IGNORE, + tubedir = wrench.META_TYPE_IGNORE, + }, + description = desc_infotext, + }) + if wrench.has_digilines then + wrench.register_node("pipeworks:digiline_detector_tube_"..i, { + drop = true, + metas = { + formspec = wrench.META_TYPE_IGNORE, + channel = wrench.META_TYPE_STRING, + adjlist = wrench.META_TYPE_IGNORE, + tubedir = wrench.META_TYPE_IGNORE, + }, + description = wrench.description_with_channel, + }) + end +end + +-- Tubes (old style): 'lua_tube' and 'mese_tube' + +local lua_tube_data = { + drop = true, + metas = { + formspec = wrench.META_TYPE_STRING, + code = wrench.META_TYPE_STRING, + ignore_offevents = wrench.META_TYPE_STRING, + lc_memory = wrench.META_TYPE_STRING, + luac_id = wrench.META_TYPE_INT, + real_portstates = wrench.META_TYPE_INT, + tubedir = wrench.META_TYPE_IGNORE, + }, + description = function(pos, meta, node, player) + local desc = minetest.registered_nodes["pipeworks:lua_tube000000"].description + return S("@1 with code", desc) + end, +} + +local mese_tube_data = { + drop = true, + lists = {}, + metas = { + formspec = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_IGNORE, + adjlist = wrench.META_TYPE_IGNORE, + tubedir = wrench.META_TYPE_IGNORE, + }, + description = wrench.description_with_configuration, +} + +for i = 1, 6 do + mese_tube_data.metas["l"..i.."s"] = wrench.META_TYPE_INT + table.insert(mese_tube_data.lists, "line"..i) +end + +for xm = 0, 1 do +for xp = 0, 1 do +for ym = 0, 1 do +for yp = 0, 1 do +for zm = 0, 1 do +for zp = 0, 1 do + local tname = xm..xp..ym..yp..zm..zp + wrench.register_node("pipeworks:lua_tube"..tname, lua_tube_data) + wrench.register_node("pipeworks:mese_tube_"..tname, mese_tube_data) +end +end +end +end +end +end + +lua_tube_data.drop = nil +wrench.register_node("pipeworks:lua_tube_burnt", lua_tube_data) diff --git a/nodes/protector.lua b/nodes/protector.lua new file mode 100644 index 0000000..ee3f353 --- /dev/null +++ b/nodes/protector.lua @@ -0,0 +1,28 @@ + +-- Register wrench support for protector + +wrench.register_node("protector:chest", { + lists = {"main"}, + metas = { + name = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + }, +}) + +wrench.register_node("protector:protect", { + owned = true, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + members = wrench.META_TYPE_STRING, + }, +}) + +wrench.register_node("protector:protect2", { + owned = true, + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + members = wrench.META_TYPE_STRING, + }, +}) diff --git a/nodes/signs_lib.lua b/nodes/signs_lib.lua new file mode 100644 index 0000000..326e0bc --- /dev/null +++ b/nodes/signs_lib.lua @@ -0,0 +1,64 @@ + +-- Register wrench support for signs_lib (overrides default signs) + +local function remove_glow(pos, meta) + meta:set_string("glow", "") +end + +-- Wood signs + +local wood_signs = { + "default:sign_wall_wood", + "default:sign_wood_hanging", + "default:sign_wood_onpole", + "default:sign_wood_onpole_horiz", + "default:sign_wood_yard", +} + +for _, n in pairs(wood_signs) do + wrench.register_node(n, { + metas = { + text = wrench.META_TYPE_STRING, + glow = wrench.META_TYPE_STRING, + widefont = wrench.META_TYPE_INT, + unifont = wrench.META_TYPE_INT, + infotext = wrench.META_TYPE_IGNORE, + }, + before_pickup = remove_glow, + after_place = function(pos, player, stack, pointed) + signs_lib.after_place_node(pos, player, stack, pointed) + signs_lib.update_sign(pos) + end, + drop = "default:sign_wall_wood", + }) +end + +-- Steel signs (locked) + +local steel_signs = { + "default:sign_wall_steel", + "default:sign_steel_hanging", + "default:sign_steel_onpole", + "default:sign_steel_onpole_horiz", + "default:sign_steel_yard", +} + +for _, n in pairs(steel_signs) do + wrench.register_node(n, { + metas = { + text = wrench.META_TYPE_STRING, + glow = wrench.META_TYPE_STRING, + widefont = wrench.META_TYPE_INT, + unifont = wrench.META_TYPE_INT, + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_IGNORE, + }, + before_pickup = remove_glow, + after_place = function(pos, player, stack, pointed) + signs_lib.after_place_node(pos, player, stack, pointed, true) + signs_lib.update_sign(pos) + end, + drop = "default:sign_wall_steel", + owned = true, + }) +end diff --git a/nodes/technic.lua b/nodes/technic.lua index 288b857..4f1562c 100644 --- a/nodes/technic.lua +++ b/nodes/technic.lua @@ -8,17 +8,22 @@ local function register_machine_node(nodename, tier) local lists = tier ~= "LV" and machine_invlist_upgrades or machine_invlist local metas = { infotext = wrench.META_TYPE_STRING, - formspec = wrench.META_TYPE_STRING, + formspec = tier ~= "LV" and wrench.META_TYPE_STRING or wrench.META_TYPE_IGNORE, + splitstacks = tier ~= "LV" and wrench.META_TYPE_INT or nil, [tier.."_EU_demand"] = wrench.META_TYPE_INT, [tier.."_EU_input"] = wrench.META_TYPE_INT, - tube_time = tier ~= "LV" and wrench.META_TYPE_INT or nil, + tube_time = tier ~= "LV" and wrench.META_TYPE_INT or wrench.META_TYPE_IGNORE, src_time = wrench.META_TYPE_INT, } - wrench.register_node(nodename, {lists = lists, metas = metas}) + wrench.register_node(nodename, { + lists = lists, + metas = metas, + lists_ignore = tier ~= "LV" and {"dst_tmp"} or {"dst_tmp", "upgrade1", "upgrade2"} + }) end --- base_machines table row format: name = { extra meta fields } -local defaults = { tiers = {"LV", "MV", "HV"} } +local defaults = {tiers = {"LV", "MV", "HV"}} + local base_machines = { electric_furnace = defaults, grinder = defaults, @@ -30,7 +35,7 @@ local base_machines = { } for name, data in pairs(base_machines) do - for _,tier in ipairs(data.tiers) do + for _, tier in ipairs(data.tiers) do local nodename = "technic:"..tier:lower().."_"..name register_machine_node(nodename, tier) if minetest.registered_nodes[nodename.."_active"] then @@ -39,7 +44,29 @@ for name, data in pairs(base_machines) do end end ---------------------------------------------------------------------- +-- Generators + +local function register_generator(nodename, tier) + wrench.register_node(nodename, { + lists = {"src"}, + metas = { + infotext = wrench.META_TYPE_IGNORE, + formspec = wrench.META_TYPE_IGNORE, + splitstacks = tier ~= "LV" and wrench.META_TYPE_INT or wrench.META_TYPE_IGNORE, + burn_time = wrench.META_TYPE_INT, + burn_totaltime = wrench.META_TYPE_INT, + tube_time = wrench.META_TYPE_IGNORE, + [tier.."_EU_supply"] = wrench.META_TYPE_IGNORE, + }, + }) +end + +for _, tier in ipairs(defaults.tiers) do + local nodename ="technic:"..tier:lower().."_generator" + register_generator(nodename, tier) + register_generator(nodename.."_active", tier) +end + -- Special nodes wrench.register_node("technic:coal_alloy_furnace", { @@ -68,13 +95,15 @@ wrench.register_node("technic:tool_workshop", { lists = {"src", "upgrade1", "upgrade2"}, metas = { infotext = wrench.META_TYPE_STRING, - formspec = wrench.META_TYPE_STRING, MV_EU_demand = wrench.META_TYPE_INT, MV_EU_input = wrench.META_TYPE_INT, - tube_time = wrench.META_TYPE_INT + tube_time = wrench.META_TYPE_INT, + formspec = wrench.META_TYPE_IGNORE }, }) +-- Battery boxes + for _, tier in pairs({"LV", "MV", "HV"}) do for i = 0, 8 do wrench.register_node("technic:"..tier:lower().."_battery_box"..i, { @@ -86,8 +115,114 @@ for _, tier in pairs({"LV", "MV", "HV"}) do [tier.."_EU_supply"] = wrench.META_TYPE_INT, [tier.."_EU_input"] = wrench.META_TYPE_INT, internal_EU_charge = wrench.META_TYPE_INT, - last_side_shown = wrench.META_TYPE_INT + internal_EU_charge_max = wrench.META_TYPE_INT, + last_side_shown = wrench.META_TYPE_INT, + channel = wrench.has_digilines and wrench.META_TYPE_STRING, + tube_time = tier ~= "LV" and wrench.META_TYPE_INT or wrench.META_TYPE_IGNORE, }, + lists_ignore = tier ~= "LV" and nil or {"upgrade1", "upgrade2"}, }) end end + +-- Other machines + +wrench.register_node("technic:injector", { + lists = {"main"}, + metas = { + splitstacks = wrench.META_TYPE_INT, + mode = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + }, + timer = true, +}) + +if wrench.has_digilines then + wrench.register_node("technic:power_monitor", { + metas = { + channel = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_IGNORE, + formspec = wrench.META_TYPE_IGNORE, + }, + }) + wrench.register_node("technic:switching_station", { + timer = true, + metas = { + channel = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_IGNORE, + formspec = wrench.META_TYPE_IGNORE, + }, + }) +end + +-- Supply converter + +wrench.register_node("technic:supply_converter", { + metas = { + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + channel = wrench.META_TYPE_STRING, + enabled = wrench.META_TYPE_INT, + power = wrench.META_TYPE_INT, + mesecon_effect = wrench.META_TYPE_INT, + mesecon_mode = wrench.META_TYPE_INT, + LV_EU_demand = wrench.META_TYPE_IGNORE, + LV_EU_input = wrench.META_TYPE_IGNORE, + LV_EU_supply = wrench.META_TYPE_IGNORE, + MV_EU_demand = wrench.META_TYPE_IGNORE, + MV_EU_input = wrench.META_TYPE_IGNORE, + MV_EU_supply = wrench.META_TYPE_IGNORE, + HV_EU_demand = wrench.META_TYPE_IGNORE, + HV_EU_input = wrench.META_TYPE_IGNORE, + HV_EU_supply = wrench.META_TYPE_IGNORE, + }, +}) + +-- Forcefield emitter + +local states = { "off", "on" } +for _, state in ipairs(states) do + wrench.register_node("technic:forcefield_emitter_"..state, { + drop = state == "on", + metas = { + enabled = wrench.META_TYPE_INT, + formspec = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + mesecon_mode = wrench.META_TYPE_INT, + mesecon_effect = wrench.META_TYPE_INT, + HV_EU_input = wrench.META_TYPE_INT, + HV_EU_demand = wrench.META_TYPE_INT, + range = wrench.META_TYPE_INT, + shape = wrench.META_TYPE_INT, + channel = wrench.has_digilines and wrench.META_TYPE_STRING, + }, + }) +end + +-- Quarry + +wrench.register_node("technic:quarry", { + owned = true, + lists = {"cache"}, + metas = { + enabled = wrench.META_TYPE_INT, + finished = wrench.META_TYPE_INT, + dig_index = wrench.META_TYPE_INT, + dig_steps = wrench.META_TYPE_INT, + quarry_dir = wrench.META_TYPE_INT, + owner = wrench.META_TYPE_STRING, + purge_on = wrench.META_TYPE_INT, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + quarry_pos = wrench.META_TYPE_STRING, + dig_level = wrench.META_TYPE_INT, + HV_EU_demand = wrench.META_TYPE_INT, + max_depth = wrench.META_TYPE_INT, + dug = wrench.META_TYPE_INT, + size = wrench.META_TYPE_INT, + channel = wrench.has_digilines and wrench.META_TYPE_STRING, + dig_pos = wrench.META_TYPE_IGNORE, + HV_EU_input = wrench.META_TYPE_IGNORE, + }, +}) diff --git a/nodes/technic_chests.lua b/nodes/technic_chests.lua index 9e97b14..5b06d57 100644 --- a/nodes/technic_chests.lua +++ b/nodes/technic_chests.lua @@ -1,43 +1,36 @@ -- 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 - return result -end +local splitstacks = wrench.has_pipeworks and wrench.META_TYPE_INT local chests_meta = { iron = { infotext = wrench.META_TYPE_STRING, formspec = wrench.META_TYPE_STRING, sort_mode = wrench.META_TYPE_INT, + splitstacks = splitstacks, }, copper = { infotext = wrench.META_TYPE_STRING, formspec = wrench.META_TYPE_STRING, sort_mode = wrench.META_TYPE_INT, autosort = wrench.META_TYPE_INT, + splitstacks = splitstacks, }, silver = { infotext = wrench.META_TYPE_STRING, formspec = wrench.META_TYPE_STRING, sort_mode = wrench.META_TYPE_INT, autosort = wrench.META_TYPE_INT, + splitstacks = splitstacks, }, gold = { infotext = wrench.META_TYPE_STRING, formspec = wrench.META_TYPE_STRING, sort_mode = wrench.META_TYPE_INT, autosort = wrench.META_TYPE_INT, + splitstacks = splitstacks, + color = wrench.META_TYPE_INT, }, mithril = { infotext = wrench.META_TYPE_STRING, @@ -50,63 +43,60 @@ local chests_meta = { send_inject = wrench.META_TYPE_INT, send_pull = wrench.META_TYPE_INT, send_overflow = wrench.META_TYPE_INT, + splitstacks = splitstacks, }, } -for name, metas in pairs(chests_meta) do - wrench.register_node("technic:"..name.."_chest", { +local function with_owner_field(metas) + local result = table.copy(metas) + result.owner = wrench.META_TYPE_STRING + return result +end + +local function register_chests(material, color) + local lists_ignore = (material ~= "iron" and material ~= "copper") and {"quickmove"} or nil + wrench.register_node("technic:"..material.."_chest"..color, { lists = {"main"}, - metas = metas, - description = get_chest_description, + lists_ignore = lists_ignore, + metas = chests_meta[material], }) - wrench.register_node("technic:"..name.."_protected_chest", { + wrench.register_node("technic:"..material.."_protected_chest"..color, { lists = {"main"}, - metas = metas, - description = get_chest_description, + lists_ignore = lists_ignore, + metas = chests_meta[material], }) - wrench.register_node("technic:"..name.."_locked_chest", { + wrench.register_node("technic:"..material.."_locked_chest"..color, { lists = {"main"}, - metas = with_owner_field(metas), - description = get_chest_description, + lists_ignore = lists_ignore, + metas = with_owner_field(chests_meta[material]), owned = true, }) end +for material, metas in pairs(chests_meta) do + register_chests(material, "") +end + -- Register extra nodes with color marking for gold chest local chest_mark_colors = { - '_black', - '_blue', - '_brown', - '_cyan', - '_dark_green', - '_dark_grey', - '_green', - '_grey', - '_magenta', - '_orange', - '_pink', - '_red', - '_violet', - '_white', - '_yellow', + "_black", + "_blue", + "_brown", + "_cyan", + "_dark_green", + "_dark_grey", + "_green", + "_grey", + "_magenta", + "_orange", + "_pink", + "_red", + "_violet", + "_white", + "_yellow", } for i = 1, 15 do - 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], { - lists = {"main"}, - metas = chests_meta.gold, - description = get_chest_description, - }) - 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, - }) + register_chests("gold", chest_mark_colors[i]) end diff --git a/nodes/technic_cnc.lua b/nodes/technic_cnc.lua index 3adf8bb..e6dd2e9 100644 --- a/nodes/technic_cnc.lua +++ b/nodes/technic_cnc.lua @@ -32,9 +32,12 @@ if minetest.registered_nodes["technic:cnc_mk2"] then LV_EU_demand = wrench.META_TYPE_INT, LV_EU_input = wrench.META_TYPE_INT, src_time = wrench.META_TYPE_INT, + tube_time = wrench.META_TYPE_INT, size = wrench.META_TYPE_INT, program = wrench.META_TYPE_STRING, cnc_user = wrench.META_TYPE_STRING, + splitstacks = wrench.has_pipeworks and wrench.META_TYPE_INT, + channel = wrench.has_digilines and wrench.META_TYPE_STRING, }, }) end diff --git a/nodes/vessels.lua b/nodes/vessels.lua new file mode 100644 index 0000000..1aeb416 --- /dev/null +++ b/nodes/vessels.lua @@ -0,0 +1,10 @@ + +-- Register wrench support for vessels + +wrench.register_node("vessels:shelf", { + lists = { "vessels" }, + metas = { + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + }, +}) diff --git a/nodes/xdecor.lua b/nodes/xdecor.lua new file mode 100644 index 0000000..ac816e6 --- /dev/null +++ b/nodes/xdecor.lua @@ -0,0 +1,153 @@ + +-- Register wrench support for xdecor + +local S = wrench.translator + +xdecor:register_repairable("wrench:wrench") + +local nodes = { + "xdecor:cabinet", + "xdecor:cabinet_half", + "xdecor:empty_shelf", + "xdecor:multishelf", +} + +for _, nodename in pairs(nodes) do + wrench.register_node(nodename, { + lists = {"main"}, + metas = { + infotext = wrench.META_TYPE_IGNORE, + formspec = wrench.META_TYPE_IGNORE, + }, + }) +end + +-- Cauldron + +nodes = { + "xdecor:cauldron_empty", + "xdecor:cauldron_idle", + "xdecor:cauldron_boiling", + "xdecor:cauldron_soup", +} + +for _, nodename in pairs(nodes) do + wrench.register_node(nodename, { + metas = { + infotext = wrench.META_TYPE_STRING, + }, + description = function(pos, meta, node, player) + local desc = minetest.registered_nodes[node.name].description + return desc ~= "" and desc or minetest.registered_nodes[node.name].infotext + end, + }) +end + +-- Chessboard + +wrench.register_node("realchess:chessboard", { + lists = {"board"}, + metas = { + formspec = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + + playerBlack = wrench.META_TYPE_STRING, + playerWhite = wrench.META_TYPE_STRING, + lastMove = wrench.META_TYPE_STRING, + + blackAttacked = wrench.META_TYPE_STRING, + whiteAttacked = wrench.META_TYPE_STRING, + + lastMoveTime = wrench.META_TYPE_INT, + castlingBlackL = wrench.META_TYPE_INT, + castlingBlackR = wrench.META_TYPE_INT, + castlingWhiteL = wrench.META_TYPE_INT, + castlingWhiteR = wrench.META_TYPE_INT, + + moves = wrench.META_TYPE_STRING, + eaten = wrench.META_TYPE_STRING, + mode = wrench.META_TYPE_STRING, + }, + description = function(pos, meta, node, player) + local desc = minetest.registered_nodes[node.name].description + return S("@1 \"@2\" vs. \"@3\"", desc, meta:get_string("playerWhite"), meta:get_string("playerBlack")) + end +}) + +-- Enchantment Table + +wrench.register_node("xdecor:enchantment_table", { + lists = {"tool", "mese"}, + metas = { + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, + }, +}) + +-- Hive + +wrench.register_node("xdecor:hive", { + timer = true, + lists = {"honey"}, + metas = { + formspec = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + }, +}) + +-- Item Frame + +wrench.register_node("xdecor:itemframe", { + metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + item = wrench.META_TYPE_STRING, + }, + owned = true, + after_place = function(pos, player, stack) + -- Force item update + local timer = minetest.get_node_timer(pos) + timer:start(0) + end, + description = function(pos, meta, node, player) + local desc = minetest.registered_nodes[node.name].description + local item = meta:get_string("item") + if item and item ~= "" then + local d = ItemStack(item):get_short_description() + return S("@1 with \"@2\"", desc, d or item) + else + return desc + end + end, +}) + +-- Mailbox + +local mailbox_metas = { + owner = wrench.META_TYPE_STRING, + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_STRING, +} + +for i = 1, 7 do + mailbox_metas["giver"..i] = wrench.META_TYPE_STRING + mailbox_metas["stack"..i] = wrench.META_TYPE_STRING +end + +wrench.register_node("xdecor:mailbox", { + lists = {"mailbox", "drop"}, + metas = mailbox_metas, + owned = true, +}) + +-- Workbench + +wrench.register_node("xdecor:workbench", { + lists = {"tool", "input", "hammer", "forms", "storage"}, + metas = { + infotext = wrench.META_TYPE_STRING, + formspec = wrench.META_TYPE_IGNORE, + }, + owned = true, + timer = true, +}) diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..010d590 --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,5 @@ +# Allows the wrench to be crafted if either the 'technic' or 'default' mod is installed. +wrench.enable_crafting (Enable crafting recipe) bool true + +# Shows debug info in the console when the wrench is used with 'sneak' (very experimental) +wrench.enable_debug (Shows debug info) bool false diff --git a/tool.lua b/tool.lua index 653f762..3fa03bd 100644 --- a/tool.lua +++ b/tool.lua @@ -1,5 +1,5 @@ -local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end +local S = wrench.translator minetest.register_tool("wrench:wrench", { description = S("Wrench"), @@ -25,13 +25,24 @@ minetest.register_tool("wrench:wrench", { 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", ""} - } - }) +if minetest.settings:get_bool("wrench.enable_crafting", true) then + if minetest.get_modpath("technic") then + minetest.register_craft({ + output = "wrench:wrench", + recipe = { + {"technic:stainless_steel_ingot", "", "technic:stainless_steel_ingot"}, + {"", "technic:stainless_steel_ingot", ""}, + {"", "technic:stainless_steel_ingot", ""} + } + }) + elseif minetest.get_modpath("default") then + minetest.register_craft({ + output = "wrench:wrench", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + {"", "default:steel_ingot", ""} + } + }) + end end