Lua-Skripting
Einleitung
In diesem Kapitel werden Sie über die Skripterstellung in Lua, die dazu benötigten Werkzeuge und einige Techniken, die Sie vielleicht nützlich finden werden, lernen.
Programmierung
Beim Programmieren geht es darum, ein Problem, z. B. das Sortieren einer Liste, in Schritte umzuwandeln, die ein Computer verstehen kann. Den logischen Prozess des Programmierens beizubringen, würde den Rahmen dieses Buches sprengen, jedoch sind die folgenden Webseiten sehr nützlich, diesen zu entwickeln:
- Codecademy 🇬🇧 ist eines der besten Quellen, um zu Lernen, wie man Quelltext schreibt. Sie bietet ein interaktives Lernprogramm an.
- Scratch ist eine gute Quelle, um mit den absoluten Grundlagen zu beginnen und die zum Programmieren erforderlichen Problemlösungstechniken zu erlernen.
- TheMorpheus ist ein guter YouTube-Kanal, um programmieren zu lernen.
Programmieren in Lua
Auch das Lehren der Programmiersprache Lua, würde über dieses Buch hinausgehen. Das Buch Programming in Lua (PiL) 🇬🇧 ist allerdings eine exzellente Einführung in die Lua-Programmierung.
Code-Editoren
Für das Schreiben von Skripten in Lua reicht ein Code-Editor mit Code-Hervorhebung aus. Die Codehervorhebung verwendet unterschiedliche Farben für Wörter und Zeichen je nachdem, wofür sie stehen. Auf diese Weise können Sie leicht Fehler und Ungereimtheiten erkennen.
Zum Beispiel:
function ctf.post(team,msg)
if not ctf.team(team) then
return false
end
if not ctf.team(team).log then
ctf.team(team).log = {}
end
table.insert(ctf.team(team).log,1,msg)
ctf.save()
return true
end
Die Schlüsselwörter, einschließlich if, then, end und return, sind in diesem Beispiel hervorgehoben. Funktionen, die standardmäßig mit Lua mitgeliefert werden, wie z. B. table.insert, sind meistens ebenfalls hervorgehoben.
Zu den häufig verwendeten Editoren, die sich gut für Lua eignen, gehören:
- VSCode 🇬🇧 - quelloffen (als Code-OSS oder VSCodium), populär und Plugins für Minetest Modding 🇬🇧 besitzend.
- Notepad++ 🇬🇧 - schlicht, nur für Windows
Andere geeignete Editoren sind ebenfalls verfügbar.
Lokale und globale Reichweite
Ob eine Variable lokal oder global ist, bestimmt, wohin sie geschrieben oder gelesen werden kann. Auf globale Variablen kann von überall in der Skriptdatei, wie auch von anderen Mods, zugegriffen werden:
function one()
foo = "bar"
end
function two()
print(dump(foo)) -- Gibt "bar" aus
end
one()
two()
Dementgegen kann auf eine lokale Variable nur von dort aus zugegriffen werden, wo sie definiert ist. In Lua sind Variablen standardmäßig global, du musst demnach ausdrücklich das Schlüsselwort local benutzen:
-- Von dieser Skriptdatei aus zugänglich
local one = 1
function myfunc()
-- Von dieser Funktion aus zugänglich
local two = one + one
if two == one then
-- Von dieser if-Anweisung aus zugänglich
local three = one + two
end
end
Es sollte so viel wie möglich auf lokale Variablen zurückgegriffen werden.
Wann immer möglich, sollten lokale Variablen verwendet werden. Mods sollten nur eine globale variable mit dem gleichen Namen wie die Mod haben. Das Erstellen weiterer globaler Variablen ist unsaubere Kodierung, und Minetest wird davor warnen:
Assignment to undeclared global 'foo' inside function at init.lua:2
Auf Deutsch: Zuweisung einer nicht deklarierter globaler Variable ‘foo’ innerhalb der Funktion in init.lua:2
Um dies zu korrigieren, verwenden Sie “local”:
function one()
local foo = "bar"
end
function two()
print(dump(foo)) -- Gibt "nil" aus
end
one()
two()
Denken Sie daran, dass nil nicht initialisiert bedeutet. Der Variable wurde noch kein Wert zugewiesen, existiert nicht oder wurde nicht initialisiert (d. h. auf null gesetzt).
Funktionen sind Variablen eines besonderen Typs, sollten aber auch lokal gemacht werden, weil andere Mods Funktionen mit demselben Namen haben könnten.
local function foo(bar)
return bar * 2
end
Damit Mods Ihre Funktionen aufrufen können, sollten Sie eine Tabelle mit dem gleichen Namen wie die Mod erstellen und darin ihre Funktion einfügen. Diese Tabelle wird oft als „API table“ (zu Deutsch: „API-Tabelle“) oder „Namespace“ (zu Deutsch: „Namensraum“) bezeichnet.
mymod = {}
function mymod.foo(bar)
return "foo" .. bar
end
-- In einer anderen Mod oder einem anderen Skript:
mymod.foo("foobar")
function mymod.foo() ist äquivalent zu mymod.foo = function(), es ist nur ein anschaulicherer Weg dies zu schreiben.
Einbindung anderer Lua-Skripte
Der empfohlene Weg, um andere Lua-Skripte in eine Mod einzubinden, ist die Verwendung von dofile.
dofile(minetest.get_modpath("modname") .. "/script.lua")
Ein Skript kann einen Wert zurückgeben, der für die gemeinsame Nutzung privater locals nützlich ist:
-- script.lua
local module = {}
module.message = "Hallo Welt!"
return modile
-- init.lua
local ret = dofile(minetest.get_modpath("modname") .. "/script.lua")
print(ret) -- Hallo Welt!
In späteren Kapiteln wird erklärt, wie man den Code einer Mod am besten aufteilt.