Level 3 – Fortgeschritten

Mehrere Parameter verarbeiten

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:

  1. Den Namen des Gegenstands (default:apple)
  2. Die Anzahl (5)

Das Problem: Die param-Variable enthält alles als eine einzige Zeichenkette: "default:apple 5". Wir müssen diese Zeichenkette aufteilen.

Aufteilen von Strings mit 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:

Lua: Hilfsfunktion string.split
-- 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".

Beispiel: Ein /giveme-Befehl

Bauen wir nun den Befehl /giveme <item> <anzahl>, der alle bisherigen Konzepte vereint.

Lua: /giveme Befehl mit zwei Parametern
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,
})
Ablauf der Verarbeitung

Beachte die Reihenfolge der Schritte im Code. Sie ist ein typisches Muster für die Verarbeitung von Benutzereingaben:

  1. Teilen: Zerlege die Eingabe in logische Einheiten.
  2. Prüfen: Validiere die Struktur (z.B. Anzahl der Teile).
  3. Extrahieren & Konvertieren: Weise die Teile Variablen zu und wandle sie bei Bedarf um (z.B. mit `tonumber`).
  4. Prüfen (erneut): Validiere den Inhalt der einzelnen Teile (ist die Zahl gültig?).
  5. Ausführen: Erst wenn alle Prüfungen erfolgreich waren, führe die eigentliche Logik aus.

Zusammenfassung

Nächste Schritte

Du bist nun in der Lage, komplexe und flexible Chat-Befehle zu erstellen. Experimentiere mit den neuen Möglichkeiten!