guild 公会系统
公会核心表及关联子系统 · 完整公会数据库文档
📖 官方文档来源公会系统概述
公会系统由一个核心表 + 七个关联子表组成,覆盖公会的完整功能:
- 🏰 公会基本信息
- 👥 成员管理
- 🏅 等级与权限
- 🏦 公会银行
- 📜 事件日志
- 📊 每日提取限制
💡 关键概念:公会由
guildid 唯一标识,通过 leaderguid 关联到 characters 表中的会长角色。公会银行有独立的标签页、物品和权限管理。
🎯 关联关系:
guild_member.guid → characters.guid, guild_rank.guildid → guild.guildid, 银行相关表都通过 guildid 关联到 guild 表。
guild 表结构
公会核心表,存储每个公会的基本信息。
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | 0 | 公会唯一ID,主键 |
| name | VARCHAR(24) | '' | 公会名称(最多24字符) |
| leaderguid | INT UNSIGNED | 0 | 会长角色GUID(关联 characters.guid) |
| EmblemStyle | TINYINT UNSIGNED | 0 | 徽章样式ID |
| EmblemColor | TINYINT UNSIGNED | 0 | 徽章颜色ID |
| BorderStyle | TINYINT UNSIGNED | 0 | 边框样式ID |
| BorderColor | TINYINT UNSIGNED | 0 | 边框颜色ID |
| BackgroundColor | TINYINT UNSIGNED | 0 | 背景颜色ID |
| info | VARCHAR(500) | '' | 公会信息/公告 |
| motd | VARCHAR(128) | '' | 今日消息(Message of the Day) |
| createdate | INT UNSIGNED | 0 | 公会创建时间戳 |
| BankMoney | BIGINT UNSIGNED | 0 | 公会银行金币(铜币单位) |
guild_member 表结构
记录每个公会的成员列表及成员备注。
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | - | 公会ID |
| guid | INT UNSIGNED | - | 角色GUID(唯一索引) |
| rank | TINYINT UNSIGNED | - | 成员等级(对应 guild_rank.rid) |
| pnote | VARCHAR(31) | '' | 公开备注(所有人可见) |
| offnote | VARCHAR(31) | '' | 官员备注(仅官员可见) |
guild_rank 表结构
定义每个公会的等级结构、权限和每日银行取款限额。
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | 0 | 公会ID |
| rid | TINYINT UNSIGNED | - | 等级ID(0=会长, 1=官员, 以此类推) |
| rname | VARCHAR(20) | '' | 等级名称 |
| rights | INT UNSIGNED | 0 | 权限位掩码 |
| BankMoneyPerDay | INT UNSIGNED | 0 | 每日可取银行金币上限(铜币) |
💡 rights 权限掩码说明:
rights 使用位掩码控制权限:1=听/说, 2=官员频道, 4=提升成员, 8=降级成员, 16=邀请, 32=踢出, 64=修改MOTD, 128=编辑公告, 256=使用银行, 512=查看银行日志, 1024=公会维修等。
公会银行系统
📑 guild_bank_tab(银行标签页)
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | 0 | 公会ID |
| TabId | TINYINT UNSIGNED | 0 | 标签页ID(0-5,最多6个标签页) |
| TabName | VARCHAR(16) | '' | 标签页名称 |
| TabIcon | VARCHAR(100) | '' | 标签页图标 |
| TabText | VARCHAR(500) | NULL | 标签页描述文本 |
📦 guild_bank_item(银行物品)
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | 0 | 公会ID |
| TabId | TINYINT UNSIGNED | 0 | 标签页ID |
| SlotId | TINYINT UNSIGNED | 0 | 槽位ID(0-97,98个格子) |
| item_guid | INT UNSIGNED | 0 | 物品全局唯一ID(关联 item_instance.guid) |
🔒 guild_bank_right(银行权限)
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | 0 | 公会ID |
| TabId | TINYINT UNSIGNED | 0 | 标签页ID |
| rid | TINYINT UNSIGNED | 0 | 等级ID(关联 guild_rank.rid) |
| gbright | TINYINT UNSIGNED | 0 | 银行权限掩码(1=查看, 2=存入, 4=取出) |
| SlotPerDay | INT UNSIGNED | 0 | 每日可取物品数量上限 |
📝 guild_bank_eventlog(银行日志)
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | 0 | 公会ID |
| LogGuid | INT UNSIGNED | 0 | 日志记录ID |
| TabId | TINYINT UNSIGNED | 0 | 银行标签页ID |
| EventType | TINYINT UNSIGNED | 0 | 事件类型(1=存入, 2=取出, 3=移动, 4=金币存入, 5=金币取出等) |
| PlayerGuid | INT UNSIGNED | 0 | 操作玩家GUID |
| ItemOrMoney | INT UNSIGNED | 0 | 物品条目ID或金币数 |
| ItemStackCount | SMALLINT UNSIGNED | 0 | 物品堆叠数量 |
| DestTabId | TINYINT UNSIGNED | 0 | 目标标签页ID |
| TimeStamp | INT UNSIGNED | 0 | 事件发生时间戳(UNIX) |
guild_eventlog 表结构
记录公会管理事件日志(加入、离开、晋升、降级等)。
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guildid | INT UNSIGNED | - | 公会ID |
| LogGuid | INT UNSIGNED | - | 日志记录ID |
| EventType | TINYINT UNSIGNED | - | 事件类型(1=邀请加入, 2=离开, 3=晋升, 4=降级等) |
| PlayerGuid1 | INT UNSIGNED | - | 操作玩家1 GUID |
| PlayerGuid2 | INT UNSIGNED | - | 操作玩家2 GUID |
| NewRank | TINYINT UNSIGNED | - | 新等级(晋升/降级时) |
| TimeStamp | INT UNSIGNED | - | 事件时间戳 |
guild_member_withdraw 表结构
追踪每个公会成员每日从银行提取的金币和物品数量。
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guid | INT UNSIGNED | - | 角色GUID,主键 |
| tab0 | INT UNSIGNED | 0 | 标签页0今日提取金额 |
| tab1 | INT UNSIGNED | 0 | 标签页1今日提取金额 |
| tab2 | INT UNSIGNED | 0 | 标签页2今日提取金额 |
| tab3 | INT UNSIGNED | 0 | 标签页3今日提取金额 |
| tab4 | INT UNSIGNED | 0 | 标签页4今日提取金额 |
| tab5 | INT UNSIGNED | 0 | 标签页5今日提取金额 |
| money | INT UNSIGNED | 0 | 今日已提取金币(铜币) |
快速参考
公会表关系
| guild | ← 核心表 |
| guild_member | ← 通过 guildid |
| guild_rank | ← 通过 guildid |
| guild_bank_tab | ← 通过 guildid |
| guild_bank_item | ← 通过 guildid+TabId |
| guild_bank_right | ← 通过 guildid+TabId |
| guild_eventlog | ← 通过 guildid |
| guild_member_withdraw | ← 通过 guid |
银行权限 gbright
| 1 | 查看 |
| 2 | 存入物品 |
| 4 | 取出物品 |
| 3 | 查看+存入 |
| 7 | 全部权限 |
银行事件 EventType
| 1 | 存入物品 |
| 2 | 取出物品 |
| 3 | 移动物品 |
| 4 | 存入金币 |
| 5 | 取出金币 |
公会日志 EventType
| 1 | 邀请加入 |
| 2 | 离开公会 |
| 3 | 晋升 |
| 4 | 降级 |
| 5 | 解散公会 |
实际案例
查询 查看公会成员列表(含角色名和等级名)
SELECT c.name AS player_name,
c.level,
gm.rank,
gr.rname AS rank_name,
gm.pnote
FROM guild_member gm
JOIN characters c ON gm.guid = c.guid
JOIN guild_rank gr ON gm.guildid = gr.guildid AND gm.rank = gr.rid
WHERE gm.guildid = 1
ORDER BY gm.rank, c.level DESC;查询 查找无公会成员的角色
-- 查找所有在线但没有公会的角色
SELECT c.guid, c.name, c.level, c.race, c.class
FROM characters c
LEFT JOIN guild_member gm ON c.guid = gm.guid
WHERE gm.guid IS NULL
AND c.online = 1;管理 查看各公会银行金币统计
SELECT g.guildid,
g.name AS guild_name,
ROUND(g.BankMoney / 10000, 2) AS bank_gold,
COUNT(DISTINCT gm.guid) AS member_count
FROM guild g
LEFT JOIN guild_member gm ON g.guildid = gm.guildid
GROUP BY g.guildid
ORDER BY g.BankMoney DESC;权限 设置某等级在所有银行标签页的权限
-- 给等级3(rid=3)在所有标签页设置"查看+存入"权限(gbright=3)
INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay)
SELECT 1, TabId, 3, 3, 10
FROM guild_bank_tab
WHERE guildid = 1;修改 解散无成员的僵尸公会
-- 查找无成员的公会
SELECT g.guildid, g.name
FROM guild g
LEFT JOIN guild_member gm ON g.guildid = gm.guildid
WHERE gm.guid IS NULL;
-- 删除这些公会的所有相关数据(请谨慎操作!)
-- 删除前请先确认并使用具体的 guildid常见问题
Q1: guild_member 表中 rid=0 代表什么?
rid=0 是会长(Guild Master),每个公会只有一个会长。rid 的值对应 guild_rank 表中的 rid 字段。
Q2: 公会银行最多有几个标签页?
最多6个标签页(TabId 0-5),每个标签页有98个物品槽位(SlotId 0-97)。
Q3: guild_member_withdraw 中的 tab0-tab5 是什么?
这些字段记录成员在每个银行标签页今日已提取的金额(铜币)。系统每天重置这些值以限制每日提取额度。
Q4: BankMoney 字段存储在哪个表?
公会银行金币总额存储在 guild 表的 BankMoney 字段中。注意角色个人金币存储在 characters.money。
Q5: guild_bank_right.SlotPerDay 的作用?
限制对应等级成员每天可从该标签页取出的物品数量。设为0表示无限或不限制。