mods that hopefully work for a TechAge-based pack
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
--[[
|
||||
|
||||
Networks
|
||||
========
|
||||
|
||||
Copyright (C) 2021 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
Control API to control other network nodes which have a control interface
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S2P = minetest.string_to_pos
|
||||
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local M = minetest.get_meta
|
||||
local N = tubelib2.get_node_lvm
|
||||
local CTL = function(pos) return (minetest.registered_nodes[N(pos).name] or {}).control end
|
||||
|
||||
networks.control = {}
|
||||
|
||||
-- return list of nodes {pos = ..., indir = ...} of given node_type
|
||||
local function get_network_table(pos, tlib2, outdir, node_type)
|
||||
local netw = networks.get_network_table(pos, tlib2, outdir)
|
||||
if netw then
|
||||
return netw[node_type] or {}
|
||||
end
|
||||
return {}
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- For all types of nodes
|
||||
-------------------------------------------------------------------------------
|
||||
-- names: list of node names
|
||||
-- control_callbacks = {
|
||||
-- on_receive = function(pos, tlib2, topic, payload),
|
||||
-- on_request = function(pos, tlib2, topic), -- returns: response
|
||||
-- }
|
||||
function networks.control.register_nodes(names, control_callbacks)
|
||||
assert(type(control_callbacks) == "table")
|
||||
|
||||
for _, name in ipairs(names) do
|
||||
minetest.override_item(name, {control = control_callbacks})
|
||||
end
|
||||
end
|
||||
|
||||
-- Send a message with 'topic' string and any 'payload 'to all 'tlib2' network
|
||||
-- nodes of type 'node_type'.
|
||||
-- Function returns the number of nodes the message was sent to.
|
||||
function networks.control.send(pos, tlib2, outdir, node_type, topic, payload)
|
||||
assert(outdir and node_type and topic)
|
||||
assert(type(topic) == "string")
|
||||
local cnt = 0
|
||||
for _,item in ipairs(get_network_table(pos, tlib2, outdir, node_type)) do
|
||||
local ctl = CTL(item.pos)
|
||||
if ctl and ctl.on_receive then
|
||||
ctl.on_receive(item.pos, tlib2, topic, payload)
|
||||
cnt = cnt + 1
|
||||
end
|
||||
end
|
||||
return cnt
|
||||
end
|
||||
|
||||
-- Send a request with 'topic' string to all 'tlib2' network
|
||||
-- nodes of type 'node_type'.
|
||||
-- Function returns a list with all responses.
|
||||
function networks.control.request(pos, tlib2, outdir, node_type, topic)
|
||||
assert(outdir and node_type and topic)
|
||||
assert(type(topic) == "string")
|
||||
local t = {}
|
||||
for _,item in ipairs(get_network_table(pos, tlib2, outdir, node_type)) do
|
||||
local ctl = CTL(item.pos)
|
||||
if ctl and ctl.on_request then
|
||||
t[#t + 1] = ctl.on_request(item.pos, tlib2, topic)
|
||||
end
|
||||
end
|
||||
return t
|
||||
end
|
||||
Reference in New Issue
Block a user