Skip to content
heyhey123 edited this page Nov 11, 2025 · 7 revisions

xiaojie-gui

这是一个什么插件

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 - 即页面, 菜单中可以有多个页面

安装方式

  1. 构建项目或下载一个发布版的 jar 文件
  2. 将 jar 文件复制到您服务器的 /plugins 文件夹中
  3. 启动/重启服务器

!!!warning 请勿使用 Plugman 等插件或 /reload 指令热重载

对于其它注意事项,请查看:注意事项

对其他开发者说的

欢迎参与! 可以提出 issue 或提交拉取请求 (PR), API 可能会发生变化。要了解确切用法,请查阅 src/main/kotlin 中的源文件和 src/test/kotlin 中的单元测试.

Copyright (c) 2025 heyhey123, All rights reserved. 本项目采用 AGPL-3.0 许可证。详情请见 LICENSE 文件

Clone this wiki locally