Level 3 – Fortgeschritten
Sehr oft sind Parameter nicht nur Text, sondern Zahlen: eine Größe, eine Anzahl oder eine Koordinate. Da die param-Variable aber immer eine Zeichenkette (String) ist, müssen wir sie zuerst in eine Zahl umwandeln.
tonumber()
In Lua gibt es dafür die Funktion tonumber(). Sie versucht, eine Zeichenkette in eine Zahl zu konvertieren.
tonumber("10") ergibt die Zahl 10.tonumber("abc") ergibt nil, da "abc" keine gültige Zahl ist.
Dieses nil ist extrem wichtig. Es ermöglicht uns zu prüfen, ob der Spieler tatsächlich eine Zahl eingegeben hat.
Bauen wir einen Befehl /tower <höhe>, der einen Turm aus Stein mit der angegebenen Höhe an der Position des Spielers errichtet.
core.register_chatcommand("tower", {
params = "<höhe>",
description = "Baut einen Turm mit der angegebenen Höhe.",
privs = { interact = true },
func = function(name, param)
-- 1. Parameter in eine Zahl umwandeln
local height = tonumber(param)
-- 2. VALIDIERUNG: Prüfen, ob die Eingabe eine gültige Zahl war
if not height then
return false, "Fehler: Du musst eine Zahl als Höhe angeben. Beispiel: /tower 15"
end
-- Zusätzliche Prüfung: Ist die Zahl sinnvoll?
if height <= 0 or height > 100 then
return false, "Fehler: Die Höhe muss zwischen 1 und 100 liegen."
end
local player = core.get_player_by_name(name)
if not player then return false, "Spieler nicht gefunden." end
local pos = player:get_pos()
-- Runden auf ganze Blöcke
pos.x = math.floor(pos.x + 0.5)
pos.y = math.floor(pos.y + 0.5)
pos.z = math.floor(pos.z + 0.5)
-- 3. Schleife mit der validierten Höhe verwenden
for i = 0, height - 1 do
core.set_node({x = pos.x, y = pos.y + i, z = pos.z}, {name = "default:stone"})
end
return true, "Turm mit Höhe " .. height .. " wurde gebaut!"
end,
})
Vertraue niemals dem Input des Benutzers! Gehe immer davon aus, dass die Eingabe falsch sein könnte. Ein guter Programmierer fängt diese Fehler ab und gibt verständliche Fehlermeldungen aus.
Im Beispiel prüfen wir auf zwei Dinge:
if not height then...)if height <= 0...)tonumber(), um einen String-Parameter in eine Zahl umzuwandeln.tonumber() immer auf nil, um ungültige Eingaben abzufangen.Aber was, wenn ein Befehl mehrere Informationen auf einmal benötigt, wie z.B. einen Gegenstand UND eine Anzahl? Das behandeln wir im nächsten Kapitel.