domingo, 7 de febrero de 2016

Minetest Modding (IV) - Grupos

En el primer capítulo de esta serie vimos como poníamos como ejemplo el registro de un nodo con la propiedad groups:

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

¿Qué significa esto? ¿Cómo afecta a nuestros nodos? ¿Nos lo vas a contar furni? Claro... aquí empieza el capítulo titulado:

Los grupos!!!!!


Los grupos son una tabla en nuestro nodo y por eso van entre llaves y separados por comas ya que un nodo puede pertenecer a varios grupos. Además cada elemento de esa tabla es en si mismo una propiedad a la que se le asigna un valor. Si no le ponemos valor, minetest asume que es 1. Fijaos además que no son cadenas de texto como "Hola!!!", ya que si no irían entre comillas y no lo van...

Entre los grupos, hay un grupo de grupos especial y son los conocidos como los digging time o tiempo de pico. Cada grupo define una manera de picar el nodo, así que asociando el nodo a uno de estos grupos estaremos determinando cómo se obtiene.

Digging Time Groups

Estos grupos llevan asociado un valor del 1 al 3. Cuanto mayor sea el número más costará extraerlo. Si no ponemos nada, por defecto se asumirá que es el 1.

crumbly

Añadiendo esta propiedad significa que el nodo puede ser obtenido con la pala. Una cosa interesante es que si sólo asociamos este grupo al nodo, el nodo sólo podrá ser extraído con la pala, ni con picos,  ni con gaitas.

cracky

Este grupo es el que tenemos en el ejemplo del inicio de este artículo. Significa que el nodo o bloque puede ser extraído con el pico.

snappy

El nodo se puede cortar con la espada.

choppy

Al nodo se le puede arrear con el hacha. Aizkolariak al poder.

dig_immediate

No es necesario ninguna herramienta para su recolección. Vamos que lo podemos coger a muñonazos. Si le asignamos el valor 2 lo recogeremos en un par de golpes, si le asignamos el valor 3 se recogerá inmediatamente, como pasa con las antorchas.

oddly_breakable_by_hand

Es igual que el anterior, pero está pensado para objetos que en principio no deberían poder recogerse con la mano. El tiempo es mayor que el anterior. Si le ponemos el valor 1 tardaremos 3'5 segundos en recogerlo, 2 segundos si ponemos el valor 2 y menos de un segundo para el valor 3. Si además el nodo puede recogerse con herramientas, estas tardarán lo que deberían tardar.

Material

Define que tipo de material es el nodo. Se usa sobretodo en el crafteo. Si tenemos algo que se pueda construir con cualquier madera (por ejemplo: un palo), bastará con que nuestro nodo esté definido como wood para que también se pueda usar en el crafteo de...


Entre este tipo de grupos tenemos:
  • wool:  para la lana
  • flora:  para las flores
  • plant:  para las plantas de tamaño medio
  • sand:  para la arena
  • stone: para las piedras
  • wood: para la madera
  • tree:   para los árboles

Otros grupos

flammable

Que se le puede pegar fuego, cuando más elevado se el valor que le asignamos más inflamable es.


puts_out_fire

Justo lo contrario al anterior. Si el nodo está cerca del fuego, éste se extingue. Se le asigna un valor que mida su efectividad.

igniter

Uno de mis favoritos. Si colocamos uno de estos bloques, los nodos a su alrededor a una distancia igual al radio que especifiquemos y que sean inflamables... empiezan a arder! El sueño de todo pirómano. No empiezan a arder al momento. Recordad que cuando hemos visto el grupo flammable, le otorgábamos un valor que determinaba su resistencia al fuego. Y es que todo está muy pensao.

disable_jump

Si le ponemos el valor 1 no se podrá saltar sobre ese nodo. ¿No se os ocurren muchas maldades diseñando un parkour?

fall_damage_add_percent

Otra idea para diseñar un parkour extremo. Este parámetro modifica el daño que se hace al caer sobre el nodo. Por ejemplo, si ponemos un 25, hacemos un 25% más de daño, y un -25 un 25% menos. Si ponemos -100 no nos haremos daño y si ponemos 100 nos haremos papillita. Imaginad un parkour en el que un salto aparentemente fácil nos mate y que dejarnos caer desde una gran altura nos deje ilesos. Lo sé. Tengo una mente privilegiada para hacer el mal.

bouncy

Más maldades. Con este grupo controlamos la velocidad del salto. Podemos hacer que desde un bloque saltemos más alto (poniéndole por ejemplo un valor de 10), pero si le ponemos por ejemplo 100, lo que ocurrirá es que rebotaremos varias veces. Es más, la primera de ella incluso perderemos vida. Muahahahaha!!!




falling_node

Con este parámetro le damos al nodo el mismo comportamiento que la arena. Es decir. Si debajo no tiene nada, cae.

attached_node

Como el anterior. Sólo que al caer se convertirá en un elemento recolectable. Probad a hacer una columna de varios de estos nodos y  picad en el de abajo. La cornucopia existe.

soil

Si a un node le asociamos este grupo se covertirá en tierra, es decir, que podremos plantar árboles jóvenes (conocidos en el juego como saplings). Pero no os preocupéis, exploraremos la botánica en otro artículo, sólo hay que tener paciencia, y pasaros por aquí 'de vé en cuando'.

Y en principio nada más. Claro que hay más grupos. Y cuando hayáis leído estas líneas habrán aparecido más. Es lo que sucede cuando muchas personas se ponen a trabajar en un proyecto abierto. Pero mola.  Quien sabe. Quizá en una revisión posterior de este artículo incluya un grupo creado por vosotros. Lo dicho. Mola.



sábado, 6 de febrero de 2016

Administració i gestió d'organitzacions (05.556) - UOC

Acabado este cuatrimestre, me complazco en retomar la costumbre de compartiros mis apuntes. En este caso comparto los de la asignatura Administració i gestió d'organitzacions (05.556) de la 'Universitat Oberta de Catalunya (UOC)' en lengua catalana.

Debo indicar que los apuntes no están del todo completos porque iba justillo de tiempo, pero los adjunto en formato Word para que podáis cumplimentarlos y os ahorréis trabajo...  :-)

Otra cosa que diferencia este post de los anteriores es que sólo hay tres exámenes solucionados. El motivo es que en esta asignatura no se facilitan. Los que hay no se si son oficiales o no, pero ahí quedan a vuestro uso.

Como siempre cuelgo PACs y PECs de distintos años y en esta ocasión una sección otros con apuntes de otros compañeros y una calculadora para los índices y para el VAN. (Imprescindible!!!)

Disfrutadlos...

Mis apuntes en WORD aquí
Mis apuntes en PDF aquí

PAC'S aquí
PEC's aquí

Exámenes aquí

Otros aquí

sábado, 30 de enero de 2016

Minetest - Un mundo medieval (II) - Anarkía y cerveza fría

NOTA pa los profes: Dejando de lado la conveniencia ética de hablar de bebidas espirituosas a l@s chaval@s, este módulo refleja muy bien el proceso de creación de la cerveza, cosa que puede utilizarse a nivel docente para explicar el proceso de la formación del etanol. Por ejemplo... :-)

En capítulos anteriores, aprendimos a crear nuestro propios elementos de crafteo. Las posibilidades son infinitas, véase como ejemplo el MOD que aquí presentamos Beer Test.

El MOD en particular lo podéis descargar AQUÍ. Y por supuesto para instalar podéis hacer lo mismo que hicimos AQUÍ.

Como ya habréis adivinado la cosa va de fabricar cerveza, así que vayamos cortando un poquito de jamón que beber con el estómago vacío no es bueno.

Abuelita, abuelita... que ojos más grandes tienes (El lúpulo)

Como sin duda conocéis el lúpulo es un elemento esencial para la fabricación de cerveza, así que nuestro primer cometido será hacernos con semillas de este preciado elemento. La tarea no será sencilla pues el lúpulo sólo crece al lado de árboles que estén cerca del agua.


Picando sobre la planta, recibiremos las valoradas semillas de lúpulo (hop seeds).


De todas formas una vez plantemos las semillas y obtengamos lúpulo, podremos extraerlas del fruto y ya no tendremos que peinar más el mapa... (bufff!!! Es un alivio, lo se)

Subsistencia y plantación

Para producir lúpulo necesitamos:
  • 5 Semillas de lúpulo (Hop Seeds)
  • 10 Vallas de Madera (Wooden Fence)
  • 7 cuerdas de crecimiento suspendidas (Growing Suspension Rope)
  • 20 cuerdas de crecimiento vertical (Growing Rope)
  • 5 cultivos (Crop)

Vallas de Madera (Wooden Fence)


Cuerda suspendida (Growing Suspension Rope)


Cuerda (Growing Rope)

Cultivo (Crop)



En primer lugar construimos con las vallas de madera dos columnas de 5 de altura cada una separadas entre ellas 7 espacios. Para muestra un botón:



Ahora colocamos las cuerdas tal como se ve en la imagen siguiente. ¡Cuidado! La conexión de la cuerda horizontal con la vertical se hace con el botón izquierdo del ratón.



Aramos el suelo con la azada, colocamos un cultivo debajo de cada cuerda y ponemos una semilla de lúpulo en cada cultivo. No olvidéis cavar primero una zanja y llenarla de agua para mantener la tierra húmeda!!!



Podremos recoger nuestro cultivo cuando la planta esté bien crecidita ocupando toda la cuerda golpeándola a manos vacías. Obtendremos lúpulo (hop)


El siguiente paso va a ser secar nuestros frutos. Para ello los colgamos de cualquier sitio. Podemos construir una estructura como en la imagen o ponerlos a secar en la cocina, establo o en la sala del trono. Da igual. El caso es que veréis que cambian de color. El lúpulo seleccionado en la imagen ya está listo para recoger. Es un proceso muy rápido.


Entrando en harina

El siguiente paso es obtener la malta. La malta se obtiene sometiendo un cereal a humedad y después dejándolo secar. Y es lo que haremos.

Construimos una bandeja de trigo (Wheat tray):


Cuidado porque no vale cualquier madera deben ser wooden planks o sea, la del árbol común.

Cuando obtengamos la bandeja de trigo la pondremos en remojo (basta con ponerla al lado de una fuente de agua). Los granos germinarán. En ese momento la recogeremos y la pondremos a secar al sol (la alejaremos del agua). Visualmente este proceso no se aprecia mucho. Nos daremos cuenta que el grano ha germinado porque la bandeja cambiará de nombre. Pasará de llamarse Wheat Tray (Wheat) a Wheat Tray (Sprouting). Cuando esté seca se llamará Malt Tray (Malt).

Ahora nos toca procesar la Malta para obtener el grano (Malt Grain)


Pero una buena cerveza lleva mezcla de distintas maltas así que vamos a conseguir también Malta Cristalizada (la conseguimos poniendo una bandeja de malta en el horno) y Malta Negra (poniendo la Malta Cristalizada en el horno otra vez)

Y ahora sí! Mezclado nuestro lúpulo seco más los tres tipos de malta, obtenemos la preciada mezcla cervecera!!!



Nuestro primer barril

Con hierro y madera común construimos el barril.


Colocamos el barril en el suelo y picando sobre él con el grano de cerveza lo rellenamos. El barril lo tendremos que tapar (picaremos sobre él con un bloque de madera)

En este momento empezará el proceso de fermentación de la cerveza que pasará por cinco fases:
  1. Watery Malt
  2. Fermenting Malt
  3. Light Beer
  4. Beer
  5. Dark Beer

Si colocamos el cursor sobre el barril veremos en que punto está. Picaremos sobre él en la fase que queramos deteniendo el proceso y obteniendo cervezas de diferentes calidades.

Un poco caliente para mi gusto

Y ahora sólo nos queda coger una jarra...


... meterla en el barril... y a bailar sevillanas!



No acaba aquí...

Pues no hamijos. Sin embargo esto quedaría muy largo, así que os remito al sitio oficial.

Con este MOD podemos también:
  • Fabricar cerveza inglesa (ale) pinchando AQUÍ
  • Fabricar aguamiel (mead) pinchando AQUÍ
Y ahora sí... a más leer!

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!!!



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!!!

miércoles, 16 de diciembre de 2015

Minetest Modding (I) - Último Capítulo

Pues sí queridos amigos, hemos llegado al último capítulo de esta serie dedicada a Minetest. Que sí, que Minetest molaba mucho: hemos construido mundos fantabulosos y somos unos hachas construyendo complicadas maquinarias con Mesecons. Pero Minetest se nos queda corto. No es suficiente para nosotros necesitamos algo más. Necesitamos nuestro propio Minetest.

Minetest ha muerto, viva Minetest.

Así que aquí empezamos una nueva serie de tutoriales que denominaremos como Minetest Avanzado y que pretende adentrarnos en el mundo del Modding. ¿Qué significa ese palabro? Pues que vamos a coger Minetest y lo vamos a poner patas arriba o lo que es lo mismo, vamos a crear nuestros propios MOD's.

Evidentemente esto comporta escribir código puro y duro en un lenguaje de programación llamado Lua. En un principio no será necesario saber programar en él, pero nos acercaremos a conceptos básicos de la programación como las variables o los métodos. 

Pero bueno... eso ya se irá viendo... podría hacer aquí un extenso discurso sobre objetivos y demás pero yo tengo ganas de empezar... ¿y vosotros?

Nuestro primer MOD

Ya sabéis como funciona esto... vamos a la carpeta en la que tenemos instalado Minetest, entramos en la carpeta mods y creamos una carpeta que se llame como nuestro MOD, en mi caso voy a crear una carpeta llamada furnimod. Dentro de furnimod crearemos una carpeta llamada textures.

La carpeta textures

Nada que no sepáis... Ya habíamos modificado texturas AQUÍ. Como imagináis, es la carpeta que alberga las texturas que son imágenes con los dibujos que vemos en los bloques o nodos.

Las imágenes deben ser archivos .png de un tamaño de 16x16 o 32x32 o 64x64 o una potencia de 2 cualquiera por si misma. Lo que sean potencias de dos es un tema recurrente en la informática y tiene a ver con eso de que los ordenadores trabajan con unos y ceros. En términos de eficiencia deberíamos trabajar con 16x16 o 32x32, aunque si la imagen no queda bien definida podéis trabajar con otros tamaños. La premisa siempre será la misma... experimentad.

Yo voy a trabajar con esta textura:  
unchitexture.png

Evidentemente os invito a que creéis y no os limitéis a reproducir lo que pone aquí... ¿lo he dicho antes? Experimentad.

Recordad que hemos de trabajar con algún programa de dibujo que nos permita obtener transparencias como el Paint.NET o el GIMP. Nada de usar el Paint de Windows. También podéis usar un programa de dibujo on-line como Queeky.

El archivo init.lua

Este archivo contiene nuestro código y se coloca en la carpeta principal de nuestro MOD. En mi caso será furnimod. Es un archivo de texto plano que podéis escribir con el bloc de notas de Windows. Nada de usar editores de texto modernos como los de Word o herramientas similares. De hecho, lo ideal sería usar un editor pensado para código que nos ayudara identificando las instrucciones con colorines. El que yo uso (y no me llevo comisión) es Notepad ++. Tenéis también AQUÍ varias opciones para editar el código en linea.

Así que creáis el dichoso fichero init.lua, copiáis el siguiente código en él y guardáis.

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


Si ahora entramos en Minetest y pulsamos Configurar sobre nuestra partida, (tal y como se cuenta AQUÍ ), aparecerá nuestro MOD que debemos activar.




Una vez entremos en el juego en modo creativo, observaremos con entusiasmo y admiración que aparece nuestro bloque.


Además podréis hacer con él construcciones bonitas. Sí. Furni os quiere ti@s...


Y hasta aquí esta breve introducción al modding. Si sois alumn@s aplicados, posiblemente os estaréis preguntando qué significa todo ese código que habéis metido en el init.lua. Muy bien. Esa es la actitud.

Como podéis imaginar... éste y otros enigmas se irán resolviendo en futuros capítulos de este Tutorial de Minetest Modding.  Oh yeah!

domingo, 13 de diciembre de 2015

Videojuegos para padres y maestros - Minetest (IX) - WorldEdit (y 3)

Los que seguís habitualmente este especie de curso de Minetest os sorprenderá ver el salto argumental al volver a WorldEdit, pero es que dentro de las actividades que realizamos en el CoderDojo de Medialab-Prado Madrid a propuesta de un Ninja, surgió la actividad que os voy a proponer y que me pareció muy interesante.

De Madrid al cielo

Para realizar esta actividad debéis tener instalado WorldEdit, pinchando AQUÍ os explico cómo podrán facerlo vuesas mercedes... (sí, hoy me siento épico)

Lo primero de todo es construir un muro, con lo que pondremos una fila de 8 bloques de piedra o de algo que quede bien para construir un rascacielos... buscad una gran llanura ya que la construcción va a ser tocha...


Ahora con el 1 y 2 (si no sabéis de que os hablo mirad AQUÍ) seleccionaremos toda la fila y la apilaremos sobre si misma (en el eje de la y) por ejemplo 4 veces.

//stack y 4



Ahora haremos las ventanas. Las podéis hacer haciendo trampas (o sea picando) o seleccionarlas con el 1 y 2 y rellenarlas de aire o cristal...

//set air  o   //set glass



Ahora seleccionaremos toda la pared y la apilaremos una vez sobre la derecha. El problema radica en que no sabemos si la derecha es el eje x (Este), el z (Norte), el -x (Oeste) o el -Z (Sur). Pulsando el [F5] podremos averiguarlo. Sin embargo es más sencillo colocarnos mirando hacia donde queremos que la estructura se apile y usar la ? (Hacia donde miremos)



//stack ? 1


Ahora seleccionamos tooooda la pared y la apilamos hacia el fondo una vez, de manera que nos quede una pared de dos bloques de espesor... (ahora veréis para qué...)

//stack ? 1



Seleccionamos la nueva pared (la del fondo) y ahora es donde aplicamos la magia:

//rotate y 90



Impresionante no? Aquí lo que hemos hecho es poner una bisagra vertical (y) en el 2 y rotar la estructura seleccionada 90 grados. Para que os funcione como a mí, es importante que cuando seleccionéis la segunda pared, el 2 esté a la derecha.

Si no os ha salido bien con //rotate y -90 volverá a su sitio.

Y ahora a hacer el bestia...

Seleccionamos toooooooda la estructura y la copiamos digamos 20 bloques pal fondo (?)

//copy ? 20



Veis como queda? 
El siguiente paso es obvio... seleccionaremos toda la nueva estructura que hemos creado y la giraremos 180 grados.

//rotate y 180


Como al hacer esto hemos arrasado con todo lo que había por en medio es posible que nuestra nueva estructura esté llena de cosas que no queremos con lo que seleccionamos todo el interior (las paredes no) y lo llenamos de aire para vaciarlo. Puede que para poder seleccionar el interior debáis poner un bloque para poder seleccionarlo como hago en la siguiente imagen...


Ahora rellenamos todo de aire:

//set air

También podemos aprovechar para poner un suelo bonito o algo...


Fijaos que NO hemos rellenado todo el suelo, hemos dejado una fila por abajo y a la derecha sin poner nada. Como podéis imaginar ahí van las paredes.

Ahora seleccionaremos la estructura nuevamente, per dejaremos sin seleccionar la fila de abajo y la de la derecha del todo como hemos hecho en el suelo...


Como imagináis el siguiente paso consistirá en mover la nueva estructura ya rotada sobre la original. Si la hubiéramos seleccionado toda, estaríamos copiando el aire que corresponde a las paredes antiguas, con lo que al mover nos las cargaríamos. Otra estrategia hubiera sido mover la nueva estructura un bloque más hacia atrás y uno a la izquierda para no pisar las paredes originales.

Ahora nos colocamos tras la pared que queremos empujar de la nueva estructura (donde la estrella)...


Y si antes habíamos copiado 20 para aquí, ahora movemos 20 para allá...

//move ? 20


Ahora nos toca decorar nuestra casita, no debemos olvidarnos de poner antorchas ni la escalera. Fijaos como en la escalera hemos hecho un bujero en el suelo... Por cierto, es curioso como el corrector no me señala la palabra bujero... He consultado y es de los pocos vulgarismos que la RAE aún no acepta. Os lo juro por un bocata de almóndigas.



Ahora seleccionamos todo, todo, todo y apilamos 20 para arriba!!!

//stack y 20





Y ya lo tenemos... ahora sólo queda añadir detalles de calidad como la puerta... tapar el agujerito de la escalera... y personalizar cada piso!!!!!!

A más ver!!!