Murder Mystery для Paper 1.20.1 (Java 17): убийца / детектив / мирные, дневные и ночные арены, магазин с постоянными покупками, статистика в SQLite, скорборды FastBoard, трупы Corpses и кастомные звуки ресурс-пака.
git clone <repo> && cd MurderMysteryTS
gradle wrapper --gradle-version 8.10 # если wrapper ещё не в репозитории
./gradlew build # Windows: gradlew.bat build
Готовый jar: build/libs/MurderMysteryTS-2.0.0.jar (FastBoard уже внутри, релоцирован в ru.mmts.libs.fastboard). Тулчейн сам подтянет JDK 17.
-
jar -> plugins/, перезапуск сервера.
-
Ресурс-пак — в server.properties:
resource-pack=https://ваш-cdn/murder-pack.zip resource-pack-prompt=Нужен для звуков Murder Mystery require-resource-pack=false -
Точки: /sethub, /mmts setlobby, затем арена:
/mmts c castle # дневная /mmts c asylum night # ночная /mmts lobbyset castle /mmts spawnset castle # несколько раз — разные точки /mmts gold castle # несколько раз — точки золота /mmts setshop castle # NPC-торговец (опционально)
- core — composition root, singleton, lifecycle
- config — Builder-конфиг + MiniMessage-сообщения с кэшем
- database — SQLite (WAL), версионируемые миграции, один IO-поток
- arena — неизменяемые настройки, конечный автомат, фабрика, реестр
- game — сессия раунда, Strategy (день/ночь), распределение ролей
- game.task — отсчёт, таймер, эмбиент, раскрытие имени, золото
- lobby / shop / gui — лобби, магазин, фабрика GUI
- command — реестр подкоманд, валидация аргументов
- listener — 4 слушателя: соединения, защита, действия, чат
- stats, scoreboard, resourcepack, corpse, particle, sound, util
Ключевые решения и почему:
- SQLite вместо YAML: атомарность записи, индексы, миграции схемы.
- FastBoard 2.1.3 + Shadow: вшивается и релоцируется, обновляет только изменившиеся строки.
- Corpses через рефлексию: нет жёсткой зависимости от приватного репо.
- PDC-метки на предметах: системная защита от дублирования.
| Плагин | Статус | Что даёт |
|---|---|---|
| LuckPerms | soft | префиксы в лобби-скорборде |
| Corpses | soft | трупы на месте смерти |
| ProtocolLib | soft | зарезервирован под скрытие ников |
| Multiverse | soft | отложенная загрузка арен (1 тик) |
- Новый товар — секция в shop.yml, код не трогается.
- Новое действие товара — enum-константа ShopItem.Action + case в ShopManager.applyPurchases.
- Новый режим (например «Хэллоуин») — реализация GameModeStrategy, одна строка в конструкторе GameSession.
- Новая миграция БД — case N в DatabaseManager.applyMigration.