Creando juegos en minetest:spawning y timers

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 ;)

Compartir

Deja una respuesta

Your email address will not be published. Required fields are marked *