telemosaic/digilines.lua

82 lines
1.8 KiB
Lua

local function digiline_receive(pos, _, channel, msg)
local meta = minetest.get_meta(pos)
local set_channel = meta:get("channel") or telemosaic.default_channel
if channel ~= set_channel then
return
end
if type(msg) == "string" then
-- Convert string command to table
if msg == "get" or msg == "GET" then
msg = {command = "get"}
elseif msg == "enable" or msg == "disable" then
msg = {command = msg}
elseif msg:match("^setchannel .+") then
local c = string.split(msg, " ", true, 1)
msg = {command = c[1], channel = c[2]}
elseif msg:match("^setdest .+") then
local c = string.split(msg, " ", true, 1)
local p = string.split(c[2], ",")
msg = {command = c[1], x = p[1], y = p[2], z = p[3]}
end
end
if type(msg) ~= "table" or not msg.command then
return
end
if msg.command == "get" then
local dest = telemosaic.get_destination(pos)
digilines.receptor_send(pos, digilines.rules.default, set_channel, {
state = telemosaic.get_state(pos),
origin = pos,
target = dest,
pos = pos,
destination = dest,
})
elseif msg.command == "setchannel" then
if type(msg.channel) == "string" then
meta:set_string("channel", msg.channel)
end
elseif msg.command == "enable" then
if telemosaic.get_state(pos) == "disabled" then
telemosaic.set_state(pos, "active")
end
elseif msg.command == "disable" then
if telemosaic.get_state(pos) == "active" then
telemosaic.set_state(pos, "disabled")
end
elseif msg.command == "setdest" then
local dest = msg.pos or {
x = msg.x,
y = msg.y,
z = msg.z
}
if type(dest) ~= "table" then
return
end
dest.x = tonumber(dest.x)
dest.y = tonumber(dest.y)
dest.z = tonumber(dest.z)
if dest.x and dest.y and dest.z then
telemosaic.set_destination(pos, dest)
end
end
end
telemosaic.digilines = {
receptor = {},
effector = {
action = digiline_receive
}
}