mirror of
https://github.com/minetest-mods/MoreMesecons.git
synced 2024-12-29 17:07:35 +01:00
do not use minetest.find_node_near, I guess it's a bit laggy
This commit is contained in:
parent
c46cd1ff13
commit
8e684b83ca
@ -1,49 +1,85 @@
|
|||||||
local JAMMER_MAX_DISTANCE = 10
|
local JAMMER_MAX_DISTANCE = 10
|
||||||
|
|
||||||
minetest.after(0, function() -- After load all mods
|
-- see wireless jammer
|
||||||
function mesecon.turnon(pos, link) -- Overwrite mesecons function.
|
local get = vector.get_data_from_pos
|
||||||
local frontiers = {{pos = pos, link = link}}
|
local set = vector.set_data_to_pos
|
||||||
|
local remove = vector.remove_data_from_pos
|
||||||
|
|
||||||
local depth = 1
|
local jammers = {}
|
||||||
while frontiers[depth] do
|
local function add_jammer(pos)
|
||||||
local f = frontiers[depth]
|
if get(jammers, pos.z,pos.y,pos.x) then
|
||||||
local node = minetest.get_node_or_nil(f.pos)
|
return
|
||||||
|
end
|
||||||
|
set(jammers, pos.z,pos.y,pos.x, true)
|
||||||
|
end
|
||||||
|
|
||||||
-- area not loaded, postpone action
|
local function remove_jammer(pos)
|
||||||
if not node then
|
remove(jammers, pos.z,pos.y,pos.x)
|
||||||
mesecon.queue:add_action(f.pos, "turnon", {link}, nil, true)
|
end
|
||||||
elseif minetest.find_node_near(f.pos, JAMMER_MAX_DISTANCE, {"moremesecons_jammer:jammer_on"}) then -- JAMMER
|
|
||||||
break
|
|
||||||
elseif mesecon.is_conductor_off(node, f.link) then
|
|
||||||
local rules = mesecon.conductor_get_rules(node)
|
|
||||||
|
|
||||||
minetest.swap_node(f.pos, {name = mesecon.get_conductor_on(node, f.link),
|
local function is_jammed(pos)
|
||||||
param2 = node.param2})
|
local pz,py,px = vector.unpack(pos)
|
||||||
|
for z,yxs in pairs(jammers) do
|
||||||
-- call turnon on neighbors: normal rules
|
if math.abs(pz-z) <= JAMMER_MAX_DISTANCE then
|
||||||
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
|
for y,xs in pairs(yxs) do
|
||||||
local np = mesecon.addPosRule(f.pos, r)
|
if math.abs(py-y) <= JAMMER_MAX_DISTANCE then
|
||||||
|
for x in pairs(xs) do
|
||||||
-- area not loaded, postpone action
|
if math.abs(px-x) <= JAMMER_MAX_DISTANCE
|
||||||
if not minetest.get_node_or_nil(np) then
|
and (px-x)^2+(py-y)^2+(pz-z)^2 <= JAMMER_MAX_DISTANCE^2 then
|
||||||
mesecon.queue:add_action(np, "turnon", {rulename},
|
return true
|
||||||
nil, true)
|
end
|
||||||
else
|
|
||||||
local links = mesecon.rules_link_rule_all(f.pos, r)
|
|
||||||
for _, l in ipairs(links) do
|
|
||||||
table.insert(frontiers, {pos = np, link = l})
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif mesecon.is_effector(node.name) then
|
|
||||||
mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)
|
|
||||||
if mesecon.is_effector_off(node.name) then
|
|
||||||
mesecon.activate(f.pos, node, f.link, depth)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
depth = depth + 1
|
|
||||||
end
|
end
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
minetest.after(0, function() -- After load all mods
|
||||||
|
function mesecon.turnon(pos, link) -- Overwrite mesecons function.
|
||||||
|
local frontiers = {{pos = pos, link = link}}
|
||||||
|
|
||||||
|
local depth = 1
|
||||||
|
while frontiers[depth] do
|
||||||
|
local f = frontiers[depth]
|
||||||
|
local node = minetest.get_node_or_nil(f.pos)
|
||||||
|
|
||||||
|
-- area not loaded, postpone action
|
||||||
|
if not node then
|
||||||
|
mesecon.queue:add_action(f.pos, "turnon", {link}, nil, true)
|
||||||
|
elseif is_jammed(f.pos) then -- JAMMER
|
||||||
|
return
|
||||||
|
elseif mesecon.is_conductor_off(node, f.link) then
|
||||||
|
local rules = mesecon.conductor_get_rules(node)
|
||||||
|
|
||||||
|
minetest.swap_node(f.pos, {name = mesecon.get_conductor_on(node, f.link),
|
||||||
|
param2 = node.param2})
|
||||||
|
|
||||||
|
-- call turnon on neighbors: normal rules
|
||||||
|
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
|
||||||
|
local np = mesecon.addPosRule(f.pos, r)
|
||||||
|
|
||||||
|
-- area not loaded, postpone action
|
||||||
|
if not minetest.get_node_or_nil(np) then
|
||||||
|
mesecon.queue:add_action(np, "turnon", {rulename},
|
||||||
|
nil, true)
|
||||||
|
else
|
||||||
|
local links = mesecon.rules_link_rule_all(f.pos, r)
|
||||||
|
for _, l in ipairs(links) do
|
||||||
|
table.insert(frontiers, {pos = np, link = l})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif mesecon.is_effector(node.name) then
|
||||||
|
mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)
|
||||||
|
if mesecon.is_effector_off(node.name) then
|
||||||
|
mesecon.activate(f.pos, node, f.link, depth)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
depth = depth + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
mesecon.register_node("moremesecons_jammer:jammer", {
|
mesecon.register_node("moremesecons_jammer:jammer", {
|
||||||
@ -54,15 +90,21 @@ mesecon.register_node("moremesecons_jammer:jammer", {
|
|||||||
groups = {dig_immediate=2},
|
groups = {dig_immediate=2},
|
||||||
mesecons = {effector = {
|
mesecons = {effector = {
|
||||||
action_on = function(pos)
|
action_on = function(pos)
|
||||||
|
add_jammer(pos)
|
||||||
minetest.swap_node(pos, {name="moremesecons_jammer:jammer_on"})
|
minetest.swap_node(pos, {name="moremesecons_jammer:jammer_on"})
|
||||||
end }}
|
end
|
||||||
|
}},
|
||||||
},{
|
},{
|
||||||
tiles = {"moremesecons_jammer_on.png"},
|
tiles = {"moremesecons_jammer_on.png"},
|
||||||
groups = {dig_immediate=2, not_in_creative_inventory=1},
|
groups = {dig_immediate=2, not_in_creative_inventory=1},
|
||||||
mesecons = {effector = {
|
mesecons = {effector = {
|
||||||
action_off = function(pos)
|
action_off = function(pos)
|
||||||
|
remove_jammer(pos)
|
||||||
minetest.swap_node(pos, {name="moremesecons_jammer:jammer_off"})
|
minetest.swap_node(pos, {name="moremesecons_jammer:jammer_off"})
|
||||||
end }}
|
end
|
||||||
|
}},
|
||||||
|
on_destruct = remove_jammer,
|
||||||
|
on_construct = add_jammer,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
@ -70,3 +112,10 @@ minetest.register_craft({
|
|||||||
recipe = {{"group:mesecon_conductor_craftable", "default:mese", "group:mesecon_conductor_craftable"},
|
recipe = {{"group:mesecon_conductor_craftable", "default:mese", "group:mesecon_conductor_craftable"},
|
||||||
{"", "moremesecons_wireless:jammer_off", ""}}
|
{"", "moremesecons_wireless:jammer_off", ""}}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
nodenames = {"moremesecons_jammer:jammer_on"},
|
||||||
|
interval = 5,
|
||||||
|
chance = 1,
|
||||||
|
action = add_jammer
|
||||||
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user