CGAskJuqingPoint 是旧版客户端里用于主动请求当前剧情点数回包的查询封包。
当前旧版项目中,这条请求包会直接在 msgagent 内构造 GCJuqingPoint 回包,不进入场景服主链;服务端现状固定返回 0。客户端收到回包后,会把其中的 4 字节值当成当前剧情点数写入本地状态。
包信息
| 项目 |
内容 |
| 封包 ID |
555 |
| 包名 |
CGAskJuqingPoint |
| 方向 |
CG 客户端 -> 登录/消息服 |
| 固定包长 |
4 |
| 直接回包 |
GCJuqingPoint |
| 回包 ID |
689 |
| 主要作用 |
请求当前剧情点数回包 |
| 当前 Lua 入口 |
request:CGAskJuqingPoint() |
| 当前服务端处理 |
直接在 msgagent 构造 GCJuqingPoint 并发送 |
当前 Game.exe 的虚函数结论为:
GetPacketID() = 555;
GetPacketSize() = 4;
包体结构
这条包是固定长度包,当前 Game.exe 与当前 Lua 一致,都会按 4 字节无符号整数读写。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
unknow |
uint32 |
当前版本中服务端未消费该值,现阶段业务语义仍未完全确认 |
当前实际行为 / 模式说明
- 当前 Lua 请求入口是
request:CGAskJuqingPoint()。
- 这条请求当前不会转发到
/home/ubuntu/Game2/services/scene,而是直接在 msgagent 构造回包并发送。
- 当前服务端回包是
GCJuqingPoint,并把 juqing_point 固定写成 0。
- 也就是说,在当前旧版 Lua 服务端现状里,这条请求的实际效果就是“询问剧情点数”,但现阶段永远收到
0。
- 当前请求包里这 4 字节参数虽然真实存在,且客户端/服务端都会按
uint32 读写,但当前服务端没有使用它,客户端侧也暂未找到更直接的发送赋值证据,因此现阶段仍只能谨慎保留为未确认字段。
- 当前客户端对
GCJuqingPoint 的执行逻辑会读取回包中的 4 字节值,写入本地剧情点数状态,并抛出一次界面通知事件;这说明回包字段语义已经可以明确确定为 juqing_point。
服务端落点
这条包在当前项目里的关键位置如下:
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 请求入口与直接回包:
/home/ubuntu/Game2/services/msgagent.lua
- 剧情点数配置区间:
/home/ubuntu/Game2/configs/ConfigInfo.ini
关键代码
当前 Lua 协议定义
packet.CGAskJuqingPoint = {
xy_id = packet.XYID_CG_ASK_JVQING_POINT,
ctor = function(self) self.unknow = 0 end,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.unknow = stream:readuint()
end,
bos = function(self)
local stream = bostream.new()
stream:writeuint(self.unknow)
return stream:get()
end
}
packet.GCJuqingPoint = {
xy_id = packet.XYID_GC_JVQING_POINT,
ctor = function(self) self.juqing_point = 0 end,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.juqing_point = stream:readuint()
end
}
当前 Lua 请求入口
function request:CGAskJuqingPoint()
local ret = packet_def.GCJuqingPoint.new()
ret.juqing_point = 0
Net:send(ret)
end
当前客户端关键结论
Game.exe 中 CGAskJuqingPoint::Read/Write 都是固定 4 字节读写:
Read : read(a1 + 24, 4);
Write: write(a1 + 24, 4);
GCJuqingPoint 的执行函数还会继续消费这个回包字段:
set_juqing_point(*(uint32 *)(a1 + 24));
notify_ui(368);
这里的函数名是按当前行为概括后的语义表达。可以确定的是,回包中偏移 +24 的 uint32 会被当成客户端当前剧情点数写入本地状态。
结论
CGAskJuqingPoint 在当前旧版项目中的现状可以概括为两点:
- 请求包本体确实是固定
4 字节,不是空包。
- 当前服务端并不消费这 4 字节请求值,而是直接返回
GCJuqingPoint,且固定返回 0。
因此,这条包的当前实际用途已经可以明确写成“请求当前剧情点数回包”。其中回包字段 GCJuqingPoint.juqing_point 已可确认;但请求包里的 uint32 参数在当前证据下仍不能直接下最终业务命名,只能继续保留为未完全确认字段。