CGRaidKick 是团队系统里的踢人请求包,用于把指定成员从当前 raid 中移除。
包信息
| 项目 |
内容 |
| 封包 ID |
1225 |
| 包名 |
CGRaidKick |
| 方向 |
客户端 -> 游戏服 |
| 固定长度 |
8 字节 |
| 对应回包 |
无专用回包 |
| 相关结果包 |
GCRaidResult (1256) / GCRaidError (1249) |
| 作用 |
团长或助理请求踢出指定 raid 成员 |
包体结构
客户端 Game.exe 中 Packets::CGRaidKick 的 Read 逻辑按顺序读取两个 uint32,当前 Lua 协议定义也一致。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
m_OperateGUID |
uint32 |
发起踢人操作的成员 GUID |
0x04 |
0x04 |
m_TargetGUID |
uint32 |
被踢目标成员 GUID |
总长度:
8 字节
当前实际行为
Game.exe 中 sub_1405EC770() 直接返回 1225,sub_1405EFB10() 直接返回 8,可确认当前客户端类的包 ID 与固定包长。
Game.exe 中 sub_14060ADC0() 会连续读取两个 4 字节字段到对象偏移 +0x18 与 +0x1C,与 Lua 的 m_OperateGUID、m_TargetGUID 完全对应。
- 当前 Lua 入口
request:CGRaidKick() 直接把整包转发到世界服,不会像普通队伍踢人那样用当前连接角色 GUID 覆盖 m_OperateGUID。
- 世界服要求发起者与目标都在线、两者 GUID 不相同、并且同属一个 raid;任一条件不满足时,大多直接返回,部分分支会回
GCRaidError。
- 普通团员不能踢人,返回
GCRaidError(error_code = 8);助理不能踢团长,返回 error_code = 9;助理不能踢同职位助理,返回 error_code = 10。
- 当当前 raid 成员数小于等于
2 时,这条包不会走“单人踢出”结果,而是广播 GCRaidResult(return_type = 9) 并直接解散整个 raid。
- 当 raid 成员数大于
2 时,世界服广播 GCRaidResult(return_type = 3),随后调用 raid:del_member(guid_ex) 把目标移出团队。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 请求入口:
/home/ubuntu/Game2/services/msgagent.lua
- 世界服处理:
/home/ubuntu/Game2/services/world/worldcore.lua
- 团队对象删除成员:
/home/ubuntu/Game2/lualib/raid.lua
- 结果码与职位定义:
/home/ubuntu/Game2/lualib/define.lua
关键代码
客户端 Game.exe 关键方法:
__int64 sub_1405EC770()
{
return 1225;
}
__int64 sub_1405EFB10()
{
return 8;
}
__int64 __fastcall sub_14060ADC0(__int64 a1, __int64 a2)
{
sub_1403F9B00(a2, (char *)(a1 + 24), 4u);
sub_1403F9B00(a2, (char *)(a1 + 28), 4u);
return 1;
}
当前 Lua 协议与世界服处理:
packet.CGRaidKick = {
xy_id = packet.XYID_CGRaidKick,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.m_OperateGUID = stream:readuint()
self.m_TargetGUID = stream:readuint()
end
}
function request:CGRaidKick()
skynet.call(".world", "lua", "char_raid_kick", self)
end
if me_position == define.RAID_POISTION.RAID_POISTION_MEMBER then
msg.error_code = define.RAID_ERROR.RAID_ERROR_KICKNOTLEADER
elseif me_position == define.RAID_POISTION.RAID_POISTION_ASSISTANT then
if tar_position == define.RAID_POISTION.RAID_POISTION_LEADER then
msg.error_code = define.RAID_ERROR.RAID_ERROR_KICKLEADER
elseif tar_position == define.RAID_POISTION.RAID_POISTION_ASSISTANT then
msg.error_code = define.RAID_ERROR.RAID_ERROR_KICK_ASSISTANT
end
end
if raid:member_count() <= 2 then
msg.return_type = define.RAID_RESULT.RAID_RESULT_DISMISS
self.raid_list:destory_raid(raid_id)
else
msg.return_type = define.RAID_RESULT.RAID_RESULT_KICK
raid:del_member(guid_ex)
end
结论
CGRaidKick 是当前 raid 系统中的固定 8 字节踢人请求包,字段顺序为 m_OperateGUID + m_TargetGUID。
当前版本最值得注意的不是包体本身,而是服务端行为:
- 这条包没有专用成功回包,失败走
GCRaidError(1249),成功走 GCRaidResult(1256)。
- 当前 Lua 直接信任客户端上传的
m_OperateGUID,没有在入口层用连接身份重写。
- 当团队只剩
2 人时,这条“踢人”请求会退化成整团解散,而不是单纯移除目标成员。
|