diff --git a/mods/mesecons/mesecons/internal.lua b/mods/mesecons/mesecons/internal.lua index d4798521..4ef2b18d 100755 --- a/mods/mesecons/mesecons/internal.lua +++ b/mods/mesecons/mesecons/internal.lua @@ -76,7 +76,7 @@ function mesecon.get_conductor(nodename) end end -function mesecon.get_any_outputrules (node) +function mesecon.get_any_outputrules(node) if not node then return nil end if mesecon.is_conductor(node.name) then @@ -86,7 +86,7 @@ function mesecon.get_any_outputrules (node) end end -function mesecon.get_any_inputrules (node) +function mesecon.get_any_inputrules(node) if not node then return nil end if mesecon.is_conductor(node.name) then @@ -96,7 +96,7 @@ function mesecon.get_any_inputrules (node) end end -function mesecon.get_any_rules (node) +function mesecon.get_any_rules(node) return mesecon.mergetable(mesecon.get_any_inputrules(node) or {}, mesecon.get_any_outputrules(node) or {}) end @@ -381,27 +381,41 @@ function mesecon.turnon(pos, link) -- area not loaded, postpone action if not node then - mesecon.queue:add_action(f.pos, "turnon", {link}, nil, true) + mesecon.queue:add_action(f.pos, "turnon", {f.link}, nil, true) 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}) + -- Success: If false, at least one neighboring node is unloaded, + -- postpone turning on action + local success = true + local neighborlinks = {} - -- call turnon on neighbors: normal rules + -- call turnon on neighbors for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do local np = vector.add(f.pos, r) - -- area not loaded, postpone action + -- Neighboring node not loaded, postpone turning on current node + -- since we can't even know if neighboring node has matching rules if not mesecon.get_node_force(np) then - mesecon.queue:add_action(np, "turnon", {rulename}, - nil, true) + success = false + break else - local links = mesecon.rules_link_rule_all(f.pos, r) + neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) + end + end + + if success then + minetest.swap_node(f.pos, {name = mesecon.get_conductor_on(node, f.link), + param2 = node.param2}) + + for npos, links in pairs(neighborlinks) do + -- links = all links to node, l = each single link for _, l in ipairs(links) do - table.insert(frontiers, {pos = np, link = l}) + table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l}) end end + else + mesecon.queue:add_action(f.pos, "turnon", {f.link}, nil, true) end elseif mesecon.is_effector(node.name) then mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) @@ -413,7 +427,7 @@ function mesecon.turnon(pos, link) end end -mesecon.queue:add_function("turnon", function (pos, rulename, recdepth) +mesecon.queue:add_function("turnon", function(pos, rulename, recdepth) mesecon.turnon(pos, rulename, recdepth) end) @@ -427,27 +441,41 @@ function mesecon.turnoff(pos, link) -- area not loaded, postpone action if not node then - mesecon.queue:add_action(f.pos, "turnoff", {link}, nil, true) + mesecon.queue:add_action(f.pos, "turnoff", {f.link}, nil, true) elseif mesecon.is_conductor_on(node, f.link) then local rules = mesecon.conductor_get_rules(node) - minetest.swap_node(f.pos, {name = mesecon.get_conductor_off(node, f.link), - param2 = node.param2}) + -- Success: If false, at least one neighboring node is unloaded, + -- postpone turning on action + local success = true + local neighborlinks = {} - -- call turnoff on neighbors: normal rules + -- call turnoff on neighbors for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do local np = vector.add(f.pos, r) - -- area not loaded, postpone action + -- Neighboring node not loaded, postpone turning off current node + -- since we can't even know if neighboring node has matching rules if not mesecon.get_node_force(np) then - mesecon.queue:add_action(np, "turnoff", {rulename}, - nil, true) + success = false + break else - local links = mesecon.rules_link_rule_all(f.pos, r) + neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r) + end + end + + if success then + minetest.swap_node(f.pos, {name = mesecon.get_conductor_off(node, f.link), + param2 = node.param2}) + + for npos, links in pairs(neighborlinks) do + -- links = all links to node, l = each single link for _, l in ipairs(links) do - table.insert(frontiers, {pos = np, link = l}) + table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l}) end end + else + mesecon.queue:add_action(f.pos, "turnoff", {f.link}, nil, true) end elseif mesecon.is_effector(node.name) then mesecon.changesignal(f.pos, node, f.link, mesecon.state.off, depth) @@ -459,7 +487,7 @@ function mesecon.turnoff(pos, link) end end -mesecon.queue:add_function("turnoff", function (pos, rulename, recdepth) +mesecon.queue:add_function("turnoff", function(pos, rulename, recdepth) mesecon.turnoff(pos, rulename, recdepth) end) @@ -523,8 +551,8 @@ function mesecon.rules_link(output, input, dug_outputrules) --output/input are p local outputnode = mesecon.get_node_force(output) local inputnode = mesecon.get_node_force(input) - local outputrules = dug_outputrules or mesecon.get_any_outputrules (outputnode) - local inputrules = mesecon.get_any_inputrules (inputnode) + local outputrules = dug_outputrules or mesecon.get_any_outputrules(outputnode) + local inputrules = mesecon.get_any_inputrules(inputnode) if not outputrules or not inputrules then return end @@ -547,7 +575,7 @@ end function mesecon.rules_link_rule_all(output, rule) local input = vector.add(output, rule) local inputnode = mesecon.get_node_force(input) - local inputrules = mesecon.get_any_inputrules (inputnode) + local inputrules = mesecon.get_any_inputrules(inputnode) if not inputrules then return {} end @@ -567,7 +595,7 @@ function mesecon.rules_link_rule_all_inverted(input, rule) --local irule = mesecon.invertRule(rule) local output = vector.add(input, rule) local outputnode = mesecon.get_node_force(output) - local outputrules = mesecon.get_any_outputrules (outputnode) + local outputrules = mesecon.get_any_outputrules(outputnode) if not outputrules then return {} end diff --git a/mods/mesecons/mesecons/services.lua b/mods/mesecons/mesecons/services.lua index 5d0f81e0..343410a6 100755 --- a/mods/mesecons/mesecons/services.lua +++ b/mods/mesecons/mesecons/services.lua @@ -87,10 +87,6 @@ end mesecon.queue:add_function("cooldown", function (pos) - if minetest.get_item_group(minetest.get_node(pos).name, "overheat") == 0 then - return -- node has been moved, this one does not use overheating - ignore - end - local meta = minetest.get_meta(pos) local heat = meta:get_int("heat") diff --git a/mods/mesecons/mesecons_blinkyplant/init.lua b/mods/mesecons/mesecons_blinkyplant/init.lua index a3f5bda6..8d2aa6ea 100755 --- a/mods/mesecons/mesecons_blinkyplant/init.lua +++ b/mods/mesecons/mesecons_blinkyplant/init.lua @@ -10,23 +10,11 @@ local toggle_timer = function (pos) end local on_timer = function (pos) - local activate = false - for _, player in pairs(minetest.get_connected_players()) do - local p = player:getpos() - local dist = ((p.x-pos.x)^2 + (p.y-pos.y)^2 + (p.z-pos.z)^2)^0.5 - if dist < 40 then - activate = true - break - end - end - - if activate then - local node = minetest.get_node(pos) - if(mesecon.flipstate(pos, node) == "on") then - mesecon.receptor_on(pos) - else - mesecon.receptor_off(pos) - end + local node = minetest.get_node(pos) + if(mesecon.flipstate(pos, node) == "on") then + mesecon.receptor_on(pos) + else + mesecon.receptor_off(pos) end toggle_timer(pos) end diff --git a/mods/mesecons/mesecons_commandblock/init.lua b/mods/mesecons/mesecons_commandblock/init.lua index 17bcf016..8fb54e6a 100755 --- a/mods/mesecons/mesecons_commandblock/init.lua +++ b/mods/mesecons/mesecons_commandblock/init.lua @@ -93,9 +93,22 @@ local function receive_fields(pos, formname, fields, sender) end local function resolve_commands(commands, pos) + local players = minetest.get_connected_players() + + -- No players online: remove all commands containing + -- @nearest, @farthest and @random + if #players == 0 then + commands = commands:gsub("[^\r\n]+", function (line) + if line:find("@nearest") then return "" end + if line:find("@farthest") then return "" end + if line:find("@random") then return "" end + return line + end) + return commands + end + local nearest, farthest = nil, nil local min_distance, max_distance = math.huge, -1 - local players = minetest.get_connected_players() for index, player in pairs(players) do local distance = vector.distance(pos, player:getpos()) if distance < min_distance then diff --git a/mods/mesecons/mesecons_luacontroller/init.lua b/mods/mesecons/mesecons_luacontroller/init.lua index 01f58789..458286f3 100755 --- a/mods/mesecons/mesecons_luacontroller/init.lua +++ b/mods/mesecons/mesecons_luacontroller/init.lua @@ -508,10 +508,15 @@ local digiline = { end } } -local function on_receive_fields(pos, form_name, fields) +local function on_receive_fields(pos, form_name, fields, sender) if not fields.program then return end + local name = sender:get_player_name() + if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then + minetest.record_protection_violation(pos, name) + return + end reset(pos) reset_meta(pos, fields.code) local err = run(pos, {type="program"}) diff --git a/mods/mesecons/mesecons_random/init.lua b/mods/mesecons/mesecons_random/init.lua index 9e0e333f..e37886bf 100755 --- a/mods/mesecons/mesecons_random/init.lua +++ b/mods/mesecons/mesecons_random/init.lua @@ -26,7 +26,7 @@ minetest.register_craft({ -- GHOSTSTONE minetest.register_node("mesecons_random:ghoststone", { - description="ghoststone", + description="Ghoststone", tiles = {"jeija_ghoststone.png"}, is_ground_content = true, inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"),