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 负责,本包只负责提交最终表单内容。