CGCheckDoubleExp 是旧版客户端里保留的双倍经验状态检查包。
当前 Game.exe 仍然保留这条包类,但当前 Lua 主链并没有接入 CGCheckDoubleExp。当前项目真正使用的双倍经验查询链,已经改为 CGAskDoubleExp(709) 请求,再由服务端返回 GCDoubleExpInfo(675)。
包信息
| 项目 |
内容 |
| 封包 ID |
985 |
| 包名 |
CGCheckDoubleExp |
| 对应回包 |
当前 Lua 未发现这条包的直接回包 |
| 回包 ID |
无 |
| 作用 |
旧版客户端中的双倍经验状态检查包;当前项目实际已不走这条请求链 |
当前 Game.exe 的虚函数结论为:
CGCheckDoubleExp
GetPacketID() = 985;
GetPacketSize() = 20;
Read = 0x1405CB630;
Write = 0x1405C9A90;
Execute thunk = 0x1405CB620 -> sub_14007A440;
包体结构
当前 Game.exe 可以确认,这条包固定为 20 字节,按 5 个 uint32 连续读写。
由于当前 Lua 没有接入 CGCheckDoubleExp,字段名只能结合当前仍在使用的 GCDoubleExpInfo 结构来对齐理解。两者在客户端里的包体布局是同构的,因此当前最稳妥的命名如下:
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
available_hour |
uint32 |
当前还能领取的双倍经验小时数 |
0x04 |
0x04 |
is_lock |
uint32 |
双倍经验是否冻结,0=未冻结,1=冻结 |
0x08 |
0x04 |
money_time |
uint32 |
当前身上按秒计的付费双倍经验时间 |
0x0C |
0x04 |
total_time |
uint32 |
当前总双倍经验时间;Lua 现行回包里等于 money_time + free_time |
0x10 |
0x04 |
rtime |
uint32 |
双倍经验状态时间戳字段;当前 Lua 代码直接沿用这个名字 |
客户端读写结构可以概括为:
Read(stream) {
read_u32(available_hour);
read_u32(is_lock);
read_u32(money_time);
read_u32(total_time);
read_u32(rtime);
}
Write(stream) {
write_u32(available_hour);
write_u32(is_lock);
write_u32(money_time);
write_u32(total_time);
write_u32(rtime);
}
当前实际行为
- 当前 Lua 服务端里没有
packet.CGCheckDoubleExp 定义。
- 当前 Lua 请求入口里也没有
request:CGCheckDoubleExp()。
- 因此
985 这条包在当前项目里不能作为现行双倍经验查询请求来使用。
- 当前项目实际使用的是另一条链:
- 客户端请求:
CGAskDoubleExp(709)
- 服务端回包:
GCDoubleExpInfo(675)
- 当前 Lua 的
CGAskDoubleExp 是空包实现。
- 当前
human:send_double_exp_info() 会把双倍经验状态写入 GCDoubleExpInfo,字段名分别是:
available_hour
is_lock
money_time
total_time
rtime
- 当前
rtime 在 Lua 数据里是真实存在的时间戳字段,默认角色数据和重置逻辑都会写它。
- 结合当前
Game.exe 里 CGCheckDoubleExp 与 GCDoubleExpInfo 的同构布局,可以判断:
CGCheckDoubleExp 更像是旧版本保留下来的双倍经验状态包
- 但当前
Temp_Release_v0-07-0300 的 Lua 主链已经不再接它
服务端落点
当前项目实际双倍经验查询链的关键位置如下:
- 当前协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 当前请求入口:
/home/ubuntu/Game2/services/msgagent.lua
- 当前状态发送:
/home/ubuntu/Game2/services/scene/obj/human.lua
- 双倍经验辅助逻辑:
/home/ubuntu/Game2/lualib/script_base.lua
当前这些位置里,未发现 CGCheckDoubleExp 的直接 Lua 接入代码。
关键代码
CGCheckDoubleExp
GetPacketID() = 985;
GetPacketSize() = 20;
Read(stream) {
read_u32(available_hour);
read_u32(is_lock);
read_u32(money_time);
read_u32(total_time);
read_u32(rtime);
}
packet.CGAskDoubleExp = {
xy_id = packet.XYID_CG_ASK_DOUBLE_EXP,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
end,
bos = function(self)
local stream = bostream.new()
return stream:get()
end
}
function request:CGAskDoubleExp()
skynet.call(my_scene, "lua", "char_ask_double_exp_info", my_obj_id, self)
end
function human:send_double_exp_info()
local msg = packet_def.GCDoubleExpInfo.new()
msg.available_hour = self.double_exp_info.available_hour
msg.is_lock = self.double_exp_info.is_lock and 1 or 0
msg.money_time = math.floor(self.double_exp_info.money_time)
msg.total_time = math.floor(self.double_exp_info.money_time) + math.floor(self.double_exp_info.free_time)
msg.rtime = self.double_exp_info.rtime
self:get_scene():send2client(self, msg)
end
结论
CGCheckDoubleExp 的封包 ID 是 985,固定长度 20 字节。
- 当前
Game.exe 可以确认它的包体就是 5 个 uint32。
- 这
5 个字段可按当前 GCDoubleExpInfo 的结构命名为 available_hour、is_lock、money_time、total_time、rtime。
- 当前
Temp_Release_v0-07-0300 的 Lua 主链并没有接入 CGCheckDoubleExp。
- 当前项目真正使用的双倍经验查询请求包,是
CGAskDoubleExp(709),返回包是 GCDoubleExpInfo(675)。
- 写当前版本文档和代码时,不应把
CGCheckDoubleExp(985) 当成现行正式请求包使用。