Skip to content

Commit b7f4f76

Browse files
committed
feat: 增加对openclaw的支持
1 parent 4d1d31f commit b7f4f76

4 files changed

Lines changed: 817 additions & 0 deletions

File tree

OPENCLAW_USAGE.md

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
# OpenClaw 使用说明文档
2+
3+
本文档详细介绍了如何让 OpenClaw AI 自主进入游戏房间,并通过 TCP API 配置游戏参数(阵营、队伍、位置等)。
4+
5+
## 1. 启动与进房 (Join Game)
6+
7+
OpenClaw 可以通过命令行参数直接启动 OpenRA 客户端并连接到指定服务器。
8+
9+
### 启动命令格式
10+
11+
```bash
12+
# Windows
13+
OpenRA.Game.exe Game.Mod=copilot Launch.Connect=115.191.61.19:27940
14+
15+
# Linux / macOS
16+
./launch-game.sh Game.Mod=copilot Launch.Connect=115.191.61.19:27940
17+
```
18+
19+
* `Game.Mod=copilot`: 指定使用 Copilot 模组。
20+
* `Launch.Connect=115.191.61.19:27940`: 连接到指定的比赛服务器。
21+
22+
### 示例
23+
24+
```python
25+
import subprocess
26+
27+
def join_server():
28+
cmd = [
29+
"OpenRA.Game.exe",
30+
"Game.Mod=copilot",
31+
"Launch.Connect=115.191.61.19:27940"
32+
]
33+
subprocess.Popen(cmd)
34+
```
35+
36+
---
37+
38+
## 2. 房间控制 API (Lobby API)
39+
40+
当 OpenClaw 进入房间(Lobby)后,客户端会开启一个 TCP 监听端口(默认 **7446**),允许外部程序通过 JSON 指令控制房间设置。
41+
42+
* **端口**: 7446
43+
* **协议**: TCP / JSON
44+
* **编码**: UTF-8
45+
46+
### 2.1 请求格式 (Request)
47+
48+
```json
49+
{
50+
"apiVersion": "1.0",
51+
"requestId": "unique_id_123",
52+
"command": "command_name",
53+
"params": {
54+
"param1": "value1"
55+
}
56+
}
57+
```
58+
59+
### 2.2 响应格式 (Response)
60+
61+
```json
62+
{
63+
"status": 1, // 1: 成功, -1: 失败
64+
"requestId": "unique_id_123",
65+
"response": "Success message",
66+
"data": { ... }, // 返回数据(查询命令)
67+
"error": { // 错误信息(如果有)
68+
"code": "ERROR_CODE",
69+
"message": "Error description"
70+
}
71+
}
72+
```
73+
74+
---
75+
76+
## 3. 可用指令列表
77+
78+
### 3.1 基础控制
79+
80+
| 命令 | 参数 | 说明 |
81+
| :--- | :--- | :--- |
82+
| `set_faction` | `{"faction": "soviet"}` | 设置己方阵营 (soviet, allies) |
83+
| `set_team` | `{"team": 1}` | 设置队伍 (0=无队伍, 1-4=队伍) |
84+
| `set_spawn` | `{"spawn": 0}` | 设置出生点 (0-N) |
85+
| `set_spectator` | `{}` | 切换为观察者 |
86+
| `set_ready` | `{"ready": true}` | 设置准备状态 (true/false) |
87+
88+
### 3.2 房主专用 (Host Only)
89+
90+
| 命令 | 参数 | 说明 |
91+
| :--- | :--- | :--- |
92+
| `map` | `{"map": "hash_or_uid"}` | 切换地图 |
93+
| `slot_open` | `{"slot": "Multi0"}` | 打开指定槽位 |
94+
| `slot_close` | `{"slot": "Multi0"}` | 关闭指定槽位 |
95+
| `slot_bot` | `{"slot": "Multi0", "botType": "rush"}` | 添加电脑玩家 |
96+
| `kick` | `{"clientIndex": 1}` | 踢出玩家 |
97+
| `start_game` | `{}` | 开始游戏 |
98+
99+
### 3.3 查询
100+
101+
| 命令 | 参数 | 说明 |
102+
| :--- | :--- | :--- |
103+
| `get_lobby_info` | `{}` | 获取当前房间详细信息(玩家、槽位、地图等) |
104+
105+
---
106+
107+
## 4. Python 调用示例
108+
109+
```python
110+
import socket
111+
import json
112+
import time
113+
114+
class LobbyAPI:
115+
def __init__(self, host='127.0.0.1', port=7446):
116+
self.address = (host, port)
117+
118+
def send_command(self, command, params=None):
119+
request = {
120+
"apiVersion": "1.0",
121+
"requestId": str(time.time()),
122+
"command": command,
123+
"params": params or {}
124+
}
125+
126+
try:
127+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
128+
s.connect(self.address)
129+
s.sendall(json.dumps(request).encode('utf-8'))
130+
data = s.recv(16384)
131+
return json.loads(data.decode('utf-8'))
132+
except ConnectionRefusedError:
133+
print("无法连接到 Lobby API,请确保游戏已进入房间")
134+
return None
135+
136+
# 使用示例
137+
if __name__ == "__main__":
138+
api = LobbyAPI()
139+
140+
# 1. 获取房间信息
141+
info = api.send_command("get_lobby_info")
142+
print("房间信息:", json.dumps(info, indent=2, ensure_ascii=False))
143+
144+
# 2. 选择苏联阵营
145+
api.send_command("set_faction", {"faction": "soviet"})
146+
147+
# 3. 选择队伍 1
148+
api.send_command("set_team", {"team": 1})
149+
150+
# 4. 准备
151+
api.send_command("set_ready", {"ready": True})
152+
153+
# 5. (如果是房主) 开始游戏
154+
# api.send_command("start_game")
155+
```

0 commit comments

Comments
 (0)