sábado, 26 de diciembre de 2015

Minetest Modding (III) - CraftItems

En el capítulo anterior vimos como registrar nodos. Dijimos que un nodo es un bloque que podemos colocar. Ahora veremos los craftItems o elementos de crafteo que se usan como ingredientes para generar otros objetos, o bien para el uso del jugador como la comida.

Comiendo nubes rosas

Como veréis funciona de una forma muy parecida a los nodos. Si para los primeros usábamos el método (o para nosotros instrucción) minetest.register_node, para un elemento de crafteo usaremos minetest.register_craftitem y con una sintaxis muy parecida... veamos un ejemplo.

Vamos a crear una nube rosa que nos de vida al comerla:

unchi64.png

minetest.register_craftitem("furnimod:unchi", {
    description = "Unchi",
    inventory_image = "unchi64.png",
    on_use = minetest.item_eat(20)
})

Casi todo lo anterior ya sabemos como funciona del capítulo anterior.

Aquí lo que hacemos diferente es utilizar un evento (nosotros lo denominaremos acción) llamado on_use.

Lo que hace un evento es que cuando se da la acción (en este caso usar) se dispara un método o instrucción de los más de 170 que hay, que en este caso es comer. En vez de on_use que dispara el evento al pulsar el botón izquierdo del ratón, podríamos haber usado otros eventos como on_place que dispara la acción con el botón derecho, o on_drop que lo dispara cuando lo soltamos con la [Q].

Es decir: Podríamos crear un objeto que se comiera con la [Q] en lugar de con el botón izquierdo.

El parámetro que tiene mintest.item_eat es 20. Un corazón son dos puntos. Así que 20 son diez corazones. Podemos hacer que nuestra comida recupere los corazones que queramos cambiando el parámetro.

Pero podríamos hacer más cosas con minetest.item_eat. Mirad esto:

fly64.png

minetest.register_craftitem("furnimod:fly", {
    description = "Fly",
    inventory_image = "fly64.png",
    stack_max = 50
})

minetest.register_craftitem("furnimod:unchi", {
    description = "Unchi",
    inventory_image = "unchi64.png",
    on_use = minetest.item_eat(1,"furnimod:fly")
})

Definimos dos craftItems uno llamado Fly y otro, que ya conocemos, Unchi. Si os fijáis en el evento on_use de la nube rosa, además de darnos medio corazón de vida al comerla, añade a nuestro inventario una mosca. Es el efecto que podemos utilizar para que al comer pan nos queden migas, al comer un pollo aparezca en nuestro inventario huesos o al comer una manzana un logo de Apple.

stack_max

Además si os fijáis en el código de la mosca aparece un nuevo atributo llamado stack_max. Nos dice que en una misma casilla del inventario sólo podemos llevar 50 moscas. Esto mismo lo podemos usar en los nodos, como en el Pink Block del capítulo anterior.

stack_max = numero     (Si no lo ponemos coge 99)

liquids_pointable

Es un valor booleano, que como sabemos puede coger los valores de verdadero (true) y falso (false). Indica si con el objeto podemos apuntar sobre los líquidos para hacer algo. Un ejemplo es el cubo que trae minetest 'de fábrica' (el empty bucket) que se llena al usarlo sobre agua o lava, otro ejemplo podría ser una caña para pescar (total ya tenemos las moscas como cebo) o un extintor para detener la lava o una varita mágica para congelar el agua... lo que se os ocurra...   :-)

liquids_pointable = false  //   liquids_pointable = true    (Si no ponemos nada es false)


Crafteando

Vamos a construir un pico rosa. La verdad es que no sabemos. Pero una buena estrategia en el modding y en la programación en general es buscar en el interné código que haga lo que queremos y aplicar las modificaciones necesarias.

Mirad en este enlace tenemos el código que minetest usa para las herramientas. Lo que haremos es buscar el código del pico de madera (pick_wood), copiarlo en nuestro init.lua y modificar lo necesario.

Nos quedará así:

minetest.register_tool("furnimod:pick_pink", { 
    description = "Pink Pickaxe", 
    inventory_image = "pinkpick64.png", 
    tool_capabilities = { 
        full_punch_interval = 1.2, 
        max_drop_level=0, 
        groupcaps={ 
            cracky = {times={[3]=1.60}, uses=10, maxlevel=1}, 
        }, 
        damage_groups = {fleshy=2}, 
    }, 
}) 

Como veis hemos cambiado el nombre (junto al MOD), la descripción y la imagen. Lo demás no sabemos qué hace, pero podemos asegurar que funcionará igual que el pico de madera. Podemos investigar cambiando cosas: por ejemplo, uses = 10 tiene toda la pinta de referirse a la resistencia de nuestro pico. Experimentad!

pinkpick64.png

Ahora que ya tenemos el pico definido vamos a craftearlo:

minetest.register_craft({
    output = "furnimod:pick_pink",
    recipe = {
        {"furnimod:unchi", "furnimod:unchi", "furnimod:unchi"},
        {"", "default:stick", ""},
        {"", "default:stick", ""}
    }
})

Como veis es muy sencillo de entender:

En output ponemos el objeto a crear. Si hubiéramos puesto output = "furnimod:pick_pink 99" nos hubiera creado 99 unidades en lugar de una, aunque como los picos no son apilables no tiene mucho sentido.

Y en recipe ponemos los elementos en el orden que los pondríamos en la mesa de crafteo. Si en un cuadrado no va nada ponemos ("").  Y ya está.


Para una espada (esa le definís vosotros que ya sabéis) si hacemos lo siguiente obligamos que se tenga que craftear en el centro:

minetest.register_craft({
    output = "furnimod:sword_pink",
    recipe = {
        {"", "furnimod:unchi", ""},
        {"", "furnimod:unchi", ""},
        {"", "default:stick", ""}
    }
})

o a la derecha:

minetest.register_craft({
    output = "furnimod:sword_pink",
    recipe = {
        {"", "" ,"furnimod:unchi"},
        {"", "" ,"furnimod:unchi"},
        {"", "" ,"default:stick"}
    }
})

o si nos da igual si derecha, izquierda o centro o no votáis (sí, acabamos de salir de elecciones):

minetest.register_craft({
    output = "furnimod:sword_pink",
    recipe = {
        {"furnimod:unchi"},
        {"furnimod:unchi"},
        {"default:stick"}
    }
})

Como nota final añadir que este tipo de elementos de crafteo se conoce como Shaped. Es decir, que tiene que ponerse en una posición determinada para obtener un nuevo elemento. Los que no es necesario poner en un lugar determinado se conocen como Shapeless y es necesario indicarlo.

Por ejemplo, yo quiero que con tres nubes rosas obtenga una nube azul. Haríamos algo parecido a esto:

minetest.register_craft({
    type = "shapeless",
    output = "furnimod:unchi_blue",
    recipe = {
        {"furnimod:unchi", "furnimod:unchi", "furnimod:unchi"}
    }
})

Veis que fácil...   hemos indicado que el elemento de crafteo es de tipo shapeless.

Cocinando

Sí, señor@s. Ha llegado el momento de cocinar.

Los elementos que se cocinan también se identifican con un tipo y en este caso es cooking.

¿Recordáis el bloque rosa del anterior capítulo? Teníamos el problema de cómo lo introducíamos en el juego en modo NO creativo. Pues muy sencillo. ¿Que tal si cocinamos nubes rosas para obtener una suerte de adobe rosa?


Nuevamente el código es muy sencillo y con lo que ya sabemos casi autoexplicativo.

minetest.register_craft({
    type = "cooking",
    output = "furnimod:pinkblock",
    recipe = "furnimod:unchi",
    cooktime = 10,
})

¿Qué hemos hecho aquí?

Por un lado decimos que el elemento es de tipo cooking.

En recipe (receta) le damos el nombre del ingrediente que vamos a cocinar (recordad que siempre precedido del nombre del MOD) y en output el resultado de la cocción.

Cooktime es el número de segundos que tardará en aparecer el nuevo elemento. Si no ponemos nada tardará 3 segundos.

De esta manera ya podemos introducir el bloque rosa en un juego no creativo de nuestro servidor de minetest. Y como sois muy listos habréis pensado... pero furni, tío... ¿Y como introducimos la nube rosa? Buah... chupao... sólo tenéis que cargar un MOD de animales, en el que por ejemplo haya una vaca y modificar su código para que al matarla nos de nubes rosas...


Ya bueno... os prometo que más adelante seréis capaces de hacerlo...  :-)


Fuel

Para finalizar este capítulo que empieza a ser un poco denso, hablar del fuel. El fuel es otro tipo. Y funciona como el carbón en el horno. Podríamos hacer que nuestra nube rosa en lugar de ingrediente fuera combustible...

minetest.register_craft({
    type = "fuel",
    recipe = "furnimod:unchi",
    burntime = 30,
})

burntime es el tiempo que nuestro combustible estará quemando, así con un tiempo de combustión de 30, podremos obtener 10 elementos con un tiempo de cocinado (cooktime) de tres.

Y ya está!!!!!

Ya podemos empezar a crear nuestros objetos para minetest!!!



No hay comentarios:

Publicar un comentario