From b2ff68fe8c0397a77ed8afabe8642f687ac9c15b Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Fri, 23 Aug 2019 23:35:37 +0200 Subject: [PATCH] further logic nodes added --- basic_machines/chest.lua | 48 +++--- basis/command.lua | 38 ++--- doc/ta3_doc.lua | 2 +- init.lua | 5 + logic/button.lua | 201 ++++++++++++++++++++++++++ logic/detector.lua | 154 ++++++++++++++++++++ logic/lib.lua | 73 ++++++++++ logic/programmer.lua | 108 ++++++++++++++ logic/repeater.lua | 118 +++++++++++++++ logic/terminal.lua | 35 +++-- power/powerswitch.lua | 12 +- solar/minicell.lua | 10 +- textures/techage_appl_button.png | Bin 0 -> 173 bytes textures/techage_appl_detector.png | Bin 0 -> 215 bytes textures/techage_appl_detector_on.png | Bin 0 -> 215 bytes textures/techage_appl_repeater.png | Bin 0 -> 252 bytes textures/techage_button_off.png | Bin 0 -> 168 bytes textures/techage_button_on.png | Bin 0 -> 168 bytes textures/techage_programmer.png | Bin 0 -> 879 bytes textures/techage_programmer_wield.png | Bin 0 -> 698 bytes tools/repairkit.lua | 4 +- 21 files changed, 746 insertions(+), 62 deletions(-) create mode 100644 logic/button.lua create mode 100644 logic/detector.lua create mode 100644 logic/lib.lua create mode 100644 logic/programmer.lua create mode 100644 logic/repeater.lua create mode 100644 textures/techage_appl_button.png create mode 100644 textures/techage_appl_detector.png create mode 100644 textures/techage_appl_detector_on.png create mode 100644 textures/techage_appl_repeater.png create mode 100644 textures/techage_button_off.png create mode 100644 textures/techage_button_on.png create mode 100644 textures/techage_programmer.png create mode 100644 textures/techage_programmer_wield.png diff --git a/basic_machines/chest.lua b/basic_machines/chest.lua index 6ec5d45..3d60697 100644 --- a/basic_machines/chest.lua +++ b/basic_machines/chest.lua @@ -23,27 +23,27 @@ local InventoryState = {} local function store_action(pos, player, action, stack) local meta = minetest.get_meta(pos) local name = player and player:get_player_name() or "" - local number = meta:get_string("number") + local number = meta:get_string("node_number") local item = stack:get_name().." "..stack:get_count() PlayerActions[number] = {name, action, item} end local function send_off_command(pos) local meta = minetest.get_meta(pos) - local dest_num = meta:get_string("dest_num") - local own_num = meta:get_string("number") - local owner = meta:get_string("owner") - techage.send_multi(dest_num, owner, nil, "off", own_num) + local numbers = meta:get_string("numbers") or "" + if numbers ~= "" then + local own_num = meta:get_string("node_number") + techage.send_multi(numbers, "off", own_num) + end end local function send_command(pos) local meta = minetest.get_meta(pos) - local dest_num = meta:get_string("dest_num") - if dest_num ~= "" then - local own_num = meta:get_string("number") - local owner = meta:get_string("owner") - techage.send_multi(dest_num, owner, nil, "on", own_num) + local numbers = meta:get_string("numbers") or "" + if numbers ~= "" then + local own_num = meta:get_string("node_number") + techage.send_multi(numbers, "on", own_num) minetest.after(1, send_off_command, pos) end end @@ -110,12 +110,16 @@ minetest.register_node("techage:chest_ta2", { after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = techage.add_node(pos, "techage:chest_ta2") - meta:set_string("number", number) + meta:set_string("node_number", number) meta:set_string("owner", placer:get_player_name()) meta:set_string("formspec", formspec2()) meta:set_string("infotext", S("TA2 Protected Chest").." "..number) end, + techage_set_numbers = function(pos, numbers, player_name) + return techage.logic.set_numbers(pos, numbers, player_name, S("TA2 Protected Chest")) + end, + can_dig = can_dig, after_dig_node = after_dig_node, allow_metadata_inventory_put = allow_metadata_inventory_put, @@ -159,12 +163,16 @@ minetest.register_node("techage:chest_ta3", { after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = techage.add_node(pos, "techage:chest_ta3") - meta:set_string("number", number) + meta:set_string("node_number", number) meta:set_string("owner", placer:get_player_name()) meta:set_string("formspec", formspec3()) meta:set_string("infotext", S("TA3 Protected Chest").." "..number) end, + techage_set_numbers = function(pos, numbers, player_name) + return techage.logic.set_numbers(pos, numbers, player_name, S("TA3 Protected Chest")) + end, + can_dig = can_dig, after_dig_node = after_dig_node, allow_metadata_inventory_put = allow_metadata_inventory_put, @@ -208,12 +216,16 @@ minetest.register_node("techage:chest_ta4", { after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) local number = techage.add_node(pos, "techage:chest_ta4") - meta:set_string("number", number) + meta:set_string("node_number", number) meta:set_string("owner", placer:get_player_name()) meta:set_string("formspec", formspec4()) meta:set_string("infotext", S("TA4 Protected Chest").." "..number) end, + techage_set_numbers = function(pos, numbers, player_name) + return techage.logic.set_numbers(pos, numbers, player_name, S("TA4 Protected Chest")) + end, + can_dig = can_dig, after_dig_node = after_dig_node, allow_metadata_inventory_put = allow_metadata_inventory_put, @@ -249,16 +261,8 @@ techage.register_node({"techage:chest_ta2", "techage:chest_ta3", "techage:chest_ return techage.get_inv_state(inv, "main") elseif topic == "player_action" then local meta = minetest.get_meta(pos) - local number = meta:get_string("number") + local number = meta:get_string("node_number") return PlayerActions[number] - elseif topic == "set_numbers" then - if techage.check_numbers(payload) then - local meta = minetest.get_meta(pos) - meta:set_string("dest_num", payload) - local number = meta:get_string("number") - meta:set_string("infotext", S("TA Protected Chest").." "..number.." "..S("connected with").." "..payload) - return true - end else return "unsupported" end diff --git a/basis/command.lua b/basis/command.lua index 8ad5c34..b8f0e06 100644 --- a/basis/command.lua +++ b/basis/command.lua @@ -83,10 +83,11 @@ end local function not_protected(pos, placer_name, clicker_name) local meta = minetest.get_meta(pos) if meta then - local cached_name = meta:get_string("techage_cached_name") - if placer_name and (placer_name == cached_name or not minetest.is_protected(pos, placer_name)) then - meta:set_string("techage_cached_name", placer_name) - if clicker_name == nil or not minetest.is_protected(pos, clicker_name) then + if placer_name and not minetest.is_protected(pos, placer_name) then + if clicker_name == nil or placer_name == clicker_name then + return true + end + if not minetest.is_protected(pos, clicker_name) then return true end end @@ -157,20 +158,6 @@ end -- API helper functions ------------------------------------------------------------------- --- Check the given list of numbers. --- Returns true if number(s) is/are valid and point to real nodes. -function techage.check_numbers(numbers) - if numbers then - for _,num in ipairs(string_split(numbers, " ")) do - if Number2Pos[num] == nil then - return false - end - end - return true - end - return false -end - -- Function returns { pos, name } for the node on the given position number. function techage.get_node_info(dest_num) if Number2Pos[dest_num] then @@ -297,6 +284,21 @@ function techage.not_protected(number, placer_name, clicker_name) return false end +-- Check the given list of numbers. +-- Returns true if number(s) is/are valid, point to real nodes and +-- and the nodes are not protected for the given player_name. +function techage.check_numbers(numbers, placer_name) + if numbers then + for _,num in ipairs(string_split(numbers, " ")) do + if not techage.not_protected(num, placer_name, nil) then + return false + end + end + return true + end + return false +end + function techage.send_multi(numbers, topic, payload) for _,num in ipairs(string_split(numbers, " ")) do if Number2Pos[num] and Number2Pos[num].name then diff --git a/doc/ta3_doc.lua b/doc/ta3_doc.lua index e977318..38b2e20 100644 --- a/doc/ta3_doc.lua +++ b/doc/ta3_doc.lua @@ -109,5 +109,5 @@ techage.register_category_page("ta3l", S("TA3: Logic"), S("Collection of TA3 logic blocks to control your machines."), "techage:terminal2", - {"terminal"} + {"terminal", "button", "detector", "repeater", "programmer"} ) diff --git a/init.lua b/init.lua index 24e5d85..54359bb 100644 --- a/init.lua +++ b/init.lua @@ -149,7 +149,12 @@ else end -- Logic + dofile(MP.."/logic/lib.lua") dofile(MP.."/logic/terminal.lua") + dofile(MP.."/logic/button.lua") + dofile(MP.."/logic/detector.lua") + dofile(MP.."/logic/repeater.lua") + dofile(MP.."/logic/programmer.lua") -- Test dofile(MP.."/recipe_checker.lua") diff --git a/logic/button.lua b/logic/button.lua new file mode 100644 index 0000000..e4d5907 --- /dev/null +++ b/logic/button.lua @@ -0,0 +1,201 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Logic button + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local logic = techage.logic + +local function switch_on(pos) + local cycle_time = M(pos):get_int("cycle_time") + logic.swap_node(pos, "techage:button_on") + logic.send_on(pos, M(pos), cycle_time) + minetest.sound_play("techage_button", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) +end + +local function switch_off(pos) + logic.swap_node(pos, "techage:button_off") + logic.send_off(pos, M(pos)) +end + +local function formspec(meta) + local numbers = meta:get_string("numbers") or "" + local idx = meta:get_int("cycle_idx") or 0 + if idx == 0 then idx = 1 end + return "size[7.5,6]".. + "dropdown[0.2,0;3;type;switch,button 2s,button 4s,button 8s,button 16s,button 32s;"..idx.."]".. + "field[0.5,2;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. + "checkbox[1,3;public;public;false]".. + "button_exit[2,4;3,1;exit;"..S("Save").."]" +end + +minetest.register_node("techage:button_off", { + description = S("TA3 Button/Switch"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", + "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_button_off.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + logic.after_place_node(pos, placer, "techage:button_off", S("TA3 Button/Switch")) + logic.infotext(meta, S("TA3 Button/Switch")) + meta:set_string("formspec", formspec(meta)) + meta:set_string("public", "false") + meta:set_int("cycle_time", 0) + end, + + on_receive_fields = function(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + print(dump(fields)) + local meta = M(pos) + if not techage.check_numbers(fields.numbers, player:get_player_name()) then + return + end + + meta:set_string("numbers", fields.numbers) + if fields.public then + meta:set_string("public", fields.public) + end + local cycle_time = nil + if fields.type == "switch" then + meta:set_int("cycle_idx", 1) + cycle_time = 0 + elseif fields.type == "button 2s" then + meta:set_int("cycle_idx", 2) + cycle_time = 2 + elseif fields.type == "button 4s" then + meta:set_int("cycle_idx", 3) + cycle_time = 4 + elseif fields.type == "button 8s" then + meta:set_int("cycle_idx", 4) + cycle_time = 8 + elseif fields.type == "button 16s" then + meta:set_int("cycle_idx", 5) + cycle_time = 16 + elseif fields.type == "button 32s" then + meta:set_int("cycle_idx", 6) + cycle_time = 32 + end + if cycle_time ~= nil then + meta:set_int("cycle_time", cycle_time) + end + logic.infotext(meta, S("TA3 Button/Switch")) + if fields.exit then + meta:set_string("formspec", nil) + else + meta:set_string("formspec", formspec(meta)) + end + end, + + on_rightclick = function(pos, node, clicker) + local meta = M(pos) + local numbers = meta:get_string("numbers") + if numbers ~= "" and numbers ~= nil then + if meta:get_string("public") == "true" or + clicker:get_player_name() == meta:get_string("owner") then + switch_on(pos) + end + end + end, + + techage_set_numbers = function(pos, numbers, player_name) + local meta = M(pos) + local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Button/Switch")) + meta:set_string("formspec", formspec(meta)) + return res + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("techage:button_on", { + description = ("TA3 Button/Switch"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", + "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_button_on.png", + }, + + on_rightclick = function(pos, node, clicker) + local meta = M(pos) + local numbers = meta:get_string("numbers") + if numbers ~= "" and numbers ~= nil then + if meta:get_string("public") == "true" or + clicker:get_player_name() == meta:get_string("owner") then + switch_off(pos) + end + end + end, + + on_timer = switch_off, + on_rotate = screwdriver.disallow, + + techage_set_numbers = function(pos, numbers, player_name) + local meta = M(pos) + local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Button/Switch")) + meta:set_string("formspec", formspec(meta)) + return res + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos) + end, + + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + drop = "techage:button_off", +}) + +minetest.register_craft({ + output = "techage:button_off", + recipe = { + {"", "group:wood", ""}, + {"default:glass", "techage:vacuum_tube", ""}, + {"", "group:wood", ""}, + }, +}) + +techage.register_entry_page("ta3l", "button", + S("TA3 Button/Switch"), + S("The Button/Switch is used to send on/off commands to machines/nodes.@n".. + "It can be configured as switch or as button with configurable cycle time from 2 to 32s)"), + "techage:button_on") diff --git a/logic/detector.lua b/logic/detector.lua new file mode 100644 index 0000000..cfd60c1 --- /dev/null +++ b/logic/detector.lua @@ -0,0 +1,154 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Item detector + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local logic = techage.logic +local BLOCKING_TIME = 8 -- seconds + +local function switch_on(pos) + local mem = tubelib2.get_mem(pos) + local t = minetest.get_gametime() + if t > (mem.time or 0) then + logic.swap_node(pos, "techage:detector_on") + logic.send_on(pos, M(pos), 1) + mem.time = t + BLOCKING_TIME + end +end + +local function switch_off(pos) + logic.swap_node(pos, "techage:detector_off") + logic.send_off(pos, M(pos)) +end + +local function formspec(meta) + local numbers = meta:get_string("numbers") or "" + return "size[7.5,3]".. + "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. + "button_exit[2,2;3,1;exit;"..S("Save").."]" +end + +minetest.register_node("techage:detector_off", { + description = S("TA3 Detector"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_outp.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_inp.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector.png^[transformFX", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + logic.after_place_node(pos, placer, "techage:detector_off", S("TA3 Detector")) + logic.infotext(meta, S("TA3 Detector")) + meta:set_string("formspec", formspec(meta)) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if techage.check_numbers(fields.numbers, player:get_player_name()) then + meta:set_string("numbers", fields.numbers) + logic.infotext(M(pos), S("TA3 Detector")) + meta:set_string("formspec", formspec(M(pos))) + end + end, + + techage_set_numbers = function(pos, numbers, player_name) + local meta = M(pos) + local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Detector")) + meta:set_string("formspec", formspec(meta)) + return res + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("techage:detector_on", { + description = S("TA3 Detector"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_outp.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_inp.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector_on.png^[transformFX", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector_on.png", + }, + + on_timer = switch_off, + on_rotate = screwdriver.disallow, + + techage_set_numbers = function(pos, numbers, player_name) + local meta = M(pos) + local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Detector")) + meta:set_string("formspec", formspec(meta)) + return res + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos) + end, + + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + drop = "techage:detector_off", +}) + +minetest.register_craft({ + output = "techage:detector_off", + recipe = { + {"", "group:wood", ""}, + {"techage:tubeS", "techage:vacuum_tube", "techage:tubeS"}, + {"", "group:wood", ""}, + }, +}) + + +techage.register_node({"techage:detector_off", "techage:detector_on"}, { + on_push_item = function(pos, in_dir, stack) + if techage.push_items(pos, in_dir, stack) then + switch_on(pos) + return true + end + return false + end, + is_pusher = true, -- is a pulling/pushing node +}) + +techage.register_entry_page("ta3l", "detector", + S("TA3 Detector"), + S("The Detector is a special kind of tube block that@n".. + "outputs an event when items pass through.@n".. + "It sends an 'on' when an item goes through,@n".. + "followed by an 'off' event one second later.@n".. + "After that it blocks further events for 8 seconds."), + "techage:detector_on") diff --git a/logic/lib.lua b/logic/lib.lua new file mode 100644 index 0000000..c7d317d --- /dev/null +++ b/logic/lib.lua @@ -0,0 +1,73 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Logic library + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +techage.logic = {} + +function techage.logic.swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +function techage.logic.after_place_node(pos, placer, name, descr) + local meta = M(pos) + local own_num = techage.add_node(pos, name) + meta:set_string("node_number", own_num) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", descr.." -") +end + +function techage.logic.send_on(pos, meta, time) + local own_num = meta:get_string("node_number") or "" + local numbers = meta:get_string("numbers") or "" + if time and time > 0 then + minetest.get_node_timer(pos):start(time) + end + techage.send_multi(numbers, "on", own_num) +end + +function techage.logic.send_off(pos, meta) + local own_num = meta:get_string("node_number") or "" + local numbers = meta:get_string("numbers") or "" + techage.send_multi(numbers, "off", own_num) +end + +function techage.logic.infotext(meta, descr, text) + local own_num = meta:get_string("node_number") or "" + local numbers = meta:get_string("numbers") or "" + if numbers ~= "" then + meta:set_string("infotext", descr.." "..own_num..": "..S("connected with").." "..numbers) + elseif text then + meta:set_string("infotext", descr.." "..own_num..": "..text) + else + meta:set_string("infotext", descr.." "..own_num) + end +end + +function techage.logic.set_numbers(pos, numbers, player_name, descr) + if techage.check_numbers(numbers, player_name) then + local meta = M(pos) + meta:set_string("numbers", numbers) + techage.logic.infotext(meta, descr) + return true + end + return false +end \ No newline at end of file diff --git a/logic/programmer.lua b/logic/programmer.lua new file mode 100644 index 0000000..657c140 --- /dev/null +++ b/logic/programmer.lua @@ -0,0 +1,108 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Number programmer + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local function join_to_string(tbl) + local t = {} + for key,_ in pairs(tbl) do + t[#t + 1] = key + end + return table.concat(t, " ") +end + +local function reset_programmer(itemstack, user, pointed_thing) + user:set_attribute("techage_prog_numbers", nil) + minetest.chat_send_player(user:get_player_name(), S("[Techage Programmer] programmer reset")) + return itemstack +end + +local function read_number(itemstack, user, pointed_thing) + local pos = pointed_thing.under + if pos then + local number = techage.get_node_number(pos) + if number then + local numbers = minetest.deserialize(user:get_attribute("techage_prog_numbers")) or {} + numbers[number] = true + user:set_attribute("techage_prog_numbers", minetest.serialize(numbers)) + minetest.chat_send_player(user:get_player_name(), S("[Techage Programmer] number").." "..number.." read") + else + minetest.chat_send_player(user:get_player_name(), S("[Techage Programmer] Unknown node on").." "..minetest.pos_to_string(pos)) + end + else + return reset_programmer(itemstack, user, pointed_thing) + end + return itemstack +end + +local function program_numbers(itemstack, placer, pointed_thing) + local pos = pointed_thing.under + if pos then + local meta = M(pos) + local numbers = minetest.deserialize(placer:get_attribute("techage_prog_numbers")) or {} + placer:set_attribute("techage_prog_numbers", nil) + local player_name = placer:get_player_name() + if meta and meta:get_string("owner") ~= player_name then + minetest.chat_send_player(player_name, S("[Techage Programmer] foreign or unknown node!")) + return itemstack + end + local text = join_to_string(numbers) + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.techage_set_numbers then + local res = ndef.techage_set_numbers(pos, text, player_name) + if res == true then + minetest.chat_send_player(player_name, S("[Techage Programmer] node programmed!")) + else + minetest.chat_send_player(player_name, S("[Techage Programmer] Error: invalid numbers!")) + end + else + minetest.chat_send_player(player_name, S("[Techage Programmer] Error: programmer not supported!")) + end + return itemstack + else + return reset_programmer(itemstack, placer, pointed_thing) + end +end + +minetest.register_craftitem("techage:programmer", { + description = S("Techage Programmer (right = read number, left = write numbers)"), + inventory_image = "techage_programmer.png", + stack_max = 1, + wield_image = "techage_programmer_wield.png", + groups = {cracky=1, book=1}, + -- left mouse button = program + on_use = program_numbers, + on_secondary_use = reset_programmer, + -- right mouse button = read + on_place = read_number, +}) + +minetest.register_craft({ + output = "techage:programmer", + recipe = { + {"", "default:steel_ingot", ""}, + {"", "techage:wlanchip", ""}, + {"", "dye:red", ""}, + }, +}) + +techage.register_entry_page("ta3l", "programmer", + S("Techage Programmer"), + S("The Programmer is a tool to collect block numbers (right mouse button)@n".. + "from machines/nodes to program (left mouse button) the Repeater@n".. + "or other nodes. This is especially useful if you want to switch on/off@n".. + "many block at the same time."), + "techage:programmer") diff --git a/logic/repeater.lua b/logic/repeater.lua new file mode 100644 index 0000000..422c273 --- /dev/null +++ b/logic/repeater.lua @@ -0,0 +1,118 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2017-2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + Signal Repeater + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S + +local logic = techage.logic +local OVER_LOAD_MAX = 10 +local CYCLE_TIME = 2 + +local function formspec(meta) + local numbers = meta:get_string("numbers") or "" + return "size[7.5,3]".. + "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. + "button_exit[2,2;3,1;exit;"..S("Save").."]" +end + +minetest.register_node("techage:repeater", { + description = S("TA3 Repeater"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_repeater.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local mem = tubelib2.get_mem(pos) + logic.after_place_node(pos, placer, "techage:repeater", S("TA3 Repeater")) + logic.infotext(meta, S("TA3 Repeater")) + meta:set_string("formspec", formspec(meta)) + mem.overload_cnt = 0 + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = M(pos) + if techage.check_numbers(fields.numbers, player:get_player_name()) then + meta:set_string("numbers", fields.numbers) + logic.infotext(M(pos), S("TA3 Repeater")) + meta:set_string("formspec", formspec(meta)) + end + end, + + on_timer = function(pos,elapsed) + local mem = tubelib2.get_mem(pos) + mem.overload_cnt = 0 + return true + end, + + techage_set_numbers = function(pos, numbers, player_name) + local meta = M(pos) + local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Repeater")) + meta:set_string("formspec", formspec(meta)) + return res + end, + + after_dig_node = function(pos) + techage.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "techage:repeater", + recipe = { + {"", "group:wood", ""}, + {"techage:vacuum_tube", "", "techage:vacuum_tube"}, + {"", "group:wood", ""}, + }, +}) + +techage.register_node({"techage:repeater"}, { + on_recv_message = function(pos, topic, payload) + local mem = tubelib2.get_mem(pos) + mem.overload_cnt = (mem.overload_cnt or 0) + 1 + if mem.overload_cnt > OVER_LOAD_MAX then + logic.infotext(M(pos), S("TA3 Repeater"), "fault (overloaded)") + minetest.get_node_timer(pos):stop() + return false + else + local numbers = M(pos):get_string("numbers") or "" + techage.send_multi(numbers, topic, payload) + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, +}) + +techage.register_entry_page("ta3l", "repeater", + S("TA3 Repeater"), + S("The Repeater is a multiplier block, sending received commands@n".. + "to all connected blocks. The list of destination block numbers@n".. + "has to be configured, but can easily programmed@n".. + "by means of the Programmer."), + "techage:repeater") + diff --git a/logic/terminal.lua b/logic/terminal.lua index 5bde164..f184697 100644 --- a/logic/terminal.lua +++ b/logic/terminal.lua @@ -12,6 +12,7 @@ ]]-- +local M = minetest.get_meta local S = techage.S local HELP_TA3 = S("#### TA3 Terminal ####@n".. @@ -40,14 +41,14 @@ local HELP_TA3 = S("#### TA3 Terminal ####@n".. local CMNDS_TA3 = S("Syntax error, try help") -local function formspec1() - return "size[6,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.5,1;5,1;number;Techage Controller number:;]" .. - "button_exit[1.5,2.5;2,1;exit;Save]" -end +--local function formspec1() +-- return "size[6,4]".. +-- default.gui_bg.. +-- default.gui_bg_img.. +-- default.gui_slots.. +-- "field[0.5,1;5,1;number;Techage Controller number:;]" .. +-- "button_exit[1.5,2.5;2,1;exit;Save]" +--end local function get_string(meta, num, default) local s = meta:get_string("bttn_text"..num) @@ -127,7 +128,6 @@ local function command(pos, command, player) output(pos, "$ "..command) local num, cmnd, payload = command:match('^cmd%s+([0-9]+)%s+(%w+)%s*(.*)$') if num and cmnd then - local own_number = meta:get_string("own_number") if techage.not_protected(num, owner, owner) then local resp = techage.send_single(num, cmnd, payload) if type(resp) == "string" then @@ -177,7 +177,7 @@ local function register_terminal(num, tiles, node_box, selection_box) after_place_node = function(pos, placer) local number = techage.add_node(pos, minetest.get_node(pos).name) local meta = minetest.get_meta(pos) - meta:set_string("own_number", number) + meta:set_string("node_number", number) meta:set_string("command", S("commands like: help")) meta:set_string("formspec", formspec2(meta)) meta:set_string("owner", placer:get_player_name()) @@ -284,12 +284,15 @@ minetest.register_craft({ techage.register_node({"techage:terminal1", "techage:terminal2"}, { on_recv_message = function(pos, topic, payload) - if topic == "term" then - output(pos, payload) - return true - elseif topic == "msg" then - output(pos, payload.src..": "..payload.text) - return true + output(pos, "cmd="..dump(topic)..", data="..dump(payload)) + return true + end, + on_node_load = function(pos) + local meta = M(pos) + local number = meta:get_string("number") or "" + if number ~= "" then + meta:set_string("node_number", number) + meta:set_string("number", nil) end end, }) diff --git a/power/powerswitch.lua b/power/powerswitch.lua index 05bd695..e7d7d71 100644 --- a/power/powerswitch.lua +++ b/power/powerswitch.lua @@ -80,9 +80,9 @@ minetest.register_node("techage:powerswitch", { }, after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) + local meta = M(pos) local number = techage.add_node(pos, "techage:powerswitch") - meta:set_string("number", number) + meta:set_string("node_number", number) meta:set_string("owner", placer:get_player_name()) meta:set_string("infotext", S("TA Power Switch").." "..number) end, @@ -212,6 +212,14 @@ techage.register_node({"techage:powerswitch", "techage:powerswitch_on"}, { return "unsupported" end end, + on_node_load = function(pos) + local meta = M(pos) + local number = meta:get_string("number") or "" + if number ~= "" then + meta:set_string("node_number", number) + meta:set_string("number", nil) + end + end, }) minetest.register_craft({ diff --git a/solar/minicell.lua b/solar/minicell.lua index 281818b..65b375d 100644 --- a/solar/minicell.lua +++ b/solar/minicell.lua @@ -83,7 +83,7 @@ minetest.register_node("techage:ta4_solar_minicell", { after_place_node = function(pos) local meta = minetest.get_meta(pos) local number = techage.add_node(pos, "techage:ta4_solar_minicell") - meta:set_string("number", number) + meta:set_string("node_number", number) meta:set_string("infotext", S("TA4 Streetlamp Solar Cell").." "..number) local mem = tubelib2.get_mem(pos) mem.capa = 0 @@ -121,6 +121,14 @@ techage.register_node({"techage:ta4_solar_minicell"}, { return "unsupported" end end, + on_node_load = function(pos) + local meta = M(pos) + local number = meta:get_string("number") or "" + if number ~= "" then + meta:set_string("node_number", number) + meta:set_string("number", nil) + end + end, }) minetest.register_craft({ diff --git a/textures/techage_appl_button.png b/textures/techage_appl_button.png new file mode 100644 index 0000000000000000000000000000000000000000..99f30dd1688bb9d99d1776bea1f8187b2ab9b5a7 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slj7I;J!Gca%qgD@k*tT_@uLAC&&5LchfLTfu~r!|qLAU!2Pe!&b5&u*jv zIm(_cjv*Y^lM@t#H`p@>_3#=v{bTQ1)5FTl{8{`jvw#@TmSf$l{nk2?Kzo7iaP@Op I=akR{0Ez=BuK)l5 literal 0 HcmV?d00001 diff --git a/textures/techage_appl_detector.png b/textures/techage_appl_detector.png new file mode 100644 index 0000000000000000000000000000000000000000..05dc45de6511c777f9f8c9996de526dd18f097e7 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slj7I;J!Gca%qgD@k*tT_@uLAC&&5LchfLU$JzE?v_LAU!2Pe!&b5&u*jv zIli7Qjv*Y^lM@c`W;w7}cO>L62(hv^wDd4DGqXoCF*Ey50uu8LCp?(WA~;upX-U(6 z#(>NJ|MM%b%;28NAbE)2sE^;}LjwmN8xsS=flYj04(olc0UFHU>FVdQ&MBb@0C`q7 Am;e9( literal 0 HcmV?d00001 diff --git a/textures/techage_appl_detector_on.png b/textures/techage_appl_detector_on.png new file mode 100644 index 0000000000000000000000000000000000000000..0d05fb7dc88c99094ed375f345cd9d7ed347acfb GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slj7I;J!Gca%qgD@k*tT_@uLAC&&5Lchf!iN70FMQqKgY=XH`2{mLJiCzw zmdKI;Vst09R`{ AcK`qY literal 0 HcmV?d00001 diff --git a/textures/techage_appl_repeater.png b/textures/techage_appl_repeater.png new file mode 100644 index 0000000000000000000000000000000000000000..37b5bad5d8d6acb3996e31b596d632c8de398968 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYXBYH55B7pMVAmjw9*GdMiEkp|>QmbgZgIOpf)rskC}I2WZR zmZYXAlxLP?D7bt2281{Ai31gJ7I;J!Gca%qgD@k*tT_@uL0?Z7#}JO|$q5QP64F38 zLt290z`)x>CLv+_gvtX4(hf{Ma9~;u&t#7T?}ihbq`%oDB#7BDUb$BDfq^;s^FcN? kwr}h_0Zspzdk(NOaJP%kuJ-3I0UFHU>FVdQ&MBb@03pmq?EnA( literal 0 HcmV?d00001 diff --git a/textures/techage_button_off.png b/textures/techage_button_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0d65841680021c6e43e859512f3818c1bcf9f40b GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=G`DAk4@xYmNj+Fu*6o)hDx1$6JSikzvxAFMJ?vB|(0{3=Yq3 zqyah7o-U3d5|@(`7Dz>~vLqb4a^b>;#^eKY9Yq-!Dtn~MLoD{10hKX$y85}Sb4q9e E07<+lFaQ7m literal 0 HcmV?d00001 diff --git a/textures/techage_button_on.png b/textures/techage_button_on.png new file mode 100644 index 0000000000000000000000000000000000000000..68f9f24b327636d6012a01dd817413a7e7232200 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=G`DAk4@xYmNj+Fu*6o)hDyiYOxgqBZJn|iC00|N`m}?862M7 zNCR@DJzX3_BrYc>ERc#|Wl1=8<-&yxjmZb*I*KwdRQ5=hhgj@211e+iboFyt=akR{ E09ni_X#fBK literal 0 HcmV?d00001 diff --git a/textures/techage_programmer.png b/textures/techage_programmer.png new file mode 100644 index 0000000000000000000000000000000000000000..03a08d706ba18ba88a8af466a63bf4d75d8a81b3 GIT binary patch literal 879 zcmV-#1CacQP) znV5ujwSRx6r>e54oVUZ>#l^nE$IH*iw$jzq;N{}_{Q6WN=X(GE00DGTPE!Ct=GbNc z0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-&u2n-bpK(eH# z0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbPX-PyuR9M69m)(-1 zAP|KyDBFTN;-Co#zW-}(H{#FK-ZaVO?zu5Z)pux4H&_wkzbfTXpYoqr_)DMiZ#nq* zy!cda;eBh{gWpn&^#+S2)~?>K&sc46tlhS)e+J|iJ{!};ufK5{SbwaDAd;^5R=?$6 z>UdN*1I*v5`CP_I{8|-2{3$HM`49LKM^yuob8byHetT6kAZgfTPm66^_y!J6>B6V& z6+#8y|4Q4}Uc*s941rk!QYumDi9YGV`w&<|q(K3EXWo0PL4nVFAb#O3kL#BiUT`n4 z<^ahcaQU{JfY1OK?TL@Xdmaxe>;_>2)f?#(9s=SQE)UIqb~YS_0sEK(^qc_n&SM66 z^f#v!C?f++P>9R`l*$&Wv63G6Rn`Tlat&movS2X!cimlfF60Mnm{<$&K-bhfR@YxHQsn-(&Ya;x!C2>LED+-nO8M$sl1I$3{x2Yv1H#F&PO> zlX2j_%5Q^UhAH!n)T0)n!lCPWe1{G5_s(aB3WFJI==*6<2ac*K05y)Z57mvb@Uo5< z&RS7d0MDizQOI3Yf9u;P6!sDJ9u@E@^rPYxo+O3(lR002ovPDHLk FV1ko4e|-P| literal 0 HcmV?d00001 diff --git a/textures/techage_programmer_wield.png b/textures/techage_programmer_wield.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6866c07e61de6b84c6b8ca4b68b5367f37c1ce GIT binary patch literal 698 zcmV;r0!96aP)Q7eZXqlLV zcC~+hrl+d1shqdN-NnVe!^g|d$hOke)Zpdf`uzI6ua8my0004WQchC_yVT1&-@+f?T?WpL z%lP7(44zA5m%WwG8pn~%AO7O^&ygL#5p~74a|<|%w#ERDN_2V`pUddtlb8eW>$>i~ z;sb~G3bU4%MF@-%R(wen-Umhx#LEvKzH$xx0*C@1OZV}UI{7yZ6awNs@y<~VfR4q- zh5+EofG(Xp>Xra22hIjo30|vc5#Q$3 zbqgqCAYLN7fRjg<&@uw3BTRFotDY3+Myjd=(`(W~Z8xq#fvJJG!K}y8DuVQG7z3zV zfMQ|<&b&vlwJyMFfdltJ@>&FKYy%%1rb*I0%slQ*{Ov(CNNEia-olgSIrah5EIR(w gEHml