Tutorial básico de creación de mods

Voy a hacer un manual básico para que todo el mundo sepa como crear sus mods para el Minecraft.

Pero antes de nada, advertiros que si quereis aprender a hacer un mod, tendreis que saber programar. Y no, no puedo explicar como programar aquí xD. Hay libros y páginas en internet dedicadas a ello.

Dicho esto, vamos a necesitar algo de material de internet. Concretamente, vamos a necesitar:

[ul]1. Java SDK, para poder compilar programas Java (incluido el minecraft). Asumo que ya tienes instalado Java en su última versión. Si no es así, evidentemente, instalalo.

Para descargar el SDK (o JDK como lo llaman ellos), haz click en el botón “Download JDK”[/ul]

Aunque parece obvio, alguno podría liarse con tanto botón de descarga. Ahora explicaré como instalarlo.

[ul]2. La última versión del Minecraft Coder Pack (MCP). Es la 3.x, donde x debe ser el número más alto de la lísta (Actualmente la 3.1, pero esto podría ser diferente en futuras versiones. Busca la más alta (3.2, 3.3…)).[/ul]

[ul]3. Un editor de texto con funciones de resaltado de código (o un entorno de desarrollo para Java, pero es un poco más lioso). Recomiendo el Notepad++, que es algo así como gedit de linux, pero para Windows[/ul]

Bien, como todos bien sabemos, el código de Minecraft no es libre y por ello, no lo vamos a encontrar en ningún sitio. Entonces, para conseguirlo, lo primero que deberemos hacer es descompilarlo.

Instalar los componentes necesarios.

Primero instalamos el Java SDK. No tenemos que hacer nada especial, dale a siguiente hasta que se instale (no cambies absolutamente nada). Cuando acabes, hay que editar la variable de entorno “Path” para que contenga la carpeta “bin” que hay dentro de la carpeta donde has instalado el SDK. Esto es porque a la hora de compilar, necesitaremos saber donde se encuentra el compilador.

En windows XP: haz click derecho en Mi PC, ve a Propiedades. De ahí, le das a la pestaña Opciones avanzadas y haces click sobre el botón “Variables de entorno”.

En “Variables del Sistema”, busca y selecciona la variable “Path”, y haz click en el botón “Modificar”.

En la ventana que aparece, en el campo “Valor de la variable”, ve al final del texto sin modificar nada, y escribe lo siguiente (NO COPIES Y PEGUES, lee primero lo que pone debajo):

;C:\Archivos de programa\Java\jdk1.6.0_25\bin

Primero se pone el punto y coma al final del campo. Esto es para determinar donde acaba cada dirección y es necesario. Despues se escribe la dirección de la carpeta “bin” del Java SDK. Suponiendo que tu unidad principal donde lo has instalado sea la C, empezará con C. Si tiene otra letra, cambiala por la letra de la unidad correspondiente. Por último, acuerdate de que el número de versión podría variar. La versión que tengo instalada es la “1.6.0_25”, la tuya podría ser distinta. Compruebalo.

Una vez finalices, acepta todo para aplicar los cambios.

En Windows 7: Es exáctamente igual, solo que en vez de hacer click derecho en Mi PC, lo hacemos en Equipo.

Una vez terminado, ya debería estar todo en orden y podemos proceder a instalar el MCP. Para ello, símplemente lo descomprimimos en cualquier parte donde no estorbe.

Por último, instalamos el Notepad++ como cualquier otro programa.

Decompilar y Deobfuscar el código

De ésta parte se encarga el MCP, y con ello obtendremos el código fuente del Minecraft.

Recomiendo seguir estos pasos con una versión de minecraft “limpia”. Es decir, sin mods instalados.

Para hacer ésto, primero vamos a Inicio > Ejecutar, y escribimos %appdata%, y le damos a Aceptar.

En la carpeta que se nos abre, abrimos la carpeta .minecraft. Seleccionamos las carpetas “bin” y “resources”, y las copiamos pulsando Ctrl + C.

Ahora vamos a la carpeta donde hemos descomprimido el MCP, abrimos la carpeta “jars” y pegamos las carpetas que hemos copiado antes pulsando Ctrl+V.

Volvemos atras, a la carpeta del MCP, y ejecutamos el archivo “decompile.bat”. Aparecerá una pantalla del símbolo del sistema. Solo debemos esperar hasta que finalize el programa, hasta que muestre el siguiente mensaje (parecido):

(NOTA: El programa busca si está disponible el programa del servidor. De no ser así, se lo salta. Esto es por si quieres modificar tambien el programa del servidor, contenido en minecraft_server.jar).

Tras hacer ésto, nos aparecerá una carpeta llamada “src” en la carpeta del MCP. La carpeta con el código fuente que nos interesa está en “src/minecraft/net/minecraft/src”. Dentro encontraremos todas las clases a nuestra disposición para modificarlas. Para ello, símplemente abriremos cada una con el Notepad++.

El código fuente

El nombre de cada clase es bastante explicatorio, y nos dice que es lo que contiene. Las clases que empiezan por “Biome” pertenecen al generador de Biomes, que hacen que exístan desiertos, bosques y lugares fríos. “Block” son las clases de cada bloque. “Canvas” es para la pantalla. “Clipping” es para el movimiento del jugador y los mobs por el mapa. “Container” para los contenedores (inventario, cofres, furnaces…). “Chunk” son clases relacionadas con el contról de Chunks, que son los pedazos de tierra en los que se divide el mapa, y son parte también del generador de terreno. “Effect” son clases de efectos gráficos. “Entity” es una clase que controla todas las entidades del juego. Items, mobs, instrumentos, helpers…

“Gui” se corresponde con la interfaz de usuario (Graphical User Interface). “Item” contiene las propiedades para cada objeto del juego (un pico, una espada, un arco,una barra de pan…). “J_” Contiene clases relacionadas con el engine, pero no sé muy bien con que. “Model” contiene los modelos para cada cosa del juego. Como todo está creado mediante cubos, es muy fácil crear los modelos mediante código. “NBT” deben ser clases relacionadas con el formato de los archivos del mundo, probablemente para su manipulación. “NoiseGenerator” son clases relacionadas con el generador de mapas. “Packet” son clases para la comunicación en el multijugador, creo. “Render” son clases relacionadas con la apariencia de cada cosa del juego. Aquí se pueden modificar los tamaños y aspectos de los mobs, entre otras cosas.

Esas son las clases más llamativas del código. Como ya digo, el nombre de cada uno es explicativo en sí mismo, e indica lo que vas a encontrar dentro del archivo.

Recompilar y probar el código

Para recompilar el código, vamos a la carpeta del MCP y hacemos doble click en “recompile.bat”. Una vez más nos aparecerá una ventana de comandos, y tendremos que esperar a que termine de compilarse. Si lo hace satisfactoriamente, y no la hemos liado en alguno de los pasos anteriores, mostrará un mensaje parecido a éste:

Si por un casual hubiera algún error en el código, nos lo diría:

El compilador tiene la cortesía de decirnos el archivo, la línea y una descripción breve del error. Los errores más comunes son:

-Cannot find symbol: Indica que estamos intentando usar una variable, matríz o función que no ha sido previamente declarada o no exíste en el contexto (clase-función) actual, o bien hemos escrito de manera incorrecta el nombre de la variable/matriz/función que queriamos usar.

-index out of bounds exception: Indica que en una matríz, hemos superado los límites de la mísma. Por ejemplo, si definimos una matríz de 128 casillas, e intentamos acceder a la casilla 129, nos saldrá este error. Suele deberse a que hemos especificado un valor más elevado de lo esperado a una variable, o que hay un error en el código que hace que el programa se salga de los límites de la matríz.

-’;’ expected: Más claro, agua. Nos hemos dejado un punto y coma sin poner. Te indica la linea e incluso lo que has puesto, así que no deberías tener problemas.

Haz una copia de seguridad de todo el código antes de modificar nada. Si algo falla estrepitosamente y no sabes que hacer, recuperalo y vuelve a empezar.

Para probar el código, haz doble click sobre el archivo “startclient.bat”, y disfruta de tu minecraft modeado :slight_smile:


(¿No queriais ovejas? ¡Pues tomad un puñado de ellas!)

Reobfuscar el código

Para poder distribuir el código, necesitaras reobfuscar las clases que has modificado. Para ello, bastra con ejecutar el archivo “reobfuscate.bat”, en la carpeta del MCP.

El programa buscará las clases modificadas, comparando el MD5 de las clases que has modificado con los del minecraft.jar, y reobfuscará las modificadas. Las clases reobfuscadas aparecerán en la carpeta “reobf” del MCP, lístas para ser comprimidas en un RAR y distribuidas.

Para su instalación, sigue los pasos del apartado “Descarga de ejemplos”.

Ejemplos

A continuación, os propongo algunos ejemplos para practicar.

- Ovejas explosivas

Si estais hartos de que siempre os quiten la lana cuando la vais a coger vosotros, con este mod podreis hacer que las ovejas os den una desagradable sorpresa en vez de lana cuando las intenteis esquilar.

Para ello, abrid el archivo “EntitySheep.jar” del código fuente con el Notepad++. Buscamos en el código la función “attackEntityFrom(Entity entity, int i)”. Lo vamos a modificar, y vamos a añadir las líneas que voy a marcar en negrita:

NOTA: Algunas partes del código las ocultare poniendo muchas x, ya que en teoría no se debe publicar partes del código, aunque es una tontería porque cualquiera puede acceder a ellas, pero bueno. Solo pongo una parte para que podais averiguar donde va el código.

attackEntityFrom(Entity entity, int i){
if(!worldObj.mulxxxx)
{
setxxxrex(xxx);
int j = 1 + raxxxxxx(x);
for(intxxxxxx)
{
Enxxxxem entixxxx = entityxxxxxxxxxxxxxxxxx;
enxxxxem.mxxxx += rand.nexxxxxxxxxxxx;
enxxxxem.mxxxx += (rand.nexxxxxxxxxxxxxxxx;
enxxxxem.mxxxx += (rand.nexxxxxxxxxxxxx;
}
worldObj.createExplosion(this, posX, posY, posZ, 3F);
setEntityDead();

}
return sxxxxxxxx;
}

La función “createExplosion” de la clase “worldObj” hace que se cree una explosión en un lugar determinado. Se puede modificar el tamaño de la explosión, que se corresponde con el último parametro (en este caso, 3F). Se pone una F al final porque es un valor de tipo flotante (floating point). No recomiendo poner más de 20F, ya que el juego se ralentiza mucho.

setEntityDead mata a la entidad, borrandola del mapa.

Ahora guardadlo, compiladlo y probad a golpear una oveja.

- Gigacreepers e Hypercreepers

¿Crees que los creepers dan miedo? Pues si ya de por sí dan miedo, con éste mods van a ser de infarto.

Vamos a abrir el archivo “RenderCreeper.java” con el Notepad++. Ahora buscaremos dentro la función “updateCreeperScale” (está a la vista nada mas abrir el archivo). Modificad las variables f3 y f4, con valores (de punto flotante) muy superiores, aunque no mucho (no más de 10F). Guardamos el archivo, y abrimos el archivo “EntityCreeper.java”. En la función “writeEntityToNBT”, borramos la sentencia “if” entera, y dejamos solo una de las funciones “setBoolean” que hay dentro, la que establece como “True” la propiedad “charged”.

public void writeEntityToNBT(xxxxxxxx)
{
super.wrixxxxxxxxxxxxx;
if(dataWaxxxxxxxxxxxxxxxxxxxx) == 1)
nbtxxxxxxxd.setBoolean(“powered”, true);
}

Luego modifica la función “attackEntity”, en las líneas que crean explosiones (worldObj.createExplosion) coloca un valor superior de tamaño de la explosión (18F y 12F, concretamente, tal y como yo lo puse).

Compilamos y ejecutamos el juego. Espera a que anochezca, y preparate para lo que se avecina…

- Gambling de bloques

Con este mod, al romper un bloque, vamos a tener opciones de conseguir más bloques, o ninguno. Con esto, podremos duplicar bloques, pero ojo porque tambien lo podemos perder.

Abrimos el archivo “Block.java”. Primero de todo, tenemos que añadir un import en la cabecera, debajo del resto de imports:

import java.util.*;

Ahora, buscamos la función “quantityDropped”, y la cambiamos ENTERA por lo que voy a poner yo aquí (como ésta función la he reescrito yo integramente, puedo postearla sin censura):

public int quantityDropped(Random random)
{
  Random rand = new Random();
  int randval = rand.nextInt(99);
  if(randval < 49){
  return 1;
  }
  if(randval > 49 && randval < 58){
  return 2;
  }
  if(randval > 58 && randval < 62){
  return 3;
  }
  if(randval == 75){
  return 10;
  }
  if(randval > 89){
  return 0;
  }
  return 1;
}

Con ésto, al romper cualquier bloque, tendremos:

76% de probabilidad de obtener 1 bloque
9% de probabilidad de obtener 2 bloques
4% de probabilidad de obtener 3 bloques
1% de probabilidad de obtener 10 bloques
10% de probabilidad de romperse el bloque y no obtener nada.

Descarga de ejemplos

Os podeis descargar las clases de los ejemplos ya reobfuscadas (reobfuscadas y subidas por Archreg) desde mediafire. Funciona con la versión 1.5_01. Podeis añadirlas a vuestro Minecraft de la siguiente forma:

[ul]1. Ir a Inicio > Ejecutar, escribid %appdata% y pulsad aceptar.[/ul]
[ul]2. Abrir la carpeta .minecraft. Dentro de ésta carpeta, abrid la carpeta bin.[/ul]
[ul]3. Abrir el archivo “minecraft.jar” con Winrar (click derecho sobre Minecraft.jar -> Abrir con -> Winrar. Si no aparece Winrar, selecciona “Elegir programa” y busca “Winrar” en la lísta de programas. Si no aparece, descarga e instala Winrar).[/ul]
[ul]4. Arrastra los archivos .class de los mods que quieras instalar al archivo minecraft.jar, y borra la carpeta META-INF del mísmo.[/ul]
[ul]5. Cierra todo y ejecuta Minecraft.[/ul]

NOTA: Podría haber algunos conflictos con otros mods que pudieras tener instalados, ya que como es evidente, estos mods no están diseñados para ser compatibles con otros mods.

Y ésto es todo lo que necesitas saber para empezar a crear tus propios mods para Minecraft. Espero que ésta guía te sirva de ayuda para disfrutar de Minecraft al maximo.

Bastante bien, pero te falta la parte de Reobfuscar para que otros puedan usar el mod y no lo tengas que solo “probar” desde el MCP :l

(Lo sé hacer pero en la nueva versión del MCP es muy raro y no sale la carpeta final_out ni la carpetas de herramientas, por lo que hay que sacar el nombre de las clases :? ; y los class (TODOS) se convierten en x.class (Siendo x el nombre de la clase por lo que no servirá si lo metes en minecraft.jar)

Ahora todos saben de mods menos chocolate¬¬ GRR

no te preocupes chocolate…
ya somos 2 ._.

3 querras decir

hagamos un grupito de aquellos que no saben hacer mods

Una cosa…

Si no sabeis ¿Por qué no leeis el * tutorial? xD

Por que no sabemos leer

Touché. xD

Es fácil, joer. Si sabes algo de programación, claro. Si no, pues… como si te hablaran en chino xD.

Lo de reobfuscar, lo voy a investigar un poco cuando tenga algo de ganas, y lo añadiré al tutorial, ya que es importante saberlo. En teoría debería ser ejecutando el archivo “reobfuscate.bat”. De ahí te aparece una nueva carpeta llamada “reobf” con los archivos “class” ya reobfuscados. Pero no he probado si funcionan o no al meterlos en el jar. Ya investigaré.

Al reobfuscar primero no está lo de configuración para elegir qué class reobfuscar, y segundo no sale nada en la carpeta :frowning: (Sale vacía D:)

He estado mirando el bat, y el comando apunta a un archivo de configuración llamado mcp.cfg, que es el archivo de configuración del MCP. En éste archivo no se especifica las clases a reobfuscar, por lo cual supongo que intentará reobfuscar todas las clases, o quizá detecte las clases modificadas y las reobfusque automáticamente.

En cuanto a lo de la carpeta vacía, algo tienes mal en tu MCP.

Bueno, lo reinstalaré y probaré :smiley: Grx

EDIT: No me había fijado en los ejemplos del post, pero pon el * código entero pls, o por lo menos podrías indicar la línea o las partes del principio de la función :l (No va a pasar nada por poner el código xD)

No me refiero a que lo cambies ahora, sino que a la próx :wink:

EDIT2: Funciona :smiley:
PD: ¿Te importaría si hago los mods de los ejemplos y los subo a mf para darte los links por mp y los pongas en el post? :smiley:

EDIT3: Ya los tengo ¿Los quieres? :smiley: (O cualquier otra persona :wink: )

Subelos y ya los meto al post cuando tenga tiempo, esta tarde por ejemplo.

Lo de las lineas, sé que es exagerado, pero por si acaso. Es que busqué en internet y no he visto ni una sola referencia al código, y como la información del copyright del juego dice que no distribuya nada, pues pensé que a lo mejor podría haber pleito si lo pongo al público.

http://www.minecraft.net/copyright.jsp

Pero al fín y al cabo, cualquiera puede obtener acceso al código mediante al MCP, así que es casi como si fuese público. Pero bueno, ya te digo, por si las moscas. Ya veré que hago en cuanto a eso.

Hola, veras, yo tengo entiendo un poco de java, no mucho, ya que lo que yo uso para programar (processing) tiene un parecido al java, de echo creo k lo usa internamente o no se que mas… WEno la cosa no es eso, sino que yo entre aqui buscando la class de los crafteos, no la encuentro.
Lo que quiero hacer es que los portales, (id: 90) se craften de alguna forma, los materiales ya los pensare. No pregunteis el pork kiero hacer eso xD
Weno si puedes decirme donde encontrarle pls, i si me dices ya como hacer mejor, ya que tengo un bajo nivel de programacion, la max que he hecho (en condiciones) ha sido un buscaminas xD

Saludos.

En teoría no deberíais revivir temas viejos, pero bueno. Supongo que por esta vez está justificado.

El tema requiere modificar una clase, que es la CraftingManager.java . Sólo tienes que añadir una nueva receta a las ya existentes, no es muy complicado. La receta daría como resultado bloques de portal del nether. La lísta de bloques la tienes en la clase Block.java, pero el bloque que te interesa en cuestión es el BlockPortal.java.

Troll ¿Cómo se puede saber si una variación en la programación del codigo de minecraft necesita de ModLoader, AudioMod, etc.?

Una modificación en un programa, así como un programa cualquiera, sólo requiere de codigo externo (librerías o clases externas) si así se lo especificas tú. Lo que quiero decir, es que a menos que tú diseñes tu mod para ser ejecutado bajo esas otras clases a proposito (que se llaman APIs), no es necesario de ninguna otra clase externa.

Si no he entendido mal, si lo que yo diseñe es un mod para ser ejecutado bajo un API, necesita ModLoader, no?

Más concretamente, si tú programas ese mod utilizando la api del ModLoader. El ModLoader es una API (Application Program Interface). No son más que una serie de rutinas a las que enchufas tu mod, de modo que al iniciar el minecraft, ModLoader carga todos los mods programados para ser ejecutados de ésta forma.

Por defecto, tus mods correrán sin necesidad de nada más. Es sólo si tú lo programas para funcionar en conjunto con otro mod, cuando necesitas del otro mod con el que quieras trabajar en conjunto. Puede ser el modloader o cualquier otro.

Solo tienes que crear un paquete y una clase y te saldra reofuscada si no la creas saldra vacia