Level 3 – Fortgeschritten
Viele Befehle benötigen mehr als nur eine Information. Ein gutes Beispiel ist ein Befehl, der dem Spieler eine bestimmte Anzahl eines Gegenstands gibt: /giveme default:apple 5.
Hier haben wir zwei Informationen:
default:apple)5)
Das Problem: Die param-Variable enthält alles als eine einzige Zeichenkette: "default:apple 5". Wir müssen diese Zeichenkette aufteilen.
string.split()Um einen String in seine Bestandteile zu zerlegen, verwendet man oft eine Hilfsfunktion, die den String an einem Trennzeichen (z.B. einem Leerzeichen) aufteilt. Das Ergebnis ist eine Tabelle (table), die die einzelnen Teile enthält.
In vielen Minetest-Mods wird dafür eine Funktion wie string.split() verwendet. Hier ist eine einfache Version, die du am Anfang deiner init.lua einfügen kannst:
-- Diese Funktion an den Anfang deiner init.lua kopieren
function string.split(str, sep)
if sep == nil then sep = "%s" end
local t = {}
for part in string.gmatch(str, "([^" .. sep .. "]+)") do
table.insert(t, part)
end
return t
end
Wenn wir diese Funktion nutzen, passiert Folgendes:
local parts = string.split("default:apple 5", " ")
-- `parts` ist jetzt eine Tabelle: { "default:apple", "5" }
Auf die einzelnen Teile können wir dann über den Index zugreifen: parts[1] ist "default:apple" und parts[2] ist "5".
/giveme-Befehl
Bauen wir nun den Befehl /giveme <item> <anzahl>, der alle bisherigen Konzepte vereint.
core.register_chatcommand("giveme", {
params = "<item> <anzahl>",
description = "Gibt dir eine bestimmte Anzahl von Gegenständen.",
privs = { give = true },
func = function(name, param)
-- 1. Parameter-String aufteilen
local parts = string.split(param, " ")
-- 2. VALIDIERUNG: Prüfen, ob die Anzahl der Teile stimmt
if #parts ~= 2 then
return false, "Fehler: Falsche Anzahl an Argumenten. Beispiel: /giveme default:apple 5"
end
-- 3. Teile in Variablen speichern
local item_name = parts[1]
local count = tonumber(parts[2])
-- 4. VALIDIERUNG: Prüfen, ob die Anzahl eine gültige Zahl ist
if not count or count <= 0 then
return false, "Fehler: Die Anzahl muss eine positive Zahl sein."
end
-- 5. Aktion ausführen
local player = core.get_player_by_name(name)
if player then
-- Besser: `core.give_to_player` verwenden, wenn verfügbar
local inv = player:get_inventory()
inv:add_item("main", {name = item_name, count = count})
return true, count .. "x " .. item_name .. " erhalten."
end
end,
})
Beachte die Reihenfolge der Schritte im Code. Sie ist ein typisches Muster für die Verarbeitung von Benutzereingaben:
param-String enthält alle Argumente in einer Zeichenkette.string.split() kann man den String in eine Tabelle von Einzelteilen zerlegen.#parts) sollte geprüft werden, um die richtige Befehlssyntax sicherzustellen.Du bist nun in der Lage, komplexe und flexible Chat-Befehle zu erstellen. Experimentiere mit den neuen Möglichkeiten!