Un curso técnico para aprender modding en serio: no es para copiar recetas. La idea es entender cómo funciona el juego por dentro y poder averiguar solo lo que ninguna guía explica.
Para quién: alguien que ya programa. No se explica qué es una variable o un for. Sí se explica todo lo propio de Project Zomboid: el motor, Kahlua, la frontera Lua ↔ Java, los formatos de los assets y cómo leer el código del juego.
Cómo se usa: cada módulo tiene teoría corta, un recorrido por los archivos reales del juego, ejercicios con criterio de "listo" y un desafío. Todo lo que construyes va a un solo mod de práctica, CursoLab, que crece módulo a módulo y que puedes cargar en el juego en cualquier momento.
Antes de empezar
- Necesitas tu copia de
media/del juego, que en el curso llamamos_juego/(scripts, lua, traducciones), por ejemplo en~/Zomboid/Workshop/_juego/. Ahí se hacen los recorridos "míralo en el juego": abre esa carpeta en VS Code junto al curso. - Para los módulos de Java (07 a 09) también hace falta
projectzomboid.jaren_juego/(el módulo 08 explica cómo prepararlo y cómo actualizarlo). - Las guías del sitio son el resumen práctico; este curso es la versión larga y con el porqué.
- El curso usa como fuente lo que descubrimos haciendo los mods de Wenopal.
Temario
Parte 1: fundamentos
| # | Módulo | Qué aprendes | Ejercicio central |
|---|---|---|---|
| 00 | Entorno de trabajo | Carpetas, modo debug, consola, console.txt, VS Code con tipos de PZ, ciclo editar → recargar | CursoLab carga y escribe en la consola |
| 01 | Anatomía del juego y de un mod | media/, módulos, cómo el juego junta los archivos de los mods, orden de carga, 42/ y common/ | Encontrar en el juego de dónde sale un ítem, una receta y un texto |
| 02 | Scripts: ítems | Sintaxis de los .txt, module/imports, tipos de ítem, campos, tags, cómo el juego los parsea | Tres ítems nuevos (comida, herramienta, arma) |
| 03 | Scripts: recetas y entidades B42 | craftRecipe, inputs/outputs, mode:keep, tags, itemMapper, entity y estaciones | Recetas que usan tags y una estación propia |
| 04 | Texturas e íconos | Formatos, tamaños, nombres que busca el motor, .pack vs sueltos, UI y overlays | Íconos y una textura propia para los ítems |
| 05 | Modelos 3D | Blender → FBX/X, escala y ejes, model scripts, attachment, ropa (clothing.xml, fileGuidTable) | Un objeto en la mano y una prenda |
Parte 2: Lua y el motor
| # | Módulo | Qué aprendes | Ejercicio central |
|---|---|---|---|
| 06 | Lua en PZ (Kahlua) | Lua 5.1 sobre la JVM: diferencias, require, globales, client/server/shared, eventos | Sistema propio que reacciona a eventos |
| 07 | La frontera Lua ↔ Java | Cómo Java expone clases y funciones a Lua (LuaManager, Exposer), objetos Java desde Lua, instanceof, métodos que no existen | Inspeccionar objetos vivos del juego desde la consola |
| 08 | Leer el código de Java | Sacar el .jar, decompilar (CFR/Vineflower), javap y bytecode, buscar comportamiento real | Descubrir cómo calcula el juego el loot y comprobarlo |
| 08b | Bytecode a fondo | Anatomía de un .class, qué sacar del bytecode (valores por defecto, quién llama a quién, eventos que nunca se disparan, permisos de red, cambios entre versiones), la herramienta pzxref, qué gana un mod (bugs silenciosos, números exactos, actualizaciones, multijugador) | Encontrar un evento registrado que el juego nunca dispara y comprobarlo |
| 09 | Sobrescribir comportamiento | Parchear funciones Lua del juego sin romperlas (hook/wrap), límites de lo que se puede cambiar desde Lua | Cambiar una acción del juego de forma compatible |
Parte 3: sistemas del juego
| # | Módulo | Qué aprendes | Ejercicio central |
|---|---|---|---|
| 10 | Menús contextuales e interfaz | ISContextMenu, ISPanel, ISUIElement, ventanas, fuentes y escalado | Menú contextual y una ventana propia |
| 11 | Timed actions | ISBaseTimedAction: ciclo de vida, animaciones, cola, cancelar | Una acción con barra de progreso |
| 12 | Multijugador | Qué corre dónde, sendClientCommand/sendServerCommand, ModData, sincronizar sin trampas | Una función de CursoLab que funcione en un servidor |
| 13 | Loot, sandbox y traducciones | Distribuciones, OnPostDistributionMerge, opciones de sandbox, JSON de traducción | Loot configurable desde sandbox |
| 14 | Datos persistentes y rendimiento | ModData global y de objetos, OnTick vs eventos, perfilar, evitar lag | Medir y optimizar un sistema |
Parte 4: depurar y publicar
| # | Módulo | Qué aprendes | Ejercicio central |
|---|---|---|---|
| 15 | Depuración en serio | Leer stack traces de Kahlua, debugger de Lua, recarga en caliente, aislar bugs, bisectar mods | Arreglar bugs plantados en una copia de CursoLab |
| 16 | Casos reales | Bugs que aparecieron en los mods de Wenopal (ropa, vehículos, MP) y cómo se resolvieron | Reproducir y explicar dos de ellos |
| 17 | Publicar y mantener | Workshop, versiones, compatibilidad entre parches, migraciones B41 → B42 | Publicar CursoLab como mod oculto |
Proyecto final
Un mod completo de tu elección que use lo de todo el curso. La lista de requisitos está al final del módulo 17.