Level 2-3 - Mobding Grundlagen
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.
Ein Mob (mobile entity) ist ein lebendiges Spielobjekt mit eigenem Verhalten.
Die wichtigsten Callbacks sind on_activate,
on_step, on_punch und on_death.
Lege im mods/-Ordner einen Mod my_rabbit an:
mods/
`-- my_rabbit/
|-- mod.conf
|-- init.lua
`-- textures/
`-- my_rabbit.png
mod.confname = my_rabbit
description = Mein erster Mob - ein Hase!
depends = default
Der Name folgt dem Muster mod_name:entity_name,
hier also my_rabbit:rabbit.
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},
})
init.lua Schritt für SchrittStatt 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.
on_activateIn der Entity-Tabelle ergänzen:
on_activate = function(self, staticdata, dtime_s)
self.object:set_hp(self.hp_max)
self:pick_new_direction()
end,
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,
on_step (Gehirn des Hasen)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,
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,
}) -- 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,
})
init.lua speichern.T öffnen./rabbit eingeben.Der Hase sollte erscheinen, springen, die Richtung wechseln und auf Schläge reagieren.
my_rabbit in mods/ angelegtmod.conf geschriebentextures/my_rabbit.png vorhandeninit.lua ohne Syntaxfehler/rabbit funktionierthp_max auf 10 setzen.y = 4 auf y = 7 erhöhen.timer > 3 auf timer > 1 ändern.minetest.sound_play(...).on_death hinzufügen.| 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. |
unexpected symbol: oft fehlt ein ", ) oder ,.attempt to index nil: meist ein falscher Variablen- oder Funktionsname.missing 'end': eine Funktion/Struktur wurde nicht geschlossen.textures/ prüfen.