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

洱海月 v0-07-0300 封包解析:ID 555 CGAskJuqingPoint(请求当前剧情点数)

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

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

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

×

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 参数在当前证据下仍不能直接下最终业务命名,只能继续保留为未完全确认字段。

您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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