CGCommand 是旧版客户端里用于向服务端发送文本命令的通用请求包。
包信息
| 项目 |
内容 |
| 封包 ID |
060 |
| 包名 |
CGCommand |
| 对应回包 |
当前未发现固定专用回包 |
| 回包 ID |
无 |
| 作用 |
发送一条文本命令给服务端解析,当前项目里作为文本 GM 命令入口使用 |
包体结构
当前 Game.exe 与 Lua 服务端下,这条包是可变长结构。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
command_size |
uint8 |
命令文本长度 |
0x01 |
n |
command_text |
char[n] |
命令字符串正文 |
总长度:
1 + command_size
字段说明
command_size 是命令文本字节长度,字段类型为 uint8,最大值为 255。
command_text 是实际发送给服务端的文本命令内容。
- 当前项目里,服务端收到这条包后会直接把
command_text 交给 GMCommand 处理。
当前实际行为
- 这条包在当前项目里已经接入,不是仅存在于旧资料中的历史包。
- 请求进入场景服后,会落到
char_command()。
char_command() 最终会调用 GMCommand:process()。
GMCommand 当前只在调试环境下执行。
- 命令执行前还会进行 GM 权限等级校验。
- 没有固定专用回包,实际反馈通常表现为提示消息、
GCUICommand 或 GCScriptCommand。
服务端落点
- 协议定义:
services/game/packet.lua
- 请求入口:
services/msgagent.lua
- 场景处理:
services/scene/scenecore.lua
- 命令执行:
lualib/GMCommand.lua
关键代码
self.command_size = stream:readuchar()
if self.command_size > 0 then
self.command_text = stream:read(self.command_size)
else
self.command_text = ""
end
if type(content) ~= "string" or content == "" then
return
end
GMCommand:process(obj, content)
if not is_debug_env() then
return false
end
结论
这条包真正要记住的只有五点:
CGCommand 的封包 ID 是 060。
- 包体不是固定长度,而是
1 字节长度加一段文本命令。
- 当前项目里,这条包已经接入 Lua 服务端,并作为文本 GM 命令入口使用。
- 这条包没有固定专用回包,执行结果按具体命令返回。
- 当前命令执行受调试环境和 GM 权限等级双重限制。
|