allow pipeworks to skip server steps when moving entities around.

This commit is contained in:
Vanessa Ezekowitz 2017-03-31 18:27:44 -04:00
parent 3a77d1dd8e
commit 0639bb9706

View File

@ -52,32 +52,27 @@ local function get_blockpos(pos)
end end
local active_blocks = {} -- These only contain active blocks near players (i.e., not forceloaded ones) local active_blocks = {} -- These only contain active blocks near players (i.e., not forceloaded ones)
local handle_active_blocks_step = 2
local handle_active_blocks_timer = 0
minetest.register_globalstep(function(dtime)
handle_active_blocks_timer = handle_active_blocks_timer + dtime
if handle_active_blocks_timer >= handle_active_blocks_step then
handle_active_blocks_timer = handle_active_blocks_timer - handle_active_blocks_step
local active_block_range = tonumber(minetest.setting_get("active_block_range")) or 2
local new_active_blocks = {}
for _, player in ipairs(minetest.get_connected_players()) do
local blockpos = get_blockpos(player:getpos())
local minp = vector.subtract(blockpos, active_block_range)
local maxp = vector.add(blockpos, active_block_range)
for x = minp.x, maxp.x do local move_entities_globalstep_part1 = function(dtime)
for y = minp.y, maxp.y do local active_block_range = tonumber(minetest.setting_get("active_block_range")) or 2
for z = minp.z, maxp.z do local new_active_blocks = {}
local pos = {x = x, y = y, z = z} for _, player in ipairs(minetest.get_connected_players()) do
new_active_blocks[minetest.hash_node_position(pos)] = pos local blockpos = get_blockpos(player:getpos())
end local minp = vector.subtract(blockpos, active_block_range)
end local maxp = vector.add(blockpos, active_block_range)
end
for x = minp.x, maxp.x do
for y = minp.y, maxp.y do
for z = minp.z, maxp.z do
local pos = {x = x, y = y, z = z}
new_active_blocks[minetest.hash_node_position(pos)] = pos
end
end
end end
active_blocks = new_active_blocks
-- todo: callbacks on block load/unload
end end
end) active_blocks = new_active_blocks
-- todo: callbacks on block load/unload
end
local function is_active(pos) local function is_active(pos)
return active_blocks[minetest.hash_node_position(get_blockpos(pos))] ~= nil return active_blocks[minetest.hash_node_position(get_blockpos(pos))] ~= nil
@ -309,7 +304,7 @@ function luaentity.get_objects_inside_radius(pos, radius)
end end
end end
minetest.register_globalstep(function(dtime) local move_entities_globalstep_part2 = function(dtime)
if not luaentity.entities then if not luaentity.entities then
luaentity.entities = read_entities() luaentity.entities = read_entities()
end end
@ -348,4 +343,16 @@ minetest.register_globalstep(function(dtime)
end end
end end
end end
end
local handle_active_blocks_step = 0.2
local handle_active_blocks_timer = 0.1
minetest.register_globalstep(function(dtime)
handle_active_blocks_timer = handle_active_blocks_timer + dtime
if handle_active_blocks_timer >= handle_active_blocks_step then
handle_active_blocks_timer = handle_active_blocks_timer - handle_active_blocks_step
move_entities_globalstep_part1(dtime)
move_entities_globalstep_part2(dtime)
end
end) end)