TrinityCore 组队系统开发:从 group 数据表到队长分配与掉落拾取的完整实现 原创

温馨提示:
本文最后更新于 2026-11-05,已超过 0 天没有更新。 若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。

TrinityCore 组队系统开发:从 group 数据表到队长分配与掉落拾取的完整实现

组队(Group)是 MMORPG 的核心社交玩法,也是副本、战场等多人内容的基础。TrinityCore 用一套数据库表 + 内存对象模型管理队伍的生命周期。本文从数据结构出发,剖析组队的创建、分配与拾取机制。

一、组队的数据模型

队伍的核心数据保存在 groups 表中:

SELECT * FROM groups;

关键字段包括 leaderGuid(队长)、lootMethod(拾取方式)、lootThreshold(拾取品质阈值)、icon1/2/3(队伍图标)等。队伍的成员关系则通过 group_member 表维护:

SELECT gm.guid, gm.memberGuid, m.name
FROM group_member gm
JOIN characters m ON gm.memberGuid = m.guid;

group_member 里的 subgroup 字段决定成员所在的小队(Party),而 assistant 标记是否是助理。

二、组队的创建与加入流程

创建队伍由 Player::SetGroup / Group::Create 完成。邀请流程通常走 CMSG_GROUP_INVITE 封包,服务器校验双方状态后向受邀方发送确认请求:

# 核心调用链
GroupMgr::FindGroupByGUID   -- 通过 guid 查找已有队伍
Group::AddMember            -- 将成员加入队伍并通知所有人
Group::BroadcastGroupUpdate -- 广播队伍变更给所有在线成员

加入队伍后,客户端通过 SMSG_GROUP_LIST 封包拿到最新的队伍状态,包括成员列表、队长、拾取方式等。

三、队长分配与拾取方式

lootMethod 决定了掉落归属规则,常见取值:

取值 含义
FREE 自由拾取,人人可点
MASTER 队长分配,由队长决定归属
GROUP 团队分配,需大部分成员同意
NEED_BEFORE_GREED 需求优先于贪婪

队长分配(MASTER)的实现核心在 Loot::AutoStoreLoot,掉落生成后先进入临时 loot items 列表,由队长通过 CMSG_LOOT_MASTER_GIVE 指定归属:

if (lootMethod == MASTER) {
    // 掉落先不直接入包,等待队长分配
    LootItem::SetSlot(looT, i, ...);
}

四、掉落拾取的完整链路

一次战斗后的掉落流程为:

  • 生成:击杀怪物后按 creature_loot_template 生成掉落条目,计入队伍共享的 loot 对象。
  • 分配:根据 lootMethod 决定是直接入包、队长分配还是团队表决。
  • 拾取:玩家发 CMSG_LOOT,服务器校验权限后把物品写入背包并发送 SMSG_LOOT 结果。
  • 记录:掉落写回 character_inventory,同时更新队伍成员的 loot 状态。

五、自定义开发建议

  • 限制拾取:可在 Loot 处理前加自定义判定,如按职业限制部分掉落。
  • 队伍奖励:监听 OnGroupCreate / OnMemberJoin 等事件,给新成员发放欢迎奖励。
  • 副本绑定:理解 Group::SetBoundInstance,可定制队伍与副本的绑定规则。

掌握了 groups / group_member 两张表与 Group 对象的方法,你就能深入定制组队玩法——无论是调整分配规则,还是扩展队伍相关功能,都能定位到正确的改动点。