- 版权类型
- 原创
- 插件中文名称
- 小杰GUI
- 插件英文名称
- xiaojie-gui
- 原帖地址
- #
- 支持的核心(服务端)
- Spigot
- Paper
- PufferFish
- Leaves
- 语言支持
- 中文(简体)
- 前置组件
- Skript 2.12+
PacketEvent
Skbee(可选) - 用于在标题使用文本组件
- 适配版本(Java)
- 1.21
- 1.20
[MD]
# xiaojie-gui
## 这是一个什么插件
[xiaojie-gui](https://github.com/heyhey123-git/xiaojie-gui) 是一个使用 Kotlin 编写的 Skript 拓展(Addon), 设计目标是为 Skript 提供现代化、功能丰富的 GUI 语法拓展.
本插件参考了业界成熟发包菜单方案 Trmenu 的部分源码, 利用 PacketEvent 监听和发包, 在极端情况下仍可保持良好的性能和稳定性.
我们参考了部分 Skript-gui 语法, 同时保留了部分兼容性, 实现了静态(Bukkit API)和发包(Packet)两种菜单实现方式
## 为什么要编写这个插件
总所周知, Skript 原生编写菜单需要将事件和物品布置分开写, 在较老的 Skript 版本上 GUI 还有可能存在深拷贝导致的不同步问题:
```skript
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](https://github.com/APickledWalrus/skript-gui/releases) 的更新及功能性较为欠缺.
以上两种方式基于 Bukkit API , 在性能上一般会相较基于发包(Packet)的方案更差, 且某些时候可能会存在极端情况的刷物品问题.
最后, 本插件还解决了一些痛点, 如菜单里常见的操作也有快捷操作方法:
- "使用物品填充目标区域"
- "无需向菜单中填充真实物品即可回调"
- "对于相似布局的翻页布局可直接翻页"
有云:“书不尽言,言不尽意”;故是言之难尽,而试之易知也。以下给出一个 demo ,以望读者能够对本拓展的设计风格有一个大致的了解:
```skript
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}
```
若需寻求更多例子,请移步[语法介绍](https://github.com/heyhey123-git/xiaojie-gui/wiki/%E8%AF%AD%E6%B3%95%E4%BB%8B%E7%BB%8D);如果遇到与预期不相符的表现或新的功能需求, 可以提出 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 - 即页面, 菜单中可以有多个页面
### 安装方式
1. 构建项目或下载一个发布版的 jar 文件
2. 将 jar 文件复制到您服务器的 /plugins 文件夹中
3. 启动/重启服务器
### 语法查询
目前在 wiki 中可以查询到,后面会推送给 Skripthub / Skunity 等
[wiki地址](https://github.com/heyhey123-git/xiaojie-gui/wiki/%E8%AF%AD%E6%B3%95%E4%BB%8B%E7%BB%8D)
### 特别注意
请勿使用 Plugman 等插件或 /reload 指令热重载
对于其它注意事项,请查看:[注意事项](https://github.com/heyhey123-git/xiaojie-gui/wiki/%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9)
## 对其他开发者说的
欢迎参与! 可以提出 issue 或提交拉取请求 (PR), API 可能会发生变化。要了解确切用法,请查阅 src/main/kotlin 中的源文件和 src/test/kotlin 中的单元测试.
Copyright (c) 2025 heyhey123, All rights reserved. 本项目采用 AGPL-3.0 许可证。详情请见 LICENSE 文件
[/MD]