13.03.2025
Letztes mal, hatten wir uns damit beschäftigt, wie man einen Block in luanti/Minetest erstellt. Wie implementieren wir jetzt aber Logik auf diesem Block?
Zuallererstem mal hilft es, sich die Dokumentation (wenn auch nicht sehr übersichtlich) anzuschauen. Unter dem Punkt: Object Properties finden wir eine große Liste an Eigenschaften und Funktionen, die verschiedene Objekte, das können Blöcke, Spieler oder Tiere/Monster sein, haben.
Als Beispiel, haben wir das letzte Mal bei der GTA MINT uns die on_dig methode auf unserem Block angeschaut. Hier findet ihr alle Funktionen und Eigenschaften für einen Block.
Um jetzt unsere eigenen Logik zu implementieren, müssen wir die standardmäßig definierte Funktion überschreiben. Unterhalb findet ihr den Code von letzter Woche mit der Veränderung, dass wir jetzt die on_dig
-Funtkion überschreiben wollen:
core.register_node("block_mod:wood" {
description = "Wood from a Tree",
tiles = { "block_mod_woodtop.png", "block_mod_woodtop.png", "block_mod_wood.png"},
groups = { choppy = 3, oddly_breakable_by_hand = 2},
-- Overriding method on dig here
on_dig = function (pos, node, digger)
end
})
Zurzeit macht on_dig nichts, denn es wurde keine Logik implementiert. Hier sehen wir aber gut, wie man Funktionen bzw. Methoden (Kleiner Unterschied, in unserem Kontext aber nicht wichtig) implementiert.
Lua benutzt das Keyword: function
zur Definition einer Funktion/Methode. Nach dem function
-Keyword kommt entweder der Name der Funktion oder in unserem Fall, weil wir nicht vorhaben die Funktion noch einmal wo anders zu benutzen, nichts und wir definieren eine anonyme Funktion. Nach dem Namen kommen immer Klammern mit Null oder mehr Argumenten. Argumente sind variabeln, die Funktionen benötigen, um ihre Logik zu implementieren. Bei der on_dig
-Funktion hier haben wir die Argumente: pos – Position des Blockes, node – Der Block an sich selbst und digger – der Spieler, der den Block abbaut. Am Ende werden Funktionen in lua immer mit dem end
Keyword versehen, welches lua sagt bis wohin die Logik der Funktion geht.
Im Folgenden zeige ich euch nur den wichtigen Teil des Codes, damit wir uns auf den fokusieren können. Wir wollen jetzt auf der on_dig
-Funktion implementieren, dass nur Spieler mit dem Namen Steve
den Block abbauen können.
...
-- Overriding method on dig here
on_dig = function (pos, node, digger)
local name = digger:get_player_name()
if name == "Steve" then
core.remove_node(pos)
return true
end
return false
end
}
Okay das ist relativ viel Code. Gehen wir das langsam durch:
local name = digger:get_player_name():
- Hier definieren wir die lokale (
local
) Variabel name und weisen dieser den Wert, der Funktiondigger:get_player_name()
zu. Diese Funktion ist auf dem Playerobjekt implmentiert und gibt uns den Namen des Spielers aus, der den Block abbauen wollte.
- Hier definieren wir die lokale (
if name == "Steve" then
:- Hier beginnen wir einen Bedingungsblock. Und wir sagen Lua: Wenn der Name des Spielers, der den Block abgebaut hat, Steve ist (symbolisiert durch das
== "Steve"
, der Spielername ist auch ein String also eine Zeichenkette), dann (then
) wollen wir besondere Logik ablaufen lassen. Zu beachten ist hier, dass wir auch unserenif
-Block mit einemend
versehen müssen.
- Hier beginnen wir einen Bedingungsblock. Und wir sagen Lua: Wenn der Name des Spielers, der den Block abgebaut hat, Steve ist (symbolisiert durch das
core.remove_node(pos)
:- Diese Zeile teilt luanti mit, dass der Block an der Position, wo wir gerade eben den Block abgebaut haben, zerstört werden soll. Beachte! der Block wird nur zerstört, wenn der Spieler
Steve
heißt.
- Diese Zeile teilt luanti mit, dass der Block an der Position, wo wir gerade eben den Block abgebaut haben, zerstört werden soll. Beachte! der Block wird nur zerstört, wenn der Spieler
return true / return false
:true
(Wahr) undfalse
(Falsch) sind Wahrheitswerte, boolean genannt. Dasreturn
-Keyword gibt luanti an, ob der Block erfolgreich Abgebaut wurde oder nicht. Hierbei isttrue
, ja er wurde erfolgreich abgebaut, undfalse
, nein er wurde nicht erfolgreich abgebaut.
Zusammenfassung
Diese Woche haben wir gelernt, wie wir Funktionen auf Blöcken überschreiben um unsere eigne Logik zu implementiere. Dabei haben wir die on_dig
-Funktion überschrieben und implementiert, dass der Holz-Block nur von Spielern mit dem Namen Steve
zerstörbar ist. Zu dem haben wir über Funktionen gelernt, was Argumente sind und wie man von Funktionen Ergebnisse mit dem return
-Keyword bekommt.
Seid gespannt auf nächste Woche. Ich habe gehört wir machen Entities (Tiere/Monster) 👾.