--- title: 如何运行X4代码:从文件到行动 summary: 游戏执行什么,为什么XML,MD,AI和Lua具有不同的角色,以及如何从零开始读取一个小的模块. 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/"] --- ## 开始一个想法 模块提供指示和数据,X4在适当的时间读取. 它不需要一个主要文件, 导航数据被载入资源,MD等待条件,AI运行行为, Lua 处理用户界面. 引擎是游戏的可执行部分:它创建物体,计算运动,存储世界并执行暴露于脚本中的操作. 完全来源不在一个模块文件中. 扩展使用支持的格式和API. API是与系统交互的可用方法,例如阅读对象的名字或发送事件. 这本指南涵盖了定期调整. 新的例子是解释性的,并且没有在游戏中单独执行. 根据安装的X4 9.00文件, ## 为什么多种语言都参与其中 不同的工作需要不同的代表性. 机身值可以方便地作为数据存储;事件反应需要处理器;按需要一个小工具和点击函数. | 层 | 典型的位置 | 工作 | | --- | --- | --- | | XML 数据 | `assets/`, `libraries/`, `t/` | 产品,商品和翻译文本 | | XML 差异 | 匹配目标资源路径 | 修改文件中选择部分 | | Mission Director | `md/*.xml` | 应对事件,执行世界逻辑 | | 人工智能脚本 | `aiscripts/*.xml` | 演员的行为和命令 | | Lua 互联网 | `ui/*.lua`, 已注册 `ui.xml` | 窗户,表表和输入 | | 产地代码 | 机器或调整器的DLL | 低级一体化 | 虽然MD和AI使用XML,但它们有自己的元素和执行规则. 检查根元素和目录,而不是仅仅根据扩展判断. Python或C#可能出现在工具和复杂项目中;这并不能使它们成为内置的 MD语言. 一个 XML 补丁只需要其表现和差异. ## 当扩展加载时发生什么 下面的原始图概括了责任,而不是承诺一个确切的普遍负载顺序. X4 版本,DLC,依赖性,其他 mods和保存状态都影响了结果. `content.xml` 确定扩展及其版本/依赖性. `ui.xml` 列出Lua文件用于UI环境. 显现版本字段具有定义的数值格式;不要替代任意的人类版本字符串,如0.1.0. ```text extensions/имя_мода/content.xml → игра узнаёт расширение и его зависимости → получает ресурсы с учётом расширений и патчей → загружает подходящие скрипты и UI → события и callbacks вызывают обработчики → движок меняет состояние мира ``` ## 举例1: XML 存储一个属性 在下面缩短的宏观插图中,体是一个元素,最大是一个属性,1800是它的值. XML本身并没有运行循环;引擎在资源文本中解释该领域. 另一个变化改变了所选的属性. 读取选项:输入 `/macros/macro`, 保留指定名称的宏,输入 `/properties/hull`, 然后选择 `/@max`. 其他这是一个文件的 XPath,不是一个 MD 状况或一个活船的搜索. 资源变化仍然需要在现存存储的对象上进行测试. 看到 [完整的第一块](wiki:editing-parameters). ```xml ``` ```xml 3600 ``` ## 举例2: MD执行行动 第一个部分将3分配给 `$Count`, 检测是否超过零,并打印诊断表. 它属于合适的标志. `actions`; 它们不是一个独立的延伸. XML 外部引用界定属性; 内部确切,数字3与引用字符串不同. 完全的MD脚本包含mdscript,线索,标志条件和操作. 标志是一个状态的逻辑节点:它可以等待,激活和完成. 想象一个事件驱动的处理器,而不是一个完整的文件, `instantiate=true namespace=this` 让重复事件有其自身变量背景的实例. 阅读 [cue](wiki:md-cues), [变量](wiki:md-variables) 并且对实际游戏版本的链接的主要文档. ```xml ``` ```xml ``` ## 例子3:用户界面调用Lua 下面的简单Lua示例不使用游戏API. `local` 创建一个地方名称, `function` 定义函数,其参数接收输入, `return` 产生结果, `..` 加入了弦. 标本的原始信息保留原始语言. 按分配的函数被UI后期调用;这是回调. 分配一个函数和立即调用它是不同的操作. 没有发明按API的例子说明了这一区别. ```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("Север") -- вызвать и сохранить ответ ``` ## 窗户和世界如何交流 Lua具有游戏阅读API和一些引擎操作;MD暴露了不同的操作和特性. 根据可用的操作和生命周期选择层. 不是每一个世界变化都必须通过MD. 常见的交换器使用AddUITriggeredEvent到MD,然后raise_lua_event到RegisterEvent回调. 这些是X4环境设施:普通Lua没有提供它们. MD set_value和 raise_lua_event是XML元素,而不是Lua函数. 看到 [双对的例子](wiki:md-lua-bridge). ```text Lua: AddUITriggeredEvent(screen, control, payload) → MD: event_ui_triggered → данные запроса: event.param3 → действия и чтение результата → MD: raise_lua_event → Lua: RegisterEvent(name, callback) ``` ## 为什么编辑文件可能会留下旧结果 补丁可能是针对另一个宏或被兼容性冲突覆盖的. Lua 没有 ui.xml. 预测可能已经完成了保存. 载荷后可能会出现过时的对象参考. 保存恢复世界和MD状态,而不是简单地重新启动每个源文件. 有些变化需要初始化或迁移. 单独问:文件是否加载,预期处理器是否运行,实际对象是否改变并保留了改变? 处理器的日志标记不能证明最终效果. 单独检查新的游戏和相关的现有储存. ## 接下来要读什么 继续 [运营商和共同功能](wiki:x4-language-cheatsheet), 然后选择 [财产补丁](wiki:editing-parameters), [一个 MD 脚本](wiki:first-extension) 或 [一个窗户](wiki:create-ui). 其他在本文中,官方调整支持的来源中,