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,13 +7,13 @@ Tech Age, a mod to go through 4 tech ages in search of wealth and power.
### License ### 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 Code: Licensed under the GNU GPL version 3 or later. See LICENSE.txt
Textures: CC BY-SA 3.0 Textures: CC BY-SA 3.0
### Dependencies ### Dependencies
Required: default, tubelib2, basic_materials, bucket, stairs Required: default, doors, tubelib2, basic_materials, bucket, stairs, lcdlib
Optional: unified_inventory, wielded_light, minecart Optional: unified_inventory, wielded_light, minecart
Highly recommended: signs_bot, minecart Highly recommended: signs_bot, minecart
@ -21,4 +21,6 @@ Highly recommended: signs_bot, minecart
### History ### History
- 2019-06-16 V0.01 * First upload - 2019-06-16 V0.01 * First upload
- 2019-09-28 V0.02 * TA3 finished - 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_reactorbase = "techage:ta4_reactor_base",
ta4_furnaceheater = "techage:furnace_heater", ta4_furnaceheater = "techage:furnace_heater",
ta4_waterpump = "techage:t4_waterpump", 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_ "", --ta4_ "",
} }

View File

@ -3,7 +3,7 @@ techage.manual_DE = {}
techage.manual_DE.aTitel = { techage.manual_DE.aTitel = {
"1,Tech Age Mod", "1,Tech Age Mod",
"2,Software Update", "2,Software Update",
"3,Was hat sich am Spiel geändert", "3,Was hat sich am Spiel geändert?",
"2,Hinweise", "2,Hinweise",
"2,Erze und Mineralien", "2,Erze und Mineralien",
"3,Meridium", "3,Meridium",
@ -139,6 +139,11 @@ techage.manual_DE.aTitel = {
"3,TA4 Reaktorständer / reactor stand", "3,TA4 Reaktorständer / reactor stand",
"3,TA4 Reaktorsockel / reactor base", "3,TA4 Reaktorsockel / reactor base",
"3,TA4 Silo / silo", "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", "2,Weitere TA4 Blöcke",
"3,TA4 Tank / TA4 Tank", "3,TA4 Tank / TA4 Tank",
"3,TA4 Pumpe / TA4 Pump", "3,TA4 Pumpe / TA4 Pump",
@ -163,18 +168,35 @@ techage.manual_DE.aText = {
"\n".. "\n"..
"\n".. "\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".. "\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".. "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".. "\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".. " - 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".. " - 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", "\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".. " - 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"..
"\n", "\n",
"Diese Dokumentation ist sowohl \"ingame\" (Block Konstruktionsplan) als auch auf GitHub als MD-Files verfügbar.\n".. "Diese Dokumentation ist sowohl \"ingame\" (Block Konstruktionsplan) als auch auf GitHub als MD-Files verfügbar.\n"..
"\n".. "\n"..
" - Link: https://github.com/joe7575/techage/blob/master/manuals/toc_DE.md\n"..
" - Short Link: https://tinyurl.com/y2lwl35h\n"..
"\n".. "\n"..
"Die Konstruktionspläne (Diagramme) für den Aufbau der Maschinen sowie die Bilder sind aber nur ingame verfügbar.\n".. "Die Konstruktionspläne (Diagramme) für den Aufbau der Maschinen sowie die Bilder sind aber nur ingame verfügbar.\n"..
"\n".. "\n"..
@ -744,7 +766,7 @@ techage.manual_DE.aText = {
" - 'standby' --> nichts zu tun\\, da Quell-Inventar leer\n".. " - 'standby' --> nichts zu tun\\, da Quell-Inventar leer\n"..
" - 'blocked' --> kann nichts tun\\, da Ziel-Inventar voll\n".. " - 'blocked' --> kann nichts tun\\, da Ziel-Inventar voll\n"..
"\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".. "\n"..
"\n", "\n",
@ -1122,6 +1144,48 @@ techage.manual_DE.aText = {
"\n".. "\n"..
"\n".. "\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".. "Siehe TA3 Tank.\n"..
"\n".. "\n"..
@ -1286,6 +1350,11 @@ techage.manual_DE.aItemName = {
"ta4_reactorstand", "ta4_reactorstand",
"ta4_reactorbase", "ta4_reactorbase",
"ta4_silo", "ta4_silo",
"ta4_icta_controller",
"ta4_icta_controller",
"ta4_battery",
"ta4_display",
"ta4_signaltower",
"", "",
"ta4_tank", "ta4_tank",
"ta4_pump", "ta4_pump",
@ -1437,5 +1506,10 @@ techage.manual_DE.aPlanTable = {
"", "",
"", "",
"", "",
"",
"",
"",
"",
"",
} }

View File

@ -66,7 +66,7 @@ end
-- return the Lua code -- return the Lua code
function techage.code_action(kvSelect, environ) function techage.code_action(kvSelect, environ)
if kvSelect and kvRegisteredActn[kvSelect.choice] then 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) return kvRegisteredActn[kvSelect.choice].code(kvSelect, environ)
end end
end end

View File

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

View File

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

View File

@ -61,7 +61,7 @@ end
-- return the Lua code -- return the Lua code
function techage.code_condition(kvSelect, environ) function techage.code_condition(kvSelect, environ)
if kvSelect and kvRegisteredCond[kvSelect.choice] then 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) return kvRegisteredCond[kvSelect.choice].code(kvSelect, environ)
end end
end end

View File

@ -236,7 +236,7 @@ end
local function battery(pos) 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 if battery_pos then
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("battery", minetest.pos_to_string(battery_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
end end
minetest.register_node("techage:ta4_controller", { minetest.register_node("techage:ta4_icta_controller", {
description = "TA4 ICTA Controller", description = "TA4 ICTA Controller",
inventory_image = "techage_ta4_controller_inventory.png", inventory_image = "techage_ta4_controller_inventory.png",
wield_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) after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos) 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 local fs_data = FS_DATA
meta:set_string("fs_data", minetest.serialize(fs_data)) meta:set_string("fs_data", minetest.serialize(fs_data))
meta:set_string("owner", placer:get_player_name()) meta:set_string("owner", placer:get_player_name())
@ -467,7 +467,7 @@ minetest.register_node("techage:ta4_controller", {
minetest.register_craft({ minetest.register_craft({
output = "techage:ta4_controller", output = "techage:ta4_icta_controller",
recipe = { recipe = {
{"basic_materials:plastic_sheet", "dye:blue", "basic_materials:plastic_sheet"}, {"basic_materials:plastic_sheet", "dye:blue", "basic_materials:plastic_sheet"},
{"", "default:copper_ingot", ""}, {"", "default:copper_ingot", ""},
@ -491,7 +491,7 @@ local function set_input(pos, own_number, rmt_number, val)
end end
end end
techage.register_node({"techage:ta4_controller"}, { techage.register_node({"techage:ta4_icta_controller"}, {
on_recv_message = function(pos, src, topic, payload) on_recv_message = function(pos, src, topic, payload)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local number = meta:get_string("number") local number = meta:get_string("number")

View File

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

View File

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

View File

@ -66,7 +66,7 @@ techage.icta_register_condition("stopwatch", {
title = "stopwatch", title = "stopwatch",
formspec = { formspec = {
{ {
type = "numbers", type = "number",
name = "number", name = "number",
label = "Switch number", label = "Switch number",
default = "", default = "",
@ -89,7 +89,7 @@ techage.icta_register_action("stopwatch", {
title = "stopwatch", title = "stopwatch",
formspec = { formspec = {
{ {
type = "numbers", type = "number",
name = "number", name = "number",
label = "Display number", label = "Display number",
default = "", default = "",
@ -126,7 +126,7 @@ techage.icta_register_action("stopwatch", {
code = function(data, environ) code = function(data, environ)
local idx = ({time=1, highscore= 2, name=3})[data.type] 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 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 return s1.."\n\t"..s2
end, end,
}) })

View File

@ -119,7 +119,7 @@ local function field_to_kvSelect(kvDefinition, kvSelect, fields)
return kvSelect return kvSelect
end end
function techage.submenu_verify(kvDefinition, kvSelect) function techage.submenu_verify(owner, kvDefinition, kvSelect)
local error = false local error = false
local lControls = kvDefinition[kvSelect.choice].formspec local lControls = kvDefinition[kvSelect.choice].formspec
for idx,elem in ipairs(lControls) do for idx,elem in ipairs(lControls) do
@ -127,6 +127,16 @@ function techage.submenu_verify(kvDefinition, kvSelect)
if not kvSelect[elem.name]:find("^[%d ]+$") then if not kvSelect[elem.name]:find("^[%d ]+$") then
error = true 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 elseif elem.type == "digits" then -- including positions
if not kvSelect[elem.name]:find("^[+%%-,%d]+$") then if not kvSelect[elem.name]:find("^[+%%-,%d]+$") then
error = true error = true

View File

@ -219,6 +219,7 @@ else
dofile(MP.."/icta_controller/edit.lua") dofile(MP.."/icta_controller/edit.lua")
dofile(MP.."/icta_controller/battery.lua") dofile(MP.."/icta_controller/battery.lua")
--dofile(MP.."/icta_controller/stopwatch.lua") --dofile(MP.."/icta_controller/stopwatch.lua")
--dofile(MP.."/icta_controller/expression.lua")
dofile(MP.."/icta_controller/display.lua") dofile(MP.."/icta_controller/display.lua")
dofile(MP.."/icta_controller/signaltower.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 - `standby` --> nichts zu tun, da Quell-Inventar leer
- `blocked` --> kann nichts tun, da Ziel-Inventar voll - `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] [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 ## 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 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 Reaktorsockel / reactor base](./manual_ta4_DE.md#ta4-reaktorsockel--reactor-base)
- [TA4 Silo / silo](./manual_ta4_DE.md#ta4-silo--silo) - [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) - [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 Tank / TA4 Tank](./manual_ta4_DE.md#ta4-tank--ta4-tank)
- [TA4 Pumpe / TA4 Pump](./manual_ta4_DE.md#ta4-pumpe--ta4-pump) - [TA4 Pumpe / TA4 Pump](./manual_ta4_DE.md#ta4-pumpe--ta4-pump)