En este capítulo os enseñaré dos cosas, por un lado a crear un generador de mundo genérico y por otro a crear el generador de ores para que aparezcan en el mundo.
Antes de empezar:Creamos un paquete para los generadores del mundo. En mi caso le he llamado celtech.worldGenerator
Clase GenericGeneratorDentro del paquete que acabamos de crear, creamos la clase GenericGenerator que implemente la interfaz IWorldGenerator del Forge:
Implementar el método generateLo primero que hay que hacer es implementar el único método de la interfaz:
El switch lo que hace es llamar a un método u otro dependiendo del id de la dimensión. A estos métodos le pasamos el generador de números aleatorios, las coordenadas de cada chunk y el mundo. La razón por la cual multiplicamos por 16 las coordenadas es que el Minecraft guarda el número del chunk, no su posición y por eso al multiplicarlo por 16 obtenemos sus coordenadas en bloques.
Los métodos auxiliaresPara facilitarnos la visualización y algún cálculo, creamos tres métodos, uno por cada dimensión:
Clase OreGeneratorUna vez tenemos la clase genérica, creamos la de los ore en el mismo paquete y que extienda a la anterior.
En esta clase implementamos los tres métodos auxiliares de antes y añadimos uno que nos ayude a generar los ores:
Este método realizará una serie de operaciones para generar el bloque en el mundo.
- ore es el blockState (veremos luego como se obtiene) del bloque que queremos generar.
- rarity es la rareza de aparición, para que os hagáis una idea, el diamante tiene rareza 1, mientras que el carbón tiene 20. Esto se traduce en el número de menas (grupo) que se generará como máximo en cada chunk.
- maxMena es el número máximo de bloques que se generarán. Dada pa implementación del Minecraft, es recomendable poner como mínimo 3 o casi nunca se generará.
- minLayer, la capa más baja en la que se generará.
- maxLayer, la capa más alta en la que se generará.
El método en sí lo que hace es llamar al generador de ores del Minecraft y pasarle unas coordenadas aleatorias dentro del chunk y en el rango de capas establecidas. Lo intentará tantas veces como rareza establecida.
Una vez tenemos el método, solo tenemos que llamarlo en los métodos auxiliares de cada dimensión cuando queramos generar un ore en dicha dimensión. Por ejemplo:
El primer parámetro es el anterior mencionado blockstate, luego decimos que tiene una rareza de 13, el máximo número de bloques juntos que generará serán 5 y solo se genera entre las capas 0 y 65.
A mayores de esto, también podemos jugar con otras cosas, por ejemplo generar ciertos ore solo en determinados biomas o si el bioma tiene cierto rango de temperaturas. Para ello obtenemos primero estos valores:
Y luego hacemos algo como esto:
En este caso, solo se genera en playas u océano y cada uno con sus propios valores de rareza y capas. (El CEKConstants.SEALEVEL es una constante que creé para establecer el nivel del mar, que es capa 32)
Registrar los generadoresUna vez tenemos nuestro generador, es hora de iniciarlo en nuestra clase base.
Para ello creamos una instancia después de las de los bloques, por ejemplo:
Una por cada generador.
Luego los registramos creando un método y lo llamamos dentro del método init de nuestra clase base:
Y con esto tenemos los bloques en el mundo. Tened en cuenta que los generadores se llaman cada vez que se crea por primera vez un chunk, así que no hagáis cosas muy costosas o tardará en generar cada chunk.
Linkback: https://minecraftmin.net/index.php?topic=14997.0