From d7a62ee312c9cd4ff455223e18b9bcf09a2f79a4 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Fri, 31 Mar 2017 20:25:46 -0400 Subject: update mesecons, pipeworks, castle, and technic --- mesecons_detector/init.lua | 49 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 13 deletions(-) (limited to 'mesecons_detector/init.lua') 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 }) -- cgit v1.2.3