Spawn
En el artículo anterior, vimos que para spawnear a nuestro enemigo(mod), necesitamos usar al item(egg) y ir soltándolo por las distintas areas, pero lo ideal seria configurarlo para este spawn sea automático en determinadas areas. Así podemos configurarlo
Para empezar necesitamos generar un nuestra estructura del juego un fichero llamado minetest.conf que contendrá configuraciones específicas para nuestro juego:activar/desactivar daño,deshabilitar que se muestre la sangre,spawnear mobs en areas restringidas,etc.. Toda la configuración sobre este archivo y demás lo podeis encontrar en la api de mobs_redo
├───atrapa
│ ├───mods
| └───game.conf
|└───minetest.conf
Dentro de nuestro archivo minetest.conf habilitamos la variable mobs_spawn a true
mobs_spawn = true
Una vez habilitada la variable introducimos la siguiente función en nuestro archivo init.lua del mod, remplazando a la actual register_spawn, donde le indicamos que spawnee automáticamente a nuestro mod, en los grupos de nodos en concreto, podemos encontrar una lista de grupos de nodos incompleta aqui
Los valores importantes aquí son nodes, donde le indicamos en que nodo queremos que spawnee, en nuestro caso https://wiki.minetest.net/Dirt_with_Grass y el intervalo de la aparición, el parametro day_toggle es donde se le indica si queremos que aparezca de dia(true) o de noche(false) o que sea indiferente(nil).
Con esta función, podemos spawnear fácilmente nuestros mobs en las áreas que queramos, todos los parámetros se explican en la api de mobs_redo que comentamos.
Ahora nuestro mod aparecerá solo en los nodos, indicados y no podra ser spawneado mediante el huevo(porque comentamos la función mobs:register_egg
)
total=0
if mobs.mod and mobs.mod== "redo" then
mobs:register_mob("willy:willy",{
--vida,armadura y reaccion
type = "animal",
passive = true,
--attack_type = "dogfight",
reach = 2,
damage = 1,
hp_min = 5,
hp_max = 200,
armor = 200,
collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5},
visual="mesh",
--Tamaño de nuestro modelo
visual_size = {x=2,y=2},
mesh="willy.b3d",
--drawtype="front",
textures={
{"willy-rex.png"}
},
--animacion
animation = {
speed_normal = 500,
speed_run = 1000,
--stand_start = 0,
--stand_end = 0,
--stand_start = 5,
--stand_end = 19,
walk_start = 19,
walk_end = 108,
run_start = 20,
run_end = 100,
runaway = true,
jump=true,
walk_chance = 0,
--punch_start = 19,
--punch_end = 110,
},
on_rightclick = function(self, clicker)
--Usar lazo para capturar a willy
if mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) then
change_hud()
end
--end
end
})
minetest.register_on_joinplayer(function(player)
local my_hub3 = player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = 0.5},
offset = {x = -120, y = -25},
text = "Willy Rex atrapados "..total,
alignment = {x = 0, y = 0}, -- center aligned
scale = {x = 100, y = 100}, -- covered later
number = 0xFF0000,
})
function change_hud()
total=total+1
player:hud_change(my_hub3, "text","Willy Rex atrapados "..total)
end
end)
local spawn_on = {"default:dirt_with_grass"}
mobs:spawn({
name = "willy:willy",
nodes = spawn_on,
min_light = 14,
interval = 30,
chance = 5000,
min_height = 5,
max_height = 200,
day_toggle = true,
})
end
--end
--end
-- mobs:register_spawn("willy:willy",
-- {"default:dirt_with_grass", "ethereal:green_dirt"}, 20, 10, 15000, 1, 31000, true)
-- mobs:register_egg("willy:willy", "Willy", "default_dirt.png", 1)
Timers
Si queremos incluir un evento timer en nuestro juego por ejemplo una cuenta atras, podemos hacerlo usando la funcion minetest.after(, que nos permitira ejecutar una funcion en un tiempo determinado para ello primero nos crearemos otra estructura de mod como la anterior para nuestro modulo timer.
├───timer
│ └───textures
│ └───init.lua
│ └───mod.conf
│ └───depends.txt
En nuestro archivo mod.conf añadimos lo sigueinte:
name=timer
En nuestro archivo init.lua, añadimos lo siguiente:
cuentaAtras=100
minetest.register_on_joinplayer(function(player)
local my_hub3 = player:hud_add({
hud_elem_type = "text",
position = {x = 0.5, y = 0.5},
offset = {x = -120, y = -25},
text = "Tiempo "..cuentaAtras,
alignment = {x = 0, y = 0}, -- center aligned
scale = {x = 100, y = 100}, -- covered later
number = 0xFF0000,
})
function change_hud()
if cuentaAtras>0 then
cuentaAtras=cuentaAtras-1
player:hud_change(my_hub3, "text","Tiempo "..cuentaAtras)
end
minetest.after(5,change_hud)
end
minetest.after(5,change_hud)
end)
Esto es solo un ejemplo con un string de prueba, lo suyo seria utilizar esta función junto con otras
funciones de lua como os.clock() o os.time() para obtener el tiempo de cpu o la hora y parsear
los datos para generar un contador en condiciones.
Como siempre podéis encontrar todos los archivos y módulos actualizados en el repo de gitlab de elbinario
https://git.elbinario.net:8000/puppetmaster/minetest
Happy Gamming ;)