manuals updated

This commit is contained in:
Joachim Stolberg 2020-03-01 12:32:11 +01:00
parent 2a8dfd755f
commit 1ba43d2ef4
16 changed files with 224 additions and 69 deletions

View File

@ -7,18 +7,20 @@ Tech Age, a mod to go through 4 tech ages in search of wealth and power.
### License
Copyright (C) 2019 Joachim Stolberg
Copyright (C) 2019-2020 Joachim Stolberg
Code: Licensed under the GNU GPL version 3 or later. See LICENSE.txt
Textures: CC BY-SA 3.0
### Dependencies
Required: default, tubelib2, basic_materials, bucket, stairs
Required: default, doors, tubelib2, basic_materials, bucket, stairs, lcdlib
Optional: unified_inventory, wielded_light, minecart
Highly recommended: signs_bot, minecart
### History
- 2019-06-16 V0.01 * First upload
- 2019-09-28 V0.02 * TA3 finished
- 2019-06-16 V0.01 * First upload
- 2019-09-28 V0.02 * TA3 finished
- 2020-02-29 V0.04 * TA4 ICTA controller added

View File

@ -133,5 +133,9 @@ techage.Items = {
ta4_reactorbase = "techage:ta4_reactor_base",
ta4_furnaceheater = "techage:furnace_heater",
ta4_waterpump = "techage:t4_waterpump",
ta4_icta_controller = "techage:ta4_icta_controller",
ta4_battery = "techage:ta4_battery",
ta4_display = "techage:ta4_display",
ta4_signaltower = "techage:ta4_signaltower",
--ta4_ "",
}

View File

@ -3,7 +3,7 @@ techage.manual_DE = {}
techage.manual_DE.aTitel = {
"1,Tech Age Mod",
"2,Software Update",
"3,Was hat sich am Spiel geändert",
"3,Was hat sich am Spiel geändert?",
"2,Hinweise",
"2,Erze und Mineralien",
"3,Meridium",
@ -139,6 +139,11 @@ techage.manual_DE.aTitel = {
"3,TA4 Reaktorständer / reactor stand",
"3,TA4 Reaktorsockel / reactor base",
"3,TA4 Silo / silo",
"2,ICTA Controller",
"3,TA4 ICTA Controller",
"3,Batterie",
"3,TA4 Display",
"3,TA4 Signal Tower",
"2,Weitere TA4 Blöcke",
"3,TA4 Tank / TA4 Tank",
"3,TA4 Pumpe / TA4 Pump",
@ -163,18 +168,35 @@ techage.manual_DE.aText = {
"\n"..
"\n"..
"\n",
"\027(c@#ffffff)Da sich mit dem Update die Art und Weise wie Daten der Maschinen gespeichert werden\\, geändert hat\\, sind nach dem Update alle Maschinen erst einmal ohne Daten und damit Funktionslos und müssen \"repariert\" werden. \n"..
"Zum 23.02.2020 gab es ein größeres Software-Update\\, was einige Änderungen und aus Sicht der Spieler auch \"Probleme\" mit sich bringt. Das Software-Update war aber nötig\\, um die techage Mod weiter ausbauen und entwickeln zu können.\n"..
"\n"..
"Da sich mit dem Update die Art und Weise wie Daten der Maschinen gespeichert werden\\, geändert hat\\, sind nach dem Update alle Maschinen erst einmal ohne Daten und damit Funktionslos und müssen \"repariert\" werden. \n"..
"\n"..
"Dazu gibt es ein Reparaturset\\, bestehend aus dem Schraubenschlüssel (Techage Info Werkzeug) und der Werkzeugtasche (TechAge Reparaturset). Beide Werkzeuge können gecraftet werden.\n"..
"\n"..
" - Mit dem Schraubenschlüssel können die Verbindungen über das Stromnetz geprüft werden. Dazu einfach auf einen Generator oder eine Junction klicken\\, dann werden alle verbundenen Blöcke in der Umgebung markiert. Bei Unterbrechungen immer den letzten markierten Block (Junction) in der Kette neu setzen.\n"..
" - normale Maschinen müssen nur neu gestartet werden. Hilft dies nicht\\, einfach neu setzen.\n"..
" - Generatoren (auch Akkus und Brennstoffzelle) können entweder neu gesetzt\\, oder mit dem Reparaturset angeklickt und damit repariert werden.\n"..
" - Die Trägermodule der Solarzellen müssen ebenfalls mit dem \"Reparaturset\" angeklickt werden.\n"..
" - Die Stromschalterbox und die Stromschalter müssen neu gesetzt werden. Die Stromschalterbox verhält sich beim Setzen nun ähnlich wie Stromkabel.\n"..
" - Der TA4 Solar Wechselrichter besteht jetzt nur noch aus einem Block. Der zweite Block muss entfernt und durch ein rotes Kabel ersetzt werden.\n"..
" - Wasserstoff ist nun wie eine Flüssigkeit zu behandeln. Elektrolyseur und Brennstoffzelle müssen daher nicht mehr über Röhren und Schieber sondern über Pumpen und Flüssigkeitsleitungen miteinander verbunden werden.\n"..
"\n",
" - der TA1 Hopper ist weg\\, dafür kann jetzt der Hopper aus der Mod Minecart genutzt werden.\n"..
" - Blöcke für Wasser und andere Flüssigkeiten (Boiler\\, Tanks) haben kein Inventory mehr. Diese muss man nun füllen bzw. leeren\\, in dem man mit einem vollen bzw. leeren Behälter auf den Block klickt. Bei Wasser ist das der Eimer\\, bei Öl und anderen Flüssigkeiten die Fässer oder Kanister.\n"..
" - für TA2 und TA3 gibt er jetzt einen Steinbrecher (Quarry) zum Abbau von Steinen.\n"..
" - Die Stromschalterbox und die Stromschalter wurden überarbeitet und sind nun leichter zu Platzieren.\n"..
" - Alle Menüs werden nun automatisch und zyklisch aktualisiert\\, den \"Update\" Button gibt es nicht mehr.\n"..
" - Die Tanks können nun nicht mehr direkt über Schieber gefüllt oder geleert werden. Hierzu ist zusätzlich ein TA Einfülltrichter (TA Liquid Filler) notwendig.\n"..
" - Gas\\, was beim Destillieren entsteht (Propangas)\\, kann über den Reformer in Wasserstoff umgewandelt und dann zu Strom gemacht werden.\n"..
" - Der TA4 Solar Wechselrichter besteht jetzt nur noch aus einem Block.\n"..
" - Generator und Wärmetauscher beim Energiespeicher arbeiten nun unabhängig von einander und können auch einzeln mit dem Stromnetz verbunden sein.\n"..
" - \n"..
"\n",
"Diese Dokumentation ist sowohl \"ingame\" (Block Konstruktionsplan) als auch auf GitHub als MD-Files verfügbar.\n"..
"\n"..
" - Link: https://github.com/joe7575/techage/blob/master/manuals/toc_DE.md\n"..
" - Short Link: https://tinyurl.com/y2lwl35h\n"..
"\n"..
"Die Konstruktionspläne (Diagramme) für den Aufbau der Maschinen sowie die Bilder sind aber nur ingame verfügbar.\n"..
"\n"..
@ -744,7 +766,7 @@ techage.manual_DE.aText = {
" - 'standby' --> nichts zu tun\\, da Quell-Inventar leer\n"..
" - 'blocked' --> kann nichts tun\\, da Ziel-Inventar voll\n"..
"\n"..
"Dieser Status wird bei vielen Blöcken gleichzeitig auch über den Info-Text angezeigt.\n"..
"Dieser Status und weitere Informationen werden auch ausgegeben\\, wenn mit dem Schraubenschlüssel auf den Block geklickt wird.\n"..
"\n"..
"\n"..
"\n",
@ -1122,6 +1144,48 @@ techage.manual_DE.aText = {
"\n"..
"\n"..
"\n",
"Der ICTA Controller (ICTA steht für \"If Condition Then Action\") dient zur Überwachung und Steuerung von Maschinen. Mit dem Controller kann man Daten von Maschinen und anderen Blöcken einlesen und abhängig davon andere Maschinen und Blöcke ein-/ausschalten.\n"..
"\n"..
"Einlesen von Maschinendaten sowie das Steuern von Blöcken und Maschinen erfolgt über sogenannte Kommandos. Für das Verständnis\\, wie Kommandos funktionieren\\, ist das Kapitel TA3 -> Logik-/Schalt-Blöcke wichtig. \n"..
"\n"..
"Der Controller benötigt für den Betrieb eine Batterie. Das Display dient zur Ausgabe von Daten\\, der Signal Tower zur Anzeige von Fehlern.\n"..
"\n"..
"\n"..
"\n",
"Der Controller arbeitet auf das Basis von 'IF <condition> THEN <action>' Regeln. Es können bis zu 8 Regeln pro Controller angelegt werden.\n"..
"\n"..
"Beispiele für Regeln sind:\n"..
"\n"..
" - Wenn ein Verteiler verstopft ist ('blocked')\\, soll der Schieber davor ausgeschaltet werden\n"..
" - Wenn eine Maschine einen Fehler anzeigt\\, soll dieser auf dem Display ausgegeben werden\n"..
"\n"..
"Der Controller prüft diese Regeln zyklisch. Dazu muss pro Regel eine Zykluszeit in Sekunden ('Cycle/s') angegeben werden (1..1000). \n"..
"\n"..
"Für Regeln die einen on/off Eingang auswerten\\, bspw. von einen Schalter oder Detektor\\, muss als Zykluszeit 0 angegeben werden. Der Wert 0 bedeutet\\, dass diese Regel immer dann ausgeführt werden soll\\, wenn sich das Eingangssignal geändert hat\\, also bspw. der Button einen neuen Wert gesendet hat.\n"..
"\n"..
"Alle Regeln sollten nur so oft wie notwendig ausgeführt werden. Dies hat zwei Vorteile:\n"..
"\n"..
" - die Batterie des Controllers hält länger (jeder Controller benötigt eine Batterie)\n"..
" - die Last für den Server ist geringer (damit weniger Lags)\n"..
"\n"..
"Man muss für jede action eine Verzögerungszeit ('after/s') einstellen. Soll die Aktion sofort ausgeführt werden\\, ist 0 einzugeben.\n"..
"\n"..
"Der Controller hat eine eigene Hilfe und Hinweise zu allen Kommandos über das Controller-Menü.\n"..
"\n"..
"\n"..
"\n",
"Die Batterie muss in unmittelbarer Nähe zum Controller platziert werden\\, also an einer der 26 Positionen um den Controller herum.\n"..
"\n"..
"\n"..
"\n",
"Das Display zeigt nach dem Platzieren seine Nummer an. Über diese Nummer kann das Display angesprochen werden. Auf dem Display können Texte ausgegeben werden\\, wobei das Display 5 Zeilen und damit 5 unterschiedliche Texte darstellen kann.\n"..
"\n"..
"\n"..
"\n",
"Der Signal Tower kann rot\\, grün und orange anzeigen. Eine Kombination der 3 Farben ist nicht möglich.\n"..
"\n"..
"\n"..
"\n",
"",
"Siehe TA3 Tank.\n"..
"\n"..
@ -1286,6 +1350,11 @@ techage.manual_DE.aItemName = {
"ta4_reactorstand",
"ta4_reactorbase",
"ta4_silo",
"ta4_icta_controller",
"ta4_icta_controller",
"ta4_battery",
"ta4_display",
"ta4_signaltower",
"",
"ta4_tank",
"ta4_pump",
@ -1437,5 +1506,10 @@ techage.manual_DE.aPlanTable = {
"",
"",
"",
"",
"",
"",
"",
"",
}

View File

@ -66,7 +66,7 @@ end
-- return the Lua code
function techage.code_action(kvSelect, environ)
if kvSelect and kvRegisteredActn[kvSelect.choice] then
if techage.submenu_verify(kvRegisteredActn, kvSelect) then
if techage.submenu_verify(environ.owner, kvRegisteredActn, kvSelect) then
return kvRegisteredActn[kvSelect.choice].code(kvSelect, environ)
end
end

View File

@ -29,7 +29,7 @@ local function on_timer(pos, elapsed)
meta:set_string("infotext", S("Battery").." ("..percent.."%)")
if percent == 0 then
local node = minetest.get_node(pos)
node.name = "techage:battery_empty"
node.name = "techage:ta4_battery_empty"
minetest.swap_node(pos, node)
return false
end
@ -37,7 +37,7 @@ local function on_timer(pos, elapsed)
end
local function register_battery(ext, percent, nici)
minetest.register_node("techage:battery"..ext, {
minetest.register_node("techage:ta4_battery"..ext, {
description = S("Battery").." "..ext,
inventory_image = 'techage_battery_inventory.png',
wield_image = 'techage_battery_inventory.png',
@ -63,7 +63,7 @@ local function register_battery(ext, percent, nici)
local meta = minetest.get_meta(pos)
meta:set_int("content", BATTERY_CAPACITY * percent)
local node = minetest.get_node(pos)
node.name = "techage:battery"
node.name = "techage:ta4_battery"
minetest.swap_node(pos, node)
on_timer(pos, 1)
minetest.get_node_timer(pos):start(30)
@ -75,13 +75,13 @@ local function register_battery(ext, percent, nici)
local percent = calc_percent(tonumber(oldmetadata.fields.content))
local stack
if percent > 95 then
stack = ItemStack("techage:battery")
stack = ItemStack("techage:ta4_battery")
elseif percent > 75 then
stack = ItemStack("techage:battery75")
stack = ItemStack("techage:ta4_battery75")
elseif percent > 50 then
stack = ItemStack("techage:battery50")
stack = ItemStack("techage:ta4_battery50")
elseif percent > 25 then
stack = ItemStack("techage:battery25")
stack = ItemStack("techage:ta4_battery25")
else
return
end
@ -104,7 +104,7 @@ register_battery("75", 0.75, 1)
register_battery("50", 0.5, 1)
register_battery("25", 0.25, 1)
minetest.register_node("techage:battery_empty", {
minetest.register_node("techage:ta4_battery_empty", {
description = S("Battery"),
tiles = {
-- up, down, right, left, back, front
@ -141,7 +141,7 @@ minetest.register_node("techage:battery_empty", {
if minetest.global_exists("moreores") then
minetest.register_craft({
output = "techage:battery 2",
output = "techage:ta4_battery 2",
recipe = {
{"", "moreores:silver_ingot", ""},
{"", "default:copper_ingot", ""},
@ -150,7 +150,7 @@ if minetest.global_exists("moreores") then
})
else
minetest.register_craft({
output = "techage:battery 2",
output = "techage:ta4_battery 2",
recipe = {
{"", "default:tin_ingot", ""},
{"", "default:copper_ingot", ""},
@ -159,7 +159,8 @@ else
})
end
techage.register_node({"techage:battery", "techage:battery25", "techage:battery50", "techage:battery75"},
techage.register_node({"techage:ta4_battery", "techage:ta4_battery25",
"techage:ta4_battery50", "techage:ta4_battery75"},
{
on_node_load = function(pos)
minetest.get_node_timer(pos):start(30)

View File

@ -163,7 +163,7 @@ techage.icta_register_condition("state", {
title = "block state request",
formspec = {
{
type = "digits",
type = "number",
name = "number",
label = "block number",
default = "",
@ -201,7 +201,7 @@ techage.icta_register_condition("fuel", {
title = "fuel request",
formspec = {
{
type = "digits",
type = "number",
name = "number",
label = "block number",
default = "",
@ -238,7 +238,7 @@ techage.icta_register_condition("load", {
title = "load request",
formspec = {
{
type = "digits",
type = "number",
name = "number",
label = "block number",
default = "",
@ -275,7 +275,7 @@ techage.icta_register_condition("chest", {
title = "chest state request",
formspec = {
{
type = "digits",
type = "number",
name = "number",
label = "chest number",
default = "",
@ -314,7 +314,7 @@ techage.icta_register_condition("signaltower", {
title = "Signal Tower state request",
formspec = {
{
type = "digits",
type = "number",
name = "number",
label = "Signal Tower number",
default = "",
@ -419,7 +419,7 @@ techage.icta_register_action("display", {
type = "textlist",
name = "row",
label = "Display line",
choices = "1,2,3,4,5,6,7,8,9",
choices = "1,2,3,4,5",
default = "1",
},
{
@ -449,7 +449,7 @@ techage.icta_register_action("cleardisplay", {
title = "Display: Clear screen",
formspec = {
{
type = "numbers",
type = "number",
name = "number",
label = "Display number",
default = "",
@ -537,7 +537,6 @@ techage.icta_register_action("door", {
function techage.icta_player_detect(own_num, number, name)
local state = techage.send_single(own_num, number, "name", nil)
print("state="..state.."< name="..name.."<")
if state ~= "" then
if name == "*" or string.find(name, state) then
return state
@ -552,7 +551,7 @@ techage.icta_register_condition("playerdetector", {
title = "Player Detector name request",
formspec = {
{
type = "digits",
type = "number",
name = "number",
label = "Player Detector number",
default = "",
@ -582,7 +581,7 @@ techage.icta_register_action("set_filter", {
title = "turn Distributor filter on/off",
formspec = {
{
type = "numbers",
type = "number",
name = "number",
label = "distri number",
default = "",
@ -612,7 +611,7 @@ techage.icta_register_action("set_filter", {
end,
code = function(data, environ)
local payload = '{slot = "'..data.color..'", val = "'..data.value..'"}'
return send_multi_string(environ, data.number, "filter", payload)
return send_single_string(environ, data.number, "filter", payload)
end,
})

View File

@ -61,7 +61,7 @@ end
-- return the Lua code
function techage.code_condition(kvSelect, environ)
if kvSelect and kvRegisteredCond[kvSelect.choice] then
if techage.submenu_verify(kvRegisteredCond, kvSelect) then
if techage.submenu_verify(environ.owner, kvRegisteredCond, kvSelect) then
return kvRegisteredCond[kvSelect.choice].code(kvSelect, environ)
end
end

View File

@ -236,7 +236,7 @@ end
local function battery(pos)
local battery_pos = minetest.find_node_near(pos, 1, {"techage:battery"})
local battery_pos = minetest.find_node_near(pos, 1, {"techage:ta4_battery"})
if battery_pos then
local meta = minetest.get_meta(pos)
meta:set_string("battery", minetest.pos_to_string(battery_pos))
@ -408,7 +408,7 @@ local function on_receive_fields(pos, formname, fields, player)
end
end
minetest.register_node("techage:ta4_controller", {
minetest.register_node("techage:ta4_icta_controller", {
description = "TA4 ICTA Controller",
inventory_image = "techage_ta4_controller_inventory.png",
wield_image = "techage_ta4_controller_inventory.png",
@ -433,7 +433,7 @@ minetest.register_node("techage:ta4_controller", {
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
local number = techage.add_node(pos, "techage:ta4_controller")
local number = techage.add_node(pos, "techage:ta4_icta_controller")
local fs_data = FS_DATA
meta:set_string("fs_data", minetest.serialize(fs_data))
meta:set_string("owner", placer:get_player_name())
@ -467,7 +467,7 @@ minetest.register_node("techage:ta4_controller", {
minetest.register_craft({
output = "techage:ta4_controller",
output = "techage:ta4_icta_controller",
recipe = {
{"basic_materials:plastic_sheet", "dye:blue", "basic_materials:plastic_sheet"},
{"", "default:copper_ingot", ""},
@ -491,7 +491,7 @@ local function set_input(pos, own_number, rmt_number, val)
end
end
techage.register_node({"techage:ta4_controller"}, {
techage.register_node({"techage:ta4_icta_controller"}, {
on_recv_message = function(pos, src, topic, payload)
local meta = minetest.get_meta(pos)
local number = meta:get_string("number")

View File

@ -11,8 +11,10 @@
ICTA Controller - Display
]]--
local NUM_ROWS = 5
local RADIUS = 6
lcdlib.register_display_entity("techage:display_entity")
local function display_update(pos, objref)
@ -21,8 +23,7 @@ local function display_update(pos, objref)
text = string.gsub(text, "|", " \n")
local texture = lcdlib.make_multiline_texture(
"default", text,
--120, 120, 9, "top", "#000")
70, 70, 5, "top", "#000")
70, 70, NUM_ROWS, "top", "#000")
objref:set_properties({ textures = {texture},
visual_size = {x=0.94, y=0.94} })
end
@ -30,10 +31,10 @@ end
local function on_timer(pos)
local node = minetest.get_node(pos)
-- check if display is loaded and a player in front of the display
if node.name == "techage:display" then
if node.name == "techage:ta4_display" then
local dir = minetest.facedir_to_dir((node.param2 + 2) % 4)
local pos2 = vector.add(pos, vector.multiply(dir, 6))
for _, obj in pairs(minetest.get_objects_inside_radius(pos2, 6)) do
local pos2 = vector.add(pos, vector.multiply(dir, RADIUS))
for _, obj in pairs(minetest.get_objects_inside_radius(pos2, RADIUS)) do
if obj:is_player() then
lcdlib.update_entities(pos)
break
@ -48,7 +49,7 @@ local lcd_box = {
wall_top = {-8/16, 15/32, -8/16, 8/16, 8/16, 8/16}
}
minetest.register_node("techage:display", {
minetest.register_node("techage:ta4_display", {
description = "TA4 Display",
inventory_image = 'techage_display_inventory.png',
tiles = {"techage_display.png"},
@ -66,7 +67,7 @@ minetest.register_node("techage:display", {
},
after_place_node = function(pos, placer)
local number = techage.add_node(pos, "techage:display")
local number = techage.add_node(pos, "techage:ta4_display")
local meta = minetest.get_meta(pos)
meta:set_string("number", number)
meta:set_string("text", "My\nTechage\nTA4\nDisplay\nNo: "..number)
@ -90,10 +91,10 @@ minetest.register_node("techage:display", {
minetest.register_craft({
output = "techage:display",
output = "techage:ta4_display",
recipe = {
{"", "", ""},
{"default:glass", "dye:green", "techage:ta4_wlanchip"},
{"techage:basalt_glass_thin", "dye:green", "techage:ta4_wlanchip"},
{"", "default:copper_ingot", ""},
},
})
@ -107,7 +108,7 @@ local function add_line(meta, payload)
else
rows = string.split(text, "|")
end
if #rows > 8 then
if #rows >= NUM_ROWS then
table.remove(rows, 1)
end
table.insert(rows, payload)
@ -119,7 +120,7 @@ local function write_row(meta, payload)
local text = meta:get_string("text")
if type(payload) == "table" then
local row = tonumber(payload.row) or 0
if row > 9 then row = 9 end
if row > NUM_ROWS then row = NUM_ROWS end
local str = payload.str or "oops"
if row == 0 then
meta:set_string("infotext", str)
@ -132,8 +133,8 @@ local function write_row(meta, payload)
else
rows = string.split(text, "|")
end
if #rows < 9 then
for i = #rows, 9 do
if #rows < NUM_ROWS then
for i = #rows, NUM_ROWS do
table.insert(rows, " ")
end
end
@ -143,7 +144,7 @@ local function write_row(meta, payload)
end
end
techage.register_node({"techage:display"}, {
techage.register_node({"techage:ta4_display"}, {
on_recv_message = function(pos, src, topic, payload)
local node = minetest.get_node(pos)
local timer = minetest.get_node_timer(pos)

View File

@ -16,18 +16,18 @@
local function switch_on(pos, node, color)
local meta = minetest.get_meta(pos)
meta:set_string("state", color)
node.name = "techage:signaltower_"..color
node.name = "techage:ta4_signaltower_"..color
minetest.swap_node(pos, node)
end
local function switch_off(pos, node)
local meta = minetest.get_meta(pos)
meta:set_string("state", "off")
node.name = "techage:signaltower"
node.name = "techage:ta4_signaltower"
minetest.swap_node(pos, node)
end
minetest.register_node("techage:signaltower", {
minetest.register_node("techage:ta4_signaltower", {
description = "TA4 Signal Tower",
tiles = {
'techage_signaltower_top.png',
@ -44,7 +44,7 @@ minetest.register_node("techage:signaltower", {
},
after_place_node = function(pos, placer)
local number = techage.add_node(pos, "techage:signaltower")
local number = techage.add_node(pos, "techage:ta4_signaltower")
local meta = minetest.get_meta(pos)
meta:set_string("state", "off")
meta:set_string("infotext", "TA4 Signal Tower "..number)
@ -70,7 +70,7 @@ minetest.register_node("techage:signaltower", {
})
for _,color in ipairs({"green", "amber", "red"}) do
minetest.register_node("techage:signaltower_"..color, {
minetest.register_node("techage:ta4_signaltower_"..color, {
description = "TA4 Signal Tower",
tiles = {
'techage_signaltower_top.png',
@ -98,12 +98,12 @@ for _,color in ipairs({"green", "amber", "red"}) do
groups = {crumbly=0, not_in_creative_inventory=1},
is_ground_content = false,
sounds = default.node_sound_glass_defaults(),
drop = "techage:signaltower",
drop = "techage:ta4_signaltower",
})
end
minetest.register_craft({
output = "techage:signaltower",
output = "techage:ta4_signaltower",
recipe = {
{"dye:red", "default:copper_ingot", ""},
{"dye:orange", "default:glass", ""},
@ -111,10 +111,10 @@ minetest.register_craft({
},
})
techage.register_node({"techage:signaltower",
"techage:signaltower_green",
"techage:signaltower_amber",
"techage:signaltower_red"}, {
techage.register_node({"techage:ta4_signaltower",
"techage:ta4_signaltower_green",
"techage:ta4_signaltower_amber",
"techage:ta4_signaltower_red"}, {
on_recv_message = function(pos, src, topic, payload)
local node = minetest.get_node(pos)
if topic == "green" then

View File

@ -66,7 +66,7 @@ techage.icta_register_condition("stopwatch", {
title = "stopwatch",
formspec = {
{
type = "numbers",
type = "number",
name = "number",
label = "Switch number",
default = "",
@ -89,7 +89,7 @@ techage.icta_register_action("stopwatch", {
title = "stopwatch",
formspec = {
{
type = "numbers",
type = "number",
name = "number",
label = "Display number",
default = "",
@ -126,7 +126,7 @@ techage.icta_register_action("stopwatch", {
code = function(data, environ)
local idx = ({time=1, highscore= 2, name=3})[data.type]
local s1 = string.format('local payload = {row = %s, str = "%s "..env.stopwatch_result['..idx..']}', data.row, techage.escape(data.text))
local s2 = string.format('techage.send_multi("%s", "%s", "row", payload)', environ.number, data.number)
local s2 = string.format('techage.send_single("%s", "%s", "row", payload)', environ.number, data.number)
return s1.."\n\t"..s2
end,
})

View File

@ -119,14 +119,24 @@ local function field_to_kvSelect(kvDefinition, kvSelect, fields)
return kvSelect
end
function techage.submenu_verify(kvDefinition, kvSelect)
function techage.submenu_verify(owner, kvDefinition, kvSelect)
local error = false
local lControls = kvDefinition[kvSelect.choice].formspec
for idx,elem in ipairs(lControls) do
if elem.type == "numbers" then
if not kvSelect[elem.name]:find("^[%d ]+$") then
error = true
end
end
if not techage.check_numbers(kvSelect[elem.name], owner) then
error = true
end
elseif elem.type == "number" then
if not kvSelect[elem.name]:find("^[%d]+$") then
error = true
end
if not techage.check_numbers(kvSelect[elem.name], owner) then
error = true
end
elseif elem.type == "digits" then -- including positions
if not kvSelect[elem.name]:find("^[+%%-,%d]+$") then
error = true

View File

@ -219,6 +219,7 @@ else
dofile(MP.."/icta_controller/edit.lua")
dofile(MP.."/icta_controller/battery.lua")
--dofile(MP.."/icta_controller/stopwatch.lua")
--dofile(MP.."/icta_controller/expression.lua")
dofile(MP.."/icta_controller/display.lua")
dofile(MP.."/icta_controller/signaltower.lua")

View File

@ -408,7 +408,7 @@ Mögliche Antworten des Schiebers sind:
- `standby` --> nichts zu tun, da Quell-Inventar leer
- `blocked` --> kann nichts tun, da Ziel-Inventar voll
Dieser Status wird bei vielen Blöcken gleichzeitig auch über den Info-Text angezeigt.
Dieser Status und weitere Informationen werden auch ausgegeben, wenn mit dem Schraubenschlüssel auf den Block geklickt wird.
[ta3_logic|image]

View File

@ -284,6 +284,64 @@ Teil des Chemischen Reaktors. Wird zur Aufbewahrung von Stoffen in Pulver- oder
## ICTA Controller
Der ICTA Controller (ICTA steht für "If Condition Then Action") dient zur Überwachung und Steuerung von Maschinen. Mit dem Controller kann man Daten von Maschinen und anderen Blöcken einlesen und abhängig davon andere Maschinen und Blöcke ein-/ausschalten.
Einlesen von Maschinendaten sowie das Steuern von Blöcken und Maschinen erfolgt über sogenannte Kommandos. Für das Verständnis, wie Kommandos funktionieren, ist das Kapitel TA3 -> Logik-/Schalt-Blöcke wichtig.
Der Controller benötigt für den Betrieb eine Batterie. Das Display dient zur Ausgabe von Daten, der Signal Tower zur Anzeige von Fehlern.
[ta4_icta_controller|image]
### TA4 ICTA Controller
Der Controller arbeitet auf das Basis von ```IF <condition> THEN <action>``` Regeln. Es können bis zu 8 Regeln pro Controller angelegt werden.
Beispiele für Regeln sind:
- Wenn ein Verteiler verstopft ist (```blocked```), soll der Schieber davor ausgeschaltet werden
- Wenn eine Maschine einen Fehler anzeigt, soll dieser auf dem Display ausgegeben werden
Der Controller prüft diese Regeln zyklisch. Dazu muss pro Regel eine Zykluszeit in Sekunden (```Cycle/s```) angegeben werden (1..1000).
Für Regeln die einen on/off Eingang auswerten, bspw. von einen Schalter oder Detektor, muss als Zykluszeit 0 angegeben werden. Der Wert 0 bedeutet, dass diese Regel immer dann ausgeführt werden soll, wenn sich das Eingangssignal geändert hat, also bspw. der Button einen neuen Wert gesendet hat.
Alle Regeln sollten nur so oft wie notwendig ausgeführt werden. Dies hat zwei Vorteile:
- die Batterie des Controllers hält länger (jeder Controller benötigt eine Batterie)
- die Last für den Server ist geringer (damit weniger Lags)
Man muss für jede action eine Verzögerungszeit (```after/s```) einstellen. Soll die Aktion sofort ausgeführt werden, ist 0 einzugeben.
Der Controller hat eine eigene Hilfe und Hinweise zu allen Kommandos über das Controller-Menü.
[ta4_icta_controller|image]
### Batterie
Die Batterie muss in unmittelbarer Nähe zum Controller platziert werden, also an einer der 26 Positionen um den Controller herum.
[ta4_battery|image]
### TA4 Display
Das Display zeigt nach dem Platzieren seine Nummer an. Über diese Nummer kann das Display angesprochen werden. Auf dem Display können Texte ausgegeben werden, wobei das Display 5 Zeilen und damit 5 unterschiedliche Texte darstellen kann.
[ta4_display|image]
### TA4 Signal Tower
Der Signal Tower kann rot, grün und orange anzeigen. Eine Kombination der 3 Farben ist nicht möglich.
[ta4_signaltower|image]
## Weitere TA4 Blöcke

View File

@ -138,6 +138,11 @@
- [TA4 Reaktorständer / reactor stand](./manual_ta4_DE.md#ta4-reaktorständer--reactor-stand)
- [TA4 Reaktorsockel / reactor base](./manual_ta4_DE.md#ta4-reaktorsockel--reactor-base)
- [TA4 Silo / silo](./manual_ta4_DE.md#ta4-silo--silo)
- [ICTA Controller](./manual_ta4_DE.md#icta-controller)
- [TA4 ICTA Controller](./manual_ta4_DE.md#ta4-icta-controller)
- [Batterie](./manual_ta4_DE.md#batterie)
- [TA4 Display](./manual_ta4_DE.md#ta4-display)
- [TA4 Signal Tower](./manual_ta4_DE.md#ta4-signal-tower)
- [Weitere TA4 Blöcke](./manual_ta4_DE.md#weitere-ta4-blöcke)
- [TA4 Tank / TA4 Tank](./manual_ta4_DE.md#ta4-tank--ta4-tank)
- [TA4 Pumpe / TA4 Pump](./manual_ta4_DE.md#ta4-pumpe--ta4-pump)