GCMovieOpr 是客户端过场影片控制包。当前 Game.exe 保留了完整的读写和执行链,用来触发影片播放,或在特定分支下回调 OnMovieEnd 脚本。
包信息
| 项目 |
内容 |
| 封包 ID |
1026 |
| 包名 |
GCMovieOpr |
| 方向 |
GC 游戏服 -> 客户端 |
| 固定包长 |
9 |
| 当前 Lua 协议定义 |
未检出 |
| 当前 Lua 发送点 |
未检出 |
| 当前用途 |
控制客户端播放指定影片,或触发影片结束脚本回调 |
当前 Game.exe 可直接确认:
GetPacketID() = 1026;
GetPacketSize() = 9;
Read() = read_u8(op_type), read_u32(movie_id), read_u32(param);
Write() = write_u8(op_type), write_u32(movie_id), write_u32(param);
Execute() = op_type == 1 时播放影片,否则走 OnMovieEnd(movie_id) 回调链;
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
op_type |
uint8 |
影片操作类型;当前执行链明确处理 1 |
0x01 |
0x04 |
movie_id |
uint32 |
影片或过场资源 ID |
0x05 |
0x04 |
param |
uint32 |
预留参数;当前执行链未直接使用 |
当前实际行为
- 当前 Lua 服务端未检出同名协议定义和发送点。
- 当前客户端执行链只在
op_type == 1 时进入已确认的播放分支。
- 若客户端能从影片属性表中拿到
movie_id 对应资源,就会向界面层发送 Play 操作。
- 若影片资源不存在,客户端会构造一条本地脚本执行链,回调
OnMovieEnd(movie_id)。
param 虽然在线上包体中保留,但当前执行函数未直接读取它。
服务端落点
- 当前
/home/ubuntu/Game2 未检出 packet.GCMovieOpr
- 当前
/home/ubuntu/Game2 未检出同名发送点
关键代码
当前 Game.exe 读写结构
__int64 Write(Packet *pkt, Stream *s) {
s->Write(&pkt->op_type, 1);
s->Write(&pkt->movie_id, 4);
s->Write(&pkt->param, 4);
return 1;
}
__int64 Read(Packet *pkt, Stream *s) {
s->Read(&pkt->op_type, 1);
s->Read(&pkt->movie_id, 4);
s->Read(&pkt->param, 4);
return 1;
}
当前 Game.exe 执行分支
if (pkt && pkt->op_type == 1) {
if (FindMovieAttr(pkt->movie_id)) {
UI->SendMessage("Play");
} else {
ExecuteScript("OnMovieEnd", pkt->movie_id);
}
}
return 2;
结论
GCMovieOpr 是固定 9 字节的影片控制包。
- 当前可确认字段是
op_type + movie_id + param。
- 当前客户端只明确处理
op_type == 1 的播放分支。
- 当前 Lua 主链未接入这条包,现役行为主要由客户端本地执行逻辑决定。
|