跳到主要内容

GUI 自定义

Assiah 的所有界面都通过 YAML 配置文件定义,你可以自由修改布局、图标、文本和交互动作。

GUI 文件列表

文件界面
ui/mailbox-main.yml邮箱主界面(邮件列表)
ui/mailbox-detail.yml邮件详情
ui/mailbox-compose.yml撰写邮件
ui/mailbox-draft.yml草稿箱
ui/mailbox-admin.yml管理员面板
ui/mailbox-preference.yml偏好设置

配置结构

每个 GUI 配置文件包含以下部分:

# 窗口标题(支持占位符)
title: "&8邮箱 {folder-display} &7[{page}/{max-page}]"

# 内部标识名
display: mailbox-main

# 行数(1~6)
rows: 6

# 字符布局
layout:
- "IIIIIIIII"
- "IMMMMMMMI"
- "IMMMMMMMI"
- "IMMMMMMMI"
- "IPMMMMMNI"
- "WBSDATREC"

# 图标定义
icons:
I:
role: STATIC
material: GRAY_STAINED_GLASS_PANE
name: " "
M:
role: MAIL_LIST
template: mail-summary
actions:
left:
- "mail:open-detail"

# 模板定义
templates:
mail-summary:
material: PAPER
name: "&f{mail.title}"
lore:
- "&7发件人: &f{mail.sender}"

下图展示了图标在 GUI 中的实际效果:

按钮图标效果

对应的 YAML 配置:

按钮配置示例

字符布局系统

layout 中的每个字符对应 icons 中的一个图标定义。每行 9 个字符,对应 GUI 中的 9 个槽位。

例如邮箱主界面的布局:

IIIIIIIII    ← 顶部装饰
IMMMMMMMI ← 邮件列表(7 个槽位)
IMMMMMMMI ← 邮件列表
IMMMMMMMI ← 邮件列表
IPMMMMMNI ← 上一页 + 邮件列表 + 下一页
WBSDATREC ← 功能按钮行

底部按钮行:W=写信, B=返回, S=已发送, D=草稿, A=归档, T=回收站, R=刷新, E=偏好, C=关闭

图标角色 (Role)

每个图标必须指定一个 role,决定该槽位的功能类型:

通用角色

角色说明
STATIC静态装饰物品,无交互
CLOSE关闭 GUI
BACK返回上一级界面
REFRESH刷新当前页面数据
PREV_PAGE上一页
NEXT_PAGE下一页

邮箱主界面角色

角色说明
MAIL_LIST邮件/草稿列表槽位,动态填充
COMPOSE写新邮件
OPEN_FOLDER打开指定文件夹
OPEN_DRAFT打开草稿箱
OPEN_PREFERENCE打开偏好设置

邮件详情角色

角色说明
DETAIL邮件详情展示
ATTACHMENT_LIST附件列表
CLAIM领取全部附件
DELETE删除邮件
REPLY回复邮件
FORWARD转发邮件
ARCHIVE归档邮件
RESTORE从回收站恢复
MARK_UNREAD切换已读/未读

撰写界面角色

角色说明
EDIT_RECIPIENT编辑收件人
EDIT_TITLE编辑标题
EDIT_BODY编辑正文
UPLOAD_ITEM上传物品附件
UPLOAD_SOURCE_ITEM上传物品库物品附件(仅管理员)
EDIT_KETHER编辑 Kether 脚本附件(仅管理员)
UPLOAD_CURRENCY上传货币附件
EDIT_RECEIVE_CONDITION编辑接收条件(仅管理员)
EDIT_CLAIM_CONDITION编辑领取条件(仅管理员)
SAVE_DRAFT保存草稿
SEND_DRAFT发送邮件

偏好设置角色

角色说明
TOGGLE_PLAYER_MAIL切换玩家邮件接收
TOGGLE_SYSTEM_MAIL切换系统邮件接收
TOGGLE_WHITELIST切换白名单模式
TOGGLE_BLACKLIST黑名单管理

管理员面板角色

角色说明
ADMIN_INSPECT管理员检查信息展示

动作系统

通过 actions 配置点击动作,按鼠标按键分类:

actions:
left:
- "mail:open-detail"
right:
- "mail:quick-claim"
shift-left:
- "mail:delete"
shift-right:
- "mail:archive"

动作格式为 mail:<动作名>mail:<动作名>:<参数>

可用动作

动作说明
mail:open-detail打开邮件详情
mail:quick-claim快速领取附件
mail:claim领取全部附件
mail:claim-single领取单个附件
mail:delete删除邮件
mail:archive归档邮件
mail:restore恢复邮件
mail:mark-unread切换已读/未读
mail:reply回复邮件
mail:forward转发邮件
mail:open-book以书本视图打开
mail:compose写新邮件
mail:open-folder:<文件夹>打开指定文件夹(SENT/ARCHIVE/TRASH)
mail:open-draft打开草稿
mail:delete-draft删除草稿
mail:open-preference打开偏好设置
mail:toggle-preference:<项>切换偏好(player-mail/system-mail/whitelist/blacklist)
mail:open-filter关闭 GUI → 聊天栏输入筛选关键词 → 重新打开列表
mail:toggle-select切换邮件多选状态(用于批量操作)
mail:edit-recipient编辑收件人
mail:edit-title编辑标题
mail:edit-body编辑正文
mail:upload-item上传物品
mail:upload-source-item上传物品库物品(仅管理员,聊天栏输入物品源 ID)
mail:edit-kether编辑 Kether 脚本(仅管理员,笔与书输入)
mail:upload-currency <key>上传货币附件(key 对应 currency.yml 中的货币键名)
mail:edit-receive-condition编辑接收条件(仅管理员,笔与书输入 Kether 脚本)
mail:edit-claim-condition编辑领取条件(仅管理员,笔与书输入 Kether 脚本 + 聊天栏输入提示消息)
mail:remove-attachment移除附件
mail:save-draft保存草稿
mail:send-draft发送邮件
mail:page-prev上一页
mail:page-next下一页
mail:refresh刷新
mail:back返回
mail:close关闭

附件列表模板映射

ATTACHMENT_LIST 角色的槽位支持通过 templates 字段为不同附件类型指定不同的展示模板。

邮件详情界面

邮件详情界面的附件列表支持 5 种附件类型的模板映射:

A:
role: ATTACHMENT_LIST
template: attachment # 默认兜底模板
templates:
ITEM: attachment-item # 物品附件 → 显示物品材质和 Lore
CURRENCY: attachment-currency # 货币附件 → 显示货币名称和数量
KETHER: attachment-kether # Kether 附件 → 显示脚本预览
SOURCE_ITEM: attachment-source-item # 物品库附件 → 显示物品源标识
actions:
left:
- "mail:claim-single"

物品库附件模板示例:

templates:
attachment-source-item:
material: ENDER_CHEST
name: "&b{attachment.name}"
lore:
- "&7类型: &f{attachment.type}"
- "&7来源: &f{attachment.source}"
- "&7数量: &f{attachment.item.amount}"
- "&7可领取: &f{attachment.claimable}"
- ""
- "&e左键领取此附件"

撰写界面

撰写界面的附件列表同样支持 templates 映射,用于展示已添加的附件。未匹配到类型模板时,回退到 template 指定的默认模板:

L:
role: ATTACHMENT_LIST
template: attachment-item # 默认兜底模板
templates:
ITEM: attachment-item
CURRENCY: attachment-currency
KETHER: attachment-kether
SOURCE_ITEM: attachment-source-item
actions:
right:
- "mail:remove-attachment"
提示

支持的类型键:ITEMCURRENCYKETHERSOURCE_ITEMTEXT。你可以根据需要为每种类型配置独立的展示模板。

模板与占位符

模板用于动态内容槽位(如邮件列表、附件列表)的物品渲染。

邮件摘要占位符

占位符说明
{mail.title}邮件标题
{mail.sender}发件人显示名称
{mail.receiver}收件人显示名称
{mail.status-display}状态文本(未读/已读/已领取等)
{mail.time}格式化时间
{mail.id}邮件唯一 ID
{mail.summary}正文摘要

撰写界面占位符

撰写界面除了支持上述邮件摘要占位符外,还提供以下专用占位符:

占位符说明
{mail.recipient}收件人显示名称(群发时显示群发目标)
{mail.body}草稿正文(截取前 120 字符)
{attachment.count}当前附件总数
{attachment.<currencyKey>}指定货币键名的当前数量(如 {attachment.vault}
{condition.receive.status}接收条件状态(已设置 / 未设置
{condition.claim.status}领取条件状态(已设置 / 未设置
{condition.receive.preview}接收条件脚本预览(前 40 字符)
{condition.claim.preview}领取条件脚本预览(前 40 字符)

附件占位符

通用占位符(所有附件类型均可使用):

占位符说明
{attachment.name}附件名称
{attachment.type}附件类型显示文本
{attachment.claimable}是否可领取
{attachment.count}当前附件数量

物品附件 (ITEM) 额外占位符:

占位符说明
{attachment.item.name}物品显示名称
{attachment.item.amount}物品数量
{attachment.item.material}物品材质名称
{attachment.lore}物品原始 Lore(列表占位符,展开为多行;无 Lore 时该行自动移除)

货币附件 (CURRENCY) 额外占位符:

占位符说明
{attachment.currency}货币键名(如 vault)
{attachment.currency.name}货币显示名称
{attachment.amount}货币数量

Kether 附件 (KETHER) 额外占位符:

占位符说明
{attachment.script.preview}脚本内容预览(截取前 40 字符)

物品库附件 (SOURCE_ITEM) 额外占位符:

占位符说明
{attachment.source}物品源标识(如 mythicmobs:FireSword
{attachment.item.amount}物品数量

偏好占位符

占位符说明
{preference.player-mail}玩家邮件接收状态
{preference.system-mail}系统邮件接收状态
{preference.whitelist}白名单模式状态
{preference.blacklist}黑名单状态

管理员面板占位符

占位符说明
{admin.inbox}收件箱邮件总数
{admin.unread}未读邮件数量
{admin.trash}回收站邮件数量
{admin.archive}归档邮件数量
{admin.failed-claim}领取失败数量

分页占位符

占位符说明
{page}当前页码
{max-page}总页数
{folder-display}当前文件夹显示名称

子图标系统 (icons)

v1.0.9 新增了子图标功能,类似 TrMenu 的 icons 机制。你可以为任意图标定义多个条件子图标,根据 Kether 条件脚本动态切换图标的外观和动作。

配置格式

在图标定义中添加 icons 列表:

icons:
W:
role: COMPOSE
material: WRITABLE_BOOK
name: "&a写新邮件"
lore:
- "&7点击创建新邮件"
actions:
left:
- "mail:compose"
# 子图标列表
icons:
- condition: "perm *assiah.vip" # Kether 条件脚本(必填)
priority: 1 # 优先级,数值越小越先匹配(可选)
inherit: true # 是否继承父图标未覆盖的属性(可选,默认 false)
material: DIAMOND # 覆盖材质(可选)
name: "&6&lVIP 写信" # 覆盖名称(可选)
lore: # 覆盖描述(可选)
- "&e尊贵的 VIP 用户"
- "&7点击创建新邮件"
actions: # 覆盖动作(可选)
left:
- "mail:compose"

匹配规则

  • 子图标按 priority 升序匹配,第一个条件满足的生效
  • 如果所有子图标条件均不满足,使用父图标的默认配置
  • inherit: true 时,子图标未指定的属性(material/name/lore/actions)会继承父图标
  • inherit: false(默认)时,子图标必须完整定义所有需要的属性

条件脚本

condition 字段使用 Kether 脚本语法,必须返回布尔值。常用示例:

# 检查权限
condition: "perm *assiah.vip"

# 检查 PAPI 变量
condition: "check papi %player_level% > 10"