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("До свидания!")
endplayer.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-255storage.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: settingsNONE- ничего не делать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.