further logic nodes added
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"}
|
||||
)
|
||||
|
5
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")
|
||||
|
201
logic/button.lua
Normal file
@ -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")
|
154
logic/detector.lua
Normal file
@ -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")
|
73
logic/lib.lua
Normal file
@ -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
|
108
logic/programmer.lua
Normal file
@ -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")
|
118
logic/repeater.lua
Normal file
@ -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")
|
||||
|
@ -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,
|
||||
})
|
||||
|
@ -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({
|
||||
|
@ -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({
|
||||
|
BIN
textures/techage_appl_button.png
Normal file
After Width: | Height: | Size: 173 B |
BIN
textures/techage_appl_detector.png
Normal file
After Width: | Height: | Size: 215 B |
BIN
textures/techage_appl_detector_on.png
Normal file
After Width: | Height: | Size: 215 B |
BIN
textures/techage_appl_repeater.png
Normal file
After Width: | Height: | Size: 252 B |
BIN
textures/techage_button_off.png
Normal file
After Width: | Height: | Size: 168 B |
BIN
textures/techage_button_on.png
Normal file
After Width: | Height: | Size: 168 B |
BIN
textures/techage_programmer.png
Normal file
After Width: | Height: | Size: 879 B |
BIN
textures/techage_programmer_wield.png
Normal file
After Width: | Height: | Size: 698 B |
@ -1,7 +1,7 @@
|
||||
--[[
|
||||
|
||||
TexchAge
|
||||
========
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2017-2019 Joachim Stolberg
|
||||
|
||||
|