Практический Cookbook
Большая коллекция практических сценариев: от старта до продакшн-эксплуатации плагина на NextLib.
Обновлено: 01 янв. 1980 г.Чтение: ~3 мин
Практический Cookbook
Этот раздел собран как книга рецептов: берёте задачу, находите паттерн, адаптируете под свой плагин.
Сценарий 1. Экономика игрока (баланс, магазин, транзакции)
Цель
Сделать стабильную экономику: хранить баланс в БД, показывать GUI-магазин, безопасно списывать валюту.
Шаги
- Создайте
PlayerWalletсущность с@PrimaryKey UUID playerId. - На
PlayerJoinEventвыполняйте upsert (создать при первом входе). - В GUI на кнопке покупки используйте pipeline:
- загрузить баланс,
- проверить достаточность,
- списать,
- выдать предмет,
- записать лог операции.
- Все ошибки пользователя выводите через i18n-ключи.
Важные детали
- Баланс храните в
long/int, а не вdouble. - При частых покупках добавьте индекс по
player_id. - Не делайте дорогие DB операции в каждом
InventoryClickEventбез кеша.
Сценарий 2. Ранги и права доступа
Цель
Управлять рангами через БД и синхронизировать с командами.
Паттерн
- Таблица
player_ranks. - Команда
/rank set <player> <rank>через Command API. - Валидация аргументов через Validation API.
- На успешное изменение публикуйте событие в MessageBus (
rank.updated).
Что даёт MessageBus
- Один модуль меняет ранг,
- другой модуль ловит событие и обновляет кэш/таблицы/GUI,
- без жёстких зависимостей между классами.
Сценарий 3. Ежедневные квесты
Цель
Запустить daily-контент с сохранением прогресса.
Паттерн запуска
- На старте зарегистрируйте квесты в
QuestManager. - На входе игрока:
restorePlayer(uuid). - В листенерах событий Bukkit вызывайте
recordKill/recordCraft/.... - На завершение objective выдавайте награду и сохраняйте состояние.
Антипаттерны
- Хранить весь прогресс только в памяти.
- Обновлять БД синхронно на каждый шаг без батчинга.
- Жёстко зашивать тексты квестов в Java-коде.
Сценарий 4. Горячий reload без рестарта
Цель
Перезагружать конфиги/GUI/локализацию на живом сервере.
Базовая схема
reload.register("configs", ...)reload.register("guis", ...)reload.register("i18n", ...)- команда
/plugin reloadвызываетreloadAll().
Практика качества
- Каждый reload-блок должен быть идемпотентным.
- Ошибка в одном блоке не должна «ломать» остальные.
- Результат
ReloadReportвсегда логируйте.
Сценарий 5. Наблюдаемость и диагностика
Цель
Понять, где тормозит плагин и почему.
Минимальный набор
- counter:
commands.executed - counter:
db.errors - timer:
db.query.latency - gauge:
online.players - health-check:
database.connection
Что смотреть первым при проблеме
- Health статусы.
- Ошибки в structured logs.
- Спайки таймеров.
- Только потом deep dive в код.
Сценарий 6. Мультиязычные сообщения
Цель
Один код, несколько языков без хаоса.
Паттерн
- Все строки пользователя только через
i18n.message(...). - В ключи закладывайте доменную структуру:
command.rank.no_permissionshop.purchase.successdb.connection.failed
Правила
- Ключи неизменяемые после релиза.
- Аргументы шаблонов именуйте понятно (
{player},{amount}). - Фолбэк-локаль всегда должна содержать полный набор ключей.
Сценарий 7. Безопасная миграция схемы
Цель
Эволюционировать таблицы без потери данных.
Подход
- Используйте
withAutoMigrations(plugin)для базовых изменений. - Для критичных случаев поддерживайте ручные SQL миграции.
- Каждую миграцию делайте reversible, если возможно.
Чеклист
- Бэкап перед выкатом.
- Прогон на staging-копии прод-данных.
- Замер времени миграции.
- План rollback.
Сценарий 8. Большой GUI-каталог
Проблема
Десятки меню, сложно поддерживать.
Решение
- Древовидная структура
menus/по доменам:menus/main/menus/shop/menus/admin/
- Единые нейминги id.
- Общие элементы через шаблонные секции.
- Чёткое разделение «витрина» и «действия».
Сценарий 9. Конфиги как контракт
Цель
Чтобы конфиги не «падали» неожиданно после правок.
Практика
- Наследование от
BaseConfig+ валидация на загрузке. - Явные default-значения.
- Логирование всех отсутствующих обязательных ключей.
- Мягкий fallback для необязательных настроек.
Сценарий 10. Production-hardening
Минимум перед релизом
- Профилирование горячих мест.
- Тест на 50-100 одновременных игроков (локально/стенд).
- Прогон стресс-сценариев команд и GUI кликов.
- Проверка корректного shutdown (без «висячих» потоков/подключений).
Operational playbook
- Инцидент: рост ошибок БД.
- переключиться в degraded mode,
- отключить тяжёлые функции,
- собрать диагностический dump.
- Инцидент: GUI не открывается.
- reload GUI,
- проверка YAML синтаксиса,
- проверка action/condition регистрации.
Архитектурные принципы, которые окупаются
- Меньше «магии», больше явных контрактов.
- Каждый модуль отвечает за одну зону ответственности.
- Конфиги и локализация считаются частью API.
- Наблюдаемость включена с первого дня, а не «потом добавим».
Финальный чеклист проекта
- DB слой: есть сущности, индексы, миграции, закрытие соединений.
- GUI слой: есть каталогизация файлов, переиспользование блоков, error logging.
- Commands: валидация, права, автокомплит.
- i18n: покрыты все пользовательские строки.
- Reload: безопасный pipeline и отчётность.
- Observability: базовые метрики/health/logging.
Если сделать этот минимум, ваш плагин на NextLib будет масштабироваться в разы спокойнее.