魔兽争霸 III 云脚本(MLS)本地测试工具,Rust 编写,单文件运行,自带原生 GUI,并保留 Bridge HTTP 接口供客户端对接。
用于在本地模拟平台云脚本运行环境,支持多客户端连接、事件收发、存档读写,无需连接线上平台。
mls-sim-rs/ Rust 模拟器源码
src/ 核心代码
config.example.json 配置示例
docs/ 使用文档
参考/mls-master/ 平台官方 API 文档和 demo 脚本
需要 Rust 工具链(rustup + cargo)。
cd mls-sim-rs
cargo build --release产物:target/release/mls-sim.exe,约 5MB,无外部依赖。
方式一:命令行指定脚本目录
mls-sim.exe --script-dir "D:/你的脚本目录/script"启动后自动创建房间、加载 main.lua、打开原生 GUI。
方式二:使用配置文件
复制 config.example.json 为 config.json,修改里面的路径:
copy config.example.json config.json
mls-sim.exe方式三:空启动后在 GUI 里建房
mls-sim.exe在原生 GUI 的“房间”页点击“新建”手动创建房间。
curl http://127.0.0.1:5000/api/health| 参数 | 默认值 | 说明 |
|---|---|---|
--host |
127.0.0.1 |
监听地址 |
--port / -p |
5000 |
监听端口 |
--script-dir / -s |
无 | 云脚本目录,启动后自动建房 |
--config |
config.json |
配置文件路径 |
--console-notwrte |
false |
Windows 下隐藏控制台窗口,仅保留 GUI 窗口 |
{
"host": "127.0.0.1",
"port": 5000,
"auto_open_browser": true,
"archive_dir": "./archives",
"auto_room": {
"script_dir": "D:/你的脚本目录/script",
"mode_id": 0,
"players": [
{"index": 0, "name": "玩家1", "items": {"VIP001": 1}},
{"index": 1, "name": "玩家2"}
]
}
}| 字段 | 说明 |
|---|---|
host |
监听地址 |
port |
监听端口 |
auto_open_browser |
历史字段,当前原生 GUI 版本不再依赖浏览器启动 |
archive_dir |
存档保存目录 |
auto_room |
启动后自动创建的房间配置(可不填) |
auto_room.script_dir |
云脚本目录,目录下必须有 main.lua |
auto_room.mode_id |
游戏模式 ID |
auto_room.players |
玩家列表,含槽位、昵称、道具、存档等 |
启动后打开 MLS 云脚本环境模拟 窗口,功能包括:
- 创建/停止/销毁房间
- 查看玩家状态(在线/离线、等级、道具)
- 模拟玩家断线、重连、退出
- 向云脚本发送自定义事件
- 实时查看脚本日志(支持级别过滤和搜索)
- 实时查看出站事件(脚本发给客户端的事件)
- 查看房间完整状态 JSON
客户端(War3 地图脚本或 Python/其他语言模拟)通过 HTTP 与模拟器通信:
发送事件给云脚本: POST /api/bridge/event
轮询云脚本返回: GET /api/bridge/poll/{room_id}/{player_index}
Python 示例:
import requests, time
BASE = "http://127.0.0.1:5000"
ROOM = "room-001"
# 发送事件
requests.post(f"{BASE}/api/bridge/event", json={
"room_id": ROOM, "player_index": 0,
"ename": "buy_tower", "evalue": '{"id":1}'
})
# 轮询
while True:
r = requests.get(f"{BASE}/api/bridge/poll/{ROOM}/0")
for ev in r.json().get("events", []):
print(f"[{ev['ename']}] {ev['evalue']}")
time.sleep(0.05)- 云脚本通过
MsSaveScriptArchive等 API 写入存档 - 房间停止时自动保存到
archives/<脚本目录名>.json - 下次创建同名脚本房间时自动读取上次存档
- 配置文件中手动指定的存档数据优先级高于自动读取
完整复刻平台 MLS 运行时 API,详见 Lua 接口参考:
Log.Debug/Info/Error— 日志Timer.After/NewTicker— 定时器RegisterEvent/UnregisterEvent— 事件注册MsSendMlEvent— 发送事件给客户端MsGetPlayerName/MapLevel/MapExp/PlayedTime/PlayedCount— 玩家查询MsGetRoomStartTs/LoadedTs/GameTime/PlayerCount/ModeId— 房间查询MsGetPlayerItem/MsConsumeItem— 道具MsGet/SaveScriptArchive— 脚本存档MsGetCommonArchive/ReadArchive/CfgArchive— 普通/只读/全局存档MsSetReadArchive— 设置只读存档(触发_rdata)MsEnd— 停止脚本json.encode/decode— JSONrequire— 模块加载(支持相对路径和.分隔)
见 docs 文档中心: