找回密码
 registerss
搜索

洱海月 v0-07-0300 封包解析:ID 559 CGTeamRetApply(队长回应入队申请)

[复制链接]
Waylee 发表于 2026-4-12 17:23 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

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

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

×

CGTeamRetApply 是旧版客户端里用于让队长回应入队申请的请求包。

包信息

项目 内容
封包 ID 559
包名 CGTeamRetApply
相关回包 GCTeamList / GCTeamError
作用 由队长对指定申请者的入队申请作出同意或拒绝,并携带当时的队伍成员快照

包体结构

当前 Game.exe 与 Lua 协议定义都能确认,这条包固定为 41 字节。

偏移 长度 字段 类型 含义
0x00 0x01 return_type uint8 队长对申请的回应类型
0x01 0x04 source_guid int32 申请入队的角色 GUID
0x05 0x20 team_guids[8] int32[8] 客户端提交的队伍成员 GUID 快照

当前 Game.exe 的 GetPacketSize() 返回固定值:

41

当前实际行为 / 模式说明

  • 当前 Game.exe 中,CGTeamRetApply::GetPacketID() 返回 559,GetPacketSize() 返回 41。
  • 当前 Game.exe 的 Read() / Write() 顺序固定为:
    • return_type
    • source_guid
    • team_guids[8]
  • 当前 Game.exe 的 Execute() 对客户端侧是空处理,直接返回。
  • 当前 Lua 协议定义与 Game.exe 一致,按相同顺序读取这三个字段。
  • 当前 Lua 请求入口是 request:CGTeamRetApply(),它会把当前角色 GUID 和整包一起转发给世界服 char_ret_team_apply。
  • 当前世界服处理链里:
    • source_guid 会被当成申请入队者 GUID
    • 请求发起者 guid 会被当成当前队长 GUID
    • return_type == 0 时,直接给申请者发送 TEAM_ERROR_APPLYLEADERREFUSE
    • 其它情况下,继续做入队校验
  • 校验内容包括:
    • 申请者或队长是否已在团里
    • 申请者是否已经有队伍
    • 队伍是否已满
    • 当前发起者是否真的是该队伍队长
  • 校验通过后,世界服会把申请者加入队伍,并给申请者发送 GCTeamList。
  • 当前世界服处理函数没有读取 team_guids 做校验或分支,因此这组 GUID 在现状里更像客户端附带的队伍快照参数。

服务端落点

  • 协议定义:
    • /home/ubuntu/Game2/services/game/packet.lua
  • 请求入口:
    • /home/ubuntu/Game2/services/msgagent.lua
  • 世界服处理:
    • /home/ubuntu/Game2/services/world/worldcore.lua

关键代码

当前 Lua 协议定义

packet.CGTeamRetApply = {
    xy_id = packet.XYID_CG_TEAM_RET_APPLY,
    bis = function(self, buffer)
        local stream = bistream.new()
        stream:attach(buffer)
        self.return_type = stream:readuchar()
        self.source_guid = stream:readint()
        self.team_guids = {}
        for i = 1, 8 do
            self.team_guids[i] = stream:readint()
        end
    end
}

当前 Lua 请求入口

function request:CGTeamRetApply()
    local my_guid = ma_func:get_guid()
    skynet.call(".world", "lua", "char_ret_team_apply", my_guid, self)
end

当前世界服处理

function worldcore:char_ret_team_apply(guid, rta)
    local source_guid = rta.source_guid
    local me = self:find_user(source_guid)
    local leader = self:find_user(guid)
    if me == nil or leader == nil then
        return
    end
    if rta.return_type == 0 then
        local msg = packet_def.GCTeamError.new()
        msg.error_code = define.TEAM_ERROR.TEAM_ERROR_APPLYLEADERREFUSE
        self:send2client(me, msg)
        return
    end
    ...
    team:add_member(me.uinfo)
    local msg = packet_def.GCTeamList.new()
    msg.type = define.TEAM_LIST_TYPE.JOIN
    ...
    self:send2client(me, msg)
end

当前 Game.exe 的读写与执行结论

GetPacketID() = 559;
GetPacketSize() = 41;

Read(stream) {
    read_u8(return_type);
    read_i32(source_guid);
    for (i = 0; i < 8; ++i) {
        read_i32(team_guids[i]);
    }
}

Write(stream) {
    write_u8(return_type);
    write_i32(source_guid);
    for (i = 0; i < 8; ++i) {
        write_i32(team_guids[i]);
    }
}

Execute() {
    return 2;
}

结论

这条包在当前旧版项目里要记住六点:

  1. CGTeamRetApply 的封包 ID 是 559。
  2. 它是固定 41 字节结构:1 + 4 + 8*4。
  3. return_type 表示队长对入队申请的回应,当前世界服里 0 明确表示拒绝。
  4. source_guid 是申请入队者 GUID,不是当前队长 GUID。
  5. 当前世界服真正决定是否加人的处理链在 char_ret_team_apply(),通过后会把申请者加入队伍并回 GCTeamList。
  6. team_guids[8] 在当前版本里会被客户端提交,但当前世界服处理函数没有使用它做分支。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

GMT+8, 2026-10-24 13:56 , Processed in 0.025434 second(s), 27 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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