跳到主要内容

Guild

公会系统,支持角色、邀请、共享银行和 GUI 菜单,并在服务器间同步。

私有v0.1.0社交
依赖TypeWriter0.9.0-beta-177 (BTC build)GUI (TypeWriter extension)MySQL (TypeWriter extension)可选NumericalStorage (TypeWriter extension)可选Redis or Valkey可选

专为 BornToCraft 服务器网络打造。此扩展仅作参考文档,不对外分发。

概述​

Guild 让玩家创建公会、邀请他人、管理职级并共享银行。一切都可以通过 /guild 命令使用,你还可以添加一个在网页面板中构建的菜单,这样玩家就无需输入命令。公会有一位会长,以及任意数量的官员、成员和新人。

所有公会都存储在同一个 Guild Artifact 中,并保留在内存中以便快速读取。借助 MySQL 桥接和 Redis,每次更改都会广播到网络中的其他服务器;公会银行是数据库中单独的一行,因此两个服务器永远不会重复花掉同一笔金币。

菜单是一个 GUI 菜单。你设计它的布局和界面,把物品标记为公会按钮,扩展则会添加成员头像和邀请横幅。

功能​

  • 公会和角色 — 会长、官员、成员和新人,支持创建、邀请、踢出、晋升、转让和解散。
  • 邀请 — 按名称邀请,通过 /guild join 加入,也可以在菜单中通过搜索框接受或拒绝。
  • 公会菜单 — 一个条目承载所有界面,带有成员头像、分页和标签页。
  • 感知状态的按钮 — 不适用于该玩家的按钮(已在公会中时的创建、非会长时的解散)会从布局中移除。
  • 公会银行 — 使用玩家的 NumericalStorage 余额存取,数据库行为原子操作。
  • 跨服务器同步 — 创建、成员、角色、银行和移除都会同步到该组的每个服务器。
  • 占位符 — 名称、角色、会长、规模、在线人数、银行、成员名称,以及按玩家查询。
  • 管理命令 — 列出公会、查看某个公会,以及代表会长解散或踢出。

安装​

  1. 安装负责绘制菜单的 GUI 扩展。
  2. 如果玩家需要使用银行,请安装 NumericalStorage 扩展。它提供存取款所使用的余额。
  3. 可选,适用于多个服务器:安装 MySQL 扩展,启用 Redis(或 Valkey),并在每个服务器上设置相同的 redis.group-id。公会银行同样需要 MySQL 扩展,参见公会银行。
  4. 将 Guild 的 JAR 放入 plugins/Typewriter/extensions/,然后重启服务器。
  5. 在一个 static 页面上创建一个 Guild Artifact 并发布。

guild.use 默认授予所有人,guild.admin 默认授予 OP。

快速上手​

构建一个通过 /guild 打开的公会菜单:

  1. 在 TypeWriter 网页面板中,在一个 static 页面上添加一个 Guild Artifact。保持 artifactId 为 btc_guild_data。
  2. 添加一个 Guild Menu 条目。/guild 会打开找到的第一个 Guild Menu。
  3. 设置 inventoryTitle、inventoryRows 和 guiType,在 layoutPool 中构建布局并设置 mainLayoutId。参见 GUI 指南。
  4. 在 views 中声明你的界面(例如 main、members、join)。将列出成员的界面 id 放入 memberListViewIds,将列出待处理邀请的界面 id 放入 joinListViewIds。
  5. 添加物品,并将 buttonType 设为公会按钮:GUILD_MEMBERS 和 GUILD_BANK 打开界面,GUILD_LEAVE 和 GUILD_DISBAND 立即执行,PAGE_NAV 用于在列表中翻页。
  6. 对于需要输入名称的按钮(创建、邀请、踢出、晋升、转让),请给物品设置一个 input 对话框,其 onInputCommands 运行相应命令,例如 guild create {input}。
  7. 发布并运行 /guild。
加入界面

id 为 join 的界面就是 GUILD_JOIN 和 GUILD_PENDING_INVITES 所打开的界面。请把 join 添加到 views 和 joinListViewIds 中,并给它一个带有 input 对话框的物品,运行 guild joinsearch {input},让玩家可以按公会名称过滤邀请。

工作原理​

公会会在启动时加载到内存中。每次更改之后,公会会在后台保存到 artifact 并广播到其他服务器,由它们替换各自的副本。待处理的邀请只保存在内存中,不会被持久化。

菜单​

Guild Menu 是一个 GUI 菜单,具有以下公会专属的行为。

内容面板。 在 memberListViewIds 所列出的界面上,每位成员是一个玩家头像,会长排在最前,并显示其角色和在线状态。如果你是会长,左键点击可晋升成员,右键点击则踢出成员。在 joinListViewIds 所列出的界面上,每个待处理的邀请是一面横幅:左键点击加入,右键点击拒绝。面板的位置由 contentX、contentY、contentColumns 和 contentRows 决定。

按钮。 这些 buttonType 值开箱即用:

buttonType点击
GUILD_MEMBERS打开 members 界面(guild open members)。
GUILD_BANK打开 bank 界面(guild open bank)。
GUILD_ALLIANCES, GUILD_WARS打开 allies 或 wars 界面(见下方说明)。
GUILD_LEAVE离开公会。
GUILD_DISBAND解散公会(仅限会长)。
GUILD_JOIN, GUILD_PENDING_INVITES切换到同一菜单的 join 视图。
NAV_BACK, NAV_CLOSE返回、关闭菜单。
PAGE_NAV左键向前,右键向后;名称会显示页码计数器。当一页就够用时会隐藏。

这些值不会附加任何动作。它们适用于你自己配置的物品(显示文本,或运行相应命令的 input 对话框):GUILD_INFO、GUILD_MEMBER_MANAGE、GUILD_INVITE、GUILD_CREATE、GUILD_KICK、GUILD_PROMOTE、GUILD_DEMOTE、GUILD_TRANSFER、GUILD_ALLY_ADD、GUILD_ALLY_REMOVE、GUILD_WAR_DECLARE、GUILD_WAR_END、GUILD_BANK_DEPOSIT、GUILD_BANK_WITHDRAW、GUILD_ACCEPT_INVITE、GUILD_DECLINE_INVITE。

隐藏的按钮。 当物品不适用时,会从布局中移除:玩家已有公会时的 GUILD_CREATE 和 GUILD_JOIN;玩家不是会长或官员时的 GUILD_INVITE;没有公会时的 GUILD_LEAVE、GUILD_MEMBERS、GUILD_BANK、GUILD_ALLIANCES 和 GUILD_WARS;玩家不是会长时的 GUILD_DISBAND。

槽位命令。 物品可以运行 guild open [view]、guild page next|prev|<number>、guild create <name>、guild invite <name>、guild join <guild>、guild declineinvite <guild>、guild joinsearch <text>、guild leave、guild disband、guild kick <name>、guild promote <name> 和 guild transfer <name>。它们会以点击的玩家身份运行。

联盟、战争和降级

公会会存储盟友列表、敌人列表和等级,占位符也会提供它们,但此版本中没有任何命令或按钮可以更改它们:等级保持为 1,也没有降级命令。allies 和 wars 界面只有在你自己构建时才存在。

语言

默认的菜单文本(标题 “Guilde”、头像 lore)是法语的,guild admin 的回复也是法语的。面向玩家的聊天消息是英语的。请在你的布局中覆盖菜单文本。

公会银行​

银行作用于数据库表 btc_guild_bank 中的公会余额(该名称不遵循 table-prefix),该表会在 MySQL 数据库中自动创建。每个操作都是原子的,因此来自不同服务器的存取款不会使银行透支。

  • /guild deposit <amount> 从玩家在 NumericalStorage 中的余额里扣除金币,并加入银行。任何成员都可以存款。
  • /guild withdraw <amount> 将金币从银行转给玩家。只有会长和官员可以取款。
  • 如果无法连接银行,存款会被退还,并告知玩家存储暂时不可用。

没有启用 MySQL 扩展,或没有 NumericalStorage 时,银行无法使用。

命令​

所有命令都需要 guild.use。别名:/g、/guilde。不带参数的命令会打开第一个 Guild Menu,如果不存在则不输出任何内容。

命令说明
/guild打开公会菜单。
/guild create <name>创建公会。名称必须为 3 到 16 个字母或数字。
/guild invite <player>邀请一位玩家(会长或官员)。
/guild join <guild>加入你受邀加入的公会。
/guild leave离开你的公会。仍有成员的会长必须先转让或解散。
/guild kick <player>踢出成员(会长,或官员踢非官员)。
/guild promote <player>将新人晋升为成员,将成员晋升为官员(仅限会长)。
/guild transfer <player>移交会长身份。原会长成为官员。
/guild deposit <amount>将金币存入公会银行。
/guild withdraw <amount>从银行取出金币(会长或官员)。
/guild info输出你公会的会长、成员数量、等级和银行余额。
/guild disband解散你的公会(仅限会长)。
/guild admin list列出所有公会(需要 guild.admin)。
/guild admin info <guild>显示某个公会。
/guild admin disband <guild>解散某个公会。其会长必须在线。
/guild admin kick <guild> <player>踢出某位成员。该公会的会长必须在线。

权限​

权限默认授予
guild.use所有人每个 /guild 命令。菜单点击会执行相同的动作,但不会检查它。
guild.adminOP/guild admin 命令。

占位符​

用于 MiniMessage 文本的 MiniPlaceholders 标签,例如 <guild_name>。

占位符返回值
<guild_in_guild>玩家在公会中时为 1,否则为 0。
<guild_name>公会名称,没有公会时为空。
<guild_role>LEADER、OFFICER、MEMBER 或 RECRUIT。
<guild_leader>会长的名称。
<guild_size>, <guild_members>成员数量(两者返回相同的值)。
<guild_online_count>在本服务器上在线的成员数。
<guild_level>公会等级(目前始终为 1),没有公会时为 0。
<guild_bank>本服务器上存储的银行余额。
<guild_allies_count>, <guild_enemies_count>盟友和敌人的数量。
<guild_list>以逗号分隔的成员名称。
<guild_member_name:index>该位置的成员名称,从 0 开始。
<guild_of:name>指定名称玩家所在的公会,没有时为空。

条目​

2 个条目,由扩展源码生成。

动作1
构件1

故障排查​

重启后公会消失了。 没有发布 Guild Artifact,因此什么都没有被保存。请在 static 页面上添加它并发布。

/guild create 回复 “Guild name must be alphanumeric and between 3-16 characters.” 名称只接受字母和数字,不能有空格或下划线。

/guild 不输出任何内容。 没有 Guild Menu 条目。请创建并发布一个。诸如 /guild info 的子命令在没有它时也能使用。

存款失败并提示 “Insufficient funds”。 存款读取的是玩家的 NumericalStorage 余额。请安装 NumericalStorage,并检查玩家在那里是否有足够的金币。

“Guild bank storage is temporarily unavailable.” 无法连接银行表。请启用 MySQL 扩展(mysql.enabled: true),并在日志中检查数据库连接。存款会被退还。

在一个服务器上创建的公会在另一个服务器上缺失。 每个服务器都需要相同的 redis.group-id、唯一的 redis.server-name,以及 mysql.enabled: true,这样 artifact 才会被共享。没有 group-id 就不会广播任何内容。

成员头像或邀请横幅没有出现。 当前界面没有列在 memberListViewIds 或 joinListViewIds 中。当 views 为空时,菜单会使用 view:请将其设为 members 或 join。

相关扩展​

  • MySQL — Redis 消息传递以及公会银行背后的数据库。
  • GUI — 公会菜单所使用的布局、视图和 input 对话框。
  • NumericalStorage — 银行所使用的玩家余额。
  • Friend 和 Party — 其他社交系统。