-
Notifications
You must be signed in to change notification settings - Fork 1
Home
xiaojie-gui 是一个使用 Kotlin 编写的 Skript 拓展(Addon), 设计目标是为 Skript 提供现代化、功能丰富的 GUI 语法拓展.
本插件参考了业界成熟发包菜单方案 Trmenu 的部分源码, 利用 PacketEvent 监听和发包, 在极端情况下仍可保持良好的性能和稳定性.
我们参考了部分 Skript-gui 语法, 同时保留了部分兼容性, 实现了静态(Bukkit API)和发包(Packet)两种菜单实现方式
总所周知, Skript 原生编写菜单需要将事件和物品布置分开写, 在较老的 Skript 版本上 GUI 还有可能存在深拷贝导致的不同步问题:
on load:
set {_gui} to chest inventory named "test"
set {_guiForPlayer} to {_gui}
set slot 1 of {_guiForPlayer} to dirt
#> 在较老的 Skript 版本上会导致 {_gui} 会被操作
另外, 社区中一个常用的 Skript GUI 拓展 Skript-GUI 的更新及功能性较为欠缺.
以上两种方式基于 Bukkit API , 在性能上一般会相较基于发包(Packet)的方案更差, 且某些时候可能会存在极端情况的刷物品问题.
最后, 本插件还解决了一些痛点, 如菜单里常见的操作也有快捷操作方法:
- "使用物品填充目标区域"
- "无需向菜单中填充真实物品即可回调"
- "对于相似布局的翻页布局可直接翻页"
有云:“书不尽言,言不尽意”;故是言之难尽,而试之易知也。以下给出一个 demo ,以望读者能够对本拓展的设计风格有一个大致的了解:
on load:
#> -------------
#> 菜单 Shape
#> -------------
add "#########" to {_shape::*}
add "#AAAAAAA#" to {_shape::*}
add "#AAAAAAA#" to {_shape::*}
add "#AAAAAAA#" to {_shape::*}
add "#AAAAAAA#" to {_shape::*}
add "##<#x#>##" to {_shape::*}
create phantom menu with (chest inventory) titled "<white>awa" with layout {_shape::*}:
#> -------------------
#> 无需物品的回调执行
#> -------------------
when slot 5 in page 0 is clicked:
send "不要再戳我啦!" to event-player
#> ------
#> 翻页
#> ------
if {_page} > 1:
map key "<" to icon paper named "&e上一页" for event-menu:
turn to page {_page} - 1 for {_p}
else if {_page} = 1:
map key "<" to icon gray stained glass pane for event-menu
if {_page} < {_maxpage}:
map key ">" to icon paper named "&e下一页" for event-menu:
turn to page {_page} + 1 for {_p}
else:
map key ">" to icon gray stained glass pane for event-menu
#> -------------------
#> 使用物品填充目标区域
#> -------------------
map key "A" to items {-_allSkull::*} for event-menu:
set {_teleporter} to "%{_player}%"
set {_server} to server of vplayer {_teleporter}
functionawa({_teleporter},{_server})
map key "x" to icon clock named "&e返回菜单" for event-menu:
close menu for {_p}
#> Create menu 时,若 Default Page (open menu 时如果不指定页面自动打开的页面)未设置,那么将自动插入 1 页,因此我们无须插入页面即可
open menu event-menu to {_p}
若需寻求更多例子,请移步语法介绍;如果遇到与预期不相符的表现或新的功能需求, 可以提出 Issue.
默认本插件的用户对于 Skript 本身足够了解, 下面主要介绍本插件引入的一些基础概念:
- Menu - 即菜单, 玩家可以交互, 也可以使用
on menu open等语法监听(类似与 Bukkit GUI) - Layout - 即形状, 用字符描述菜单的形状, 通常来说是 1-6 组长度为 9 的字符串
- 形如 "xxxxxxxxx","xABCDEFGx","xxxxxxxxx" 就是形容了一个三行的箱子的形状
- Key - 即键, 其中 "x", "A" 是 Layout 的字符串中一个个单独的字母,可以被设置为不同的物品
- MenuSession - 即会话, 当玩家打开一个 Menu 之后, 会自行创建 Session
- 其目的主要是针对不同玩家打开同一个 Menu 时, 事实上是不同的 Session
- 使用 Session 可以方便我们为某玩家更新单独的标题, 以及从获得其中 Slot 的物品
- Icon - 即图标, 实际上就是 item. 如,map key to icon %item% 可以将一个 Key 转变为 GUI 中的物品
- Page - 即页面, 菜单中可以有多个页面
- 构建项目或下载一个发布版的 jar 文件
- 将 jar 文件复制到您服务器的 /plugins 文件夹中
- 启动/重启服务器
!!!warning 请勿使用 Plugman 等插件或 /reload 指令热重载
对于其它注意事项,请查看:注意事项
欢迎参与! 可以提出 issue 或提交拉取请求 (PR), API 可能会发生变化。要了解确切用法,请查阅 src/main/kotlin 中的源文件和 src/test/kotlin 中的单元测试.
Copyright (c) 2025 heyhey123, All rights reserved. 本项目采用 AGPL-3.0 许可证。详情请见 LICENSE 文件