Capitulo 8.1: Tu Primer Mod (Hello World)
Inicio | Tu Primer Mod | Siguiente: Crear un Item Personalizado >>
Tabla de Contenidos
- Requisitos Previos
- Paso 1: Instalar DayZ Tools
- Paso 2: Configurar la Unidad P: (Workdrive)
- Paso 3: Crear la Estructura de Directorios del Mod
- Paso 4: Escribir mod.cpp
- Paso 5: Escribir config.cpp
- Paso 6: Escribir Tu Primer Script
- Paso 7: Empaquetar el PBO con Addon Builder
- Paso 8: Cargar el Mod en DayZ
- Paso 9: Verificar en el Script Log
- Paso 10: Solucion de Problemas Comunes
- Referencia Completa de Archivos
- Siguientes Pasos
Requisitos Previos
Antes de comenzar, asegurate de tener:
- Steam instalado y con sesion iniciada
- DayZ instalado (version retail de Steam)
- Un editor de texto (VS Code, Notepad++, o incluso Notepad)
- Aproximadamente 15 GB de espacio libre en disco para DayZ Tools
Eso es todo. No se requiere experiencia en programacion para este tutorial -- cada linea de codigo esta explicada.
Paso 1: Instalar DayZ Tools
DayZ Tools es una aplicacion gratuita en Steam que incluye todo lo que necesitas para construir mods: el editor de scripts Workbench, Addon Builder para empaquetar PBOs, Terrain Builder y Object Builder.
Como Instalar
- Abre Steam
- Ve a Biblioteca
- En el filtro desplegable de arriba, cambia Juegos a Herramientas
- Busca DayZ Tools
- Haz clic en Instalar
- Espera a que la descarga se complete (son aproximadamente 12-15 GB)
Una vez instalado, encontraras DayZ Tools en tu biblioteca de Steam bajo Herramientas. La ruta de instalacion predeterminada es:
C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Que Se Instala
| Herramienta | Proposito |
|---|---|
| Addon Builder | Empaqueta los archivos de tu mod en archivos .pbo |
| Workbench | Editor de scripts con resaltado de sintaxis |
| Object Builder | Visor y editor de modelos 3D para archivos .p3d |
| Terrain Builder | Editor de mapas/terreno |
| TexView2 | Visor/convertidor de texturas (.paa, .edds) |
Para este tutorial, solo necesitas Addon Builder. Los otros son utiles mas adelante.
Paso 2: Configurar la Unidad P: (Workdrive)
El modding de DayZ usa una letra de unidad virtual P: como espacio de trabajo compartido. Todos los mods y datos del juego referencian rutas que comienzan desde P:, lo que mantiene las rutas consistentes entre diferentes maquinas.
Crear la Unidad P:
- Abre DayZ Tools desde Steam
- En la ventana principal de DayZ Tools, haz clic en P: Drive Management (o busca un boton etiquetado "Mount P drive" / "Setup P drive")
- Haz clic en Create/Mount P: Drive
- Elige una ubicacion para los datos de la unidad P: (la predeterminada esta bien, o elige una unidad con suficiente espacio)
- Espera a que el proceso se complete
Verificar que Funciona
Abre el Explorador de Archivos y navega a P:\. Deberias ver un directorio que contiene datos del juego DayZ. Si la unidad P: existe y puedes navegarla, estas listo para continuar.
Alternativa: Unidad P: Manual
Si la GUI de DayZ Tools no funciona, puedes crear una unidad P: manualmente usando un simbolo del sistema de Windows (ejecutar como Administrador):
subst P: "C:\DayZWorkdrive"Reemplaza C:\DayZWorkdrive con cualquier carpeta que quieras. Esto crea un mapeo de unidad temporal que dura hasta que reinicies. Para un mapeo permanente, usa net use o la GUI de DayZ Tools.
Que Pasa Si No Quiero Usar la Unidad P:?
Puedes desarrollar sin la unidad P: colocando tu carpeta de mod directamente en el directorio del juego DayZ y usando el modo -filePatching. Sin embargo, la unidad P: es el flujo de trabajo estandar y toda la documentacion oficial la asume. Recomendamos fuertemente configurarla.
Paso 3: Crear la Estructura de Directorios del Mod
Todo mod de DayZ sigue una estructura de carpetas especifica. Crea los siguientes directorios y archivos en tu unidad P: (o en tu directorio del juego DayZ si no usas P:):
P:\MyFirstMod\
mod.cpp
Scripts\
config.cpp
5_Mission\
MyFirstMod\
MissionHello.cCrear las Carpetas
- Abre el Explorador de Archivos
- Navega a
P:\ - Crea una nueva carpeta llamada
MyFirstMod - Dentro de
MyFirstMod, crea una carpeta llamadaScripts - Dentro de
Scripts, crea una carpeta llamada5_Mission - Dentro de
5_Mission, crea una carpeta llamadaMyFirstMod
Entendiendo la Estructura
| Ruta | Proposito |
|---|---|
MyFirstMod/ | Raiz de tu mod |
mod.cpp | Metadatos (nombre, autor) mostrados en el launcher de DayZ |
Scripts/config.cpp | Le dice al motor de que depende tu mod y donde estan los scripts |
Scripts/5_Mission/ | La capa de script de mision (UI, hooks de arranque) |
Scripts/5_Mission/MyFirstMod/ | Subcarpeta para los scripts de mision de tu mod |
Scripts/5_Mission/MyFirstMod/MissionHello.c | Tu archivo de script real |
Necesitas exactamente 3 archivos. Vamos a crearlos uno por uno.
Paso 4: Escribir mod.cpp
Crea el archivo P:\MyFirstMod\mod.cpp en tu editor de texto y pega este contenido:
name = "My First Mod";
author = "YourName";
version = "1.0";
overview = "My very first DayZ mod. Prints Hello World to the script log.";Que Hace Cada Linea
name-- El nombre que se muestra en la lista de mods del launcher de DayZ. Los jugadores ven esto al seleccionar mods.author-- Tu nombre o nombre de equipo.version-- Cualquier string de version que quieras. El motor no lo parsea.overview-- Una descripcion mostrada al expandir los detalles del mod.
Guarda el archivo. Esa es la tarjeta de identidad de tu mod.
Paso 5: Escribir config.cpp
Crea el archivo P:\MyFirstMod\Scripts\config.cpp y pega este contenido:
class CfgPatches
{
class MyFirstMod_Scripts
{
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredAddons[] =
{
"DZ_Data"
};
};
};
class CfgMods
{
class MyFirstMod
{
dir = "MyFirstMod";
name = "My First Mod";
author = "YourName";
type = "mod";
dependencies[] = { "Mission" };
class defs
{
class missionScriptModule
{
value = "";
files[] = { "MyFirstMod/Scripts/5_Mission" };
};
};
};
};Que Hace Cada Seccion
CfgPatches declara tu mod al motor de DayZ:
class MyFirstMod_Scripts-- Un identificador unico para el paquete de scripts de tu mod. No debe colisionar con ningun otro mod.units[] = {}; weapons[] = {};-- Listas de entidades y armas que tu mod agrega. Vacias por ahora.requiredVersion = 0.1;-- Version minima del juego. Siempre0.1.requiredAddons[] = { "DZ_Data" };-- Dependencias.DZ_Datason los datos base del juego. Esto asegura que tu mod se cargue despues del juego base.
CfgMods le dice al motor donde estan tus scripts:
dir = "MyFirstMod";-- Directorio raiz del mod.type = "mod";-- Este es un mod de cliente+servidor (a diferencia de"servermod"para solo servidor).dependencies[] = { "Mission" };-- Tu codigo se engancha al modulo de script de Mission.class missionScriptModule-- Le dice al motor que compile todos los archivos.cencontrados enMyFirstMod/Scripts/5_Mission/.
Por que solo 5_Mission? Porque nuestro script Hello World se engancha al evento de arranque de la mision, que vive en la capa de mision. La mayoria de los mods simples empiezan aqui.
Paso 6: Escribir Tu Primer Script
Crea el archivo P:\MyFirstMod\Scripts\5_Mission\MyFirstMod\MissionHello.c y pega este contenido:
modded class MissionServer
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The SERVER mission has started.");
}
};
modded class MissionGameplay
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The CLIENT mission has started.");
}
};Explicacion Linea por Linea
modded class MissionServerLa palabra clave modded es el corazon del modding de DayZ. Dice: "Toma la clase existente MissionServer del juego vanilla y agrega mis cambios encima." No estas creando una nueva clase -- estas extendiendo la existente.
override void OnInit()OnInit() es llamado por el motor cuando una mision empieza. override le dice al compilador que este metodo ya existe en la clase padre y lo estamos reemplazando con nuestra version.
super.OnInit();Esta linea es critica. super.OnInit() llama a la implementacion vanilla original. Si omites esto, el codigo de inicializacion de la mision vanilla nunca se ejecuta y el juego se rompe. Siempre llama a super primero.
Print("[MyFirstMod] Hello World! The SERVER mission has started.");Print() escribe un mensaje al archivo de log de scripts de DayZ. El prefijo [MyFirstMod] hace facil encontrar tus mensajes en el log.
modded class MissionGameplayMissionGameplay es el equivalente del lado del cliente de MissionServer. Cuando un jugador se une a un servidor, MissionGameplay.OnInit() se dispara en su maquina. Al moddear ambas clases, tu mensaje aparece tanto en los logs del servidor como del cliente.
Sobre los Archivos .c
Los scripts de DayZ usan la extension de archivo .c. A pesar de verse como C, esto es Enforce Script, el lenguaje de scripting propio de DayZ. Tiene clases, herencia, arrays y maps, pero no es C, C++ ni C#. Tu IDE puede mostrar errores de sintaxis -- eso es normal y esperado.
Paso 7: Empaquetar el PBO con Addon Builder
DayZ carga mods desde archivos .pbo (similar a .zip pero en un formato que el motor entiende). Necesitas empaquetar tu carpeta Scripts en un PBO.
Usando Addon Builder (GUI)
Abre DayZ Tools desde Steam
Haz clic en Addon Builder para lanzarlo
Establece Source directory a:
P:\MyFirstMod\Scripts\Establece Output/Destination directory a una nueva carpeta:
P:\@MyFirstMod\Addons\Crea la carpeta
@MyFirstMod\Addons\primero si no existe.En Addon Builder Options:
- Establece Prefix a:
MyFirstMod\Scripts - Deja las otras opciones en sus valores predeterminados
- Establece Prefix a:
Haz clic en Pack
Si tiene exito, veras un archivo en:
P:\@MyFirstMod\Addons\Scripts.pboConfigurar la Estructura Final del Mod
Ahora copia tu mod.cpp junto a la carpeta Addons:
P:\@MyFirstMod\
mod.cpp <-- Copiar de P:\MyFirstMod\mod.cpp
Addons\
Scripts.pbo <-- Creado por Addon BuilderEl prefijo @ en el nombre de la carpeta es una convencion para mods distribuibles. Senala a los administradores de servidores y al launcher que este es un paquete de mod.
Alternativa: Probar Sin Empaquetar (File Patching)
Durante el desarrollo, puedes omitir el empaquetado PBO completamente usando el modo file patching. Esto carga scripts directamente de tus carpetas fuente:
DayZDiag_x64.exe -mod=P:\MyFirstMod -filePatchingEl file patching es mas rapido para iteracion porque editas un archivo .c, reinicias el juego y ves los cambios inmediatamente. No se necesita paso de empaquetado. Sin embargo, el file patching solo funciona con el ejecutable diagnostico (DayZDiag_x64.exe) y no es adecuado para distribucion.
Paso 8: Cargar el Mod en DayZ
Hay dos formas de cargar tu mod: a traves del launcher o via parametros de linea de comandos.
Opcion A: Launcher de DayZ
- Abre el Launcher de DayZ desde Steam
- Ve a la pestana Mods
- Haz clic en Add local mod (o "Add mod from local storage")
- Navega a
P:\@MyFirstMod\ - Habilita el mod marcando su casilla
- Haz clic en Play (asegurate de conectarte a un servidor local/offline, o lanzar en modo un jugador)
Opcion B: Linea de Comandos (Recomendado para Desarrollo)
Para iteracion mas rapida, lanza DayZ directamente con parametros de linea de comandos. Crea un acceso directo o archivo batch:
Usando el Ejecutable Diagnostico (con file patching, sin PBO necesario):
"C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\MyFirstMod -filePatching -server -config=serverDZ.cfg -port=2302Usando el PBO empaquetado:
"C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\@MyFirstMod -server -config=serverDZ.cfg -port=2302El flag -server lanza un listen server local. El flag -filePatching permite cargar scripts desde carpetas sin empaquetar.
Prueba Rapida: Modo Offline
La forma mas rapida de probar es lanzar DayZ en modo offline:
DayZDiag_x64.exe -mod=P:\MyFirstMod -filePatchingLuego en el menu principal, haz clic en Play y selecciona Offline Mode (o Community Offline). Esto inicia una sesion local de un jugador sin necesitar un servidor.
Paso 9: Verificar en el Script Log
Despues de lanzar DayZ con tu mod, el motor escribe toda la salida de Print() en archivos de log.
Encontrar los Archivos de Log
DayZ almacena logs en tu directorio AppData local:
C:\Users\<TuNombreDeUsuarioDeWindows>\AppData\Local\DayZ\Para llegar alli rapidamente:
- Presiona Win + R para abrir el dialogo Ejecutar
- Escribe
%localappdata%\DayZy presiona Enter
Busca el archivo mas reciente con nombre como:
script_<fecha>_<hora>.logPor ejemplo: script_2025-01-15_14-30-22.log
Que Buscar
Abre el archivo de log en tu editor de texto y busca [MyFirstMod]. Deberias ver uno de estos mensajes:
[MyFirstMod] Hello World! The SERVER mission has started.o (si cargaste como cliente):
[MyFirstMod] Hello World! The CLIENT mission has started.Si ves tu mensaje: felicitaciones. Tu primer mod de DayZ esta funcionando. Has logrado exitosamente:
- Crear una estructura de directorios de mod
- Escribir una config que el motor lee
- Engancharte a codigo vanilla del juego con
modded class - Imprimir salida al script log
Que Pasa Si Ves Errores?
Si el log contiene lineas que empiezan con SCRIPT (E):, algo salio mal. Lee la siguiente seccion.
Paso 10: Solucion de Problemas Comunes
Problema: Sin Salida en el Log (El Mod No Parece Cargar)
Verifica tus parametros de lanzamiento. La ruta de -mod= debe apuntar a la carpeta correcta. Si usas file patching, verifica que la ruta apunte a la carpeta que contiene Scripts/config.cpp directamente (no la carpeta @).
Verifica que config.cpp existe en el nivel correcto. Debe estar en Scripts/config.cpp dentro de la raiz de tu mod. Si esta en la carpeta equivocada, el motor ignora silenciosamente tu mod.
Verifica el nombre de clase CfgPatches. Si no hay bloque CfgPatches, o su sintaxis esta mal, el PBO completo se omite.
Mira el log principal de DayZ (no solo el script log). Verifica:
C:\Users\<TuNombre>\AppData\Local\DayZ\DayZ_<fecha>_<hora>.RPTBusca el nombre de tu mod. Puedes ver mensajes como "Addon MyFirstMod_Scripts requires addon DZ_Data which is not loaded."
Problema: SCRIPT (E): Undefined variable o Undefined type
Esto significa que tu codigo referencia algo que el motor no reconoce. Causas comunes:
- Typo en un nombre de clase.
MisionServeren lugar deMissionServer(nota la doble 's'). - Capa de script equivocada. Si referencias
PlayerBasedesde5_Mission, deberia funcionar. Pero si accidentalmente colocaste tu archivo en3_Gamey referencias tipos de mision, obtendras este error. - Falta la llamada a
super.OnInit(). Omitirla puede causar fallas en cascada.
Problema: SCRIPT (E): Member not found
El metodo que estas llamando no existe en la clase. Verifica el nombre del metodo y asegurate de estar sobreescribiendo un metodo real de vanilla. OnInit existe en MissionServer y MissionGameplay -- pero no en todas las clases.
Problema: El Mod Carga Pero el Script Nunca Se Ejecuta
- Extension de archivo: Asegurate de que tu archivo de script termine en
.c(no.c.txto.cs). Windows puede ocultar extensiones por defecto. - Desajuste de ruta de script: La ruta de
files[]enconfig.cppdebe coincidir con tu directorio real."MyFirstMod/Scripts/5_Mission"significa que el motor busca una carpeta en esa ruta exacta relativa a la raiz del mod. - Nombre de clase:
modded class MissionServerdistingue mayusculas de minusculas. Debe coincidir exactamente con el nombre de la clase vanilla.
Problema: Errores de Empaquetado PBO
- Asegurate de que
config.cppesta al nivel raiz de lo que estas empaquetando (la carpetaScripts/). - Verifica que el prefix en Addon Builder coincida con la ruta de tu mod.
- Asegurate de que no haya archivos que no sean de texto mezclados en la carpeta Scripts (sin
.exe,.dll, o archivos binarios).
Problema: El Juego Crashea al Iniciar
- Verifica errores de sintaxis en
config.cpp. Un punto y coma, llave o comilla faltante puede crashear el parser de config. - Verifica que
requiredAddonsliste nombres de addon validos. Un nombre de addon mal escrito causa un fallo critico. - Remueve tu mod de los parametros de lanzamiento y confirma que el juego inicia sin el. Luego vuelve a agregarlo para aislar el problema.
Referencia Completa de Archivos
Aqui estan los tres archivos en su forma completa, para copiar y pegar facilmente:
Archivo 1: MyFirstMod/mod.cpp
name = "My First Mod";
author = "YourName";
version = "1.0";
overview = "My very first DayZ mod. Prints Hello World to the script log.";Archivo 2: MyFirstMod/Scripts/config.cpp
class CfgPatches
{
class MyFirstMod_Scripts
{
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredAddons[] =
{
"DZ_Data"
};
};
};
class CfgMods
{
class MyFirstMod
{
dir = "MyFirstMod";
name = "My First Mod";
author = "YourName";
type = "mod";
dependencies[] = { "Mission" };
class defs
{
class missionScriptModule
{
value = "";
files[] = { "MyFirstMod/Scripts/5_Mission" };
};
};
};
};Archivo 3: MyFirstMod/Scripts/5_Mission/MyFirstMod/MissionHello.c
modded class MissionServer
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The SERVER mission has started.");
}
};
modded class MissionGameplay
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The CLIENT mission has started.");
}
};Siguientes Pasos
Ahora que tienes un mod funcional, aqui estan las progresiones naturales:
- Capitulo 8.2: Crear un Item Personalizado -- Definir un nuevo item en el juego con texturas y spawn.
- Agregar mas capas de script -- Crea carpetas
3_Gamey4_Worldpara organizar configuracion, clases de datos y logica de entidades. Consulta Capitulo 2.1: La Jerarquia de 5 Capas de Scripts. - Agregar keybindings -- Crea un archivo
Inputs.xmly registra acciones de teclas personalizadas. - Crear UI -- Construye paneles dentro del juego usando archivos layout y
ScriptedWidgetEventHandler. Consulta Capitulo 3: Sistema de GUI. - Usar un framework -- Integra con Community Framework (CF) o MyFramework para funciones avanzadas como RPC, gestion de config y paneles de admin.
Siguiente: Capitulo 8.2: Crear un Item Personalizado
