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

洱海月 v0-07-0300 封包解析:ID 813 CGGuildApply(提交建帮申请表单)

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

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

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

×

CGGuildApply 是旧版客户端里用于提交建帮申请表单的请求包。

当前版本里,这条包承载两个变长文本字段,分别是帮会名称和帮会简介。客户端先通过 GCGuildApply 打开建帮界面,玩家填写内容后,再把本包提交给服务端创建帮会。

包信息

项目 内容
封包 ID 813
包名 CGGuildApply
方向 CG 客户端 -> 消息服
包长 变长
直接处理 ma_guild:CGGuildApply()
后续结果 GCGuildReturn
主要作用 提交帮会名称与帮会简介,申请创建帮会

当前 Game.exe 的虚函数结论为:

GetPacketID() = 813;
GetPacketSize() = name_len + desc_len + 2;

包体结构

这条包是变长包,结构为 name_size + name + desc_size + desc。

偏移 长度 字段 类型 含义
0x00 0x01 guild_name_size uint8 帮会名称字节长度
0x01 0x00~0x18 guild_name char[n] 帮会名称,最大 24 字节
0x01+n 0x01 guild_desc_size uint8 帮会简介字节长度
0x02+n 0x00~0x3C guild_desc char[n] 帮会简介,最大 60 字节

当前实际行为 / 模式说明

  • 当前 Lua 协议定义会先读取 guild_name_size,然后在长度不超过 0x18 时读取帮会名称。
  • 接着会读取 guild_desc_size,然后在长度不超过 0x3C 时读取帮会简介。
  • 当前 msgagent 收到本包后,会转到 ma_guild:CGGuildApply(request)。
  • 网关层会先补充 request.chief_name = 当前玩家名字,再把整个请求转给 .Guildmanager 的 guild_apply。
  • 当前 guildmanager_core:create_guild() 会把:
    • apply.guild_name 写入 guild.name
    • apply.guild_desc 写入 guild.desc
  • 创建成功后,服务端不会回 CGGuildApply 对应结果包,而是通过 GCGuildReturn 的 GUILD_RETURN_CREATE 分支把新帮会信息回给客户端。
  • 建帮界面的打开不是靠这条请求包,而是前置的 GCGuildApply 回包负责触发。

服务端落点

这条包在当前项目里的关键位置如下:

  • 协议定义:
    • /home/ubuntu/Game2/services/game/packet.lua
  • 请求入口:
    • /home/ubuntu/Game2/services/msgagent.lua
  • 消息服网关处理:
    • /home/ubuntu/Game2/msgagent_module/ma_guild.lua
  • 帮会管理器创建逻辑:
    • /home/ubuntu/Game2/services/guild/guildmanager_core.lua
  • 前置界面触发包:
    • /home/ubuntu/Game2/lualib/script_base.lua

关键代码

当前 Lua 协议定义

packet.CGGuildApply = {
    xy_id = packet.XYID_CG_GUILD_APPLY,
    bis = function(self, buffer)
        local stream = bistream.new()
        stream:attach(buffer)

        local nameSize = stream:readuchar()
        if nameSize > 0 and nameSize <= 0x18 then
            self.guild_name = stream:read(nameSize)
            self.guild_name = gbk.toutf8(self.guild_name)
            self.name = self.guild_name
        end

        local descSize = stream:readuchar()
        if descSize > 0 and descSize <= 0x3C then
            self.guild_desc = stream:read(descSize)
            self.guild_desc = gbk.toutf8(self.guild_desc)
            self.desc = self.guild_desc
        end
    end
}

当前消息服处理

function request:CGGuildApply()
    ma_func:CGGuildApply(self)
end

function ma_guild:CGGuildApply(request)
    request.chief_name = self.my_data.attrib.name
    local result = skynet.call(".Guildmanager", "lua", "guild_apply", self:get_guid(), request)
end

当前帮会创建落点

function guildmanager_core:create_guild(chief_guid, apply)
    local guild = {}
    guild.chief_guid = chief_guid
    guild.chief_name = apply.chief_name
    guild.creator = apply.chief_name
    guild.name = apply.guild_name or apply.name
    guild.desc = apply.guild_desc or apply.desc
    guild.id = #self.guilds
    skynet.call(".db", "lua", "safe_insert", { collection = "guild", doc = guild})
    self:reload_guilds()
    self:remake_name_list()
    return guild
end

当前客户端关键结论

Game.exe 中 CGGuildApply 的 Read() / Write() 顺序可以直接确认:

read(name_len, 1);
read(name, name_len);
read(desc_len, 1);
read(desc, desc_len);

对应包长计算也是:

GetPacketSize() = name_len + desc_len + 2;

客户端 Execute() 本身不做客户端本地逻辑处理,直接返回。

结论

CGGuildApply 在当前旧版项目中的最终语义已经可以明确:

  • 这是建帮表单提交请求包
  • 第 1 段文本是 guild_name
  • 第 2 段文本是 guild_desc
  • 最大长度分别是 24 字节和 60 字节

因此,当前 Lua 里原先较泛的 name / desc 已经可以收敛成更明确的 guild_name / guild_desc。前置的界面打开动作由 GCGuildApply 负责,本包只负责提交最终表单内容。

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

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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