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 0000000..99f30dd Binary files /dev/null and b/textures/techage_appl_button.png differ diff --git a/textures/techage_appl_detector.png b/textures/techage_appl_detector.png new file mode 100644 index 0000000..05dc45d Binary files /dev/null and b/textures/techage_appl_detector.png differ diff --git a/textures/techage_appl_detector_on.png b/textures/techage_appl_detector_on.png new file mode 100644 index 0000000..0d05fb7 Binary files /dev/null and b/textures/techage_appl_detector_on.png differ diff --git a/textures/techage_appl_repeater.png b/textures/techage_appl_repeater.png new file mode 100644 index 0000000..37b5bad Binary files /dev/null and b/textures/techage_appl_repeater.png differ diff --git a/textures/techage_button_off.png b/textures/techage_button_off.png new file mode 100644 index 0000000..0d65841 Binary files /dev/null and b/textures/techage_button_off.png differ diff --git a/textures/techage_button_on.png b/textures/techage_button_on.png new file mode 100644 index 0000000..68f9f24 Binary files /dev/null and b/textures/techage_button_on.png differ diff --git a/textures/techage_programmer.png b/textures/techage_programmer.png new file mode 100644 index 0000000..03a08d7 Binary files /dev/null and b/textures/techage_programmer.png differ diff --git a/textures/techage_programmer_wield.png b/textures/techage_programmer_wield.png new file mode 100644 index 0000000..7a6866c Binary files /dev/null and b/textures/techage_programmer_wield.png differ diff --git a/tools/repairkit.lua b/tools/repairkit.lua index e7d88d2..8ab3481 100644 --- a/tools/repairkit.lua +++ b/tools/repairkit.lua @@ -1,7 +1,7 @@ --[[ - TexchAge - ======== + TechAge + ======= Copyright (C) 2017-2019 Joachim Stolberg