---
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) 在安装示例在测试资料中之前,并解释每个行.