This commit is contained in:
paly2 2015-12-12 10:52:06 +01:00
commit 9ff6ad9ce0
2 changed files with 87 additions and 37 deletions

@ -1 +1,2 @@
mesecons mesecons
vector_extras

@ -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
})