summaryrefslogtreecommitdiff
path: root/mesecons_detector/init.lua
diff options
context:
space:
mode:
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>2017-03-31 20:25:46 -0400
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2017-03-31 20:25:46 -0400
commitd7a62ee312c9cd4ff455223e18b9bcf09a2f79a4 (patch)
tree823380234c085bb6edbc472531277db8a33c721b /mesecons_detector/init.lua
parent02c000610d3e78d6f8a5fa58115e8fcd83f3d97b (diff)
downloaddreambuilder_modpack-d7a62ee312c9cd4ff455223e18b9bcf09a2f79a4.tar
dreambuilder_modpack-d7a62ee312c9cd4ff455223e18b9bcf09a2f79a4.tar.gz
dreambuilder_modpack-d7a62ee312c9cd4ff455223e18b9bcf09a2f79a4.tar.bz2
dreambuilder_modpack-d7a62ee312c9cd4ff455223e18b9bcf09a2f79a4.tar.xz
dreambuilder_modpack-d7a62ee312c9cd4ff455223e18b9bcf09a2f79a4.zip
update mesecons, pipeworks, castle, and technic
Diffstat (limited to 'mesecons_detector/init.lua')
-rw-r--r--mesecons_detector/init.lua49
1 files changed, 36 insertions, 13 deletions
diff --git a/mesecons_detector/init.lua b/mesecons_detector/init.lua
index 65e5c6e..397543c 100644
--- a/mesecons_detector/init.lua
+++ b/mesecons_detector/init.lua
@@ -5,15 +5,18 @@ local GET_COMMAND = "GET"
-- The radius can be specified in mesecons/settings.lua
local function object_detector_make_formspec(pos)
- minetest.get_meta(pos):set_string("formspec", "size[9,2.5]" ..
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", "size[9,2.5]" ..
"field[0.3, 0;9,2;scanname;Name of player to scan for (empty for any):;${scanname}]"..
"field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
"button_exit[7,0.75;2,3;;Save]")
end
-local function object_detector_on_receive_fields(pos, _, fields)
+local function object_detector_on_receive_fields(pos, formname, fields, sender)
if not fields.scanname or not fields.digiline_channel then return end
+ if minetest.is_protected(pos, sender:get_player_name()) then return end
+
local meta = minetest.get_meta(pos)
meta:set_string("scanname", fields.scanname)
meta:set_string("digiline_channel", fields.digiline_channel)
@@ -28,14 +31,17 @@ local function object_detector_scan(pos)
if next(objs) == nil then return false end
local scanname = minetest.get_meta(pos):get_string("scanname")
+ local scan_for = {}
+ for _, str in pairs(string.split(scanname:gsub(" ", ""), ",")) do
+ scan_for[str] = true
+ end
+
local every_player = scanname == ""
for _, obj in pairs(objs) do
-- "" is returned if it is not a player; "" ~= nil; so only handle objects with foundname ~= ""
local foundname = obj:get_player_name()
-
if foundname ~= "" then
- -- return true if scanning for any player or if specific playername was detected
- if scanname == "" or foundname == scanname then
+ if every_player or scan_for[foundname] then
return true
end
end
@@ -128,17 +134,23 @@ minetest.register_abm({
-- Detects the node in front of it
local function node_detector_make_formspec(pos)
- minetest.get_meta(pos):set_string("formspec", "size[9,2.5]" ..
+ local meta = minetest.get_meta(pos)
+ if meta:get_string("distance") == "" then meta:set_string("distance", "0") end
+ meta:set_string("formspec", "size[9,2.5]" ..
"field[0.3, 0;9,2;scanname;Name of node to scan for (empty for any):;${scanname}]"..
- "field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
+ "field[0.3,1.5;2.5,2;distance;Distance (0-"..mesecon.setting("node_detector_distance_max", 10).."):;${distance}]"..
+ "field[3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
"button_exit[7,0.75;2,3;;Save]")
end
-local function node_detector_on_receive_fields(pos, _, fields)
+local function node_detector_on_receive_fields(pos, fieldname, fields, sender)
if not fields.scanname or not fields.digiline_channel then return end
+ if minetest.is_protected(pos, sender:get_player_name()) then return end
+
local meta = minetest.get_meta(pos)
meta:set_string("scanname", fields.scanname)
+ meta:set_string("distance", fields.distance or "0")
meta:set_string("digiline_channel", fields.digiline_channel)
node_detector_make_formspec(pos)
end
@@ -148,10 +160,17 @@ local function node_detector_scan(pos)
local node = minetest.get_node_or_nil(pos)
if not node then return end
+ local meta = minetest.get_meta(pos)
+
+ local distance = meta:get_int("distance")
+ local distance_max = mesecon.setting("node_detector_distance_max", 10)
+ if distance < 0 then distance = 0 end
+ if distance > distance_max then distance = distance_max end
+
local frontname = minetest.get_node(
- vector.subtract(pos, minetest.facedir_to_dir(node.param2))
+ vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1))
).name
- local scanname = minetest.get_meta(pos):get_string("scanname")
+ local scanname = meta:get_string("scanname")
return (frontname == scanname) or
(frontname ~= "air" and frontname ~= "ignore" and scanname == "")
@@ -162,11 +181,17 @@ local node_detector_digiline = {
effector = {
action = function(pos, node, channel, msg)
local meta = minetest.get_meta(pos)
+
+ local distance = meta:get_int("distance")
+ local distance_max = mesecon.setting("node_detector_distance_max", 10)
+ if distance < 0 then distance = 0 end
+ if distance > distance_max then distance = distance_max end
+
if channel ~= meta:get_string("digiline_channel") then return end
if msg == GET_COMMAND then
local nodename = minetest.get_node(
- vector.subtract(pos, minetest.facedir_to_dir(node.param2))
+ vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1))
).name
digiline:receptor_send(pos, digiline.rules.default, channel, nodename)
@@ -208,7 +233,6 @@ minetest.register_node("mesecons_detector:node_detector_off", {
}},
on_construct = node_detector_make_formspec,
on_receive_fields = node_detector_on_receive_fields,
- after_place_node = after_place_node_detector,
sounds = default.node_sound_stone_defaults(),
digiline = node_detector_digiline
})
@@ -225,7 +249,6 @@ minetest.register_node("mesecons_detector:node_detector_on", {
}},
on_construct = node_detector_make_formspec,
on_receive_fields = node_detector_on_receive_fields,
- after_place_node = after_place_node_detector,
sounds = default.node_sound_stone_defaults(),
digiline = node_detector_digiline
})