forked from Mirrorlandia_minetest/digilines
7ecb29e87f
Digilines is probably used by most people in its entirety. I've retained the ability to disable inventory, rtc, lightsensor and LCD by the minetest settings "diglines_enable_rtc" etc.. If set to "false", these components will not be loaded. It is assumed by default that these are enabled. In the conversion the digilines_lcd:lcd node was renamed to digilines:lcd (same for all the other nodes). To retain backwards compatibility I've provided aliases for each of these nodes.
91 lines
2.3 KiB
Lua
91 lines
2.3 KiB
Lua
function digiline:getspec(node)
|
|
if not minetest.registered_nodes[node.name] then return false end
|
|
return minetest.registered_nodes[node.name].digiline
|
|
end
|
|
|
|
function digiline:importrules(spec, node)
|
|
if type(spec) == 'function' then
|
|
return spec(node)
|
|
elseif spec then
|
|
return spec
|
|
else
|
|
return digiline.rules.default
|
|
end
|
|
end
|
|
|
|
function digiline:getAnyInputRules(pos)
|
|
local node = minetest.get_node(pos)
|
|
local spec = digiline:getspec(node)
|
|
if not spec then return end
|
|
|
|
if spec.wire then
|
|
return digiline:importrules(spec.wire.rules, node)
|
|
end
|
|
if spec.effector then
|
|
return digiline:importrules(spec.effector.rules, node)
|
|
end
|
|
end
|
|
|
|
function digiline:getAnyOutputRules(pos)
|
|
local node = minetest.get_node(pos)
|
|
local spec = digiline:getspec(node)
|
|
if not spec then return end
|
|
|
|
if spec.wire then
|
|
return digiline:importrules(spec.wire.rules, node)
|
|
end
|
|
if spec.receptor then
|
|
return digiline:importrules(spec.receptor.rules, node)
|
|
end
|
|
end
|
|
|
|
function digiline:rules_link(output, input)
|
|
local outputrules = digiline:getAnyOutputRules(output)
|
|
local inputrules = digiline:getAnyInputRules (input)
|
|
|
|
if not outputrules or not inputrules then return false end
|
|
|
|
|
|
for _, orule in ipairs(outputrules) do
|
|
if digiline:cmpPos(digiline:addPosRule(output, orule), input) then
|
|
for _, irule in ipairs(inputrules) do
|
|
if digiline:cmpPos(digiline:addPosRule(input, irule), output) then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function digiline:rules_link_anydir(output, input)
|
|
return digiline:rules_link(output, input)
|
|
or digiline:rules_link(input, output)
|
|
end
|
|
|
|
function digiline:transmit(pos, channel, msg, checked)
|
|
local checkedid = tostring(pos.x).."_"..tostring(pos.y).."_"..tostring(pos.z)
|
|
if checked[checkedid] then return end
|
|
checked[checkedid] = true
|
|
|
|
local node = minetest.get_node(pos)
|
|
local spec = digiline:getspec(node)
|
|
if not spec then return end
|
|
|
|
|
|
-- Effector actions --> Receive
|
|
if spec.effector then
|
|
spec.effector.action(pos, node, channel, msg)
|
|
end
|
|
|
|
-- Cable actions --> Transmit
|
|
if spec.wire then
|
|
local rules = digiline:importrules(spec.wire.rules, node)
|
|
for _,rule in ipairs(rules) do
|
|
if digiline:rules_link(pos, digiline:addPosRule(pos, rule)) then
|
|
digiline:transmit(digiline:addPosRule(pos, rule), channel, msg, checked)
|
|
end
|
|
end
|
|
end
|
|
end
|