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;
}
结论
这条包在当前旧版项目里要记住六点:
CGTeamRetApply 的封包 ID 是 559。
- 它是固定
41 字节结构:1 + 4 + 8*4。
return_type 表示队长对入队申请的回应,当前世界服里 0 明确表示拒绝。
source_guid 是申请入队者 GUID,不是当前队长 GUID。
- 当前世界服真正决定是否加人的处理链在
char_ret_team_apply(),通过后会把申请者加入队伍并回 GCTeamList。
team_guids[8] 在当前版本里会被客户端提交,但当前世界服处理函数没有使用它做分支。
|