Unterrichtseinheit: „Koordinaten und eigene Chat-Befehle in Minetest / Lua“

Diese Seite enthält den Stoff einer Doppelstunde (2 × 45 Minuten) der Luanti-Programmier-AG. Ziel: den 3D-Raum von Minetest verstehen und eigene Chat-Befehle mit Lua programmieren.

1. Kurze Theorie

WasWofür?
Koordinaten (x y z)Jedes Objekt besitzt eine Position: x → Osten / Westen, y → Höhe, z → Norden / Süden. Nullpunkt ist (0 0 0).
VektorTabelle {x=…, y=…, z=…}. Viele API-Funktionen erwarten oder liefern solche Tabellen.
player:get_pos()Liefert die aktuellen Koordinaten des Spielers.
player:set_pos(pos)Teleportiert den Spieler an eine Position.
minetest.register_chatcommand()Erstellt einen Befehl /name. Wichtige Felder: params, description, privs, func(name,param).
minetest.get_player_by_name()Gibt das Spieler-Objekt zu einem Namen zurück.
minetest.pos_to_string(pos[,prec])Formatiert einen Positions-Vektor als lesbaren Text.
vector.add(v1,v2)Addiert zwei Vektoren (z. B. aktuelle Position + Delta).
vector.distance(v1,v2)Liefert die Distanz zweier Punkte in Metern.
vector.round(v)Rundet jede Koordinate auf ganze Zahlen.
minetest.set_node(pos,{name="…"})Platziert (oder ersetzt) einen Block an pos.
minetest.sound_play(name,spec)Spielt einen Sound (z. B. beim Teleport).
minetest.get_connected_players()Liste aller aktuell verbundenen Spieler.
minetest.colorize(farbe,text)Färbt Chat-Text in der angegebenen Farbe ein.

Tipp: Gewähre den Kindern testweise die Privilegien shout und teleport, damit sie frei experimentieren können.

2. Praktische Aufgaben

Jede Aufgabe baut auf der vorherigen auf und festigt das Verständnis.

#ZielTechnische SchritteErweiterungsideen
1.
„Mein GPS“ –
/pos
Position des Spielers ermitteln und im Chat ausgeben.
  1. Vorlage kopieren.
  2. Name auf "pos" ändern; params & privs dürfen leer sein.
  3. local player = minetest.get_player_by_name(name)
  4. local p = player:get_pos()
  5. Ausgabe mit minetest.pos_to_string(p,0)
  • Koordinaten auf 1 Nachkommastelle runden.
  • Farbe via minetest.colorize.
2.
„Ein Schritt vorwärts“ –
/step <dx> <dy> <dz>
Parameter lesen & relative Bewegung.
  1. String aufteilen (z. B. for word in param:gmatch("%S+")).
  2. Mit tonumber in Zahlen wandeln.
  3. Grenzen prüfen |dx|-|dz| ≤ 30.
  4. vector.add mit aktueller Position, dann set_pos.
  • Teleport-Sound (minetest.sound_play).
3.
„Wir bauen einen Turm“ –
/pillar <höhe>
Schleifen & Blöcke setzen.
  1. Höhe (1–20) aus param.
  2. Aktuelle Position runden (vector.round).
  3. for y = 0, h-1 do … minetest.set_node
  • Material als 2. Parameter (/pillar 10 default:wood).
  • Variante in while.
4.
„Wie nah sind wir?“ –
/distance <spieler>
Distanz zwischen zwei Spielern berechnen.
  1. Zielspieler via minetest.get_player_by_name.
  2. d = vector.distance(p1,p2)
  3. Rundung & Farbcode (minetest.colorize).
  • Abstände zu allen Spielern (minetest.get_connected_players).

3. Verständnis-Check

4. Freiwillige Hausaufgabe

Schreibe /cube <größe>, der einen hohlen Würfel mit Mittelpunkt an deiner Position baut (ungerade 3–15).