Skip to content

Commit f952ee4

Browse files
committedMay 30, 2013
Block queue doesn't lag anymore on slow operations like digging and placing nodes, better and more efficient //fixlight.
1 parent a1dcc43 commit f952ee4

File tree

2 files changed

+37
-31
lines changed

2 files changed

+37
-31
lines changed
 

‎worldedit/manipulations.lua

+7-11
Original file line numberDiff line numberDiff line change
@@ -397,19 +397,15 @@ worldedit.fixlight = function(pos1, pos2, env)
397397
if env == nil then env = minetest.env end
398398
local count = 0
399399

400-
local pos = {x=pos1.x, y=0, z=0}
400+
local pos = {x=pos1.x, y=pos2.y, z=0}
401401
while pos.x <= pos2.x do
402-
pos.y = pos1.y
403-
while pos.y <= pos2.y do
404-
pos.z = pos1.z
405-
while pos.z <= pos2.z do
406-
if env:get_node(pos).name == "air" then
407-
env:dig_node(pos)
408-
count = count + 1
409-
end
410-
pos.z = pos.z + 1
402+
pos.z = pos1.z
403+
while pos.z <= pos2.z do
404+
if env:get_node(pos).name == "air" then
405+
env:dig_node(pos)
406+
count = count + 1
411407
end
412-
pos.y = pos.y + 1
408+
pos.z = pos.z + 1
413409
end
414410
pos.x = pos.x + 1
415411
end

‎worldedit/queue.lua

+30-20
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,39 @@ worldedit = worldedit or {}
22

33
worldedit.queue = {}
44

5-
worldedit.ENABLE_QUEUE = true
6-
worldedit.BLOCKS_PER_GLOBALSTEP = 512
5+
worldedit.ENABLE_QUEUE = true --enable the WorldEdit block queue
6+
worldedit.MAXIMUM_TIME = 0.08 --maximum time each step alloted for WorldEdit operations
77

88
minetest.register_globalstep(function(dtime)
9-
i = 1
10-
while i <= #worldedit.queue and i <= worldedit.BLOCKS_PER_GLOBALSTEP do
11-
idx = (#worldedit.queue + 1) - i -- we use the last entry, so we don't spend days moving stuff in the table because we removed the first entry
12-
if worldedit.queue[idx].t == "set_node" then
13-
minetest.env:set_node(worldedit.queue[idx].pos, worldedit.queue[idx].node)
14-
elseif worldedit.queue[idx].t == "remove_node" then
15-
minetest.env:remove_node(worldedit.queue[idx].pos)
16-
elseif worldedit.queue[idx].t == "place_node" then
17-
minetest.env:place_node(worldedit.queue[idx].pos, worldedit.queue[idx].node)
18-
elseif worldedit.queue[idx].t == "dig_node" then
19-
minetest.env:dig_node(worldedit.queue[idx].pos)
20-
elseif worldedit.queue[idx].t == "add_entity" then
21-
minetest.env:add_entity(worldedit.queue[idx].pos, worldedit.queue[idx].name)
22-
elseif worldedit.queue[idx].t == "add_item" then
23-
minetest.env:add_item(worldedit.queue[idx].pos, worldedit.queue[idx].item)
24-
elseif worldedit.queue[idx].t == "meta_from_table" then
25-
minetest.env:get_meta(worldedit.queue[idx].pos):from_table(worldedit.queue[idx].table)
9+
local i = 1
10+
local elapsed = 0
11+
local env = minetest.env
12+
while i <= #worldedit.queue and elapsed <= worldedit.MAXIMUM_TIME do
13+
local idx = (#worldedit.queue + 1) - i
14+
local entry = worldedit.queue[idx] --we use the last entry, so we don't spend days moving stuff in the table because we removed the first entry
15+
if entry.t == "set_node" then
16+
env:set_node(entry.pos, entry.node)
17+
elapsed = elapsed + 0.0002
18+
elseif entry.t == "remove_node" then
19+
env:remove_node(entry.pos)
20+
elapsed = elapsed + 0.0002
21+
elseif entry.t == "place_node" then
22+
env:place_node(entry.pos, entry.node)
23+
elapsed = elapsed + 0.001
24+
elseif entry.t == "dig_node" then
25+
env:dig_node(entry.pos)
26+
elapsed = elapsed + 0.001
27+
elseif entry.t == "add_entity" then
28+
env:add_entity(entry.pos, entry.name)
29+
elapsed = elapsed + 0.005
30+
elseif entry.t == "add_item" then
31+
env:add_item(entry.pos, entry.item)
32+
elapsed = elapsed + 0.005
33+
elseif entry.t == "meta_from_table" then
34+
env:get_meta(entry.pos):from_table(entry.table)
35+
elapsed = elapsed + 0.0002
2636
else
27-
print("Unknown queue event type: " .. worldedit.queue[idx].t)
37+
print("Unknown queue event type: " .. entry.t)
2838
end
2939
table.remove(worldedit.queue, idx)
3040
i = i + 1

0 commit comments

Comments
 (0)
Please sign in to comment.