Skip to content

Commit f4070d3

Browse files
authored
Use FIFO queue for mvps (#599)
1 parent 21ac966 commit f4070d3

File tree

2 files changed

+22
-38
lines changed

2 files changed

+22
-38
lines changed

mesecons/internal.lua

+4-3
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
-- mesecon.rotate_rules_down(rules)
4747
-- These functions return rules that have been rotated in the specific direction
4848

49-
local fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua")
49+
-- See fifo_queue.lua for documentation.
50+
mesecon.fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua")
5051

5152
-- General
5253
function mesecon.get_effector(nodename)
@@ -421,7 +422,7 @@ end
421422
function mesecon.turnon(pos, link)
422423
find_light_update_conductors()
423424

424-
local frontiers = fifo_queue.new()
425+
local frontiers = mesecon.fifo_queue.new()
425426
frontiers:add({pos = pos, link = link})
426427
local pos_can_be_skipped = {}
427428

@@ -484,7 +485,7 @@ end
484485
function mesecon.turnoff(pos, link)
485486
find_light_update_conductors()
486487

487-
local frontiers = fifo_queue.new()
488+
local frontiers = mesecon.fifo_queue.new()
488489
frontiers:add({pos = pos, link = link})
489490
local signals = {}
490491
local pos_can_be_skipped = {}

mesecons_mvps/init.lua

+18-35
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,31 @@ end
6363
function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky)
6464
-- determine the number of nodes to be pushed
6565
local nodes = {}
66-
local frontiers = {pos}
67-
68-
while #frontiers > 0 do
69-
local np = frontiers[1]
70-
local nn = minetest.get_node(np)
71-
72-
if not node_replaceable(nn.name) then
66+
local pos_set = {}
67+
local frontiers = mesecon.fifo_queue.new()
68+
frontiers:add(vector.new(pos))
69+
70+
for np in frontiers:iter() do
71+
local np_hash = minetest.hash_node_position(np)
72+
local nn = not pos_set[np_hash] and minetest.get_node(np)
73+
if nn and not node_replaceable(nn.name) then
74+
pos_set[np_hash] = true
7375
table.insert(nodes, {node = nn, pos = np})
7476
if #nodes > maximum then return nil end
7577

76-
-- add connected nodes to frontiers, connected is a vector list
77-
-- the vectors must be absolute positions
78-
local connected = {}
78+
-- add connected nodes to frontiers
7979
if minetest.registered_nodes[nn.name]
8080
and minetest.registered_nodes[nn.name].mvps_sticky then
81-
connected = minetest.registered_nodes[nn.name].mvps_sticky(np, nn)
81+
local connected = minetest.registered_nodes[nn.name].mvps_sticky(np, nn)
82+
for _, cp in ipairs(connected) do
83+
frontiers:add(cp)
84+
end
8285
end
8386

84-
table.insert(connected, vector.add(np, dir))
87+
frontiers:add(vector.add(np, dir))
8588

8689
-- If adjacent node is sticky block and connects add that
87-
-- position to the connected table
90+
-- position
8891
for _, r in ipairs(mesecon.rules.alldirs) do
8992
local adjpos = vector.add(np, r)
9093
local adjnode = minetest.get_node(adjpos)
@@ -96,36 +99,16 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky)
9699
-- connects to this position?
97100
for _, link in ipairs(sticksto) do
98101
if vector.equals(link, np) then
99-
table.insert(connected, adjpos)
102+
frontiers:add(adjpos)
100103
end
101104
end
102105
end
103106
end
104107

105108
if all_pull_sticky then
106-
table.insert(connected, vector.subtract(np, dir))
107-
end
108-
109-
-- Make sure there are no duplicates in frontiers / nodes before
110-
-- adding nodes in "connected" to frontiers
111-
for _, cp in ipairs(connected) do
112-
local duplicate = false
113-
for _, rp in ipairs(nodes) do
114-
if vector.equals(cp, rp.pos) then
115-
duplicate = true
116-
end
117-
end
118-
for _, fp in ipairs(frontiers) do
119-
if vector.equals(cp, fp) then
120-
duplicate = true
121-
end
122-
end
123-
if not duplicate then
124-
table.insert(frontiers, cp)
125-
end
109+
frontiers:add(vector.subtract(np, dir))
126110
end
127111
end
128-
table.remove(frontiers, 1)
129112
end
130113

131114
return nodes

0 commit comments

Comments
 (0)