---
title: Cómo funciona el código X4: de un archivo a una acción
summary: Lo que ejecuta el juego, por qué XML, MD, AI y Lua tienen diferentes roles, y cómo leer un pequeño mod desde cero.
section: start
kind: guide
status: reference
updated: 2026-10-26
tags: ["X4","modding","x4","code","basics"]
sources: ["https://wiki.egosoft.com/X4%20Foundations%20Wiki/Modding%20Support/","https://wiki.egosoft.com/X%20Rebirth%20Wiki/Modding%20support/Mission%20Director%20Guide/"]
---
## Empieza con una idea
Un mod proporciona instrucciones y datos que X4 lee en el momento adecuado. No necesita un archivo principal a través del cual cada evento pasa. Carga de datos de envío como recursos, MD espera condiciones, AI ejecuta el comportamiento, y Lua maneja UI.
El motor es la parte ejecutable del juego: crea objetos, calcula el movimiento, almacena el mundo y realiza operaciones expuestas a los scripts. Su fuente completa no está en una carpeta mod. Una extensión utiliza formatos compatibles y API. Una API es un conjunto de formas disponibles de interactuar con un sistema, como leer el nombre de un objeto o enviar un evento.
Esta guía cubre el modding regular. Nuevos ejemplos son explicativos y no fueron ejecutados por separado en el juego. Los valores Elite originales fueron comprobados con los archivos X4 9.00 instalados.
## Por qué se involucran varios idiomas
Diferentes trabajos necesitan representaciones diferentes. Un valor del casco se almacena convenientemente como datos; una reacción de evento necesita un controlador; un botón necesita un widget y una función de clic.
| Capa | Ubicación típica | Trabajo |
| --- | --- | --- |
| Datos XML | `assets/`, `libraries/`, `t/` | Propiedades, productos y texto traducido |
| Diff XML | Coincidiendo con la ruta de recurso objetivo | Cambiar partes seleccionadas de un documento |
| Mission Director | `md/*.xml` | Reacciona a los eventos y realiza la lógica del mundo |
| Scripts de inteligencia artificial | `aiscripts/*.xml` | Comportamiento y órdenes de los actores |
| Lua UI | `ui/*.lua`, registrado en `ui.xml` | Ventanas, tablas e entradas |
| Código nativo | Un motor o un DLL de mod | Integración de nivel inferior |
MD y AI usan XML pero tienen sus propios elementos y reglas de ejecución. Inspeccione el elemento raíz y el directorio en lugar de juzgar solo por la extensión. Python o C# pueden aparecer en herramientas y proyectos complejos; eso no los hace integrados en lenguajes MD. Un primer parche XML solo necesita su manifiesto y diferencia.
## ¿Qué sucede cuando una extensión se carga
El diagrama original a continuación resume las responsabilidades en lugar de prometer un orden de carga universal exacto. La versión X4, DLC, las pérdidas, otros mods y estado guardado afectan al resultado. `content.xml` identifica la extensión y su versión/dependencia. `ui.xml` Lista de archivos Lua para un entorno de UI. Los campos de versión manifiestos tienen un formato de serie definido; no sustituya una cadena de versión humana arbitraria como 0.1.0.
```text
extensions/имя_мода/content.xml
→ игра узнаёт расширение и его зависимости
→ получает ресурсы с учётом расширений и патчей
→ загружает подходящие скрипты и UI
→ события и callbacks вызывают обработчики
→ движок меняет состояние мира
```
## Ejemplo 1: XML almacena una propiedad
En la ilustración macro acortada a continuación, el casco es un elemento, max es un atributo y 1800 es su valor. XML en sí mismo no ejecuta un bucle; el motor interpreta ese campo en el contexto del recurso. Una diferencia separada cambia el atributo seleccionado.
Lea el se como se dice: `/macros/macro`, mantener la macro con el nombre especificado, introducir `/properties/hull`, luego seleccione `/@max`. Esto es XPath sobre un documento, no una condición MD o una búsqueda de una nave viva. Un cambio de recurso todavía necesita pruebas en objetos guardados existentes. Ver [el primer parche completo](wiki:editing-parameters).
```xml
```
```xml
3600
```
## Ejemplo 2: MD realiza acciones
El primer fragmento asigna 3 a `$Count`, prueba si es mayor que cero e imprime un diagnóstico. `actions`; no es una extensión independiente. Las comillas externas XML delimitan un atributo; dentro de exacto, el número 3 difiere de una cadena citada.
Un script MD completo tiene mdscript, cues, condiciones de entrada y acciones. Un cue es un nodo lógico con estado: puede esperar, activar y completar. Piense en los manejadores impulsados por eventos en lugar de un archivo entero continuamente reimpedir desde la parte superior. `instantiate=true namespace=this` permite que los eventos repetidos tengan instancias con sus propios contextos variables. Leer [cues](wiki:md-cues), [variables](wiki:md-variables) y la documentación primaria vinculada para la versión real del juego.
```xml
```
```xml
```
## Ejemplo 3: Lua es llamado por la UI
El ejemplo plano de Lua a continuación no utiliza APIs de juego. `local` crea un nombre local, `function` define una función, su argumento recibe entrada, `return` produce un resultado, y `..` Los mensajes originales de muestra conservan su idioma original.
Una función asignada a un botón es llamada más tarde por la UI; esto es una llamada de vuelta. Asignar una función y llamarla inmediatamente son operaciones diferentes. Los ejemplos ilustran esa distinción sin inventar una API de botón.
```lua
local function makeLabel(name)
if type(name) ~= "string" or name == "" then
return "Без имени"
end
return "Корабль: " .. name
end
local label = makeLabel("Север")
```
```lua
local callback = makeLabel -- сохранить саму функцию
local result = makeLabel("Север") -- вызвать и сохранить ответ
```
## Cómo una ventana y el mundo se comunican
Lua tiene APIs de lectura de juegos y algunas operaciones de motores; MD expone un conjunto diferente de acciones y propiedades. Elija la capa en función de la operación y el ciclo de vida disponibles. No todos los cambios del mundo deben pasar a través de MD.
Un intercambio común utiliza AddUITriggeredEvent a MD, luego raise_lua_event a una callback RegisterEvent. Estas son instalaciones de entorno X4: Lua ordinario no los proporciona. MD set_value y raise_lua_event son elementos XML, no funciones Lua. Ver [el ejemplo emparejado](wiki:md-lua-bridge).
```text
Lua: AddUITriggeredEvent(screen, control, payload)
→ MD: event_ui_triggered
→ данные запроса: event.param3
→ действия и чтение результата
→ MD: raise_lua_event
→ Lua: RegisterEvent(name, callback)
```
## ¿Por qué editar un archivo puede dejar el resultado anterior
Un parche puede apuntar a otra macro o ser sobrescrito por un conflicto de compatibilidad. Es posible que Lua falte de ui.xml. Es posible que ya se haya completado una señal en el archivo de almacenamiento. Una referencia de objeto puede estar rancada después de cargar. Un archivo de MD y world restablece el estado de MD en lugar de simplemente reiniciar cada archivo fuente.
Preguntar por separado: ¿el archivo se carga, se ejecuta el controlador previsto, y el objeto real cambió y mantener ese cambio? Un marcador de registro para el controlador no prueba el efecto final. Compruebe los juegos nuevos y los guardares existentes relevantes por separado.
## Qué leer a continuación
Continuar con [operadores y funciones comunes](wiki:x4-language-cheatsheet), luego elige [un parche de la propiedad](wiki:editing-parameters), [un script MD](wiki:first-extension) o [una ventana](wiki:create-ui). El Soporte Oficial Modding está vinculado entre las fuentes de este artículo.