跳到主要内容

菜单

星月邮箱有三个箱子界面,外观全部写在 plugins/StarMail/menus/ 里:

文件界面打开方式
mailbox.yml邮箱主界面/sm、/sm view <玩家>
mail.yml单封邮件在邮箱里左键点一封邮件
compose.yml写信(玩家写信与管理员写信共用)/sm write、/sm admin、/sm template create

改完执行 /sm reload 生效。想恢复某个文件的默认样子:把它改名或删除,再 /sm reload,会重新生成默认文件。

三个文件共通的写法​

title: '<gradient:#7F7FD5:#86A8E7:#91EAE4>✉ 星月邮箱</gradient> <dark_gray>· <gray>{unread} 未读'
rows: 6
content-slots: ['10-16', '19-25', '28-34', '37-43']

sounds:
open: 'BLOCK_ENDER_CHEST_OPEN:0.35:1.6'
click: 'UI_BUTTON_CLICK:0.4:1.4'
fail: 'BLOCK_NOTE_BLOCK_BASS:0.6:0.8'
delete: 'ENTITY_ITEM_FRAME_REMOVE_ITEM:0.6:1.0'

decorations:
frame:
material: BLACK_STAINED_GLASS_PANE
slots: ['0-8', '45-53', 9, 17]

buttons:
claim-all:
slot: 49
material: CHEST_MINECART
name: '<gold>一键领取'
lore: ['<gray>领取全部 {unclaimed} 封邮件的附件']
键作用
title界面标题,支持 & 颜色、&#RRGGBB 与 MiniMessage。可用变量:邮箱主界面 {unread} {unclaimed} {total} {owner} {player};单封邮件 {title} {sender};写信界面不使用变量
rows行数,1 ~ 6
content-slots放「列表内容」的格位:邮箱主界面放邮件,单封邮件放附件,写信界面是附件格。可以写数字或范围 '10-16'。和按钮重叠的格位会自动跳过;没写时使用除了最后一行以外的全部格位
items-per-page(选填)每页最多显示几项,默认等于内容格位的数量
soundsopen 打开、click 点击按钮、fail 操作失败、delete 删除(邮箱与单封邮件)、send 管理员写信寄出(玩家寄信成功时固定播放经验球音效)
decorations装饰(玻璃板等),可以写好几组,键名随便取。只显示,点了没反应
buttons按钮。键名就是功能(见各界面的功能键),不认识的键名是只执行 actions 的自定义按钮

格位编号从 0 开始,第一行是 0 ~ 8,第二行 9 ~ 17,依此类推。

音效写法​

写法意思
UI_BUTTON_CLICK原版音效名称,音量与音调都是 1
UI_BUTTON_CLICK:0.6音量 0.6
UI_BUTTON_CLICK:0.6:1.2音量 0.6、音调 1.2
minecraft:block.note_block.pling用音效 ID(资源包的自定义音效也可以,例如 myserver:ui.open:0.8:1)
''不播放

写错的音效名称会被忽略,不会让界面出错。

按钮与装饰的键​

键默认作用
type键名指定功能。键名就是功能键时不用写;想用别的键名、或同一个功能放两个按钮时写 type: next 这样。写 type: action 表示只执行 actions
slot / slots—格位,slot: 4、slots: [45, 53]、slots: ['0-8', 17]
material按钮 STONE / 装饰 BLACK_STAINED_GLASS_PANE材质,写错时变成石头
amount1数量(1 ~ 64)
name空名称,支持颜色与该界面的变量
lore无说明,一行一个项目,支持颜色与变量
custom-model-data0自定义模型数据,0 = 不用
item-model空物品模型(1.21.4+),例如 myserver:gui/mail
tooltip-style空提示框样式(1.21.2+),例如 myserver:mail
head空头颅材质(material 要是 PLAYER_HEAD),见下方
glowfalse附魔光效
sound界面的 click点击这个按钮的音效(覆盖 sounds.click)
permission空没有这个权限的玩家看不到这个按钮
enabledtruefalse = 暂时停用这个按钮 / 装饰,不用删掉整段
states—不同状态下的外观,见下方
actions—点击时执行的动作,见下方
modeboth只有写信界面用:player 只在玩家写信显示 / admin 只在管理员写信显示 / both 都显示

按钮物品会隐藏原版的属性、附魔等说明,名称与说明默认不是斜体。

head 的写法:

写法显示
'{player}'正在看这个界面的玩家自己的头
'{target}'邮箱主界面 = 邮箱主人;单封邮件 = 寄件人
Steve 或 UUID那个玩家的头(要是服务器认识的玩家)
很长的一串 base64头颅网站复制的 textures 值(可以加 base64: 前缀)

states 状态外观: 只写要改的项目,其余沿用按钮本身的设定。

claim-all:
slot: 49
material: CHEST_MINECART
glow: true
name: '<gold>✦ 一键领取 ✦'
states:
none: # 没有可领取的附件时
material: MINECART
glow: false
name: '<dark_gray>一键领取'
lore: ['<dark_gray>没有待领取的附件']

每个功能键有哪些状态,见下面各界面的说明。

actions 动作(自定义按钮,type: action 或不认识的键名):

写法效果
'command: spawn'玩家执行指令
'console: give {player} diamond'控制台执行指令
'message: <green>你好'给玩家发一条消息
'sound: ENTITY_PLAYER_LEVELUP'播放音效
'close'关闭界面

动作里可以用 {player} 代表玩家名。例子:在邮箱左下加一个回主城的按钮:

buttons:
back-to-spawn:
slot: 46
material: ENDER_PEARL
name: '<aqua>回到主城'
actions:
- 'close'
- 'command: spawn'

说明文字的排版规则​

  • 一行里有多行变量(例如 {content}、{attachments})时,这一行会按内容重复好几行;内容是空的就整行拿掉。
  • 连续的空行只保留一行,开头与结尾的空行会自动去掉。所以可以放心地用 '' 分段,某段没内容时不会留下一堆空白。

邮箱主界面 mailbox.yml​

功能键​

键作用状态
previous / next上一页 / 下一页,只有前后还有页时才显示—
filter筛选:左键下一个、右键上一个(全部 → 未读 → 待领取)—
claim-all一键领取none:没有可领取的附件
read-all全部标为已读none:没有未读邮件
delete-read删除已读、无待领附件的邮件(连按两次)confirm:第一次点下后,等待确认时
write写信;没有 starmail.write、关闭玩家互寄或在 /sm view 里时不显示—
close关闭界面—
overview只显示(例如概览)—

claim-all、read-all 在管理员查看别人邮箱(/sm view)时不显示。默认文件里的 help 按钮是 type: action、没有动作,所以只是显示说明。

变量​

变量内容
{player}正在看的玩家
{owner}邮箱主人(/sm view 时是被查看的玩家)
{unread} / {unclaimed} / {total}未读数 / 待领取数 / 邮件总数
{shown}目前筛选下的邮件数
{page} / {pages}目前页码 / 总页数
{filter} / {next_filter}目前筛选 / 下一个筛选的名称(文字在 messages.yml 的 filter)

邮件的外观(mail-item)​

每封邮件显示成什么样子:

mail-item:
icons:
attachment: CHEST # 附件待领取
unread: WRITABLE_BOOK # 未读(没有附件)
read: PAPER # 已读(没有附件)
claimed: MAP # 附件已领取
use-mail-icon: true
glow-unread: true
name: '{status} <white>{title}'
lore:
- '<dark_gray>{type}邮件 · #{id}'
- ''
- '<gray>寄件人 <white>{sender}'
- '<gray>时间 <white>{time} <dark_gray>({ago})'
- '{expire_line}'
- ''
- '{content}'
- ''
- '{attachments}'
- ''
- '{actions}'
键默认作用
icons.attachment / unread / read / claimed见上四种状态的材质
use-mail-icontrue附件待领取时,改用寄件时指定的图标(模板的 icon、插件寄信时指定的图标)
glow-unreadtrue未读的邮件带光效
name / lore见上名称与说明
custom-model-data / item-model / tooltip-style无同按钮
expire-line<gray>过期 <yellow>{expire}{expire_line} 的内容。只有设了期限、附件还没领的邮件才显示
content-lines3正文预览几行
content-line<gray>{line}正文每一行的格式
content-more<dark_gray>…… 点开阅读全文正文超过预览行数时多加的一行
attachment-lines5附件预览最多几项
attachment-header / attachment-header-claimed见默认文件附件区的标题 / 已领取时的标题
attachment-line<dark_gray>▪ <white>{name} <gray>×{amount}物品的格式({name} 物品名称、{amount} 数量)
money-line / points-line见默认文件金币({money})/ 点券({points})的格式
note-line<dark_gray>▪ <light_purple>{note}附件说明的格式
command-line<dark_gray>▪ <light_purple>特殊奖励 ×{count}有指令奖励、但没有附件说明时显示
attachment-more<dark_gray>…… 还有 {count} 项附件超过预览数量时
actions.open / claim / delete / admin-delete / book见默认文件{actions} 里的操作提示,只列出这封信现在能做的操作;写成 '' 就不显示那一项

邮件的变量:

变量内容
{title} / {sender}标题 / 寄件人(没有标题时显示 messages.yml 的 no-title)
{time} / {ago}寄出时间(config.yml 的 menu.date-format)/ 多久以前
{expire}剩余时间,例如「6 天后」,永不过期显示「永不过期」
{status}状态符号(messages.yml 的 status)
{type}邮件类型:系统 / 管理员 / 玩家 / 退回 / 全服(messages.yml 的 type)
{id}邮件编号
{receiver}收件人名称
{items} / {money} / {points}物品组数 / 金币 / 点券
多行:{content}、{attachments}、{expire_line}、{actions}正文预览、附件预览、期限行、操作提示

空邮箱(empty)​

empty:
slot: 22
material: FEATHER
name: '<gray>邮箱空空如也'
lore: ['<dark_gray>新的邮件会出现在这里']

目前筛选下没有任何邮件时显示,写法同按钮。删掉这一段就不显示。

单封邮件 mail.yml​

content-slots 是附件格:物品原样显示,金币、点券、附件说明、指令奖励各显示成一个图标(见下方 attachment-items)。附件太多时用 previous / next 翻页。

功能键​

键作用状态
header信封,只显示attachment / unread / read / claimed,依邮件状态
content正文;点击用书本阅读全文—
read-book用书本阅读全文—
claim领取附件;没有附件的信不显示claimed:已经领取
delete删除这封邮件(一律要连按两次确认)confirm:等待第二次确认;locked:附件还没领、不能删
reply回信,只有玩家寄来的信、而且看的人有写信权限时显示—
back返回邮箱(回到原本的页码与筛选)—
previous / next附件上一页 / 下一页—

其他键​

键默认作用
dim-claimed-attachmentstrue(删掉这个键 = false)附件已领取时,在附件物品说明最后加一行「✔ 已领取」(文字在 messages.yml 的 attachment-claimed-lore)
content-line<white>{line}{content} 每一行的格式
expire-line<gray>过期 <yellow>{expire}{expire_line} 的内容
attachment-items.money金锭金币的图标,变量 {money}
attachment-items.points绿宝石点券的图标,变量 {points}
attachment-items.note下界之星每一条附件说明一个图标,变量 {note}
attachment-items.command下界之星有指令奖励但没有附件说明时显示,变量 {count}
attachment-items.broken屏障附件数据读不出来时显示

attachment-items 里每一项都可以写 material、name、lore、custom-model-data、item-model、tooltip-style、glow 等按钮的键。

变量​

邮箱主界面「邮件的变量」全部可以用,另外有:

变量内容
{page} / {pages}附件页码 / 总页数
{player}正在看的玩家
多行:{content}全部正文
多行:{expire_line}期限行(有期限、附件未领取时才显示)

写信界面 compose.yml​

玩家写信与管理员写信共用这个文件,用按钮的 mode 区分:player 只在玩家写信显示、admin 只在管理员写信显示、both(默认)都显示。

键作用
title玩家写信的标题
admin-title管理员写信的标题(编辑模板时后面会再加上 messages.yml 的 template-suffix)
content-slots附件格。可用的格数 = config.yml 的 mail.max-items,超过的格位会锁住
locked-slot锁住的附件格的外观(超过上限,或服务器关闭了附带物品时)
content-line{content} 每一行的格式

功能键​

键作用状态
receiver收件人:点击后在聊天栏输入group:管理员选了群发对象时
title标题:点击后输入—
body正文:左键加一行(| 分多行)、右键删最后一行、Shift + 点击清空—
money附带金币:左键输入、右键清除。玩家写信时只有在允许附带金币、有权限、有 Vault 时才显示—
send寄出incomplete:还没填收件人;confirm:群发等待第二次确认
cancel取消写信,附件退回—
preview只显示(信件预览)—
help只显示(说明)—
target-mode管理员:发送对象,左键下一个、右键上一个—
sender管理员:寄件人,左键输入、右键恢复默认—
points管理员:点券,左键输入、右键清除—
commands管理员:领取指令,左键添加、右键删除最后一条—
notes管理员:附件说明,左键添加、右键删除最后一条—
expire管理员:期限,左键输入天数、右键恢复默认—
save-template管理员:存为模板(还需要 starmail.admin.template)—

target-mode、sender、points、commands、notes、expire、save-template 即使不小心设成 mode: both,在玩家写信界面点了也没有作用。

变量​

变量内容
{player}写信的玩家
{receiver}收件人;群发时是发送对象的名称;没填时显示 messages.yml 的 compose.unset
{target}发送对象(指定玩家 / 全部在线玩家 / …,文字在 messages.yml 的 target)
{title} / {sender}标题 / 寄件人
{money} / {points}附带的金币 / 点券
{expire}期限:默认 / 永不过期 / N 天
{postage} / {postage_points}邮费金币 / 邮费点券(管理员写信为 0)
{total}合计扣除的金币(邮费 + 附带金币)
{items} / {max_items}已放的附件组数 / 可放的格数
{lines} / {max_lines}正文行数 / 最多行数
{template}正在编辑的模板名称
{icon}邮件图标(没有设定时显示「默认」)
多行:{content} / {commands} / {notes}正文 / 领取指令 / 附件说明

小技巧​

  • 换成资源包的 GUI:把装饰的玻璃板改成透明材质 + item-model,按钮也加上 item-model / custom-model-data,标题用资源包字体画背景。
  • 移动按钮:改 slot 就好;记得 content-slots 不要和按钮重叠(重叠的格位会被当成按钮,不放内容)。
  • 只给 VIP 看的按钮:加 permission: group.vip。
  • 不想要某个按钮:加 enabled: false,或整段删掉。