一个允许玩家控制生物生成的Spigot插件。
_**请注意,这是一款原始ADVANCED BAN插件的分支版本,请不要在ADVANCED BAN Discord寻求支持,请在GitHub仓库的Issues页面寻求支持**_

AdvancedBanX是Leoko制作的原始AdvancedBan插件的更新和现代化版本。它是一个All-In-One惩罚系统,具有警告、临时警告、静音、临时静音、禁令、临时禁令、IP禁令和踢出。也有玩家历史记录,可以查看玩家过去的惩罚。该插件具有可配置的时间和消息布局,自动计算并增加某些原因的惩罚时间。AdvancedBanX提供了一个完整的消息文件,以便您可以更改和翻译所有消息。此外,还有一个详细的主要配置文件,包含许多有用的选项。目前,AdvancedBanX支持Bukkit (Spigot/Paper) 和 Bungeecord。它还支持MySQL和本地文件保存作为其存储平台。

1. 从 _[GitHub releases](https://github.com/hlpdev/AdvancedBanX/releases/latest)_ 下载插件。
2. 将插件放置在您的plugins文件夹中 (Bukkit & Bungeecord 通用)。
3. 重新加载/重启您的服务器。
4. 使用 /advancedban 命令检查插件是否已成功加载。
5. 根据您的喜好进行配置,然后享受吧。
_如果数据库连接出现问题,请调整MySql的版本到5.X_

See all commands
[NEEDED]
| = 或
-s = 静默惩罚 (不向他人发送通知)
/kick<-s> [PLAYER]
踢出玩家
/ban /mute /warn /note <-s> [PLAYER]
禁/静音/警告玩家 / 给玩家添加备注
/banip <-s> [PLAYER/IP]
禁玩家的IP。如果您输入了名字,它将使用已缓存的IP
/tempban /tempmute /tempwarn <-s> [PLAYER] [Xmo|Xd|Xh|Xm|Xs|#TIMELAYOUT]
临时禁/静音/警告玩家一段时间或使用时间布局进行自动时间计算
/tempipban <-s> [PLAYER/IP] [Xmo|Xd|Xh|Xm|Xs|#TIMELAYOUT]
临时IP禁玩家一段时间或使用时间布局进行自动时间计算
Alias: /tipban
/change-reason [ID] [New reason]
通过id更改惩罚的原因
/change-reason [ban/mute] [PLAYER] [New reason]
更改玩家惩罚的原因
/unban /unmute [PLAYER]
解禁/解除静音玩家
/unwarn /unnote [ID]
删除警告/备注
/unwarn /unnote clear [PLAYER]
删除玩家的所有警告/备注
/unpunish [ID]
删除惩罚
/warns /notes
查看您的警告/备注或玩家的警告/备注。
/check [PLAYER]
获取玩家状态:UUID/IP/国家/禁令状态/静音状态/警告数量/备注数量
/banlist
查看当前所有活跃的惩罚
/history [PLAYER]
查看当前所有活跃的惩罚
使用命令 - ab.history
/advancedban reload
从文件中重新加载消息和“一些”设置
/advancedban help
显示所有命令的列表和简要说明
/systemprefs
显示一些有用的系统信息,用于配置

All Permissions
ab.kick.use - /kick
ab.kick.exempt - 免受踢出的影响
ab.notify.kick - 收到踢出通知
ab.ban.perma - /ban
ab.ban.temp - /tempban
ab.ban.undo - /unban
ab.ban.exempt - 免受禁令影响
ab.notify.ban - 收到禁令通知
ab.undoNotify.ban - 在有人被解禁时收到通知
ab.notify.tempban - 收到临时禁令通知
ab.ipban.perma - /ipban
ab.ipban.temp - /tempipban
ab.notify.ipban - 收到IP禁令通知
ab.tempipban.exempt - 免受临时IP禁令影响
ab.notify.tempipban - 收到临时IP禁令通知
ab.mute.perma - /mute
ab.mute.temp - /tempmute
ab.mute.undo - /unmute
ab.mute.exempt - 免受静音影响
ab.notify.mute - 收到静音通知
ab.undoNotify.mute - 在有人被解静音时收到通知
ab.notify.tempmute - 收到临时静音通知
ab.warn.perma - /warn
ab.warn.temp - /tempwarn
ab.warn.undo - /unwarn
ab.warn.exempt - 免受警告影响
ab.notify.warn - 收到警告通知
ab.undoNotify.warn - 在有人被解警告时收到通知
ab.notify.tempwarn - 收到临时警告通知
ab.note.use - /note
ab.note.undo - /unnote
ab.note.exempt - 免受接收备注的影响
ab.notify.note - 收到备注通知
ab.undoNotify.note - 在有人被解备注时收到通知
ab.all.undo - /unpunish
ab.warns.own - /warns
ab.warns.other - /warns PLAYER
ab.notes.own - /notes
ab.notes.other - /notes PLAYER
ab.check - /check
ab.check.ip - 也会显示IP
ab.changeReason - /change-reason
ab.banlist - /banlist
ab.history - /history
ab.reload - /advancedban reload
ab.help - /advancedban help
ab.systemprefs - /systemprefs
```
Limit punish duration
默认情况下,如果用户拥有使用命令的权限,他将能够无限期地惩罚。
您可以使用 ab.tempban/tempmute/tempwarn.dur.X 设置最大惩罚时间。
在config中,有一个名为“TempPerms”的部分。
在那里,您可以配置哪个ID能够在多长时间内惩罚
例如,您设置
1: 3600
具有 ab.tempban.dur.1 权限的玩家只能禁 3600 秒 -> 1 小时
数量以 SEC 为单位输入,如果玩家拥有多个权限,则较高的数字会覆盖。
在 config.yml 中有第二个说明。
Layered exempt permissions
具有复杂层次结构的大型团队可能需要一种更高级的方法来确定谁可以惩罚谁:
为此,您可以为具有权限分配每级免除权限
```
ab.TYPE.exempt.X
```
**TEMP** = 禁令、临时禁令、IP禁令、临时IP禁令、警告、临时警告、踢出、静音、临时静音
**X** = 1 - 10(10 是最高级别)
如果您不提供 x,则将如何解释此权限:
```
ab.TYPE.exempt = ab.TYPE.exempt.11
```
请注意,免除权限仅在目标用户在线时有效(除非使用 LuckPerms!)
(同一等级的用户无法互相惩罚)
示例:
具有 ab.ban.exempt 权限的用户无法被任何人禁令。
具有 ab.ban.exempt.4 权限的用户不能被具有 ab.ban.exempt.3 权限的人员禁令,但可以由具有 ab.ban.exempt.5 权限的人员禁令。
Spoiler
如果您在 Bungeecord 上使用此插件,则需要在 Bungeecord 服务器的 config.yml 文件或通过特殊的 bBungeecord 权限插件中定义权限。
Bungeecord 权限的一个问题是它们不支持 *-Perms,因此具有 ab.* 的用户将无法访问所有命令。但是,为了简化设置,advancedban 配置中有一个设置“EnableAllPermissionNodes”,它允许您使用 .all 代替 .*,因此已启用 ab.all 的用户将能够访问所有 AdvancedBan 命令。(在配置中还有另一个说明)

Config.yml:
config.yml 文件包含所有设置字符串。所有的字符串都可以更改。所有常规颜色代码都可以使用,但 [MiniMessage 格式化](https://docs.advntr.dev/minimessage/format.html) 是首选。
config.yml
```
# AdvancedBan v3 - Coded by Leoko, Update & Maintained by 2vY (hlpdev)
# 对于每个设置,都有一个小描述。
# 在更改任何内容之前,请仔细阅读每个描述。
# 更多信息请访问:https://www.spigotmc.org/resources/advancedban.8695/
# 如果设置为 false,则所有禁令将保存在 HSQLDB 数据库中
UseMySQL: false
MySQL:
IP: localhost
DB-Name: database-name
Username: admin
Password: superSecret
Port: 3306
Properties: 'verifyServerCertificate=false&useSSL=false&useUnicode=true&characterEncoding=utf8'
# 如果设置为 false,将在控制台显示简短消息
# 在启动和关闭时。
DetailedEnableMessage: true
DetailedDisableMessage: true
# 如果数据库出现错误,是否禁用连接到服务器
# (例如:如果您的 MySQL 服务器宕机)
LockdownOnError: true
# 如果未提供,这将是显示的默认原因
# 您可以使用常规颜色代码或 MiniMessage 格式化 (https://docs.advntr.dev/minimessage/format.html)
DefaultReason: "没有提供原因。"
# 如果您的服务器的时间与您的用户的不同,请更改此设置。
# 例如:服务器时间:16:43 | 您的时间:13:43 | TimeDiff 必须设置为 -3
# 您可以使用 /systemPrefs 检查服务器时间
TimeDiff: 0
# 此命令将对静音玩家禁用
# 玩家将无法通过 eg "/minecraft:me" 绕过
MuteCommands:
- 'me'
- 'say'
- 'action'
- 'eaction'
- 'describe'
- 'edescribe'
- 'eme'
- 'w'
- 'm'
- 'pm'
- 'whisper'
- 'ewhisper'
- 'emsg'
- 'msg'
- 'etell'
- 'tell'
- 'er'
- 'r'
- 'reply'
- 'ereply'
- 'ac'
- 'eac'
- 'amsg'
- 'eamsg'
- 'ehelpop'
- 'p msg'
# 这些玩家将无法以任何方式受到惩罚
# 即使离线,此方法也有效
# 使用 Vault 使免除权限也适用于离线玩家
ExemptPlayers:
- 'Leoko'
- 'md5'
- 'dutchy1001'
- 'ItzSomebody'
# 日期格式,将用于 %DATE% 变量
DateFormat: "MM/dd/yyyy HH:mm"
# 这对 Bungeecord 服务器或其他不支持 *-Perms 权限系统的服务器非常有用
# 如果启用此功能,您可以改为使用 ab.all 而不是 ab.* 或 ab.ban.all 代替 ab.ban.*
# 这不适用于负权限!例如,-ab.all 将不会阻止该用户的所有命令。
EnableAllPermissionNodes: false
# 如果使用外部 REST-API,它们必须以 JSON 格式响应
# 以下 API 将仅用于 NAME -> UUID
# 对于 UUID -> NAME 将使用官方 MojangAPI 或 InternFetcher
# 要检查您是否可以使用内部 fetcher,请运行 /systemPerfs 并比较您的 uuid
# 与您可以在 http://NamesMC.com 上看到的网络上的 uuid
# 如果它们相似,我们建议使用 InternFetcher
UUID-Fetcher:
# 如果设置为 true,它将覆盖“enabled”和“intern”设置
# 我们的建议:如果您没有问题,不要将 dynamic 设置为 false。
Dynamic: true
Enabled: true
Intern: false
REST-API:
URL: "https://api.mojang.com/users/profiles/minecraft/%NAME%?at=%TIMESTAMP%"
Key: "id"
BackUp-API:
URL: "https://api.minetools.eu/uuid/%NAME%"
Key: "id"
# 这些是执行在警告时执行的命令
# 如果您跳过一个数字,将执行之前命令
# 您还可以使用非 AdvancedBan 命令,例如“广播”或“清除 %PLAYER%”
# 变量:%PLAYER%,%REASON%,%COUNT%
# !! 您可以使用常规颜色代码或 MiniMessage 格式化 (https://docs.advntr.dev/minimessage/format.html)
WarnActions:
3: "kick %PLAYER% &c&o您收到了第三个警告!"
4: "tempban %PLAYER% 30m &c&o您收到了第四个警告!"
5: "tempban %PLAYER% 5h &c&o您收到了第五个警告!"
6: "tempban %PLAYER% 7d &c&o您收到了第六个警告!"
7: "tempban %PLAYER% 1mo &c&o您收到了 %COUNT% 个警告!"
10: "ban %PLAYER% &c&o您收到了第 10 个警告!"
# 在这里,您可以为 max-punishment-duration 创建权限节点。
# 权限“ab.tempban.dur.1”将允许玩家最多禁 600 秒 = 10 分钟
# 权限“ab.tempwarn.dur.2”将允许玩家最多警告 3600 秒 = 1 小时
# 您只能创建多达 10 个允许。权限可以被“ab.COMMAND.dur.max”覆盖。
TempPerms:
1: 600
2: 3600
3: 43200
# 如果此选项启用,将在控制台中显示更多信息,例如错误,如果
# 该插件工作正常则不建议启用它,因为它旨在查找 bug。
Debug: false
# 这是插件在插件/AdvancedBan/logs 文件夹中保留插件日志的天数。
# 默认设置为 10 天。
Log Purge Days: 10
# 在每个消息中删除插件的前缀。
Disable Prefix: false
# 以更友好的方式注册命令
# 默认情况下关闭,因此 AdvancedBan 可以覆盖其他插件的 /ban
# 这是一个 Bukkit 特定的选项,在 BungeeCord 上没有意义
Friendly Register Commands: false
```
Messages.yml:
messages.yml 文件包含呈现给最终用户的字符串。所有字符串都可以被更改。可以使用所有常规颜色代码,但 [MiniMessage 格式化](https://docs.advntr.dev/minimessage/format.html) 是首选。
messages.yml
```
# AdvancedBan v3 - Coded by Leoko, Update & Maintained by 2vY (hlpdev)
# 所有的字符串都可以被更改。正常颜色代码和 MiniMessage (https://docs.advntr.dev/minimessage/format.html) 都可用。
General:
Prefix: "AdvancedBanX »"
NoPerms: "您没有为此操作的权限!"
LayoutNotFound: "找不到名为 %NAME% 的布局"
# 此处将用于替换 %DURATION% 变量
TimeLayoutD: "%D%天(s) %H%小时 %M%分钟 和 %S%秒"
TimeLayoutH: "%H%小时 %M%分钟 和 %S%秒"
TimeLayoutM: "%M%分钟 和 %S%秒"
TimeLayoutS: "%S% 秒"
FailedFetch: "无法获取 %NAME% 的 UUID!有关详细信息,请查看控制台。"
Ban:
Usage: "使用方法 » /ban (-s) [名称] [原因/@Layout]"
Done: "%NAME% 已成功禁令!"
AlreadyDone: "%NAME% 已经禁令了!"
Exempt: "您无法禁令 %NAME%"
Layout:
- '%PREFIX% 永久禁令'
- ''
- ''
- "原因 » %REASON%"
- ''
- '在 TS 或论坛提交解禁申请'
- "TS-IP » 即将推出"
- "论坛 » 即将推出"
Notification:
- "%NAME% 被 %OPERATOR% 禁令"
- "原因:%REASON%"
UndoNotification: "%OPERATOR% 解禁了 %NAME%"
Ipban:
Usage: "使用方法 » /banip (-s) [名称/IP] [原因/@Layout]"
Layout:
- '%PREFIX% 永久 IP 禁令'
- ''
- ''
- "原因 » %REASON%"
- ''
- '在 TS 或论坛提交解禁申请'
- "TS-IP » 即将推出"
- "论坛 » 即将推出"
Notification:
- "%NAME% 的 IP 被 %OPERATOR% 禁令"
- "原因:%REASON%"
IpNotCashed: "没有为 %NAME%! 缓存 IP 地址。"
Tempban:
Usage: "使用方法 » /tempban (-s) [名称] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [原因/@Layout]"
MaxDuration: "您无法禁令超过 %MAX% 秒"
Layout:
- '%PREFIX% 临时禁令'
- ''
- ''
- "原因 » %REASON%"
- "持续时间 » %DURATION%"
- ''
- '在 TS 或论坛提交解禁申请'
- "TS-IP » 即将推出"
- "论坛 » 即将推出"
Notification:
- "%NAME% 被 %OPERATOR% 临时禁令"
- "原因:%REASON%"
- "此玩家被禁令时长为 %DURATION%"
Tempipban:
Usage: "使用方法 » /tempipban (-s) [名称/IP] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [原因/@Layout]"
MaxDuration: "您无法 IP 禁令超过 %MAX% 秒"
Layout:
- '%PREFIX% 临时 IP 禁令'
- ''
- ''
- "原因 » %REASON%"
- "持续时间 » %DURATION%"
- ''
- '在 TS 或论坛提交解禁申请'
- "TS-IP » 即将推出"
- "论坛 » 即将推出"
Notification:
- "%NAME% 的 IP 被 %OPERATOR% 临时 IP 禁令"
- "原因:%REASON%"
- "此玩家的 IP 禁令时长为 %DURATION%"
Mute:
Usage: "使用方法 » /mute (-s) [名称] [原因/@Layout]"
Done: "%NAME% 已成功静音!"
AlreadyDone: "%NAME% 已经静音了!"
Exempt: "您无法静音 %NAME%"
Layout:
- '%PREFIX% 您已被永久静音'
- "原因 » %REASON%"
Notification:
- "%NAME% 被 %OPERATOR% 静音"
- "原因:%REASON%"
UndoNotification: "%OPERATOR% 解静音了 %NAME%"
Tempmute:
Usage: "使用方法 » /tempmute (-s) [名称] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [原因/@Layout]"
MaxDuration: "您无法静音超过 %MAX% 秒"
Layout:
- '%PREFIX% 您已禁言 %DURATION%'
- "原因 » %REASON%"
Notification:
- "%NAME% 被 %OPERATOR% 临时静音"
- "原因:%REASON%"
- "此玩家被静音时长为 %DURATION%"
Warn:
Usage: "使用方法 » /warn (-s) [名称] [原因/@Layout]"
Done: "%NAME% 已成功发出警告!"
Exempt: "您无法对 %NAME% 发出警告"
Layout:
- '%PREFIX% 您收到警告'
- "原因 » %REASON%"
- '您现在共有 %COUNT% 个警告!'
Notification:
- "%NAME% 被 %OPERATOR% 发出警告"
- "原因:%REASON%"
Note:
Usage: "使用方法 » /note (-s) [名称] [原因]"
Done: "%NAME% 已成功添加备注!"
Exempt: "您无法对 %NAME% 添加备注"
Notification:
- "%NAME% 被 %OPERATOR% 添加备注"
- "原因 %REASON%"
Tempwarn:
Usage: "使用方法 » /tempwarn (-s) [名称] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [原因/@Layout]"
MaxDuration: "您无法发出警告超过 %MAX% 秒"
Layout:
- '%PREFIX% 您收到一个临时警告'
- "原因 » %REASON%"
- "此警告将在 » %DURATION% 过期"
- '您现在共有 %COUNT% 个警告!'
Notification:
- "%NAME% 被 %OPERATOR% 临时警告"
- "原因:%REASON%"
- "此警告将在 %DURATION% 过期"
Kick:
Usage: "使用方法 » /kick (-s) [名称] [原因/@Layout]"
Done: "%NAME% 已成功踢出!"
NotOnline: "%NAME% 当前不在线!"
Exempt: "您无法踢出 %NAME%"
Layout:
- '%PREFIX% 您被踢出'
- ''
- "原因 » %REASON%"
- ''
Notification:
- "%NAME% 被 %OPERATOR% 踢出"
- "原因:%REASON%"
UnBan:
Usage: "使用方法 » /unban [名称/IP]"
NotPunished: "%NAME% 没有被禁令!"
Done: "%NAME% 已成功解禁!"
Notification: "%OPERATOR% 解禁了 %NAME%"
UnMute:
Usage: "使用方法 » /unmute [名称]"
NotPunished: "%NAME% 没有被静音!"
Done: "%NAME% 已成功解静音!"
Notification: "%OPERATOR% 解静音了 %NAME%"
UnWarn:
Usage: "使用方法 » /unwarn [ID] 或 /unwarn clear [名称]"
NotFound: "未找到警告 #%ID%"
Done: "警告 #%ID% 已成功删除!"
Notification: "%OPERATOR% 解除了警告 %NAME%"
Clear:
Empty: "%NAME% 还没有警告!"
Done: "清除了 %COUNT% 个警告"
UnNote:
Usage: "使用方法 » /unnote [ID] 或 /unnote clear [名称]"
NotFound: "未找到备注 #%ID%"
Done: "备注 #%ID% 已成功删除!"
Notification: "%OPERATOR% 解除了备注 %NAME%"
Clear:
Empty: "%NAME% 还没有备注!"
Done: "清除了 %COUNT% 个备注"
UnPunish:
Usage: "使用方法 » /unpunish [ID]"
NotFound: "未找到惩罚 #%ID%"
Done: "惩罚 #%ID% 已成功删除!"
Banlist:
Usage: "使用方法 » /banlist (Page)"
OutOfIndex: "没有 %PAGE% 页面!"
NoEntries: "没有条目"
Header:
- "%PREFIX% 禁令列表:"
- "玩家/IP | 持续时间 | 被谁禁的"
- "类型 > 原因"
- "&7"
Entry:
- "[%DATE%]"
- "%NAME% | %DURATION% | %OPERATOR%"
- "%TYPE% | %REASON%"
- ""
Footer: "第 %CURRENT_PAGE% 页,共 %TOTAL_PAGES% 页 | 列出的禁令: %COUNT%"
PageFooter: "使用 /banlist %NEXT_PAGE% 查看下一页"
History:
Usage: "使用方法 » /history [名称/IP] (Page)"
OutOfIndex: "没有 %PAGE% 页面!"
NoEntries: "找不到 %NAME% 的历史记录"
Header:
- "%PREFIX% %NAME% 的历史记录:"
- "名称 | 持续时间 | 操作员"
- "类型 > 原因"
- ""
Entry:
- "[%DATE%]"
- "%NAME% | %DURATION% | %OPERATOR%"
- "%TYPE% | %REASON%"
- ""
Footer: "第 %CURRENT_PAGE% 页,共 %TOTAL_PAGES% 页 | 总条目: %COUNT%"
PageFooter: "使用 /history %NAME% %NEXT_PAGE% 查看下一页"
Warns:
Usage: "使用方法 » /warns [名称] (Page) 或 /warns (Page)"
OutOfIndex: "没有 %PAGE% 页面!"
NoEntries: "%NAME% 还没有警告"
Header:
- "%PREFIX% %NAME% 的警告:"
- "持续时间 | 警告由"
- "#ID > 原因"
- ""
Entry:
- "[%DATE%]"
- "%NAME% | %DURATION% | %OPERATOR%"
- "#%ID% > %REASON%"
- ""
Footer: "第 %CURRENT_PAGE% 页,共 %TOTAL_PAGES% 页 | 活跃警告: %COUNT%"
PageFooter: "使用 /warns %NAME% %NEXT_PAGE% 查看下一页"
WarnsOwn:
OutOfIndex: "没有 %PAGE% 页面!"
NoEntries: "您还没有警告"
Header:
- "%PREFIX% 您的警告:"
- "持续时间 | 警告由"
- "#ID > 原因"
- ""
Entry:
- "[%DATE%]"
- "%NAME% | %DURATION% | %OPERATOR%"
- "#%ID% > %REASON%"
- ""
Footer: "第 %CURRENT_PAGE% 页,共 %TOTAL_PAGES% 页 | 警告: %COUNT%"
PageFooter: "使用 /warns %NEXT_PAGE% 查看下一页"
Notes:
Usage: "使用方法 » /notes [名称] (Page) 或 /notes (Page)"
OutOfIndex: "没有 %PAGE% 页面!"
NoEntries: "%NAME% 还没有备注"
Header:
- ""
- "%PREFIX% %NAME% 的备注:"
- ""
Entry:
- "%DATE% | 由 %OPERATOR% (#%ID%)"
- "> %REASON%"
- ""
Footer: "第 %CURRENT_PAGE% 页,共 %TOTAL_PAGES% 页 | 备注: %COUNT%"
PageFooter: "使用 /notes %NAME% %NEXT_PAGE% 查看下一页"
NotesOwn:
OutOfIndex: "没有 %PAGE% 页面!"
NoEntries: "您还没有备注"
Header:
- ""
- "%PREFIX% 您的备注:"
- ""
Entry:
- "%DATE% | 由 %OPERATOR% (#%ID%)"
- "> %REASON%"
- ""
Footer: "第 %CURRENT_PAGE% 页,共 %TOTAL_PAGES% 页 | 备注: %COUNT%"
PageFooter: "使用 /notes %NEXT_PAGE% 查看下一页"
ChangeReason:
Usage: "使用方法 » /change-reason [ID 或 ban/mute USER] [新原因]"
Done: "惩罚 #%ID% 已成功更新!"
NotFound: "抱歉,我们无法找到此惩罚"
Check:
Usage: "使用方法 » /check [名称]"
Header: "正在检查 %NAME% (%CACHED%)"
UUID: "UUID » %UUID% (%CACHED%)"
IP: "IP » %IP% (%CACHED%)"
Geo: "国家 » %LOCATION%"
Mute: "静音 » %DURATION%"
MuteReason: " 原因 » %REASON%"
Ban: "禁令 » %DURATION%"
BanReason: " 原因 » %REASON%"
Warn: "警告 » %COUNT%"
Note: "备注 » %COUNT%"
NotFound: "抱歉,我们无法找到 %NAME%"
Cached: "缓存"
NotCached: "未缓存"
```

布局 yaml:
消息:
这里,您可以定义可以用于(临时)禁令/静音/警告的原因预定义原因。您可以使用 @layoutname 类型代替原因。您还可以在定义模板后提供一个原因,它将替换布局中的 %REASON% 变量。
时间:
您可以使用此时间布局来临时处罚。您可以使用 #layoutname 类型代替持续时间。每次使用相同的布局处罚玩家时都会增加时间。