--- title: 操作符和共同函数:XML,MD和Lua summary: 简单的语言中解释符号,小例子和经常的错误的初学者骗局表. section: scripting kind: guide status: reference updated: 2026-10-26 tags: ["X4","modding","x4","language","cheatsheet"] sources: ["https://www.lua.org/manual/5.1/","https://luajit.org/extensions.html","https://wiki.egosoft.com/X%20Rebirth%20Wiki/Modding%20support/Mission%20Director%20Guide/"] --- ## 如何使用这个骗局表 首先,确定语言. XPath,MD和Lua以不同的方式表达着类似的意图. 这是一个有用阅读这些例子和项目代码的选择,而不是统计排名或完整的语言参考. 开始 [X4 代码的工作原理](wiki:x4-code-basics) 如果这些条款不熟悉. 新的摘录是学习例子,而不是声称在游戏中的测试. ## 四个基本概念 一个变量存储一个值. 一种条件决定是否要做某事. 一个函数接收参数并执行工作,有时返回结果. 事件处理器是为特定事件运行的函数或MD节点. 区分定义 `getName`, 电话 `getName()` 存储返回值. ## XML 元素,属性和选项 | 形式 | 含义 | | --- | --- | | `` | 具有属性且没有儿童内容的元素 | | ` ... ` | 集装箱的开始和结束 | | `` | XML 评论 | | `replace`, `add`, `remove` | 取代,添加或删除选定的内容的差异操作 | | `/properties/hull/@max` | XPath到属性 | | `[@name='example']` | XPath属性过器 | 在 XML 属性中,逃离 Ampersands如 `&` 且不到 `<`. 其他在 MD 表达式之前,XML被解析,这就是为什么 lt/le/gt/ge是方便的比较. 差异选择器和do_if表达式使用不同的语法. ## MD:一次完成一个小操作 | 建设 | 用途 | | --- | --- | | `set_value` | 赋予或更新值 | | `do_if`, `do_elseif`, `do_else` | 选择一个分支 | | `do_for_each` | 过程列表元素 | | `append_to_list` | 添加一个元素 | | `remove_value` | 删除变量或记录 | | `debug_text` | 写诊断 | | `run_actions` | 运行一个适当的动作库 | | `event_ui_triggered` | 在预示条件下接收 UI 事件 | | `raise_lua_event` | 发送事件到Lua | 这些是MD元素名称,而不是标准XML函数. 引擎定义属性和有效的背景. 下面的行动示例创建了自己的列表,并以数为2结束. `operation=add exact=1` 增加它; 项指当前元素. ```xml ``` ### MD表达式 | 形式 | 含义 | | --- | --- | | `$Count`, `Init.$States` | 变量,或在明确的提示语境中的变量 | | `==`, `!=` | 平等,不平等 | | `lt`, `le`, `gt`, `ge` | 较小,较小或等等,较大,较大的或等 | | `and`, `or`, `not` | 逻辑操作 | | `+`, `-`, `*`, `/`, `%` | 数学;百分比是剩余的 | | `'Name: ' + $Label` | 弦连接 | | `$Value?`, `$Object.exists` | 变量/属性分辨率与对象存在 | | `typeof $D == datatype.list` | 值类型测试 | | `$D.{1}`, `$D.count` | 列表元素和元素数量 | | `table[]`, `[]` | 空的表和空的列表 | | `if $Ready then 'yes' else 'no'` | 条件值表达式 | 显示的MD列表从1开始. 一个可解决的变量可能包含虚假;存在和真相是不同的. 看到 [变量上下文](wiki:md-variables), 尤其是当我们看到一个提示时. ## Lua: 阅读普通函数 下面的独立例子没有使用X4函数. 结果是8,假设每个项目都有数量字段. `{}` 创建一个表,用于两个序列和命名记录. `item.amount` 平均 `item["amount"]`. 其他在 `for _, item`, 标记为"指数" (subscore) 标记为"指数" (subscore) ```lua local function total(items) if type(items) ~= "table" then return 0 end local result = 0 for _, item in ipairs(items) do result = result + item.amount end return result end local amount = total({{amount = 3}, {amount = 5}}) ``` ### Lua运营商 | 形式 | 含义 | | --- | --- | | `=` | 任务 | | `==`, `~=` | 平等,不平等 | | `<`, `<=`, `>`, `>=` | 进行比较 | | `and`, `or`, `not` | 逻辑操作 | | `+`, `-`, `*`, `/`, `%` | 算术 | | `..` | 弦连接 | | `#value` | 字符串的字节长度或序列边界 | | `object.field` | 访问表场 | | `object:method(x)` | 同等于 `object.method(object, x)` | `#table` 没有任意的钥匙. 孔和弦键不会形成密集的序列. 字符串长度计算字节,这对UTF-8来说很重要. 在Lua中,只有虚假和零是虚假的;0和空连串是真实的. `value or fallback` 假的也取代了假的. 逻辑和/或返回选定的值,不一定是布尔值. ### Lua 标准函数 `type` 报告价值类型; `tostring` 格式一个值; `tonumber` 试图转换,可能返回零. `ipairs` 密度指数从1到缺失项; `pairs` 没有订单保证. `table.insert`, `table.remove` 和 `table.concat` 操作序列. `string.format` 构建格式化的文本;使用Lua模式的匹配/gsub. `math.min` 和 `math.max` 选择数值. `pcall` 捕获Lua错误; `require` 根据环境规则,载载模块. 不是每个模块都可用在游戏UI中. 不要假设有故障或文件访问. 检查电话调用标志和错误,而不是默默地隐藏失败. 保护Lua通话不会使无效的本地通话安全. 参见下面的Lua 5.1和LuaJIT主要参考文献. ## X4函数与模特函数 在正确的表示中解决对象ID. 随机号码,船舶名称,网络ID,UI操作和UniverseID是不可交换的: [识别精度](wiki:ids-and-precision). ## 阅读时可能会发现的五个错误 1. Lua的使用 `~=`, 在MD使用时 `!=` 对于不平等. 2. Lua 连接链接到 `..`; MD 使用 `+` 在表达的形式中. 3. Lua 任务是 `=`, 比较是 `==`. 4. 改变窗口文本并不证明改变世界对象. 5. 处理器定义仍然需要加载文件,接收事件和验证输入. 阅读 [Lua ↔ MD](wiki:md-lua-bridge) 在安装示例在测试资料中之前,并解释每个行.