Level 2-3 - Mobding Grundlagen

Einen Mob in Luanti erstellen (Спрайт (upright_sprite))

In diesem Kapitel baust du einen einfachen Hasen-Mob mit visual = "upright_sprite". Diese Visual-Art eignet sich gut für schnelle 2D-Charaktere mit geringerem Aufwand als komplexe 3D-Meshes.

Was ist ein Mob?

Ein Mob (mobile entity) ist ein lebendiges Spielobjekt mit eigenem Verhalten. Die wichtigsten Callbacks sind on_activate, on_step, on_punch und on_death.

1. Mod-Struktur

Lege im mods/-Ordner einen Mod my_rabbit an:

Ordnerstruktur
mods/
`-- my_rabbit/
    |-- mod.conf
    |-- init.lua
    `-- textures/
        `-- my_rabbit.png

2. Datei mod.conf

my_rabbit/mod.conf
name = my_rabbit
description = Mein erster Mob - ein Hase!
depends = default

3. Entity registrieren

Der Name folgt dem Muster mod_name:entity_name, hier also my_rabbit:rabbit.

Start der Entity
minetest.register_entity("my_rabbit:rabbit", {
    visual       = "upright_sprite",
    visual_size  = {x = 1, y = 1},
    textures     = {"my_rabbit.png"},

    physical     = true,
    collisionbox = {-0.3, -0.5, -0.3, 0.3, 0.3, 0.3},

    hp_max       = 5,
    timer        = 0,
    direction    = {x = 0, y = 0, z = 0},
})

4. init.lua Schritt für Schritt

Statt eines großen Blocks baust du den Hasen wie im Handout in kleinen Schritten: zuerst Aktivierung, dann Richtung, Bewegung, Reaktion auf Schlag und am Ende der Spawn-Befehl.

Schritt 4 - on_activate

In der Entity-Tabelle ergänzen:

Aktivierung beim Spawn
on_activate = function(self, staticdata, dtime_s)
    self.object:set_hp(self.hp_max)
    self:pick_new_direction()
end,

Schritt 5 - Funktion zur Richtungswahl

pick_new_direction
pick_new_direction = function(self)
    local angle = math.random() * 2 * math.pi
    self.direction = {
        x = math.sin(angle) * 1.5,
        y = 0,
        z = math.cos(angle) * 1.5
    }
    self.object:set_yaw(math.atan2(self.direction.x, self.direction.z))
end,

Schritt 6 - on_step (Gehirn des Hasen)

Bewegung + Sprung + Schwerkraft
on_step = function(self, dtime)
    self.timer = self.timer + dtime

    if self.timer > 3 then
        self.timer = 0
        if math.random(1, 3) == 1 then
            self.object:set_velocity({
                x = self.direction.x,
                y = 4,
                z = self.direction.z
            })
        else
            self.object:set_velocity({x = 0, y = 0, z = 0})
        end
        self:pick_new_direction()
    end

    local vel = self.object:get_velocity()
    if vel.y > -10 then
        self.object:set_velocity({
            x = vel.x,
            y = vel.y - 0.5,
            z = vel.z
        })
    end
end,

Schritt 7 - Schlag und Tod

on_punch + on_death
on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
    local pos = self.object:get_pos()
    local ppos = puncher:get_pos()
    local flee = {x = pos.x - ppos.x, y = 0, z = pos.z - ppos.z}
    local len = math.sqrt(flee.x^2 + flee.z^2)
    if len > 0 then
        flee.x = flee.x / len * 4
        flee.z = flee.z / len * 4
    end
    self.direction = flee
    self.object:set_velocity({x = flee.x, y = 5, z = flee.z})
end,

on_death = function(self, killer)
    minetest.add_item(self.object:get_pos(), "default:apple")
end,

Schritt 8 - Entity schließen + Chatbefehl

Abschluss in init.lua
}) -- Ende von minetest.register_entity

minetest.register_chatcommand("rabbit", {
    description = "Einen Hasen spawnen",
    func = function(name, param)
        local player = minetest.get_player_by_name(name)
        if player then
            local pos = player:get_pos()
            pos.y = pos.y + 1
            minetest.add_entity(pos, "my_rabbit:rabbit")
            return true, "Der Hase ist erschienen!"
        end
        return false, "Spieler nicht gefunden."
    end,
})

5. Testen

  1. Datei init.lua speichern.
  2. Luanti starten und Welt öffnen.
  3. Chat mit T öffnen.
  4. /rabbit eingeben.

Der Hase sollte erscheinen, springen, die Richtung wechseln und auf Schläge reagieren.

6. Checkliste

7. Aufgaben für Schnelle

Level 1

Level 2

Level 3

8. Mini-Spickzettel

Lua / API Bedeutung
math.random(1, 6) Zufallszahl zwischen 1 und 6.
self.object:get_pos() Position des Mobs lesen.
self.object:set_velocity({x,y,z}) Geschwindigkeit des Mobs setzen.
self.object:set_yaw(winkel) Mob drehen (Winkel im Bogenmaß).
minetest.add_entity(pos, name) Neue Entity spawnen.
minetest.add_item(pos, item) Item in die Welt droppen.

9. Debug-Tipps