DisplayLib — это библиотека для создания интерактивных UI экранов в Minecraft с поддержкой YAML конфигурации и Lua скриптов.
- 📋 YAML конфигурация экранов - простое описание интерфейсов
- 🔧 Lua API - мощная система скриптов для логики
- 🎮 Интерактивные виджеты - кнопки, текст, предметы
- 🔄 Hot Reload - автоматическая перезагрузка при изменении файлов
- 🎨 Гибкая настройка - цвета, размеры, позиции, анимации
- 💾 Система хранения - данные между сессиями
- ⏰ Таймеры - отложенные действия и анимации
- Скомпилируйте плагин:
./gradlew build - Скопируйте JAR файл в папку
plugins/сервера - Перезапустите сервер
При первом запуске плагин автоматически создаст примеры экранов:
plugins/DisplayLib/
screens/
main_menu.yml # Главное меню
branch1.yml # Простой экран без Lua
scripts/
main_menu.lua # Скрипт главного меню
Используйте команды для тестирования:
/displaylib open main_menu # Открыть главное меню
/displaylib list # Список экранов
/displaylib close # Закрыть экран
/displaylib reload # Перезагрузить (для админов)
Каждый экран описывается в отдельном YAML файле:
id: main_menu background: color: [0, 0, 0] alpha: 160 scale: [10.0, 4.0, 1.0] text: " " scripts: file: "main_menu.lua" widgets: - id: btn_start type: ITEM_BUTTON material: COMPASS position: [-0.42, 0.30, 0.0] scale: [0.15, 0.15, 0.000001] tooltip: "Начать игру" onClick: action: RUN_SCRIPT function: "btn_start_click"
Логика экранов реализуется в Lua:
function on_open() player.message("Добро пожаловать, " .. player.name() .. "!") local visits = storage.get("visits", 0) + 1 storage.set("visits", visits) log.info("Экран открыт для " .. player.name()) end function btn_start_click() player.sound("ui.button.click") screen.switch("game_menu") end function on_close() player.message("До свидания!") end
player.name() -- имя игрока player.op() -- права оператора player.gamemode() -- текущий режим игры player.gamemode("creative") -- установить режим player.message("текст") -- сообщение в чат player.message("текст", "#ff0000") -- с цветом player.sound("ui.button.click") -- звук player.health() -- здоровье (0-20) player.health(20) -- установить здоровье player.command("tp ~ ~10 ~") -- выполнить команду
screen.id() -- ID экрана screen.close() -- закрыть экран screen.switch("other_screen") -- переключиться screen.widget("widget_id") -- получить виджет -- Persistent data (живет пока экран открыт) screen.data("key") -- получить screen.data("key", value) -- установить screen.data("key", nil) -- удалить
-- Текст (только TEXT_BUTTON) widget.text() -- получить текст widget.text("новый текст") -- установить текст widget.hoveredText("при наведении") -- Состояние widget.visible() -- видимость widget.visible(false) -- скрыть widget.enabled() -- активность widget.enabled(false) -- отключить -- Tooltip widget.tooltip() -- получить подсказку widget.tooltip("новая подсказка") -- установить -- Цвет фона (только TEXT_BUTTON) widget.bgColor(40, 40, 40) -- RGB widget.bgAlpha(150) -- прозрачность 0-255
storage.get("key") -- получить storage.get("key", 0) -- с дефолтным значением storage.set("key", value) -- установить storage.has("key") -- проверить наличие storage.remove("key") -- удалить storage.clear() -- очистить все
-- Выполнить один раз через N тиков timer.after(20, function() screen.close() end) -- Повторять каждые N тиков local t = timer.repeat(10, function() -- анимация end) timer.cancel(t) -- Повторить N раз timer.times(5, 10, function(i) -- каждые 5 тиков, 5 раз widget.text("Осталось: " .. (5 - i)) end)
log.info("информация") log.warn("предупреждение") log.error("ошибка")
- id: label_title type: TEXT_BUTTON text: "Заголовок" hoveredText: "Заголовок (наведение)" position: [0.0, 0.85, 0.0] scale: [0.5, 0.5, 0.5] tolerance: [0.08, 0.04] backgroundColor: [40, 40, 40] backgroundAlpha: 150 hoveredBackgroundColor: [60, 60, 60] hoveredBackgroundAlpha: 180 onClick: action: NONE
- id: btn_settings type: ITEM_BUTTON material: COMPASS position: [-0.42, 0.30, 0.0] scale: [0.15, 0.15, 0.000001] tolerance: [0.06, 0.06] tooltip: "Настройки" glowOnHover: true glowColor: [255, 255, 0] onClick: action: SWITCH_SCREEN target: settings
NONE- ничего не делатьSWITCH_SCREEN- переключиться на другой экранCLOSE_SCREEN- закрыть текущий экранRUN_SCRIPT- выполнить Lua функцию
Позиция виджета задается относительно центра фона:
Y+
|
-X ----+---- +X (смотришь на экран)
|
Y-
Примеры позиций:
[0.0, 0.85, 0.0]- верх по центру (заголовок)[-0.42, 0.30, 0.0]- левая колонка[0.35, 0.8, 0.0]- правый верхний угол[0.0, -0.8, 0.0]- низ по центру
/displaylib open <screen_id>- открыть экран/displaylib close- закрыть текущий экран/displaylib list- список доступных экранов/displaylib reload- перезагрузить экраны и скрипты (админ)/displaylib examples- создать примеры экранов (админ)
При изменении YAML или Lua файлов они автоматически перезагружаются. Для ручной перезагрузки используйте /displaylib reload.
Используйте log.info(), log.warn(), log.error() в Lua скриптах для вывода отладочной информации в консоль сервера.
plugins/DisplayLib/
screens/ # YAML описания экранов
main_menu.yml
settings.yml
...
scripts/ # Lua скрипты
main_menu.lua
settings.lua
shared/ # Общие функции
utils.lua
Полные примеры экранов и скриптов создаются автоматически при первом запуске или командой /displaylib examples.
Подробная документация доступна в папке docs/:
LUA_API_GUIDE.md- полное описание Lua APIYAML_DESIGN_GUIDE.md- руководство по созданию экрановLINK_LUA_AND_YAML.md- связь между YAML и Lua
Этот проект распространяется под лицензией MIT.