summaryrefslogtreecommitdiff
path: root/digilines/internal.lua
diff options
context:
space:
mode:
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>2017-03-04 23:58:38 -0500
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2017-03-04 23:58:38 -0500
commita46f07cbfbd9ae59b7b1cc2fc32f68c39ae34de0 (patch)
tree5358ecc88cd634e7277bf04e51be8e9ddd37b2aa /digilines/internal.lua
parent3eb0b959da58a153e4b9fc7f70eb513b1cf0e5fd (diff)
downloaddreambuilder_modpack-a46f07cbfbd9ae59b7b1cc2fc32f68c39ae34de0.tar
dreambuilder_modpack-a46f07cbfbd9ae59b7b1cc2fc32f68c39ae34de0.tar.gz
dreambuilder_modpack-a46f07cbfbd9ae59b7b1cc2fc32f68c39ae34de0.tar.bz2
dreambuilder_modpack-a46f07cbfbd9ae59b7b1cc2fc32f68c39ae34de0.tar.xz
dreambuilder_modpack-a46f07cbfbd9ae59b7b1cc2fc32f68c39ae34de0.zip
updated digilines, framedglass, mesecons, pipeworks, quartz
technic, unifiedinventory, and unifiedbricks
Diffstat (limited to 'digilines/internal.lua')
-rw-r--r--digilines/internal.lua67
1 files changed, 48 insertions, 19 deletions
diff --git a/digilines/internal.lua b/digilines/internal.lua
index 2319c16..45cd5d7 100644
--- a/digilines/internal.lua
+++ b/digilines/internal.lua
@@ -14,7 +14,7 @@ function digiline:importrules(spec, node)
end
function digiline:getAnyInputRules(pos)
- local node = minetest.get_node(pos)
+ local node = digiline:get_node_force(pos)
local spec = digiline:getspec(node)
if not spec then return end
@@ -27,7 +27,7 @@ function digiline:getAnyInputRules(pos)
end
function digiline:getAnyOutputRules(pos)
- local node = minetest.get_node(pos)
+ local node = digiline:get_node_force(pos)
local spec = digiline:getspec(node)
if not spec then return end
@@ -63,28 +63,57 @@ function digiline:rules_link_anydir(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 function queue_new()
+ return {nextRead = 1, nextWrite = 1}
+end
- local node = minetest.get_node(pos)
- local spec = digiline:getspec(node)
- if not spec then return 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
- -- Effector actions --> Receive
- if spec.effector then
- spec.effector.action(pos, node, channel, msg)
- end
+local function queue_dequeue(queue)
+ local nextRead = queue.nextRead
+ local object = queue[nextRead]
+ queue[nextRead] = nil
+ queue.nextRead = nextRead + 1
+ return object
+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)
+function digiline:transmit(pos, channel, msg, checked)
+ digiline:vm_begin()
+ local queue = queue_new()
+ queue_enqueue(queue, pos)
+ while not queue_empty(queue) do
+ local curPos = queue_dequeue(queue)
+ local node = digiline:get_node_force(curPos)
+ local spec = digiline:getspec(node)
+ if spec then
+ -- Effector actions --> Receive
+ if spec.effector then
+ spec.effector.action(curPos, 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
+ local nextPos = digiline:addPosRule(curPos, rule)
+ if digiline:rules_link(curPos, nextPos) then
+ local checkedID = minetest.hash_node_position(nextPos)
+ if not checked[checkedID] then
+ checked[checkedID] = true
+ queue_enqueue(queue, nextPos)
+ end
+ end
+ end
end
end
end
+ digiline:vm_end()
end