015 Übung depends:
In dieser Übung soll es darum gehen, wie man einen »Mod« von anderen »Mods« abhängig machen kann, um so Zugriff auf die Ressourcen des anderen »Mods« zu erhalten.
Abhängigkeiten definieren:
In »Minetest« ist es möglich, dass ein »Mod« auf Bilder, Töne, Eigenschaften und bestimmte Teile des Quellcodes (zum Beispiel »Funktionen«) eines anderen »Mods« zugreifen kann. Um dies zu erreichen, musst Du zunächst die Datei »mod.conf« in Deinem Mod-Ordner um folgende Zeile ergänzen:
depends = default
Jetzt kannst Du zum Beispiel auf Teile eines »Mods« namens »default« zugreifen. Gehe hierfür im Programmordner von »Minetest« zu folgendem Speicherort:
games\minetest_game\mods
Öffne dort die Datei »nodes.lua« und suche nach dem Begriff »sounds« (es gibt 137 Treffer). Welcher Klang steckt vermutlich hinter dem ersten Treffer (Zeile 265)? Und könnte er zu einem Deiner eigenen »Nodes«, die Du programmiert hast, passen? Dann kopiere die ganze Zeile (also mit sounds =).
Öffne jetzt den Quellcode Deiner eigenen »Node«, zu der der oben gewählte Ton passen würde und tausche in Deinem Quellcode die ganze von Dir angelegte(n) Zeile(n) zu sounds gegen die vorhin kopierte Codezeile aus. Achte sehr genau auf die richtige Setzung der diversen Klammern, Anführungszeichen und Kommas …
Öffne jetzt den Quellcode Deiner eigenen »Node«, zu der der oben gewählte Ton passen würde und tausche in Deinem Quellcode die ganze von Dir angelegte(n) Zeile(n) zu sounds gegen die vorhin kopierte Codezeile aus. Achte sehr genau auf die richtige Setzung der diversen Klammern, Anführungszeichen und Kommas …
mehr Töne einbinden:
Welche Töne könntest Du auf diese Weise noch in Deinem »Mod« verwenden? Glas? Holz? Metall? Erde? Sand? Schnee? Blätter? Wasser?
Bilder einbinden:
Die Formulierung unter »Aufgabe: depends« über Abhängigkeiten und Zugriffe auf andere »Mods« ist nicht ganz korrekt. Den auf die meisten Medienelemente eines anderen »Mods« kannst Du auch dann zugreifen, wenn Du nicht vorher die Codezeile »depends = default« in Deine »mod.conf« geschrieben hast.
Probiere es einmal aus. Schaue Dir in »games\minetest_game\mods« in einem »Mod« namens »wool« den textures-Ordner an. Kopiere den Dateinamen einer Textur, die Dir gefällt, und ersetze damit die Textur in einem Deiner »Nodes«.
Probiere es einmal aus. Schaue Dir in »games\minetest_game\mods« in einem »Mod« namens »wool« den textures-Ordner an. Kopiere den Dateinamen einer Textur, die Dir gefällt, und ersetze damit die Textur in einem Deiner »Nodes«.
Wann benötigt man »depends = default«?
Will man nur ein einzelnes Bild oder einen einzelnen Ton einbinden, ist ein direkter Zugriff wie unter »Aufgabe: Bilder« möglich.
Aber bei der Erweiterung der Sound-Angaben unter »Aufgabe: depends« haben wir durch die eingefügte Codezeile viel mehr getan, als nur einen einzelnen Ton zu verwenden. Das Codefragment enthält nämlich eine sogenannte »Funktion«, die im Hintergrund Dinge wie Lautstärke und einiges anderes regelt (mit »Funktionen« werden wir uns in späteren Sitzungen noch näher beschäftigen). Ohne die Zeile »depends = default« in der »mod.conf« bricht »Minetest« mit einer Fehlermeldung ab:
Aber bei der Erweiterung der Sound-Angaben unter »Aufgabe: depends« haben wir durch die eingefügte Codezeile viel mehr getan, als nur einen einzelnen Ton zu verwenden. Das Codefragment enthält nämlich eine sogenannte »Funktion«, die im Hintergrund Dinge wie Lautstärke und einiges anderes regelt (mit »Funktionen« werden wir uns in späteren Sitzungen noch näher beschäftigen). Ohne die Zeile »depends = default« in der »mod.conf« bricht »Minetest« mit einer Fehlermeldung ab:
attempt to index global 'default' (a nil value)
Falls Du neugierig bist, was da alles im Hintergrund bei »sounds =« geregelt wird, schaue in die »lua_api.txt«: Sounds für Nodes.
Gefahren beim Zugriff auf andere Mods:
Hier ein kleiner Warnhinweis: Beim direkten Zugriff auf einzelne Bilder oder Töne eines fremden »Mods« zeigt der Spielchat beim Betreten der Welt eventuell eine Fehlermeldung. Es ist nämlich nicht immer ganz klar, in welcher Reihenfolge »Mods« geladen werden. So kann es passieren, dass Dein »Mod« auf einen anderen »Mod« zugreifen möchte, der jedoch noch gar nicht in den Speicher geladen wurde. Spielen kann man aber trotzdem ganz normal, es taucht nur eine Warnmeldung in roter Schrift im Chat oben auf.
Ganz anders sieht die Sache allerdings aus, wenn Du mit »depends = default« eine Abhängigkeit definiert hast und es den genannten »Mod« gar nicht gibt; dann stürzt »Minetest« ab. Auf dieses Problem gehen wir in einer späteren Sitzung noch einmal etwas genauer an.
Ganz anders sieht die Sache allerdings aus, wenn Du mit »depends = default« eine Abhängigkeit definiert hast und es den genannten »Mod« gar nicht gibt; dann stürzt »Minetest« ab. Auf dieses Problem gehen wir in einer späteren Sitzung noch einmal etwas genauer an.
Schon fertig?
Wie sieht es mit den Dateien »mod.conf« und »README.md« aus? Sind hier vielleicht Ergänzungen nötig?
MUSTERLÖSUNG: SO KÖNNTE ES AUSSEHEN
Versuche zunächst, eine eigene Lösung für die gestellten Aufgaben zu finden. Falls Du aber alleine nicht weiterkommst, kannst Du Dir unsere Musterlösung herunterladen.
Beachte: Da es sich um eine Musterlösung handelt, kann Dein Quellcode am Ende ganz anders aussehen. Das fängt schon bei den Ordner- und Dateinamen an, die Du für Deinen »Mod« gewählt hast. Solange Dein »Mod« aber funktioniert, ist eine Lösung so gut wie die andere ...
Beachte: Da es sich um eine Musterlösung handelt, kann Dein Quellcode am Ende ganz anders aussehen. Das fängt schon bei den Ordner- und Dateinamen an, die Du für Deinen »Mod« gewählt hast. Solange Dein »Mod« aber funktioniert, ist eine Lösung so gut wie die andere ...
Verwendung dieser Inhalte - auch in Auszügen - im Schulunterricht, der Jugendarbeit und im Bildungsbereich mit dem Vermerk »© multimediamobil – Region Süd« erlaubt.