first working version
This commit is contained in:
81
override.lua
Normal file
81
override.lua
Normal file
@@ -0,0 +1,81 @@
|
||||
|
||||
-- Override digilines.transmit and digilines.receptor_send to add more functionality
|
||||
-- Mostly copied from https://github.com/minetest-mods/digilines/blob/master/internal.lua
|
||||
|
||||
|
||||
local function queue_new()
|
||||
return {nextRead = 1, nextWrite = 1}
|
||||
end
|
||||
|
||||
local function queue_empty(queue)
|
||||
return queue.nextRead == queue.nextWrite
|
||||
end
|
||||
|
||||
local function queue_enqueue(queue, object)
|
||||
local nextWrite = queue.nextWrite
|
||||
queue[nextWrite] = object
|
||||
queue.nextWrite = nextWrite + 1
|
||||
end
|
||||
|
||||
local function queue_dequeue(queue)
|
||||
local nextRead = queue.nextRead
|
||||
local object = queue[nextRead]
|
||||
queue[nextRead] = nil
|
||||
queue.nextRead = nextRead + 1
|
||||
return object[1], object[2]
|
||||
end
|
||||
|
||||
function digilines.transmit(pos, channel, msg, checked, origin)
|
||||
local checkedID = minetest.hash_node_position(pos)
|
||||
if checked[checkedID] or not origin then
|
||||
return
|
||||
end
|
||||
checked[checkedID] = true
|
||||
|
||||
digilines.vm_begin()
|
||||
local queue = queue_new()
|
||||
queue_enqueue(queue, {pos, origin})
|
||||
while not queue_empty(queue) do
|
||||
local curPos, fromPos = queue_dequeue(queue)
|
||||
local node = digilines.get_node_force(curPos)
|
||||
local spec = digilines.getspec(node)
|
||||
if spec then
|
||||
-- Effector actions --> Receive
|
||||
if spec.effector then
|
||||
spec.effector.action(curPos, node, channel, msg, fromPos)
|
||||
end
|
||||
-- Cable actions --> Transmit
|
||||
local rules
|
||||
-- Custom semiconductor def for digicontrol nodes
|
||||
if spec.semiconductor then
|
||||
rules = spec.semiconductor.rules(node, curPos, fromPos, channel)
|
||||
elseif spec.wire then
|
||||
rules = digilines.importrules(spec.wire.rules, node)
|
||||
end
|
||||
if rules then
|
||||
for _, rule in ipairs(rules) do
|
||||
local nextPos = digilines.addPosRule(curPos, rule)
|
||||
if digilines.rules_link(curPos, nextPos) then
|
||||
checkedID = minetest.hash_node_position(nextPos)
|
||||
if not checked[checkedID] then
|
||||
checked[checkedID] = true
|
||||
queue_enqueue(queue, {nextPos, curPos})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
digilines.vm_end()
|
||||
end
|
||||
|
||||
|
||||
function digilines.receptor_send(pos, rules, channel, msg)
|
||||
local checked = {}
|
||||
checked[minetest.hash_node_position(pos)] = true -- exclude itself
|
||||
for _,rule in ipairs(rules) do
|
||||
if digilines.rules_link(pos, digilines.addPosRule(pos, rule)) then
|
||||
digilines.transmit(digilines.addPosRule(pos, rule), channel, msg, checked, pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user