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.
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.
<properties>
<hull max="1800" />
</properties><diff>
<replace sel="/macros/macro[@name='ship_arg_s_fighter_02_a_macro']/properties/hull/@max">3600</replace>
</diff>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, variables y la documentación primaria vinculada para la versión real del juego.
<set_value name="$Count" exact="3" />
<do_if value="$Count gt 0">
<debug_text text="'Есть элементы для обработки'" />
</do_if><set_value name="$Count" exact="3" />
<set_value name="$Label" exact="'Три'" />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.
local function makeLabel(name)
if type(name) ~= "string" or name == "" then
return "Без имени"
end
return "Корабль: " .. name
end
local label = makeLabel("Север")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.
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, luego elige un parche de la propiedad, un script MD o una ventana. El Soporte Oficial Modding está vinculado entre las fuentes de este artículo.