guild 公会系统

公会核心表及关联子系统 · 完整公会数据库文档

📖 官方文档来源

📖公会系统概述

公会系统由一个核心表 + 七个关联子表组成,覆盖公会的完整功能:

💡 关键概念:公会由 guildid 唯一标识,通过 leaderguid 关联到 characters 表中的会长角色。公会银行有独立的标签页、物品和权限管理。
🎯 关联关系:guild_member.guidcharacters.guid, guild_rank.guildidguild.guildid, 银行相关表都通过 guildid 关联到 guild 表。

📋guild 表结构

公会核心表,存储每个公会的基本信息。

字段名类型默认值说明
guildidINT UNSIGNED0公会唯一ID,主键
nameVARCHAR(24)''公会名称(最多24字符)
leaderguidINT UNSIGNED0会长角色GUID(关联 characters.guid)
EmblemStyleTINYINT UNSIGNED0徽章样式ID
EmblemColorTINYINT UNSIGNED0徽章颜色ID
BorderStyleTINYINT UNSIGNED0边框样式ID
BorderColorTINYINT UNSIGNED0边框颜色ID
BackgroundColorTINYINT UNSIGNED0背景颜色ID
infoVARCHAR(500)''公会信息/公告
motdVARCHAR(128)''今日消息(Message of the Day)
createdateINT UNSIGNED0公会创建时间戳
BankMoneyBIGINT UNSIGNED0公会银行金币(铜币单位)

👥guild_member 表结构

记录每个公会的成员列表及成员备注。

字段名类型默认值说明
guildidINT UNSIGNED-公会ID
guidINT UNSIGNED-角色GUID(唯一索引)
rankTINYINT UNSIGNED-成员等级(对应 guild_rank.rid)
pnoteVARCHAR(31)''公开备注(所有人可见)
offnoteVARCHAR(31)''官员备注(仅官员可见)

🏅guild_rank 表结构

定义每个公会的等级结构、权限和每日银行取款限额。

字段名类型默认值说明
guildidINT UNSIGNED0公会ID
ridTINYINT UNSIGNED-等级ID(0=会长, 1=官员, 以此类推)
rnameVARCHAR(20)''等级名称
rightsINT UNSIGNED0权限位掩码
BankMoneyPerDayINT UNSIGNED0每日可取银行金币上限(铜币)
💡 rights 权限掩码说明:rights 使用位掩码控制权限:1=听/说, 2=官员频道, 4=提升成员, 8=降级成员, 16=邀请, 32=踢出, 64=修改MOTD, 128=编辑公告, 256=使用银行, 512=查看银行日志, 1024=公会维修等。

🏦公会银行系统

📑 guild_bank_tab(银行标签页)

字段名类型默认值说明
guildidINT UNSIGNED0公会ID
TabIdTINYINT UNSIGNED0标签页ID(0-5,最多6个标签页)
TabNameVARCHAR(16)''标签页名称
TabIconVARCHAR(100)''标签页图标
TabTextVARCHAR(500)NULL标签页描述文本

📦 guild_bank_item(银行物品)

字段名类型默认值说明
guildidINT UNSIGNED0公会ID
TabIdTINYINT UNSIGNED0标签页ID
SlotIdTINYINT UNSIGNED0槽位ID(0-97,98个格子)
item_guidINT UNSIGNED0物品全局唯一ID(关联 item_instance.guid)

🔒 guild_bank_right(银行权限)

字段名类型默认值说明
guildidINT UNSIGNED0公会ID
TabIdTINYINT UNSIGNED0标签页ID
ridTINYINT UNSIGNED0等级ID(关联 guild_rank.rid)
gbrightTINYINT UNSIGNED0银行权限掩码(1=查看, 2=存入, 4=取出)
SlotPerDayINT UNSIGNED0每日可取物品数量上限

📝 guild_bank_eventlog(银行日志)

字段名类型默认值说明
guildidINT UNSIGNED0公会ID
LogGuidINT UNSIGNED0日志记录ID
TabIdTINYINT UNSIGNED0银行标签页ID
EventTypeTINYINT UNSIGNED0事件类型(1=存入, 2=取出, 3=移动, 4=金币存入, 5=金币取出等)
PlayerGuidINT UNSIGNED0操作玩家GUID
ItemOrMoneyINT UNSIGNED0物品条目ID或金币数
ItemStackCountSMALLINT UNSIGNED0物品堆叠数量
DestTabIdTINYINT UNSIGNED0目标标签页ID
TimeStampINT UNSIGNED0事件发生时间戳(UNIX)

📜guild_eventlog 表结构

记录公会管理事件日志(加入、离开、晋升、降级等)。

字段名类型默认值说明
guildidINT UNSIGNED-公会ID
LogGuidINT UNSIGNED-日志记录ID
EventTypeTINYINT UNSIGNED-事件类型(1=邀请加入, 2=离开, 3=晋升, 4=降级等)
PlayerGuid1INT UNSIGNED-操作玩家1 GUID
PlayerGuid2INT UNSIGNED-操作玩家2 GUID
NewRankTINYINT UNSIGNED-新等级(晋升/降级时)
TimeStampINT UNSIGNED-事件时间戳

📊guild_member_withdraw 表结构

追踪每个公会成员每日从银行提取的金币和物品数量。

字段名类型默认值说明
guidINT UNSIGNED-角色GUID,主键
tab0INT UNSIGNED0标签页0今日提取金额
tab1INT UNSIGNED0标签页1今日提取金额
tab2INT UNSIGNED0标签页2今日提取金额
tab3INT UNSIGNED0标签页3今日提取金额
tab4INT UNSIGNED0标签页4今日提取金额
tab5INT UNSIGNED0标签页5今日提取金额
moneyINT UNSIGNED0今日已提取金币(铜币)

快速参考

公会表关系

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表示无限或不限制。