4 Commits
dev ... 1.2

Author SHA1 Message Date
e5cdeef141 Remove unused loop variables 2021-03-07 20:18:18 +01:00
182eb9822a Better fix for #16 2021-03-07 10:40:05 +01:00
021100b3d4 Add a setting for disabling the wireless jammer
Fixes #17
2021-03-07 10:25:11 +01:00
227cba54b2 Avoid stack overflow using wireless + digilines
Fixes #16
2021-03-07 10:25:11 +01:00
12 changed files with 102 additions and 87 deletions

View File

@ -55,7 +55,7 @@ local function resolve_commands(commands, pos)
local nearest = nil local nearest = nil
local min_distance = math.huge local min_distance = math.huge
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
for index, player in pairs(players) do for _, player in pairs(players) do
local distance = vector.distance(pos, player:getpos()) local distance = vector.distance(pos, player:getpos())
if distance < min_distance then if distance < min_distance then
min_distance = distance min_distance = distance

View File

@ -5,7 +5,7 @@ local nodebox = {
local function signalchanger_get_output_rules(node) local function signalchanger_get_output_rules(node)
local rules = {{x=-1, y=0, z=0}} local rules = {{x=-1, y=0, z=0}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules
@ -13,7 +13,7 @@ end
local function signalchanger_get_input_rules(node) local function signalchanger_get_input_rules(node)
local rules = {{x=0, y=0, z=-1, name="input_on"}, {x=0, y=0, z=1, name="input_off"}, {x=1, y=0, z=0, name="input_signal"}} local rules = {{x=0, y=0, z=-1, name="input_on"}, {x=0, y=0, z=1, name="input_off"}, {x=1, y=0, z=0, name="input_signal"}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules

View File

@ -1,6 +1,6 @@
local function dual_delayer_get_input_rules(node) local function dual_delayer_get_input_rules(node)
local rules = {{x=1, y=0, z=0}} local rules = {{x=1, y=0, z=0}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules
@ -8,7 +8,7 @@ end
local function dual_delayer_get_output_rules(node) local function dual_delayer_get_output_rules(node)
local rules = {{x=0, y=0, z=1}, {x=0, y=0, z=-1}} local rules = {{x=0, y=0, z=1}, {x=0, y=0, z=-1}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules

View File

@ -1,6 +1,6 @@
local injector_controller_get_output_rules = function(node) local injector_controller_get_output_rules = function(node)
local rules = {{x = 0, y = 0, z = 1}} local rules = {{x = 0, y = 0, z = 1}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules
@ -10,7 +10,7 @@ local injector_controller_get_input_rules = function(node)
local rules = {{x = 0, y = 0, z = -1}, local rules = {{x = 0, y = 0, z = -1},
{x = 1, y = 0, z = 0}, {x = 1, y = 0, z = 0},
{x = -1, y = 0, z = 0}} {x = -1, y = 0, z = 0}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules

View File

@ -2,7 +2,7 @@ local function mesechest_get_output_rules(node)
local rules = {{x=-1, y=0, z=0}, local rules = {{x=-1, y=0, z=0},
{x=0, y=0, z=-1}, {x=0, y=0, z=-1},
{x=0, y=0, z=1}} {x=0, y=0, z=1}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules

View File

@ -4,7 +4,7 @@ local kill_nearest_player = function(pos)
-- Search the nearest player -- Search the nearest player
local nearest local nearest
local min_distance = MAX_DISTANCE local min_distance = MAX_DISTANCE
for index, player in pairs(minetest.get_connected_players()) do for _, player in pairs(minetest.get_connected_players()) do
local distance = vector.distance(pos, player:getpos()) local distance = vector.distance(pos, player:getpos())
if distance < min_distance then if distance < min_distance then
min_distance = distance min_distance = distance

View File

@ -6,7 +6,7 @@ local nodebox = {
local function signalchanger_get_output_rules(node) local function signalchanger_get_output_rules(node)
local rules = {{x=-1, y=0, z=0}, local rules = {{x=-1, y=0, z=0},
{x=1, y=0, z=0}} {x=1, y=0, z=0}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules
@ -14,7 +14,7 @@ end
local function signalchanger_get_input_rules(node) local function signalchanger_get_input_rules(node)
local rules = {{x=0, y=0, z=-1, name="input_on"}, {x=0, y=0, z=1, name="input_off"}} local rules = {{x=0, y=0, z=-1, name="input_on"}, {x=0, y=0, z=1, name="input_off"}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules

View File

@ -26,7 +26,7 @@ local function teleport_nearest(pos)
local nearest = nil local nearest = nil
local min_distance = MAX_PLAYER_DISTANCE local min_distance = MAX_PLAYER_DISTANCE
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
for index, player in pairs(players) do for _, player in pairs(players) do
local distance = vector.distance(pos, player:getpos()) local distance = vector.distance(pos, player:getpos())
if distance <= min_distance then if distance <= min_distance then
min_distance = distance min_distance = distance

View File

@ -1,6 +1,6 @@
local timegate_get_output_rules = function(node) local timegate_get_output_rules = function(node)
local rules = {{x = 0, y = 0, z = 1}} local rules = {{x = 0, y = 0, z = 1}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules
@ -8,7 +8,7 @@ end
local timegate_get_input_rules = function(node) local timegate_get_input_rules = function(node)
local rules = {{x = 0, y = 0, z = -1}} local rules = {{x = 0, y = 0, z = -1}}
for i = 0, node.param2 do for _ = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules) rules = mesecon.rotate_rules_left(rules)
end end
return rules return rules

View File

@ -339,14 +339,14 @@ local function do_test()
end end
end end
local i = 0 local i = 0
for pos, v in data:iter({x=-4, y=-4, z=-4}, {x=2, y=2, z=2}) do for pos in data:iter({x=-4, y=-4, z=-4}, {x=2, y=2, z=2}) do
i = i + 1 i = i + 1
assert(vector.equals(pos, expected_positions[i])) assert(vector.equals(pos, expected_positions[i]))
end end
print("Test if iter works correctly on a corner") print("Test if iter works correctly on a corner")
local found = false local found = false
for pos, v in data:iter({x=-8, y=-7, z=-80}, {x=-5, y=-5, z=-5}) do for pos in data:iter({x=-8, y=-7, z=-80}, {x=-5, y=-5, z=-5}) do
assert(not found) assert(not found)
found = true found = true
assert(vector.equals(pos, {x=-5, y=-5, z=-5})) assert(vector.equals(pos, {x=-5, y=-5, z=-5}))

View File

@ -188,7 +188,7 @@ end
function activate_network(owner, channel) function activate_network(owner, channel)
local network = wireless[owner][channel] local network = wireless[owner][channel]
for i, wl_pos in pairs(network.members) do for _, wl_pos in pairs(network.members) do
wireless_receptor_on(wl_pos, id, network) wireless_receptor_on(wl_pos, id, network)
end end
end end
@ -253,6 +253,9 @@ function wireless_effector_off(pos)
update_mod_storage() update_mod_storage()
end end
-- This table is required to prevent a message from being sent in loop between wireless nodes
local sending_digilines = {}
local function on_digiline_receive(pos, node, channel, msg) local function on_digiline_receive(pos, node, channel, msg)
if is_jammed(pos) then if is_jammed(pos) then
return return
@ -264,11 +267,18 @@ local function on_digiline_receive(pos, node, channel, msg)
return return
end end
local pos_hash = minetest.hash_node_position(pos)
if sending_digilines[pos_hash] then
return
end
sending_digilines[pos_hash] = true
for i, wl_pos in pairs(wireless[wls.owner][wls.channel].members) do for i, wl_pos in pairs(wireless[wls.owner][wls.channel].members) do
if i ~= wls.id and check_wireless_exists(wl_pos) then if i ~= wls.id and check_wireless_exists(wl_pos) then
digiline:receptor_send(wl_pos, digiline.rules.default, channel, msg) digiline:receptor_send(wl_pos, digiline.rules.default, channel, msg)
end end
end end
sending_digilines[pos_hash] = nil
end end
mesecon.register_node("moremesecons_wireless:wireless", { mesecon.register_node("moremesecons_wireless:wireless", {
@ -327,6 +337,15 @@ mesecon.register_node("moremesecons_wireless:wireless", {
minetest.register_alias("moremesecons_wireless:wireless", "moremesecons_wireless:wireless_off") minetest.register_alias("moremesecons_wireless:wireless", "moremesecons_wireless:wireless_off")
minetest.register_craft({
output = "moremesecons_wireless:wireless_off 2",
recipe = {
{"group:mesecon_conductor_craftable", "", "group:mesecon_conductor_craftable"},
{"", "mesecons_torch:mesecon_torch_on", ""},
{"group:mesecon_conductor_craftable", "", "group:mesecon_conductor_craftable"},
}
})
local function remove_jammer(pos) local function remove_jammer(pos)
moremesecons.remove_data_from_pos(jammers, pos) moremesecons.remove_data_from_pos(jammers, pos)
end end
@ -354,83 +373,76 @@ function is_jammed(pos)
return false return false
end end
mesecon.register_node("moremesecons_wireless:jammer", { if moremesecons.setting("wireless", "enable_jammer", true) then
description = "Wireless Jammer", mesecon.register_node("moremesecons_wireless:jammer", {
paramtype = "light", description = "Wireless Jammer",
drawtype = "nodebox", paramtype = "light",
},{ drawtype = "nodebox",
tiles = {"mesecons_wire_off.png^moremesecons_jammer_top.png", "moremesecons_jammer_bottom.png", "mesecons_wire_off.png^moremesecons_jammer_side_off.png"}, },{
node_box = { tiles = {"mesecons_wire_off.png^moremesecons_jammer_top.png", "moremesecons_jammer_bottom.png", "mesecons_wire_off.png^moremesecons_jammer_side_off.png"},
type = "fixed", node_box = {
fixed = { type = "fixed",
-- connection fixed = {
{-1/16, -0.5, -0.5, 1/16, -7/16, 0.5}, -- connection
{-0.5, -0.5, -1/16, 0.5, -7/16, 1/16}, {-1/16, -0.5, -0.5, 1/16, -7/16, 0.5},
{-0.5, -0.5, -1/16, 0.5, -7/16, 1/16},
--stabilization --stabilization
{-1/16, -7/16, -1/16, 1/16, -6/16, 1/16}, {-1/16, -7/16, -1/16, 1/16, -6/16, 1/16},
-- fields -- fields
{-7/16, -6/16, -7/16, 7/16, -4/16, 7/16}, {-7/16, -6/16, -7/16, 7/16, -4/16, 7/16},
{-5/16, -4/16, -5/16, 5/16, -3/16, 5/16}, {-5/16, -4/16, -5/16, 5/16, -3/16, 5/16},
{-3/16, -3/16, -3/16, 3/16, -2/16, 3/16}, {-3/16, -3/16, -3/16, 3/16, -2/16, 3/16},
{-1/16, -2/16, -1/16, 1/16, -1/16, 1/16}, {-1/16, -2/16, -1/16, 1/16, -1/16, 1/16},
},
}, },
}, groups = {dig_immediate=2},
groups = {dig_immediate=2}, mesecons = {effector = {
mesecons = {effector = { rules = mesecon.rules.flat,
rules = mesecon.rules.flat, action_on = function(pos)
action_on = function(pos) add_jammer(pos)
add_jammer(pos) minetest.swap_node(pos, {name="moremesecons_wireless:jammer_on"})
minetest.swap_node(pos, {name="moremesecons_wireless:jammer_on"}) end
end }}
}} },{
},{ tiles = {"mesecons_wire_on.png^moremesecons_jammer_top.png", "moremesecons_jammer_bottom.png", "mesecons_wire_on.png^moremesecons_jammer_side_on.png"},
tiles = {"mesecons_wire_on.png^moremesecons_jammer_top.png", "moremesecons_jammer_bottom.png", "mesecons_wire_on.png^moremesecons_jammer_side_on.png"}, node_box = {
node_box = { type = "fixed",
type = "fixed", fixed = {
fixed = { -- connection
-- connection {-1/16, -0.5, -0.5, 1/16, -7/16, 0.5},
{-1/16, -0.5, -0.5, 1/16, -7/16, 0.5}, {-0.5, -0.5, -1/16, 0.5, -7/16, 1/16},
{-0.5, -0.5, -1/16, 0.5, -7/16, 1/16},
--stabilization --stabilization
{-1/16, -7/16, -1/16, 1/16, 5/16, 1/16}, {-1/16, -7/16, -1/16, 1/16, 5/16, 1/16},
-- fields -- fields
{-7/16, -6/16, -7/16, 7/16, -4/16, 7/16}, {-7/16, -6/16, -7/16, 7/16, -4/16, 7/16},
{-5/16, -3/16, -5/16, 5/16, -1/16, 5/16}, {-5/16, -3/16, -5/16, 5/16, -1/16, 5/16},
{-3/16, 0, -3/16, 3/16, 2/16, 3/16}, {-3/16, 0, -3/16, 3/16, 2/16, 3/16},
{-1/16, 3/16, -1/16, 1/16, 5/16, 1/16}, {-1/16, 3/16, -1/16, 1/16, 5/16, 1/16},
},
}, },
}, groups = {dig_immediate=2, not_in_creative_inventory=1},
groups = {dig_immediate=2, not_in_creative_inventory=1}, mesecons = {effector = {
mesecons = {effector = { rules = mesecon.rules.flat,
rules = mesecon.rules.flat, action_off = function(pos)
action_off = function(pos) remove_jammer(pos)
remove_jammer(pos) minetest.swap_node(pos, {name="moremesecons_wireless:jammer_off"})
minetest.swap_node(pos, {name="moremesecons_wireless:jammer_off"}) end
end }},
}}, on_destruct = remove_jammer,
on_destruct = remove_jammer, on_construct = add_jammer,
on_construct = add_jammer, })
})
minetest.register_craft({ minetest.register_craft({
output = "moremesecons_wireless:jammer_off", output = "moremesecons_wireless:jammer_off",
recipe = { recipe = {
{"moremesecons_wireless:wireless", "mesecons_torch:mesecon_torch_on", "moremesecons_wireless:wireless"} {"moremesecons_wireless:wireless", "mesecons_torch:mesecon_torch_on", "moremesecons_wireless:wireless"}
} }
}) })
end
minetest.register_craft({
output = "moremesecons_wireless:wireless_off 2",
recipe = {
{"group:mesecon_conductor_craftable", "", "group:mesecon_conductor_craftable"},
{"", "mesecons_torch:mesecon_torch_on", ""},
{"group:mesecon_conductor_craftable", "", "group:mesecon_conductor_craftable"},
}
})
if moremesecons.setting("wireless", "enable_lbm", false) then if moremesecons.setting("wireless", "enable_lbm", false) then
minetest.register_lbm({ minetest.register_lbm({

View File

@ -63,6 +63,9 @@ moremesecons_teleporter.enable_lbm (Enable Registration LBM) bool false
[Wireless] [Wireless]
# Whether to enable the wireless jammer node
moremesecons_wireless.enable_jammer (Enable wireless jammer) bool true
# Wireless Jammer action range # Wireless Jammer action range
# Any value less than or equal to 0 will be changed to 1 and a NaN value will be changed to the default value # Any value less than or equal to 0 will be changed to 1 and a NaN value will be changed to the default value
moremesecons_wireless.jammer_max_distance (Wireless Jammer action range) float 15 moremesecons_wireless.jammer_max_distance (Wireless Jammer action range) float 15