speedup mcl_observer

This commit is contained in:
AFCMS 2021-05-27 09:34:12 +02:00
parent 138a3cd154
commit 00063cde73
2 changed files with 46 additions and 42 deletions

View File

@ -2,6 +2,10 @@ local S = minetest.get_translator("mcl_observers")
mcl_observers = {} mcl_observers = {}
local string = string
local get_node = get_node
-- Warning! TODO: Remove this message. -- Warning! TODO: Remove this message.
-- 'realtime' is experimental feature! It can slow down the everything! -- 'realtime' is experimental feature! It can slow down the everything!
-- Please set it to false and restart the game if something's wrong: -- Please set it to false and restart the game if something's wrong:
@ -24,7 +28,7 @@ local rules_up = {{ x = 0, y = -1, z = 0, spread = true }}
function mcl_observers.observer_activate(pos) function mcl_observers.observer_activate(pos)
minetest.after(mcl_vars.redstone_tick, function(pos) minetest.after(mcl_vars.redstone_tick, function(pos)
local node = minetest.get_node(pos) local node = get_node(pos)
if not node then if not node then
return return
end end
@ -47,7 +51,7 @@ end
-- TODO: Also scan metadata changes. -- TODO: Also scan metadata changes.
-- TODO: Ignore some node changes. -- TODO: Ignore some node changes.
local function observer_scan(pos, initialize) local function observer_scan(pos, initialize)
local node = minetest.get_node(pos) local node = get_node(pos)
local front local front
if node.name == "mcl_observers:observer_up_off" or node.name == "mcl_observers:observer_up_on" then if node.name == "mcl_observers:observer_up_off" or node.name == "mcl_observers:observer_up_on" then
front = vector.add(pos, {x=0, y=1, z=0}) front = vector.add(pos, {x=0, y=1, z=0})
@ -56,7 +60,7 @@ local function observer_scan(pos, initialize)
else else
front = vector.add(pos, minetest.facedir_to_dir(node.param2)) front = vector.add(pos, minetest.facedir_to_dir(node.param2))
end end
local frontnode = minetest.get_node(front) local frontnode = get_node(front)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local oldnode = meta:get_string("node_name") local oldnode = meta:get_string("node_name")
local oldparam2 = meta:get_string("node_param2") local oldparam2 = meta:get_string("node_param2")
@ -94,7 +98,7 @@ local function observer_orientate(pos, placer)
-- Placer pitch in degrees -- Placer pitch in degrees
local pitch = placer:get_look_vertical() * (180 / math.pi) local pitch = placer:get_look_vertical() * (180 / math.pi)
--local node = minetest.get_node(pos) --local node = get_node(pos)
if pitch > 55 then -- player looking upwards if pitch > 55 then -- player looking upwards
-- Observer looking downwards -- Observer looking downwards
minetest.set_node(pos, {name="mcl_observers:observer_down_off"}) minetest.set_node(pos, {name="mcl_observers:observer_down_off"})
@ -156,7 +160,7 @@ mesecon.register_node("mcl_observers:observer", {
timer:start(mcl_vars.redstone_tick) timer:start(mcl_vars.redstone_tick)
end, end,
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
local node = minetest.get_node(pos) local node = get_node(pos)
minetest.set_node(pos, {name = "mcl_observers:observer_off", param2 = node.param2}) minetest.set_node(pos, {name = "mcl_observers:observer_off", param2 = node.param2})
mesecon.receptor_off(pos, get_rules_flat(node)) mesecon.receptor_off(pos, get_rules_flat(node))
end, end,
@ -208,7 +212,7 @@ mesecon.register_node("mcl_observers:observer_down", {
timer:start(mcl_vars.redstone_tick) timer:start(mcl_vars.redstone_tick)
end, end,
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
local node = minetest.get_node(pos) local node = get_node(pos)
minetest.set_node(pos, {name = "mcl_observers:observer_down_off", param2 = node.param2}) minetest.set_node(pos, {name = "mcl_observers:observer_down_off", param2 = node.param2})
mesecon.receptor_off(pos, rules_down) mesecon.receptor_off(pos, rules_down)
end, end,
@ -291,138 +295,138 @@ if realtime then
mcl_observers.remove_node = minetest.remove_node mcl_observers.remove_node = minetest.remove_node
mcl_observers.bulk_set_node = minetest.bulk_set_node mcl_observers.bulk_set_node = minetest.bulk_set_node
minetest.add_node=function(pos,node) function minetest.add_node(pos,node)
mcl_observers.add_node(pos,node) mcl_observers.add_node(pos,node)
local n=minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z}) local n = get_node({x=pos.x+1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then
mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z}) n = get_node({x=pos.x-1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then
mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1}) n = get_node({x=pos.x,y=pos.y,z=pos.z+1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1}) n = get_node({x=pos.x,y=pos.y,z=pos.z-1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1})
end end
n=minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) n = get_node({x=pos.x,y=pos.y-1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then
mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) n = get_node({x=pos.x,y=pos.y+1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then
mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z})
end end
end end
minetest.set_node=function(pos,node) function minetest.set_node(pos,node)
mcl_observers.set_node(pos,node) mcl_observers.set_node(pos,node)
local n=minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z}) local n = get_node({x=pos.x+1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then
mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z}) n = get_node({x=pos.x-1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then
mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1}) n = get_node({x=pos.x,y=pos.y,z=pos.z+1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1}) n = get_node({x=pos.x,y=pos.y,z=pos.z-1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1})
end end
n=minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) n = get_node({x=pos.x,y=pos.y-1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then
mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) n = get_node({x=pos.x,y=pos.y+1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then
mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z})
end end
end end
minetest.swap_node=function(pos,node) function minetest.swap_node(pos,node)
mcl_observers.swap_node(pos,node) mcl_observers.swap_node(pos,node)
local n=minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z}) local n = get_node({x=pos.x+1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then
mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z}) n = get_node({x=pos.x-1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then
mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1}) n = get_node({x=pos.x,y=pos.y,z=pos.z+1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1}) n = get_node({x=pos.x,y=pos.y,z=pos.z-1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1})
end end
n=minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) n = get_node({x=pos.x,y=pos.y-1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then
mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) n = get_node({x=pos.x,y=pos.y+1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then
mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z})
end end
end end
minetest.remove_node=function(pos) function minetest.remove_node(pos)
mcl_observers.remove_node(pos) mcl_observers.remove_node(pos)
local n=minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z}) local n = get_node({x=pos.x+1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then
mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z}) n = get_node({x=pos.x-1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then
mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1}) n = get_node({x=pos.x,y=pos.y,z=pos.z+1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1}) n = get_node({x=pos.x,y=pos.y,z=pos.z-1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1})
end end
n=minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) n = get_node({x=pos.x,y=pos.y-1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then
mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) n = get_node({x=pos.x,y=pos.y+1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then
mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z})
end end
end end
minetest.bulk_set_node=function(lst, node) function minetest.bulk_set_node(lst, node)
mcl_observers.bulk_set_node(lst, node) mcl_observers.bulk_set_node(lst, node)
for _, pos in pairs(lst) do for _, pos in pairs(lst) do
local n=minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z}) local n = get_node({x=pos.x+1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==-1 then
mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x+1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z}) n = get_node({x=pos.x-1,y=pos.y,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).x==1 then
mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z}) mcl_observers.observer_activate({x=pos.x-1,y=pos.y,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1}) n = get_node({x=pos.x,y=pos.y,z=pos.z+1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==-1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z+1})
end end
n=minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1}) n = get_node({x=pos.x,y=pos.y,z=pos.z-1})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_o" and minetest.facedir_to_dir(n.param2).z==1 then
mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1}) mcl_observers.observer_activate({x=pos.x,y=pos.y,z=pos.z-1})
end end
n=minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) n = get_node({x=pos.x,y=pos.y-1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_u" then
mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y-1,z=pos.z})
end end
n=minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) n = get_node({x=pos.x,y=pos.y+1,z=pos.z})
if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then if n and n.name and string.sub(n.name,1,24)=="mcl_observers:observer_d" then
mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z}) mcl_observers.observer_activate({x=pos.x,y=pos.y+1,z=pos.z})
end end

View File

@ -1869,7 +1869,7 @@ minetest.register_on_generated(function(minp, maxp, blockseed)
mcl_vars.add_chunk(minp) mcl_vars.add_chunk(minp)
end) end)
minetest.register_on_generated=function(node_function) function minetest.register_on_generated(node_function)
mcl_mapgen_core.register_generator("mod_"..tostring(#registered_generators+1), nil, node_function) mcl_mapgen_core.register_generator("mod_"..tostring(#registered_generators+1), nil, node_function)
end end