node sensor reworked

sensor delayer added
master
Joachim Stolberg 2019-07-08 23:26:37 +02:00
parent 0d44ea5a99
commit 3b4244e69e
13 changed files with 488 additions and 34 deletions

274
delayer.lua Normal file
View File

@ -0,0 +1,274 @@
--[[
Signs Bot
=========
Copyright (C) 2019 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
Signal Delayer.
Signals are forwarded delayed. Subsequent signals are queued.
]]--
-- for lazy programmers
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local P = minetest.string_to_pos
local M = minetest.get_meta
-- Load support for intllib.
local MP = minetest.get_modpath("signs_bot")
local I,_ = dofile(MP.."/intllib.lua")
local CYCLE_TIME = 2
local lib = signs_bot.lib
local function update_infotext(pos, dest_pos, cmnd)
M(pos):set_string("infotext", I("Signal Delayer: Connected with ")..S(dest_pos).." / "..cmnd)
end
local function infotext(pos)
local meta = M(pos)
local dest_pos = meta:get_string("signal_pos")
local signal = meta:get_string("signal_data")
if dest_pos ~= "" and signal ~= "" then
update_infotext(pos, P(dest_pos), signal)
end
end
local function formspec(meta)
local label = minetest.formspec_escape(I("Delay time [sec]:"))
local value = minetest.formspec_escape(meta:get_int("time"))
return "size[4,3]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"field[0.3,1;4,1;time;"..label..";"..value.."]"..
"button_exit[1,2.2;2,1;start;"..I("Start").."]"
end
-- Used by the pairing tool
local function signs_bot_get_signal(pos, node)
return "do"
end
-- switch to normal or loaded texture
local function turn_off(pos)
local mem = tubelib2.get_mem(pos)
local node = minetest.get_node(pos)
if mem.queue > 0 then
node.name = "signs_bot:delayer_loaded"
else
node.name = "signs_bot:delayer"
end
minetest.swap_node(pos, node)
end
-- switch to loaded texture
local function loaded(pos)
local node = minetest.get_node(pos)
if node.name == "signs_bot:delayer" or node.name == "signs_bot:delayer_on" then
node.name = "signs_bot:delayer_loaded"
minetest.swap_node(pos, node)
end
end
local function send_signal(pos)
local meta = M(pos)
local mem = tubelib2.get_mem(pos)
local node = minetest.get_node(pos)
if node.name == "signs_bot:delayer" or node.name == "signs_bot:delayer_loaded" then
node.name = "signs_bot:delayer_on"
minetest.swap_node(pos, node)
minetest.after(2, turn_off, pos)
end
signs_bot.send_signal(pos)
signs_bot.lib.activate_extender_nodes(pos, true)
mem.queue = (mem.queue or 1) - 1
if mem.queue > 0 then
mem.time = meta:get_int("time")
end
end
local function node_timer(pos)
local meta = M(pos)
local mem = tubelib2.get_mem(pos)
mem.time = (mem.time or 0) - CYCLE_TIME
--print("node_timer time="..mem.time..", queue="..mem.queue)
if mem.time <= 0 and mem.queue > 0 then
send_signal(pos)
end
return mem.queue > 0
end
-- To be called from sensors
local function signs_bot_on_signal(pos, node, signal)
local meta = M(pos)
local mem = tubelib2.get_mem(pos)
mem.queue = mem.queue or 0
--print("signs_bot_on_signal", signal, meta:get_int("time"))
if signal ~= "do" or meta:get_int("time") == 0 then return end
if mem.queue <= 0 then
mem.queue = 1
mem.time = meta:get_int("time")
loaded(pos)
else
mem.queue = mem.queue + 1
end
minetest.get_node_timer(pos):start(CYCLE_TIME)
end
local function on_receive_fields(pos, formname, fields, player)
local mem = tubelib2.get_mem(pos)
local meta = M(pos)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
if fields.key_enter_field == "time" or fields.start then
local time = tonumber(fields.time)
if time and time >= 0 and time < 999999 then
meta:set_int("time", time)
mem.time = 0
mem.queue = 0
end
end
meta:set_string("formspec", formspec(meta))
turn_off(pos)
end
minetest.register_node("signs_bot:delayer", {
description = I("Signal Delayer"),
inventory_image = "signs_bot_delayer_inv.png",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -11/32, -1/2, -11/32, 11/32, -5/16, 11/32},
},
},
tiles = {
-- up, down, right, left, back, front
"signs_bot_sensor2.png^signs_bot_delayer.png",
"signs_bot_sensor2.png",
},
after_place_node = function(pos, placer)
local meta = M(pos)
local mem = tubelib2.init_mem(pos)
mem.time = 0
mem.queue = 0
infotext(pos)
meta:set_string("formspec", formspec(meta))
end,
signs_bot_get_signal = signs_bot_get_signal,
signs_bot_on_signal = signs_bot_on_signal,
on_receive_fields = on_receive_fields,
on_timer = node_timer,
update_infotext = update_infotext,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
is_ground_content = false,
groups = {sign_bot_sensor = 1, cracky = 1},
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("signs_bot:delayer_loaded", {
description = I("Signal Delayer"),
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -11/32, -1/2, -11/32, 11/32, -5/16, 11/32},
},
},
tiles = {
-- up, down, right, left, back, front
"signs_bot_sensor2.png^signs_bot_delayer_loaded.png",
"signs_bot_sensor2.png",
},
signs_bot_get_signal = signs_bot_get_signal,
signs_bot_on_signal = signs_bot_on_signal,
on_receive_fields = on_receive_fields,
on_timer = node_timer,
update_infotext = update_infotext,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
is_ground_content = false,
diggable = false,
groups = {sign_bot_sensor = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("signs_bot:delayer_on", {
description = I("Signal Delayer"),
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -11/32, -1/2, -11/32, 11/32, -5/16, 11/32},
},
},
tiles = {
-- up, down, right, left, back, front
"signs_bot_sensor2.png^signs_bot_delayer_on.png",
"signs_bot_sensor2.png",
},
on_timer = node_timer,
update_infotext = update_infotext,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
is_ground_content = false,
diggable = false,
groups = {sign_bot_sensor = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(),
})
minetest.register_craft({
output = "signs_bot:delayer",
recipe = {
{"group:wood", "dye:yellow", ""},
{"default:mese_crystal_fragment", "", ""},
{"default:steel_ingot", "", ""},
}
})
minetest.register_lbm({
label = "[signs_bot] Restart delayer",
name = "signs_bot:delayer_restart",
nodenames = {"signs_bot:delayer", "signs_bot:delayer_loaded", "signs_bot:delayer_on"},
run_at_every_load = true,
action = function(pos, node)
turn_off(pos)
local mem = tubelib2.get_mem(pos)
if mem.time and mem.time > 0 then
minetest.get_node_timer(pos):start(CYCLE_TIME)
end
end
})
if minetest.get_modpath("doc") then
doc.add_entry("signs_bot", "delayer", {
name = I("Signal Delayer"),
data = {
item = "signs_bot:delayer",
text = table.concat({
I("Signals are forwarded delayed. Subsequent signals are queued."),
I("The delay time can be configured."),
}, "\n")
},
})
end

View File

@ -45,5 +45,6 @@ dofile(MP.."/chest.lua")
dofile(MP.."/legacy.lua")
dofile(MP.."/techage.lua")
dofile(MP.."/timer.lua")
dofile(MP.."/delayer.lua")
dofile(MP.."/tool.lua")

View File

@ -1,4 +1,4 @@
#!/bin/bash
../intllib/tools/xgettext.sh ./basis.lua ./bot_flap.lua ./bot_sensor.lua ./cart_sensor.lua ./changer.lua ./chest.lua ./cmd_farming.lua ./cmd_item.lua ./cmd_move.lua ./cmd_pattern.lua ./cmd_place.lua ./cmd_sign.lua ./commands.lua ./crop_sensor.lua ./doc.lua ./duplicator.lua ./extender.lua ./init.lua ./lib.lua ./node_sensor.lua ./nodes.lua ./robot.lua ./signal.lua ./signs.lua ./tool.lua ./timer.lua
../intllib/tools/xgettext.sh ./basis.lua ./bot_flap.lua ./bot_sensor.lua ./cart_sensor.lua ./changer.lua ./chest.lua ./cmd_farming.lua ./cmd_item.lua ./cmd_move.lua ./cmd_pattern.lua ./cmd_place.lua ./cmd_sign.lua ./commands.lua ./crop_sensor.lua ./doc.lua ./duplicator.lua ./extender.lua ./init.lua ./lib.lua ./node_sensor.lua ./nodes.lua ./robot.lua ./signal.lua ./signs.lua ./tool.lua ./timer.lua ./delayer.lua

Binary file not shown.

View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-29 00:01+0200\n"
"PO-Revision-Date: 2019-07-06 21:25+0200\n"
"POT-Creation-Date: 2019-07-08 23:22+0200\n"
"PO-Revision-Date: 2019-07-08 23:25+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@ -36,7 +36,7 @@ msgstr "Andere Gegenstände"
#: basis.lua
msgid "Robot Box "
msgstr "Roboter Box"
msgstr "Roboter Box "
#: basis.lua
msgid "running"
@ -1218,17 +1218,41 @@ msgstr "mit weiteren Aktoren mit Hilfe des Verbinde-Werkzeuges."
msgid "Node Sensor: Connected with "
msgstr "Block Sensor: Verbunden mit "
#: node_sensor.lua
msgid "added"
msgstr "mehr Blöcken"
#: node_sensor.lua
msgid "removed"
msgstr "weniger Blöcken"
#: node_sensor.lua
msgid "added or removed"
msgstr "mehr oder weniger"
#: node_sensor.lua
msgid "Send signal if nodes have been:]"
msgstr "Sende ein Signal bei"
#: node_sensor.lua
msgid "accept"
msgstr "übernehmen"
#: node_sensor.lua
msgid "Node Sensor"
msgstr "Block Sensor"
#: node_sensor.lua
msgid ""
"The Node Sensor sends a signal when it detects any node change (nodes appear "
"or disappear)."
"The node sensor can send a signal when it detects that nodes appear or "
"disappear,"
msgstr ""
"Der Block Sensor sendet ein Signal, wenn er eine Veränderung von Blocken vor "
"sich entdeckt (ein Block erscheint oder verschwindet)."
"Der Block Sensor kann ein Signal senden, wenn er eine Veränderung von "
"Blöcken vor sich entdeckt (ein Block erscheint oder verschwindet),"
#: node_sensor.lua
msgid "but has to be configured accordingly."
msgstr "aber muss entsprechend konfiguriert werden."
#: node_sensor.lua
msgid "Valid nodes are all kind of blocks and plants."
@ -1311,7 +1335,7 @@ msgstr "Verbunden mit"
msgid "Cycle time [min]:"
msgstr "Zykluszeit [min]:"
#: timer.lua
#: timer.lua delayer.lua
msgid "Start"
msgstr "Start"
@ -1326,6 +1350,28 @@ msgstr ""
"Kann mit einer Zeit in Sekunden programmiert werden, um bspw. den Roboter "
"zyklisch zu starten."
#: delayer.lua
msgid "Signal Delayer: Connected with "
msgstr "Sensor Verzögerer: Verbunden mit "
#: delayer.lua
msgid "Delay time [sec]:"
msgstr "Verzögerungszeit [s]:"
#: delayer.lua
msgid "Signal Delayer"
msgstr "Signal Verzögerer"
#: delayer.lua
msgid "Signals are forwarded delayed. Subsequent signals are queued."
msgstr ""
"Signale werden verzögert weitergeleitet. Nachfolgende Signale werden in die "
"Warteschlange gestellt."
#: delayer.lua
msgid "The delay time can be configured."
msgstr "Die Verzögerungszeit kann eingestellt werden."
#~ msgid ""
#~ "Go to the next sign\n"
#~ "to be executed as a sub-process.\n"

View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-25 23:36+0200\n"
"PO-Revision-Date: 2019-06-27 21:14+0200\n"
"POT-Creation-Date: 2019-07-08 23:15+0200\n"
"PO-Revision-Date: 2019-07-08 23:22+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@ -36,7 +36,7 @@ msgstr "Andere Gegenstände"
#: basis.lua
msgid "Robot Box "
msgstr "Roboter Box"
msgstr "Roboter Box "
#: basis.lua
msgid "running"
@ -761,15 +761,17 @@ msgstr ""
#: commands.lua
msgid ""
"Go to the next sign\n"
"to be executed as a sub-process.\n"
"After that it will go on with the next command\n"
"on this sign."
"Walk until a sign or obstacle is\n"
"reached. Then continue with the next command.\n"
"When a sign has been reached, \n"
"it is executed as sub-process."
msgstr ""
"Gehe bis zum nächsten Zeichen,\n"
"das dann als Unterprogramm\n"
"bearbeitet wird. Mache danach mit\n"
"dem nächsten Kommando weiter."
"Gehe bis ein Zeichen oder Hindernis\n"
"erreicht wurde. Führe dann das nächste\n"
"Kommando aus. \n"
"Wurde ein Zeichen erreicht, so arbeite\n"
"die Kommandos des Zeichens als\n"
"Unter-Prozess ab."
#: crop_sensor.lua
msgid "Crop Sensor: Connected with "
@ -777,7 +779,7 @@ msgstr "Ernte Sensor: Verbunden mit "
#: crop_sensor.lua
msgid "Crop Sensor"
msgstr "Ernte Sesor"
msgstr "Ernte Sensor"
#: crop_sensor.lua
msgid "The Crop Sensor sends a signal when, for example wheat is fully grown."
@ -1216,17 +1218,41 @@ msgstr "mit weiteren Aktoren mit Hilfe des Verbinde-Werkzeuges."
msgid "Node Sensor: Connected with "
msgstr "Block Sensor: Verbunden mit "
#: node_sensor.lua
msgid "added"
msgstr "mehr Blöcken"
#: node_sensor.lua
msgid "removed"
msgstr "weniger Blöcken"
#: node_sensor.lua
msgid "added or removed"
msgstr "mehr oder weniger"
#: node_sensor.lua
msgid "Send signal if nodes have been:]"
msgstr "Sende ein Signal bei"
#: node_sensor.lua
msgid "accept"
msgstr "übernehmen"
#: node_sensor.lua
msgid "Node Sensor"
msgstr "Block Sensor"
#: node_sensor.lua
msgid ""
"The Node Sensor sends a signal when it detects any node change (nodes appear "
"or disappear)."
"The node sensor can send a signal when it detects that nodes appear or "
"disappear,"
msgstr ""
"Der Block Sensor sendet ein Signal, wenn er eine Veränderung von Blocken vor "
"sich entdeckt (ein Block erscheint oder verschwindet)."
"Der Block Sensor kann ein Signal senden, wenn er eine Veränderung von "
"Blöcken vor sich entdeckt (ein Block erscheint oder verschwindet),"
#: node_sensor.lua
msgid "but has to be configured accordingly."
msgstr "aber muss entsprechend konfiguriert werden."
#: node_sensor.lua
msgid "Valid nodes are all kind of blocks and plants."
@ -1323,3 +1349,14 @@ msgid ""
msgstr ""
"Kann mit einer Zeit in Sekunden programmiert werden, um bspw. den Roboter "
"zyklisch zu starten."
#~ msgid ""
#~ "Go to the next sign\n"
#~ "to be executed as a sub-process.\n"
#~ "After that it will go on with the next command\n"
#~ "on this sign."
#~ msgstr ""
#~ "Gehe bis zum nächsten Zeichen,\n"
#~ "das dann als Unterprogramm\n"
#~ "bearbeitet wird. Mache danach mit\n"
#~ "dem nächsten Kommando weiter."

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-29 00:01+0200\n"
"POT-Creation-Date: 2019-07-08 23:22+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -978,14 +978,38 @@ msgstr ""
msgid "Node Sensor: Connected with "
msgstr ""
#: node_sensor.lua
msgid "added"
msgstr ""
#: node_sensor.lua
msgid "removed"
msgstr ""
#: node_sensor.lua
msgid "added or removed"
msgstr ""
#: node_sensor.lua
msgid "Send signal if nodes have been:]"
msgstr ""
#: node_sensor.lua
msgid "accept"
msgstr ""
#: node_sensor.lua
msgid "Node Sensor"
msgstr ""
#: node_sensor.lua
msgid ""
"The Node Sensor sends a signal when it detects any node change (nodes appear "
"or disappear)."
"The node sensor can send a signal when it detects that nodes appear or "
"disappear,"
msgstr ""
#: node_sensor.lua
msgid "but has to be configured accordingly."
msgstr ""
#: node_sensor.lua
@ -1064,7 +1088,7 @@ msgstr ""
msgid "Cycle time [min]:"
msgstr ""
#: timer.lua
#: timer.lua delayer.lua
msgid "Start"
msgstr ""
@ -1076,3 +1100,23 @@ msgstr ""
msgid ""
"Can be programmed with a time in seconds, e.g. to start the bot cyclically."
msgstr ""
#: delayer.lua
msgid "Signal Delayer: Connected with "
msgstr ""
#: delayer.lua
msgid "Delay time [sec]:"
msgstr ""
#: delayer.lua
msgid "Signal Delayer"
msgstr ""
#: delayer.lua
msgid "Signals are forwarded delayed. Subsequent signals are queued."
msgstr ""
#: delayer.lua
msgid "The delay time can be configured."
msgstr ""

View File

@ -39,6 +39,24 @@ local function swap_node(pos, name)
return true
end
local DropdownValues = {
["added"] = 1,
["removed"] = 2,
["added or removed"] = 3,
}
local function formspec(mem)
local label = I("added")..","..I("removed")..","..I("added or removed")
return "size[6,3]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"label[0.2,0.4;"..I("Send signal if nodes have been:]")..
"dropdown[0.2,1;6,1;mode;"..label..";"..(mem.mode or 3).."]"..
"button_exit[1.5,2.2;3,1;accept;"..I("accept").."]"
end
local function any_node_changed(pos)
local mem = tubelib2.get_mem(pos)
if not mem.pos1 or not mem.pos2 or not mem.num then
@ -50,13 +68,35 @@ local function any_node_changed(pos)
return false
end
local num = #minetest.find_nodes_in_area(mem.pos1, mem.pos2, {"air"})
if mem.num ~= num then
if mem.mode == 1 and num < mem.num then
mem.num = num
return true
elseif mem.mode == 2 and num > mem.num then
mem.num = num
return true
elseif mem.mode == 3 then
mem.num = num
return true
end
mem.num = num
return true
end
return false
end
local function on_receive_fields(pos, formname, fields, player)
local mem = tubelib2.get_mem(pos)
local meta = M(pos)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
if fields.accept then
mem.mode = DropdownValues[fields.mode] or 3
end
meta:set_string("formspec", formspec(mem))
end
local function node_timer(pos)
if any_node_changed(pos)then
if swap_node(pos, "signs_bot:node_sensor_on") then
@ -93,12 +133,15 @@ minetest.register_node("signs_bot:node_sensor", {
local meta = M(pos)
local mem = tubelib2.init_mem(pos)
meta:set_string("infotext", "Node Sensor: Not connected")
mem.mode = 3 -- default legacy mode
meta:set_string("formspec", formspec(mem))
minetest.get_node_timer(pos):start(CYCLE_TIME)
any_node_changed(pos)
end,
on_timer = node_timer,
update_infotext = update_infotext,
on_receive_fields = on_receive_fields,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
@ -168,7 +211,8 @@ if minetest.get_modpath("doc") then
data = {
item = "signs_bot:node_sensor",
text = table.concat({
I("The Node Sensor sends a signal when it detects any node change (nodes appear or disappear)."),
I("The node sensor can send a signal when it detects that nodes appear or disappear,"),
I("but has to be configured accordingly."),
I("Valid nodes are all kind of blocks and plants."),
I("The sensor range is 3 nodes/meters in one direction."),
I("The sensor has an active side (red) that must point to the observed area."),

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

View File

@ -64,15 +64,23 @@ local function use_tool(itemstack, placer, pointed_thing)
local pos1,ntype1 = get_stored_data(placer)
local pos2,ntype2 = get_current_data(pointed_thing)
if ntype1 == "actuator" and ntype2 == "sensor" then
if ntype1 == "actuator" and (ntype2 == "sensor" or ntype2 == "repeater") then
pairing(pos1, pos2)
store_data(placer, nil, nil)
minetest.sound_play('signs_bot_pong', {to_player = placer:get_player_name()})
elseif ntype2 == "actuator" and ntype1 == "sensor" then
elseif (ntype1 == "actuator" or ntype1 == "repeater") and ntype2 == "sensor" then
pairing(pos1, pos2)
store_data(placer, nil, nil)
minetest.sound_play('signs_bot_pong', {to_player = placer:get_player_name()})
elseif ntype2 == "actuator" and (ntype1 == "sensor" or ntype1 == "repeater") then
pairing(pos2, pos1)
store_data(placer, nil, nil)
minetest.sound_play('signs_bot_pong', {to_player = placer:get_player_name()})
elseif ntype2 == "actuator" or ntype2 == "sensor" then
elseif (ntype2 == "actuator" or ntype2 == "repeater") and ntype1 == "sensor" then
pairing(pos2, pos1)
store_data(placer, nil, nil)
minetest.sound_play('signs_bot_pong', {to_player = placer:get_player_name()})
elseif ntype2 == "actuator" or ntype2 == "sensor" or ntype2 == "repeater" then
store_data(placer, pos2, ntype2)
minetest.sound_play('signs_bot_ping', {to_player = placer:get_player_name()})
else