找回密码
 registerss
搜索
查看: 23|回复: 0

洱海月 v0-07-0300 封包解析:ID 985 CGCheckDoubleExp(双倍经验状态检查)

[复制链接]
  • 打卡等级:本地老炮
  • 打卡总天数:603
  • 打卡月天数:1
  • 打卡总奖励:600
  • 最近打卡:2026-10-03 06:32:28
Waylee 发表于 2026-4-13 16:36 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?registerss

×

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

结论

  1. CGCheckDoubleExp 的封包 ID 是 985,固定长度 20 字节。
  2. 当前 Game.exe 可以确认它的包体就是 5 个 uint32。
  3. 这 5 个字段可按当前 GCDoubleExpInfo 的结构命名为 available_hour、is_lock、money_time、total_time、rtime。
  4. 当前 Temp_Release_v0-07-0300 的 Lua 主链并没有接入 CGCheckDoubleExp。
  5. 当前项目真正使用的双倍经验查询请求包,是 CGAskDoubleExp(709),返回包是 GCDoubleExpInfo(675)。
  6. 写当前版本文档和代码时,不应把 CGCheckDoubleExp(985) 当成现行正式请求包使用。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

QQ|手机版|雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 )|天天打卡

GMT+8, 2026-10-4 11:26 , Processed in 0.065209 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表