27.03.2025
Habt ihr euch schon mal gefragt: “Kann ich Blöcke größer als nur 1×1 machen kann?” oder “Wie macht man eigentlich ein Slab?”. Wenn eure Antwort ja ist, dann seid ihr an der richtigen Stelle angekommen. Diese Woche haben wir uns nämlich genau damit und mit den Entities aus letzter Woche beschäftigt.
Unsere Aufgabe war es einen Tepichblock zu erstellen und das ist schwieriger als gedacht. Der Code fängt Anfangs einfacher an wie jeder Block halt.
core.register_node("block_mod:carpet", {
description = "Hello World Carpet",
tiles = { "block_mod_carpet.png" },
groups = { choppy = 3, oddly_breakable_by_hand = 2 },
...
})
Hier erstellen wir einen Block namens “carpet”(Teppich) und geben dem die gleichen Attribute wie das Holz was wir ganz am Anfang gemacht haben.
Unser Teppich soll zwei Blöcke breit und sehr niedrig sein. Damit der Block so dargestellt werden kann, müssen wir die Kollisions- und die Selektionsbox des Blockes verändern.
Die Kollisionsbox eines Blockes gibt uns an, ab wann eine Entity (Spieler, Monster oder Tiere) mit dem Block zusammenstoßen.
Genauso gibt die Selektionsbox uns an, wann wir einen Block selektiert haben zum z.B. Abbauen des Blockes.
...
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 1.5, -0.45, 0.5 }
},
collision_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 1.5, -0.45, 0.5 }
},
...
In Luanti kann man bei der Angabe, der Kollisions- und Selektionsbox mehrere Boxen angeben als Liste von Listen so: { box1, box2, ...}
. Der Typ "fixed"
bedeutet, dass die beiden Boxen sich nicht ändern werden.
Im Attribut fixed
stehen jetzt die Definitionen der Boxen. Hierbei ist zu beachten, dass diese Punkte von der Mitte des Blockes ausgehen. Für einen regulären 1x1x1 Block ist die Definition:{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
. Die einzelnen Koordinaten sind so definiert: { x1, y1, z1, x2, y2, z2 }
und geben die äußere untere und auf der anderen Seite die äußere obere Ecke des Blockes an.
Würden wir den Block jetzt so platzieren passiert noch nichts wirklich mit ihm und es würde wie ein normaler Block aussehen, wobei die Kollisions- und Selektionsbox richtig sein würden. Wir benötigen jetzt ein flaches Modell für unseren Teppich, welches wir so implementieren:
...
drawtype = "mesh",
mesh = "carpet.obj",
...
Wir benutzen wie bei der Entity aus der letzten Woche ein 3D-Modell, welches ich über Blender erstellt habe. Das 3D-Modell muss im textures
Ordner des Mods liegen, um von Luanti benutzt zu werden.
Würden wir jetzt den Block benutzen, würden wir sehen, dass er korrekt dargestellt wird. Ein einziges Problem ist nur noch offen, denn der Teppich wird aus jeder Richtung immer in eine bestimmte Richtung gelegt und nicht mit der Ausrichtung des Spielers gedreht.
...
paramtype2 = "facedir",
...
Mit dieser Veränderung wird der Teppich jetzt auch gedreht mit der Richtung, aus der er plaziert wurde.
Der gesamte Code sieht also jetzt so aus:
core.register_node("block_mod:carpet", {
description = "Hello World Carpet",
tiles = { "block_mod_carpet.png" },
groups = { choppy = 3, oddly_breakable_by_hand = 2 },
drawtype = "mesh",
mesh = "carpet.obj",
paramtype2 = "facedir",
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 1.5, -0.45, 0.5 }
},
collision_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 1.5, -0.45, 0.5 }
},
})
Und wenn wir den Teppich jetzt platzieren bekommen wir:

Zusammenfassung
Diese Woche haben wir gelernt, wie man Blöcke vergrößert bzw. verkleinert und somit jede Größe an Blöcken bekommen kann mit relativ einfachen Modifikationen zu unserem Blockcode. Diese Woche haben wir auch weiter an unserer Entity rumgebastelt und haben uns 3D-Modell Software angeschaut wie z.B. Blender und hauptsächlich Blockbench zum kreiren von 3D-Modellen für unseren Teppich sowie für unsere Entity