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

洱海月 v0-07-0300 封包解析:ID 1225 CGRaidKick(踢出团队成员)

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

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

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

×

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 人时,这条“踢人”请求会退化成整团解散,而不是单纯移除目标成员。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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