lunes, 21 de diciembre de 2015

Minetest Modding (II) - Registrando nodos

En nuestra introducción habíamos empezado creando un nodo con el siguiente código:

minetest.register_node("furnimod:pinkblock", {
    description = "Pink Block",
    tiles = {"unchitexture.png"},
    is_ground_content = true,
    groups = {cracky=3, stone=1}
})

¿Qué es esto? 

Realmente es la llamada a un método con la sintaxis:

minetest.register_node("nombre", {definición del nodo})

Si habéis oído hablar de la programación orientada a objetos y de las clases, podríamos decir que minetest es la clase y register_node uno de sus más de 150 métodos.  (Vedlos AQUÍ). A nosotros nos vale con pensar que es una orden o instrucción.

Esta orden tiene unos parámetros. Cada método tiene los suyos. Éste en concreto tiene dos:  un texto que lo reconocemos como tal porque va entre comillas y una tabla que la reconocemos porque va entre llaves {}.

El primer parámetro (en mi ejemplo "furnimod:pinkblock")  define el nombre del nodo o bloque y es lo que utilizaremos para referirnos a él. Imaginaos que tengo una varita mágica que lo que hace es crear una pinkblock cada vez que la uso. Posiblemente en algún lugar de mi MOD tendré un código que diga algo como:   Al_usar_la_varita = minetest.crear_nodo("furnimod:pinkblock").

Fijaos en el uso del nombre del MOD que precede al del bloque. Siempre debe ponerse al referirnos a un nodo. Esto es así para evitar que venga un espabilao y cree un nodo con el mismo nombre que el nuestro y haga que Minetest explote.

El segundo parámetro corresponde a un tabla. Una tabla es un montón variable de elementos separados por comas. En este caso lo que hace cada uno de los elementos de la tabla es definir una propiedad de nuestro nodo. Hemos dicho que la tabla es conjunto variable de elementos porque sólo hemos puesto las propiedades que queríamos definir. Hay muchas más. Incluso podríamos definirlas nosotros...

Definición del nodo

En el ejemplo hemos definido cuatro propiedades del nodo (fijaos que se separan por comas)

Description

Fácil. Su descripción. Es el texto que sale, por ejemplo, cuando apuntamos a un nodo dentro de su inventario y muestra el nombre. Como texto que es, va entre comillas.

Tiles

Es el dibujito o textura de nuestro nodo que corresponde a una imagen que tenemos en la carpeta textures de nuestro MOD. Como es el nombre de un archivo es un texto y va entre comillas. Además como está entre llaves nos indica que es una tabla. ¿Y que nos sugiere? Nos sugiere que un nodo tiene seis caras, por lo que podría haberme creado seis texturas diferentes y poner:

tiles = {
        "unchitexture_up.png",
        "unchitexture_down.png",
        "unchitexture_right.png",
        "unchitexture_left.png",
        "unchitexture_back.png",
        "unchitexture_front.png"
    }

Is_ground_content

Fijaos que le estamos diciendo que es TRUE o verdadero. Podríamos decirle que es FALSE o falso y ya está. No podemos decirle otra cosa, es lo que se conoce como un valor Booleano o Lógico.

De todas formas fijaos como estamos usando el símbolo igual ( = ) durante todo el rato. No es un igual como el de las matemáticas viene a ser algo como Tal cosa coge el valor de tal otra.

Lo que hace este propiedad es declarar que nuestro nodo es un suelo y sirve para que el generador de mapas lo tenga en cuenta. Realmente no vale de mucho. Pensad que cuando se cargan los MODs el mapa ya está generado. Entonces ¿por qué lo ponemos?. Pues porque hay que hacer las cosas bien. Imaginad que alguien hace un MOD llamado justicia_divina y que destruye todo lo que hay en una región excepto el suelo. ¿Nos gustaría que se respetara nuestro bloque?  Pues eso... además... nada nos asegura que en un futuro los MOD's se carguen antes de la generación del mapa o que el mapa se genere mientras jugamos... y entonces nos gustaría que nuestro bloque apareciera, ¿no?  Pues eso. Hay que hacer las cosas bien.

Groups

Muy bien. Ya habéis visto que es una tabla. A los grupos ya les entraremos con mayor enjundia, de hecho lo haremos AQUÍ. Pero vamos, lo que viene a decir lo que tenemos es que el bloque se destruye con un pico y que además es una piedra. El hecho de decirle que es una piedra implica por ejemplo, que tenga en cuenta nuestro nodo para Craftear aquellos objetos que precisan piedras, pero no importe cual.

Otras propiedades de los nodos

Inventory_image

Minetest crea automáticamente un cubo para representar a nuestro nodo en el inventario. Pero nosotros podemos querer que se muestre otra cosa. Para ello ponemos el dibujito en la carpeta de texturas de nuestro MOD e incluimos la propiedad en la tabla de definiciones (recordad que se separan por comas)

inventory_image = "miTextura.png"

Wield_image

Funciona de la misma manera que el anterior pero en este caso definimos la textura que queremos mostrar cuando llevamos el objeto en la mano.

wield_image = "miTextura.png"

Walkable

Nos indica si se puede atravesar o no el nodo. Esto nos afecta a nosotros, a los mobs y a cualquier cosa que se mueva. Sin embargo deja construir encima... Imaginad que creáis un nodo con la misma textura que tiene la CobbleStone pero con la propiedad walkable a FALSE. ¡Podríamos construir una cueva cerrada con puertas secretas combinando ambos bloques!

walkable = false     //    walkable = true      //  Si no se pone está a true

Recordad que los valores booleanos no llevan comillas (no son textos).

Pointable

Significa que no se puede apuntar sobre el nodo. Si no se puede apuntar no se puede destruir ni se puede construir sobre él. Ni en modo creativo. Así que mucho cuidado al usarlo. Imagina que queremos construir un juego con algo que no se pueda destruir. En modo Creativo tenemos este parámetro a TRUE, pero antes de distribuir el juego a nuestros amigos lo cambiamos a FALSE. También podríamos diseñar un MOD de protección en el que tuviéramos un bloque que cambiara esta propiedad a los nodos de su alrededor.

pointable = false     //    pointable = true     //  Si no se pone está a true

Diggable

A efectos prácticos es como el anterior. Si lo ponemos a FALSE no se deja picar.  En cambio al poderse seleccionar podremos construir encima. Cuando lo picamos desaparece y vuelve a aparecer al instante. Es el estado en el que se colocan los nodos de los MOD's de protección más conocidos.

diggable = false     //    diggable = true     //  Si no se pone está a true

Buildable_to

Si queremos situar un bloque al lado de otro, seleccionamos una de sus caras y pulsamos el botón derecho del ratón. El nuevo bloque aparecerá a continuación. ¿Qué pasaría si el bloque original tuviera el parámetro buildable_to a TRUE?  Pues que cuando colocáramos el nuevo bloque éste sustituiría al anterior en lugar de colocarse a continuación. Esto es lo que sucede con el agua. Si yo tengo un agujero lleno de agua y le meto un bloque, éste sustituye al agua... no queda flotando encima...

buildable_to = false     //    buildable_to = true     //  Si no se pone está a false

Drop

Por norma general obtenemos el nodo sobre el que picamos. Pero hay casos en el que obtenemos otro objeto distinto (como por ejemplo al picar sobre un bloque de carbón). Para ello sólo debemos definir el objeto que queramos que nos de...

drop = "default:nyancat"

Como veis, ponemos el nombre del MOD delante. El MOD default hace referencia a los elementos que lleva Minetest  'de fábrica'. Es decir, sin que le hayamos instalado nada.

Y con esto creo que ya vale por hoy... en el siguiente capítulo veremos los craftItems es decir, los elementos que no sirven para construir pero sí para craftear o para comer...

Nos vemos!!!

1 comentario: