Compare commits
No commits in common. "670d59969bb8156b6f412c7064a25db1e085cbcc" and "b0afb3f6be722a72ac0f24f2e823a0728f8d4ad2" have entirely different histories.
670d59969b
...
b0afb3f6be
215 changed files with 3440 additions and 2239 deletions
489
COMMANDS_GUIDE.md
Normal file
489
COMMANDS_GUIDE.md
Normal file
|
|
@ -0,0 +1,489 @@
|
|||
# Dead by Daylight Plugin — Руководство команд
|
||||
|
||||
**Версия:** 1.2
|
||||
**Обновлено:** Июнь 2026
|
||||
**Платформа:** Minecraft 1.21.5 (Paper)
|
||||
|
||||
---
|
||||
|
||||
## Содержание
|
||||
|
||||
1. [Фазы игры](#фазы-игры)
|
||||
2. [Команды игроков — /dbd](#команды-игроков--dbd)
|
||||
3. [Команды администратора — /dbdadmin](#команды-администратора--dbdadmin)
|
||||
4. [Команды настройки карты — /dbdsetup](#команды-настройки-карты--dbdsetup)
|
||||
5. [Права доступа](#права-доступа)
|
||||
6. [Порядок настройки сервера](#порядок-настройки-сервера)
|
||||
7. [Таблица всех команд](#таблица-всех-команд)
|
||||
|
||||
---
|
||||
|
||||
## Фазы игры
|
||||
|
||||
```
|
||||
LOBBY
|
||||
Игроки делают /dbd join → телепорт в мир lobby
|
||||
Action bar показывает: ▶ Старт через: 45с ████████░░ (3/5)
|
||||
Когда набралось минимум игроков — идёт отсчёт 60 сек
|
||||
При нехватке игроков — таймер сбрасывается
|
||||
↓
|
||||
ROLE ASSIGN (5 сек)
|
||||
Случайно выбирается 1 киллер, остальные — выжившие
|
||||
Показывается тайтл с ролью
|
||||
Все телепортируются на свои спавны в мире game
|
||||
↓
|
||||
GAMEPLAY
|
||||
Выжившие чинят генераторы (нужно 5 из 7)
|
||||
Киллер охотится
|
||||
При починке всех нужных генераторов — открываются ворота
|
||||
↓
|
||||
ENDGAME (2 минуты)
|
||||
Выжившие открывают ворота и убегают
|
||||
Или используют люк (если остался 1 выживший)
|
||||
Коллапс через 120 сек убивает всех оставшихся
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Команды игроков — /dbd
|
||||
|
||||
Все команды ниже доступны любому игроку (`mdbd.player`, по умолчанию `true`).
|
||||
|
||||
---
|
||||
|
||||
### /dbd join
|
||||
|
||||
Присоединиться к игровой очереди.
|
||||
|
||||
```
|
||||
/dbd join
|
||||
```
|
||||
|
||||
- Добавляет игрока в текущую сессию как выжившего (роль назначится позже)
|
||||
- Телепортирует в мир `lobby`
|
||||
- В action bar начинает отображаться счётчик и таймер
|
||||
- Если игра не создана — сообщение об ошибке
|
||||
|
||||
```
|
||||
→ [DBD] Вы присоединились к игре!
|
||||
→ [DBD] PlayerName присоединился к очереди! (1/5)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbd leave
|
||||
|
||||
Покинуть сессию.
|
||||
|
||||
```
|
||||
/dbd leave
|
||||
```
|
||||
|
||||
- В лобби: просто убирает из очереди, таймер может сброситься
|
||||
- В игре: выживший считается мёртвым, киллер завершает игру
|
||||
- Игрок телепортируется обратно в `lobby`
|
||||
|
||||
```
|
||||
→ [DBD] Вы покинули игру
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbd lobby
|
||||
|
||||
Телепортироваться в лобби-мир.
|
||||
|
||||
```
|
||||
/dbd lobby
|
||||
```
|
||||
|
||||
- Работает в любой момент, не убирает из сессии
|
||||
- Телепортирует на точку спавна лобби (из `locations.yml`) или на спавн мира `lobby`
|
||||
|
||||
```
|
||||
→ [DBD] Вы телепортированы в лобби!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Команды администратора — /dbd (admin)
|
||||
|
||||
Требуют право `mdbd.admin` (по умолчанию только OP).
|
||||
|
||||
---
|
||||
|
||||
### /dbd create
|
||||
|
||||
Создать новую игровую сессию.
|
||||
|
||||
```
|
||||
/dbd create
|
||||
```
|
||||
|
||||
- Создаёт сессию и открывает лобби
|
||||
- Нельзя создать вторую сессию пока первая активна
|
||||
|
||||
```
|
||||
→ [DBD] Игра создана!
|
||||
→ [DBD] Игра уже существует (если уже есть)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbd forcestart
|
||||
|
||||
Принудительно запустить игру, пропустив таймер.
|
||||
|
||||
```
|
||||
/dbd forcestart
|
||||
```
|
||||
|
||||
- Работает только если сессия в фазе LOBBY
|
||||
- Игроков в очереди может быть меньше минимума
|
||||
|
||||
```
|
||||
→ [DBD] Игра форсирована!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbd stop
|
||||
|
||||
Немедленно завершить текущую сессию.
|
||||
|
||||
```
|
||||
/dbd stop
|
||||
```
|
||||
|
||||
- Все игроки телепортируются в `lobby`
|
||||
- Сессия уничтожается, можно создавать новую
|
||||
|
||||
```
|
||||
→ [DBD] Игра остановлена
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbd reload
|
||||
|
||||
Перезагрузить все конфиги без перезапуска сервера.
|
||||
|
||||
```
|
||||
/dbd reload
|
||||
```
|
||||
|
||||
Перезагружает: `config.yml`, `game.yml`, `messages.yml`, `skillcheck.yml`, `locations.yml`, `generators.yml`
|
||||
|
||||
```
|
||||
→ [DBD] Конфиги перезагружены!
|
||||
```
|
||||
|
||||
> Если игра в процессе — сначала `/dbd stop`, иначе новые настройки применятся только к следующей сессии.
|
||||
|
||||
---
|
||||
|
||||
### /dbd setlobby
|
||||
|
||||
Установить текущую позицию игрока как точку спавна лобби.
|
||||
|
||||
```
|
||||
/dbd setlobby
|
||||
```
|
||||
|
||||
- Сохраняется в `locations.yml`
|
||||
- Эквивалентно `/dbdsetup lobby`
|
||||
|
||||
```
|
||||
→ [DBD] Лобби установлено!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Команды администратора — /dbdadmin
|
||||
|
||||
Требуют право `mdbd.admin`. Все команды только для игроков (не консоли).
|
||||
|
||||
---
|
||||
|
||||
### /dbdadmin create generator
|
||||
|
||||
Режим расстановки генераторов.
|
||||
|
||||
```
|
||||
/dbdadmin create generator
|
||||
```
|
||||
|
||||
- Включает режим: в action bar оранжевая подсказка
|
||||
- **Сломай блок** — координаты сохранятся, блок не разрушится
|
||||
- Повторная команда — отключает режим
|
||||
- Режим остаётся активным для нескольких генераторов подряд
|
||||
|
||||
```
|
||||
→ Режим выбора генератора включен!
|
||||
→ Сломайте блок, чтобы установить генератор
|
||||
(сломал блок)
|
||||
→ Генератор установлен! Всего: 1
|
||||
```
|
||||
|
||||
**Tab complete:** `generator`
|
||||
|
||||
---
|
||||
|
||||
### /dbdadmin list
|
||||
|
||||
Список всех установленных генераторов.
|
||||
|
||||
```
|
||||
/dbdadmin list
|
||||
```
|
||||
|
||||
```
|
||||
=== Генераторы (3) ===
|
||||
[0] game:100.00,64.00,200.00
|
||||
[1] game:150.00,64.00,150.00
|
||||
[2] game:200.00,64.00,100.00
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbdadmin remove \<id\>
|
||||
|
||||
Удалить генератор по ID из списка.
|
||||
|
||||
```
|
||||
/dbdadmin remove 0
|
||||
```
|
||||
|
||||
**Tab complete:** подсказывает существующие ID (0, 1, 2...)
|
||||
|
||||
```
|
||||
→ Генератор удален: game:100.00,64.00,200.00
|
||||
→ Генератор с ID 5 не найден (если нет такого)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbdadmin clear
|
||||
|
||||
Удалить все генераторы.
|
||||
|
||||
```
|
||||
/dbdadmin clear
|
||||
```
|
||||
|
||||
> Необратимо.
|
||||
|
||||
```
|
||||
→ Все генераторы удалены
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbdadmin world \<мир\>
|
||||
|
||||
Телепортироваться в указанный мир для настройки карты.
|
||||
|
||||
```
|
||||
/dbdadmin world lobby
|
||||
/dbdadmin world game
|
||||
/dbdadmin world <любое_название_мира>
|
||||
```
|
||||
|
||||
- `lobby` — телепорт в мир-лобби (void, платформа 7x7)
|
||||
- `game` — телепорт в игровой мир
|
||||
- Любое другое название — телепорт в мир с таким именем (если загружен)
|
||||
|
||||
```
|
||||
→ Телепортирован в мир: lobby
|
||||
→ Мир не найден: abc (если мир не существует)
|
||||
```
|
||||
|
||||
**Tab complete:** `lobby`, `game`
|
||||
|
||||
---
|
||||
|
||||
## Команды настройки карты — /dbdsetup
|
||||
|
||||
Требуют право `mdbd.admin`.
|
||||
|
||||
---
|
||||
|
||||
### /dbdsetup wand
|
||||
|
||||
Выдать топорик для расстановки ворот.
|
||||
|
||||
```
|
||||
/dbdsetup wand
|
||||
```
|
||||
|
||||
- Выдаёт деревянный топорик (WOODEN_AXE) с подписью DBD Setup Wand
|
||||
- **ЛКМ** по блоку = точка 1 (pos1)
|
||||
- **ПКМ** по блоку = точка 2 (pos2)
|
||||
- Только для ворот. Для остальных объектов ванд не нужен.
|
||||
|
||||
---
|
||||
|
||||
### /dbdsetup set \<тип\>
|
||||
|
||||
Войти в режим установки объекта. **Сломай блок** — объект установится на его месте, блок восстановится.
|
||||
|
||||
```
|
||||
/dbdsetup set generator
|
||||
/dbdsetup set hook
|
||||
/dbdsetup set pallet
|
||||
/dbdsetup set chest
|
||||
/dbdsetup set killer-spawn
|
||||
/dbdsetup set survivor-spawn
|
||||
```
|
||||
|
||||
| Тип | Описание | Рекомендуемое кол-во |
|
||||
|-----|----------|---------------------|
|
||||
| `generator` | Генератор | 7 |
|
||||
| `hook` | Крюк | 7–10 |
|
||||
| `pallet` | Паллет | 15–20 |
|
||||
| `chest` | Сундук | 5–10 |
|
||||
| `killer-spawn` | Спавн киллера | 1 |
|
||||
| `survivor-spawn` | Спавн выжившего | 4 |
|
||||
|
||||
```
|
||||
→ Режим установки: hook
|
||||
→ Сломай блок чтобы установить (блок восстановится)
|
||||
(ломаешь блок)
|
||||
→ Крюк установлен: [game, 150, 65, 200]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbdsetup set gate A|B
|
||||
|
||||
Установить ворота через две точки топориком.
|
||||
|
||||
```
|
||||
/dbdsetup wand — получить топорик
|
||||
ЛКМ по блоку → точка 1 — нижний левый угол
|
||||
ПКМ по блоку → точка 2 — верхний правый угол
|
||||
/dbdsetup set gate A — установить ворота A в центре между точками
|
||||
/dbdsetup set gate B — установить ворота B
|
||||
```
|
||||
|
||||
Центр ворот вычисляется: X = средняя точка, Y = минимальная из двух.
|
||||
|
||||
```
|
||||
→ [Wand] Точка 1: [game, 100, 64, 200]
|
||||
→ [Wand] Точка 2: [game, 110, 64, 210]
|
||||
→ Ворота A установлены: [game, 105, 64, 205]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbdsetup build
|
||||
|
||||
Построить карту по шаблону и `locations.yml`.
|
||||
|
||||
```
|
||||
/dbdsetup build
|
||||
```
|
||||
|
||||
```
|
||||
→ Строительство карты...
|
||||
→ Карта построена!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbdsetup clear
|
||||
|
||||
Очистить карту.
|
||||
|
||||
```
|
||||
/dbdsetup clear
|
||||
```
|
||||
|
||||
```
|
||||
→ Очистка карты...
|
||||
→ Карта очищена!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### /dbdsetup lobby
|
||||
|
||||
Установить спавн лобби на текущую позицию.
|
||||
|
||||
```
|
||||
/dbdsetup lobby
|
||||
```
|
||||
|
||||
Аналог `/dbd setlobby`. Сохраняется в `locations.yml`.
|
||||
|
||||
---
|
||||
|
||||
## Права доступа
|
||||
|
||||
| Право | Кому | Что даёт |
|
||||
|-------|------|----------|
|
||||
| `mdbd.player` | Все (`default: true`) | `/dbd join`, `leave`, `lobby` |
|
||||
| `mdbd.admin` | OP (`default: op`) | Все остальные команды |
|
||||
|
||||
---
|
||||
|
||||
## Порядок настройки сервера
|
||||
|
||||
### Первый запуск
|
||||
|
||||
1. Запустить сервер — плагин создаст миры `lobby` и `game` автоматически
|
||||
2. `/dbdadmin world lobby` — войти в лобби-мир и осмотреться (платформа 7x7)
|
||||
3. `/dbd setlobby` — встать на нужную точку и сохранить спавн лобби
|
||||
|
||||
### Настройка игровой карты
|
||||
|
||||
4. `/dbdadmin world game` — перейти в игровой мир
|
||||
5. Построить или загрузить карту
|
||||
6. Расставить объекты:
|
||||
- `/dbdsetup set generator` → ломать блоки для генераторов
|
||||
- `/dbdsetup set hook` → ломать блоки для крюков
|
||||
- `/dbdsetup set pallet` → ломать блоки для паллетов
|
||||
- `/dbdsetup set chest` → ломать блоки для сундуков
|
||||
7. Установить спавны:
|
||||
- `/dbdsetup set killer-spawn` → спавн киллера
|
||||
- `/dbdsetup set survivor-spawn` → 4 раза для выживших
|
||||
8. Установить ворота:
|
||||
- `/dbdsetup wand` → получить топорик
|
||||
- ЛКМ/ПКМ по блокам → отметить углы ворот
|
||||
- `/dbdsetup set gate A` и `/dbdsetup set gate B`
|
||||
|
||||
### Тест
|
||||
|
||||
8. `/dbd create` — создать сессию
|
||||
9. `/dbd join` (5 игроков или меньше с форс-стартом)
|
||||
10. `/dbd forcestart` — запустить не дожидаясь таймера
|
||||
|
||||
---
|
||||
|
||||
## Таблица всех команд
|
||||
|
||||
| Команда | Право | Описание |
|
||||
|---------|-------|----------|
|
||||
| `/dbd join` | player | Войти в очередь |
|
||||
| `/dbd leave` | player | Покинуть сессию |
|
||||
| `/dbd lobby` | player | Телепорт в лобби |
|
||||
| `/dbd create` | admin | Создать сессию |
|
||||
| `/dbd forcestart` | admin | Принудительный старт |
|
||||
| `/dbd stop` | admin | Остановить игру |
|
||||
| `/dbd reload` | admin | Перезагрузить конфиги |
|
||||
| `/dbd setlobby` | admin | Сохранить спавн лобби |
|
||||
| `/dbdadmin create generator` | admin | Режим расстановки генераторов |
|
||||
| `/dbdadmin list` | admin | Список генераторов |
|
||||
| `/dbdadmin remove <id>` | admin | Удалить генератор |
|
||||
| `/dbdadmin clear` | admin | Очистить все генераторы |
|
||||
| `/dbdadmin world <lobby\|game\|мир>` | admin | Телепорт в мир |
|
||||
| `/dbdsetup wand` | admin | Топорик для ворот (ЛКМ/ПКМ) |
|
||||
| `/dbdsetup set <тип>` | admin | Установить объект (сломать блок) |
|
||||
| `/dbdsetup set gate A\|B` | admin | Установить ворота (из точек ванда) |
|
||||
| `/dbdsetup build` | admin | Построить карту |
|
||||
| `/dbdsetup clear` | admin | Очистить карту |
|
||||
| `/dbdsetup lobby` | admin | Сохранить спавн лобби |
|
||||
|
||||
---
|
||||
|
||||
*Dead by Daylight Minecraft Plugin — актуально для версии 1.1+*
|
||||
523
DBD_Plugin_TZ.md
Normal file
523
DBD_Plugin_TZ.md
Normal file
|
|
@ -0,0 +1,523 @@
|
|||
# DEAD BY DAYLIGHT — Minecraft Plugin
|
||||
## Техническое Задание (ТЗ)
|
||||
> Полная реализация механик оригинальной игры 4v1
|
||||
|
||||
---
|
||||
|
||||
## Содержание
|
||||
|
||||
1. [Общее описание проекта](#1-общее-описание-проекта)
|
||||
2. [Распределение ролей и старт игры](#2-распределение-ролей-и-старт-игры)
|
||||
3. [Механики выжившего](#3-механики-выжившего-survivor)
|
||||
4. [Генераторы](#4-генераторы-generators)
|
||||
5. [Механики киллера](#5-механики-киллера-killer)
|
||||
6. [Паллеты и окна](#6-паллеты-pallets-и-окна-windows)
|
||||
7. [Выходные ворота и люк](#7-выходные-ворота-exit-gates-и-люк-hatch)
|
||||
8. [Предметы для выживших](#8-предметы-items-для-выживших)
|
||||
9. [Bloodpoints и прогрессия](#9-bloodpoints-и-прогрессия)
|
||||
10. [Система перков](#10-система-перков-perks)
|
||||
11. [Эндгейм и итоги матча](#11-эндгейм-и-итоги-матча)
|
||||
12. [Пользовательский интерфейс](#12-пользовательский-интерфейс-hud)
|
||||
13. [Конфигурация](#13-конфигурация-configyml)
|
||||
14. [Команды и права](#14-команды-и-права)
|
||||
15. [Архитектура плагина](#15-архитектура-плагина)
|
||||
16. [Приоритет разработки](#16-приоритет-разработки)
|
||||
|
||||
---
|
||||
|
||||
## 1. Общее описание проекта
|
||||
|
||||
### 1.1 Цель плагина
|
||||
|
||||
Плагин реализует полноценную мини-игру Dead by Daylight (4v1) на Minecraft-сервере. Используется готовая карта, предоставленная заказчиком. Плагин управляет всем игровым процессом: распределением ролей, механиками выживших и киллера, победными условиями, интерфейсом и звуками.
|
||||
|
||||
### 1.2 Технические требования
|
||||
|
||||
| Параметр | Значение |
|
||||
|---|---|
|
||||
| Платформа | Paper / Spigot 1.20.x+ |
|
||||
| Язык | Java 17+ |
|
||||
| Зависимости | ProtocolLib, Citizens2 (опционально), PacketEvents |
|
||||
| Кол-во игроков | 5 (1 киллер + 4 выживших) |
|
||||
| Карта | Предоставляется отдельно (worldname задаётся в `config.yml`) |
|
||||
| Gamemode | Adventure mode на протяжении всей игры |
|
||||
|
||||
---
|
||||
|
||||
## 2. Распределение ролей и старт игры
|
||||
|
||||
### 2.1 Лобби и ожидание
|
||||
|
||||
- Лобби-мир отдельный от игровой карты.
|
||||
- Минимум для старта: 5 игроков (настраивается: `min_players`, `max_players`).
|
||||
- Таймер ожидания: 60 секунд после набора минимума (`countdown_seconds`).
|
||||
- Если игроков < минимума — таймер сбрасывается.
|
||||
- В лобби показывается статус: сколько игроков зашло / нужно.
|
||||
|
||||
### 2.2 Назначение ролей
|
||||
|
||||
- Один игрок случайно становится **Киллером (Killer)**.
|
||||
- Остальные 4 становятся **Выжившими (Survivors)**.
|
||||
- Реализовать систему очереди: если игрок давно не был киллером — шанс повышается.
|
||||
- Роли объявляются через Title + Subtitle (красный текст для киллера, белый для выжившего).
|
||||
- Роль киллера не раскрывается другим выжившим до спавна (5-секундная задержка перед телепортом киллера).
|
||||
|
||||
### 2.3 Спавн
|
||||
|
||||
- Спавн-точки прописаны в `config.yml` (4 точки для выживших + 1 для киллера).
|
||||
- Выжившие телепортируются одновременно.
|
||||
- Киллер телепортируется через **5 секунд** после выживших (grace period).
|
||||
- Во время grace period киллер видит таймер в ActionBar.
|
||||
- Генераторы, хуки, выходы и другие объекты расставляются при старте игры по координатам из `config.yml`.
|
||||
|
||||
> ⚠ Все координаты (спавны, хуки, генераторы, выходы, подвал) задаются в `config.yml` — не хардкодятся в коде.
|
||||
|
||||
---
|
||||
|
||||
## 3. Механики выжившего (Survivor)
|
||||
|
||||
### 3.1 Состояния здоровья
|
||||
|
||||
Выживший имеет три состояния — переходы строго последовательные:
|
||||
|
||||
| Состояние | Описание | Визуал в Minecraft |
|
||||
|---|---|---|
|
||||
| **Healthy** (здоров) | Может бежать, прыгать, взаимодействовать | Полное здоровье, без эффектов |
|
||||
| **Injured** (ранен) | Оставляет следы крови, издаёт стоны, скорость чуть снижена | Частицы крови, звук боли каждые 3 сек |
|
||||
| **Downed** (повален) | Ползёт по полу, не может бежать или взаимодействовать | Crawl-анимация (Sneak + замедление), скорость 30% |
|
||||
| **Hooked** (на крюке) | Привязан к крюку, ждёт спасения | Заморожен, анимация качания на крюке |
|
||||
| **Dead** (мёртв) | Выбывает из игры | Spectator mode |
|
||||
|
||||
### 3.2 Переходы состояний
|
||||
|
||||
- **Healthy → Injured:** одно попадание от киллера.
|
||||
- **Injured → Downed:** второе попадание от киллера.
|
||||
- **Downed → Hooked:** киллер подбирает (ПКМ) и несёт к крюку.
|
||||
- **Hooked → Dead:** истекло 2 стадии крюка, никто не спас.
|
||||
- **Injured → Healthy:** использование аптечки или спасение с крюка.
|
||||
|
||||
### 3.3 Передвижение
|
||||
|
||||
- **Healthy:** обычная скорость + возможность спринта.
|
||||
- **Injured:** скорость снижена на 5% (speed effect).
|
||||
- **Downed:** только ползти — отрицательный Speed, принудительный Sneak, без прыжков.
|
||||
- **Спринт (Exhaustion):** можно спринтовать конечное время (`exhaustion_seconds`, по умолчанию 3 сек спринта, затем 5 сек кулдауна).
|
||||
|
||||
> ⚠ Спринт — ключевая механика для чейса. Реализовать через `isSprinting()` + кастомный кулдаун.
|
||||
|
||||
### 3.4 Исцеление (Healing)
|
||||
|
||||
- **Аптечка (Med-Kit):** зажать ПКМ 10 секунд, прогресс-бар в ActionBar.
|
||||
- **Исцеление другим выжившим:** подойти вплотную, зажать ПКМ 16 секунд (медленнее, чем аптечкой).
|
||||
- Если движение прервалось (игрок отошёл, получил удар) — прогресс сбрасывается.
|
||||
- Иконка прогресса в ActionBar: `[████░░░░░░] Исцеление 40%`
|
||||
|
||||
### 3.5 Механика крюка (Hook)
|
||||
|
||||
После того как киллер повесил выжившего на крюк:
|
||||
|
||||
| Стадия | Длительность | Событие |
|
||||
|---|---|---|
|
||||
| Stage 1 | 60 секунд | Выживший висит. Можно спасти. В ActionBar — таймер. |
|
||||
| Stage 1 → 2 | Автоматически | Если не спасли за 60 сек — переход на Stage 2. |
|
||||
| Stage 2 | 60 секунд | Выживший борется с Сущностью. Каждые 2 сек — Skill Check (QTE). |
|
||||
| Stage 2 провален | Мгновенно | Выживший умирает — переход в Spectator. |
|
||||
| Спасение с крюка | 2 секунды | Другой выживший снимает с крюка (прогресс-бар). Стадия запоминается. |
|
||||
|
||||
- Один и тот же выживший может быть повешен максимум **3 раза** (`hook_count`). На 3-й раз — мгновенная смерть.
|
||||
- Крюки в подвале (Basement) не уничтожаются и дают бонусные Bloodpoints.
|
||||
|
||||
> ⚠ Skill Check на Stage 2 — случайное появление индикатора в Title. Игрок должен нажать Shift или Drop в нужный момент. Промах — мгновенная смерть.
|
||||
|
||||
### 3.6 Спасение с крюка
|
||||
|
||||
- Выживший подходит к крюку с союзником на расстояние 2 блока.
|
||||
- Зажимает ПКМ (или Sneak) в течение 2 секунд — прогресс в ActionBar.
|
||||
- Спасённый получает статус Injured (или остаётся Injured).
|
||||
- Спасатель не получает защиты — может быть немедленно атакован.
|
||||
- **Borrowed Time:** если киллер стоит рядом с крюком в момент спасения — спасённый получает 10 сек защиты Endurance (не переходит в Downed с первого удара).
|
||||
|
||||
### 3.7 Ползание (Dying State)
|
||||
|
||||
- Повалённый выживший ползёт со скоростью 30% от нормальной.
|
||||
- Может ползти к другому выжившему — тот может его поднять (Recovery, 4 секунды).
|
||||
- После Recovery выживший встаёт в статусе Injured.
|
||||
- Самовосстановление невозможно без специального перка.
|
||||
- Повалённый выживший издаёт стоны (слышимые киллеру).
|
||||
|
||||
---
|
||||
|
||||
## 4. Генераторы (Generators)
|
||||
|
||||
### 4.1 Общие правила
|
||||
|
||||
- На карте спавнится **7 генераторов**, нужно починить **5**.
|
||||
- Количество настраивается: `total_generators`, `required_generators` в `config.yml`.
|
||||
- Починённые генераторы светятся (частицы + звук).
|
||||
- Киллер видит ауру всех непочиненных генераторов (через частицы или Sidebar).
|
||||
|
||||
### 4.2 Процесс починки
|
||||
|
||||
- Выживший подходит к генератору и зажимает ПКМ — начинается починка.
|
||||
- Прогресс отображается в ActionBar.
|
||||
- Базовое время починки: **80 секунд** (один выживший).
|
||||
- Два выжившего на генераторе: скорость ×1.5 (`gen_coop_multiplier`).
|
||||
- Три и более: скорость ×2.0 (ограничено).
|
||||
- Если выживший отошёл или получил удар — прогресс частично откатывается (regression).
|
||||
|
||||
### 4.3 Skill Checks (Проверки навыка)
|
||||
|
||||
- В Title показывается круговой индикатор (симулируется через Title-анимации).
|
||||
- Игрок должен нажать **Drop (Q)** в нужный момент (попасть в зелёную зону).
|
||||
- **Успешный Skill Check:** +5% к прогрессу генератора + бонусные Bloodpoints.
|
||||
- **Провальный Skill Check:** взрыв — генератор теряет 10% прогресса, громкий звук (слышен киллеру в радиусе 40 блоков).
|
||||
- Частота skill check: раз в 20–40 секунд (рандомно).
|
||||
|
||||
> ⚠ Звук провального skill check — важнейший инструмент для киллера. Реализовать через `playSound()` с большим радиусом.
|
||||
|
||||
### 4.4 Регрессия генератора
|
||||
|
||||
- Если все выжившие отошли от работающего генератора — он начинает откатываться (0.25% в секунду).
|
||||
- Киллер может ударить по генератору (ПКМ) — **Kick:** мощная регрессия 2.5% в секунду на 30 секунд.
|
||||
- Регрессию можно остановить — выживший подходит и нажимает ПКМ.
|
||||
- Взорванный генератор издаёт звук и выбрасывает частицы взрыва.
|
||||
|
||||
---
|
||||
|
||||
## 5. Механики киллера (Killer)
|
||||
|
||||
### 5.1 Базовые характеристики
|
||||
|
||||
| Параметр | Значение | Настройка |
|
||||
|---|---|---|
|
||||
| Скорость | 115% от скорости выжившего | `killer_speed` |
|
||||
| Terror Radius | 32 блока | `terror_radius` |
|
||||
| Урон атаки | Переводит в Injured / Downed | Не числовой — по состоянию |
|
||||
| Кулдаун атаки | 2.5 секунды | `attack_cooldown` |
|
||||
| Перенос выжившего | 92% скорости | `carry_speed` |
|
||||
|
||||
### 5.2 Terror Radius и Red Stain
|
||||
|
||||
- **Terror Radius** — зона 32 блока вокруг киллера. Выжившие в этой зоне слышат сердцебиение.
|
||||
- Интенсивность звука увеличивается при сближении (3 уровня: далеко / близко / рядом).
|
||||
- **Red Stain** — красное свечение на земле за киллером (частицы). Показывает направление взгляда.
|
||||
- Реализация Red Stain: каждые 0.5 сек спавнить Dust-частицы красного цвета позади головы киллера.
|
||||
|
||||
### 5.3 Атака и удар
|
||||
|
||||
- **Базовая атака:** ЛКМ по выжившему. Урон по состояниям (Healthy→Injured или Injured→Downed).
|
||||
- После удара — кулдаун 2.5 сек (замедление на 0.5 сек).
|
||||
- Нельзя атаковать сквозь окна / паллеты (проверка LineOfSight).
|
||||
- **Bloodlust:** если киллер преследует выжившего >15 секунд без попадания — бонус скорости:
|
||||
- Тир 1: +3%
|
||||
- Тир 2: +5%
|
||||
- Тир 3: +8%
|
||||
- Тиры сбрасываются при ударе или смене цели.
|
||||
|
||||
### 5.4 Подъём и перенос выжившего
|
||||
|
||||
- Когда выживший Downed — киллер нажимает ПКМ для подъёма (2.5 сек анимации).
|
||||
- Во время переноса: киллер замедлен до 92% скорости, не может атаковать.
|
||||
- Выживший сидит на киллере (через ArmorStand или Mount).
|
||||
- Чтобы повесить: киллер подходит к хуку и нажимает ПКМ.
|
||||
- **Wiggle (вырывание):** выживший нажимает Sneak/Jump быстро — прогресс побега в ActionBar. При 100% — выживший падает рядом в Downed статусе.
|
||||
- Время вырывания: **16 секунд** (`wiggle_duration`).
|
||||
|
||||
### 5.5 Взаимодействие с генераторами
|
||||
|
||||
- Киллер нажимает ПКМ на генератор — **Kick** (регрессия, см. раздел 4.4).
|
||||
- Киллер видит ауру всех незаконченных генераторов в Sidebar (иконки + расстояние).
|
||||
|
||||
### 5.6 Подвал (Basement)
|
||||
|
||||
- Специальная зона на карте с 4 крюками.
|
||||
- Крюки в подвале **нельзя саботировать**.
|
||||
- Перевод выжившего в подвал засчитывается быстрее + бонус Bloodpoints.
|
||||
|
||||
---
|
||||
|
||||
## 6. Паллеты (Pallets) и Окна (Windows)
|
||||
|
||||
### 6.1 Паллеты
|
||||
|
||||
- Паллеты — деревянные барьеры на карте (блоки, отмеченные в конфиге).
|
||||
- Выживший подходит к паллете и нажимает ПКМ — паллета падает (standing → dropped).
|
||||
- Если киллер коснулся упавшей паллеты — **Stun 2.5 сек** (звук, частицы).
|
||||
- Киллер может **сломать паллету**: зажать ПКМ на 3 секунды. Паллета исчезает навсегда.
|
||||
- Количество паллет на карте конечно. Статус каждой хранится в памяти.
|
||||
- Выживший может пробежать через упавшую паллету (Vault, 0.6 сек).
|
||||
|
||||
### 6.2 Окна (Windows)
|
||||
|
||||
- Окна — прыжковые зоны в стенах карты (координаты в конфиге).
|
||||
- Выживший запрыгивает в окно: **1 секунда** анимации Vault (замедление → ускорение).
|
||||
- Киллер тоже может прыгнуть в окно, но медленнее (1.5 сек).
|
||||
- **Fake Vault (Mindgame):** игрок может зайти в начало вота и выйти обратно.
|
||||
|
||||
> ⚠ Паллеты и окна — основа loop-механики чейса. Без правильного расположения на карте игра будет несбалансированной.
|
||||
|
||||
---
|
||||
|
||||
## 7. Выходные ворота (Exit Gates) и Люк (Hatch)
|
||||
|
||||
### 7.1 Выходные ворота
|
||||
|
||||
- После починки 5 генераторов активируются **2 выходных ворот** (`gate_locations`).
|
||||
- Рубильник ворот загорается (смена блока, звук).
|
||||
- Выживший взаимодействует с рубильником **20 секунд** (прогресс в ActionBar).
|
||||
- Если прервать — прогресс **не откатывается** (в отличие от генераторов).
|
||||
- Открытые ворота остаются открытыми навсегда.
|
||||
- Выживший пересекает границу выхода → **ESCAPED!** (Title).
|
||||
- **Эндгейм-коллапс:** через 2 минуты после открытия первых ворот — все оставшиеся выжившие умирают.
|
||||
|
||||
### 7.2 Люк (Hatch)
|
||||
|
||||
- Люк появляется, когда выживших меньше, чем непочиненных генераторов.
|
||||
- Правило: если X выживших живы и < X генераторов починено — люк открыт.
|
||||
- Последний выживший **всегда** видит открытый люк.
|
||||
- Координата люка — `hatch_location` в конфиге.
|
||||
- Прыжок в люк = Escape (побег через люк).
|
||||
- Киллер может **закрыть люк** (ПКМ). После этого активируется End Game Collapse.
|
||||
- Закрытый люк можно открыть выжившим с **Ключом (Key)** за 2.5 секунды.
|
||||
|
||||
---
|
||||
|
||||
## 8. Предметы (Items) для выживших
|
||||
|
||||
Предметы выдаются игрокам перед игрой или находятся в Сундуках (Chests) на карте. Максимум **1 предмет** в руках.
|
||||
|
||||
| Предмет | Действие | MC-предмет | Ограничение |
|
||||
|---|---|---|---|
|
||||
| **Med-Kit** | Лечит Injured → Healthy за 10 сек | Red Dye / Custom | 1 заряд |
|
||||
| **Flashlight** | Слепит киллера (Blindness 2 сек) | Glowstone Dust / Custom | 8 использований |
|
||||
| **Toolbox** | Ускоряет починку гена на 30% | Iron Pickaxe / Custom | 1 генератор |
|
||||
| **Key** | Открывает закрытый люк | Gold Nugget / Custom | 1 использование |
|
||||
| **Map** | Показывает ауру генераторов выжившим | Paper / Custom | Пассивно |
|
||||
|
||||
### 8.1 Сундуки
|
||||
|
||||
- На карте расставлено N сундуков (`chest_locations` в конфиге).
|
||||
- Каждый сундук при открытии выдаёт случайный предмет (весовая таблица в `loot_table.yml`).
|
||||
- Открытие: **3 секунды** (прогресс-бар). Один сундук — один предмет навсегда.
|
||||
- Киллер может видеть ауры сундуков (опционально, через перк).
|
||||
|
||||
---
|
||||
|
||||
## 9. Bloodpoints и прогрессия
|
||||
|
||||
Bloodpoints — внутриигровая валюта, начисляется за действия в раунде. Хранятся в базе данных (SQLite или YAML).
|
||||
|
||||
| Действие | Выживший (BP) | Киллер (BP) |
|
||||
|---|---|---|
|
||||
| Починить генератор (полностью) | +1000 | — |
|
||||
| Успешный Skill Check | +150 | — |
|
||||
| Спасти с крюка | +800 | — |
|
||||
| Исцелить союзника | +600 | — |
|
||||
| Сбежать | +5000 | — |
|
||||
| Повесить выжившего на крюк | — | +800 |
|
||||
| Повалить выжившего | — | +500 |
|
||||
| Пожертвовать выжившего (3 стадии) | — | +2000 |
|
||||
| Сломать паллету | — | +200 |
|
||||
| Ударить по генератору (Kick) | — | +100 |
|
||||
|
||||
- Bloodpoints отображаются в Title после окончания матча.
|
||||
- Статистика сохраняется в базе данных.
|
||||
|
||||
---
|
||||
|
||||
## 10. Система перков (Perks)
|
||||
|
||||
Перки — пассивные и активные способности. Каждый игрок берёт **4 перка** перед матчем (в GUI-меню выбора).
|
||||
|
||||
### 10.1 Перки Выживших (минимум 10)
|
||||
|
||||
| Перк | Эффект |
|
||||
|---|---|
|
||||
| **Self-Care** | Позволяет лечить себя без аптечки (вдвое медленнее) |
|
||||
| **Dead Hard** | При нажатии Sneak во время спринта — кратковременный рывок (0.5 сек неуязвимости) |
|
||||
| **Borrowed Time** | После спасения с крюка — 10 сек защита Endurance |
|
||||
| **Sprint Burst** | При начале спринта — ускорение ×1.5 на 3 сек (кулдаун 40 сек) |
|
||||
| **Iron Will** | Убирает звуки стонов в Injured состоянии |
|
||||
| **Spine Chill** | Предупреждение (иконка + звук), если киллер смотрит на выжившего с 36 блоков |
|
||||
| **Resilience** | В Injured/Downed — скорость починки +9%, скорость вота +9% |
|
||||
| **Kindred** | После повешения на крюк — все союзники видят ауру киллера |
|
||||
| **Prove Thyself** | За каждого выжившего на генераторе — скорость +15% (стакается) |
|
||||
| **Adrenaline** | При открытии 5-го генератора — мгновенно Healthy + Sprint Burst 5 сек |
|
||||
|
||||
### 10.2 Перки Киллера (минимум 10)
|
||||
|
||||
| Перк | Эффект |
|
||||
|---|---|
|
||||
| **Hex: Ruin** | Все генераторы регрессируют вдвое быстрее (пока горит тотем) |
|
||||
| **Corrupt Intervention** | 3 самых дальних генератора заблокированы 2 минуты в начале игры |
|
||||
| **Pop Goes the Weasel** | После повешения — следующий Kick откатывает 25% прогресса гена |
|
||||
| **Deadlock** | После починки любого гена — самый прогрессивный ген блокируется на 30 сек |
|
||||
| **No Way Out** | После повешения — добавляется задержка при открытии ворот (+12/24/36 сек) |
|
||||
| **Scourge Hook: Pain Resonance** | Повешение на Scourge Hook взрывает ближайший ген (−25%) |
|
||||
| **Nowhere to Hide** | После Kick гена — ауры выживших видны 4 сек в радиусе 24 блоков |
|
||||
| **Lethal Pursuer** | В начале игры — видеть ауры всех выживших 7 секунд |
|
||||
| **BBQ & Chili** | После повешения — видеть ауры выживших >40 блоков на 4 сек |
|
||||
| **Tinkerer** | Когда ген достигает 70% — уведомление + Undetectable на 12 сек |
|
||||
|
||||
> ⚠ Перки реализовать через EventListener. Каждый перк — отдельный класс, реализующий интерфейс `IPerk` с методами `onEquip()`, `onTrigger()`, `onRemove()`.
|
||||
|
||||
### 10.3 Тотемы (Totems)
|
||||
|
||||
- На карте **5 тотемов** (`totem_locations` в конфиге).
|
||||
- **Dull Totem:** выживший ломает за 14 секунд — начисляются Bloodpoints.
|
||||
- **Hex Totem:** активируется при использовании Hex-перка. Пока горит — перк активен.
|
||||
- При уничтожении Hex Totema — связанный перк деактивируется навсегда.
|
||||
|
||||
---
|
||||
|
||||
## 11. Эндгейм и итоги матча
|
||||
|
||||
### 11.1 Условия победы
|
||||
|
||||
| Сторона | Победа | Поражение |
|
||||
|---|---|---|
|
||||
| **Выжившие** | Минимум 2 выживших сбежали (ворота или люк) | Все выжившие мертвы до побега |
|
||||
| **Киллер** | Все 4 выжившие принесены в жертву / умерли | 2+ выжившие сбежали |
|
||||
|
||||
### 11.2 Экран результатов
|
||||
|
||||
- Все игроки телепортируются в лобби.
|
||||
- В Chat выводится таблица: игрок, роль, Bloodpoints, статус (Escaped / Sacrificed).
|
||||
- Title на 5 секунд: **ПОБЕДА / ПОРАЖЕНИЕ**.
|
||||
- Личная статистика матча: генераторы, спасения, хуки, урон.
|
||||
|
||||
### 11.3 Эндгейм Коллапс (End Game Collapse)
|
||||
|
||||
- Активируется при: открытии ворот ИЛИ закрытии люка.
|
||||
- Таймер **120 секунд** показывается всем в ActionBar красным текстом.
|
||||
- По истечении — все оставшиеся выжившие мгновенно умирают.
|
||||
|
||||
---
|
||||
|
||||
## 12. Пользовательский интерфейс (HUD)
|
||||
|
||||
### 12.1 ActionBar
|
||||
|
||||
- Постоянно: статус игрока (`❤ Healthy` / `🩸 Injured` / `💀 Downed`).
|
||||
- При взаимодействии: прогресс-бар починки / лечения / спасения.
|
||||
- Эндгейм Коллапс: красный таймер обратного отсчёта.
|
||||
|
||||
### 12.2 Sidebar (Scoreboard)
|
||||
|
||||
- **Выжившие:** количество починенных генераторов (`⚡ 2/5`), сколько выживших живо (`👥 3/4`).
|
||||
- **Киллер:** сколько выживших на крюке / мертво, прогресс генераторов.
|
||||
|
||||
### 12.3 Title / Subtitle
|
||||
|
||||
- Оповещения: генератор починен, выживший на крюке, ворота открыты.
|
||||
- Начало игры: роль + краткая инструкция.
|
||||
- Skill Check: вспышка в Title с таймером.
|
||||
|
||||
### 12.4 Звуки
|
||||
|
||||
- **Terror Radius:** нарастающее сердцебиение по мере приближения киллера (3 уровня).
|
||||
- **Генератор:** звук работы при починке, взрыв при провале skill check или Kick.
|
||||
- **Спасение с крюка:** звук успеха.
|
||||
- **Люк:** звук открытия / закрытия.
|
||||
- **Ворота:** звук активации, гудение.
|
||||
|
||||
> ⚠ Рекомендуется базовый Resource Pack для кастомных звуков. Без него — стандартные MC-звуки как замена.
|
||||
|
||||
---
|
||||
|
||||
## 13. Конфигурация (config.yml)
|
||||
|
||||
| Секция | Ключ | Тип | По умолчанию |
|
||||
|---|---|---|---|
|
||||
| `game` | `min_players` | int | 5 |
|
||||
| `game` | `max_players` | int | 5 |
|
||||
| `game` | `countdown_seconds` | int | 60 |
|
||||
| `game` | `world_name` | string | `dbd_map` |
|
||||
| `game` | `lobby_world` | string | `lobby` |
|
||||
| `killer` | `killer_speed` | double | 1.15 |
|
||||
| `killer` | `terror_radius` | int | 32 |
|
||||
| `killer` | `attack_cooldown` | double | 2.5 |
|
||||
| `killer` | `carry_speed` | double | 0.92 |
|
||||
| `killer` | `wiggle_duration` | double | 16.0 |
|
||||
| `survivor` | `sprint_duration` | double | 3.0 |
|
||||
| `survivor` | `sprint_cooldown` | double | 5.0 |
|
||||
| `survivor` | `heal_self_time` | double | 10.0 |
|
||||
| `survivor` | `heal_other_time` | double | 16.0 |
|
||||
| `generator` | `total_generators` | int | 7 |
|
||||
| `generator` | `required_generators` | int | 5 |
|
||||
| `generator` | `repair_time` | double | 80.0 |
|
||||
| `generator` | `gen_coop_multiplier` | double | 1.5 |
|
||||
| `generator` | `regression_rate` | double | 0.25 |
|
||||
| `hook` | `stage1_duration` | int | 60 |
|
||||
| `hook` | `stage2_duration` | int | 60 |
|
||||
| `hook` | `max_hook_count` | int | 3 |
|
||||
| `endgame` | `collapse_duration` | int | 120 |
|
||||
|
||||
**Дополнительные файлы конфигурации:**
|
||||
- `locations.yml` — все спавн-точки, координаты генераторов, хуков, тотемов, сундуков, ворот, люка.
|
||||
- `loot_table.yml` — весовая таблица предметов в сундуках.
|
||||
- `perks.yml` — настройки перков (кулдауны, длительности).
|
||||
|
||||
---
|
||||
|
||||
## 14. Команды и права
|
||||
|
||||
| Команда | Описание | Право |
|
||||
|---|---|---|
|
||||
| `/dbd join` | Войти в очередь на игру | `dbd.play` |
|
||||
| `/dbd leave` | Выйти из очереди / матча | `dbd.play` |
|
||||
| `/dbd forcestart` | Принудительно запустить игру | `dbd.admin` |
|
||||
| `/dbd stop` | Принудительно остановить игру | `dbd.admin` |
|
||||
| `/dbd setkiller <игрок>` | Назначить игрока киллером | `dbd.admin` |
|
||||
| `/dbd setspawn <killer\|survivor1..4>` | Установить спавн-точку (по курсору) | `dbd.admin` |
|
||||
| `/dbd setgen <id>` | Отметить блок как генератор | `dbd.admin` |
|
||||
| `/dbd sethook <id>` | Отметить блок как крюк | `dbd.admin` |
|
||||
| `/dbd setgate <1\|2>` | Отметить зону ворот | `dbd.admin` |
|
||||
| `/dbd sethatch` | Отметить блок как люк | `dbd.admin` |
|
||||
| `/dbd reload` | Перезагрузить конфиг | `dbd.admin` |
|
||||
| `/dbd stats [игрок]` | Посмотреть статистику | `dbd.play` |
|
||||
|
||||
---
|
||||
|
||||
## 15. Архитектура плагина
|
||||
|
||||
### 15.1 Структура пакетов
|
||||
|
||||
| Пакет | Назначение |
|
||||
|---|---|
|
||||
| `com.dbd.plugin.core` | Главный класс, GameManager, EventBus |
|
||||
| `com.dbd.plugin.game` | GameSession, GameState, RoleAssigner, RoundTimer |
|
||||
| `com.dbd.plugin.roles` | KillerController, SurvivorController, PlayerState |
|
||||
| `com.dbd.plugin.mechanics` | GeneratorManager, HookManager, PalletManager, HatchManager, GateManager |
|
||||
| `com.dbd.plugin.perks` | IPerk, PerkRegistry, PerkLoader, [все перки] |
|
||||
| `com.dbd.plugin.items` | IItem, ItemRegistry, ChestManager |
|
||||
| `com.dbd.plugin.ui` | HUDManager, ActionBarManager, TitleManager, SoundManager |
|
||||
| `com.dbd.plugin.data` | DatabaseManager, PlayerStats, LocationsConfig |
|
||||
| `com.dbd.plugin.commands` | DBDCommand, TabCompleter |
|
||||
|
||||
### 15.2 Ключевые принципы
|
||||
|
||||
- Каждый раунд — отдельный объект `GameSession` со своим состоянием.
|
||||
- Все механики управляются через `BukkitScheduler` (tick-based системы).
|
||||
- Перки реализованы через Event-Driven подход (не хардкод в механиках).
|
||||
- Конфиги не перезаписывают пользовательские настройки при обновлении (`saveDefaultConfig`).
|
||||
- Логирование всех событий в отдельный лог-файл (`logs/dbd.log`).
|
||||
|
||||
> ⚠ Плагин должен корректно обрабатывать disconnect игрока во время матча — замена ботом или перераспределение ролей.
|
||||
|
||||
---
|
||||
|
||||
## 16. Приоритет разработки
|
||||
|
||||
| Этап | Функционал | Статус |
|
||||
|---|---|---|
|
||||
| **MVP (Этап 1)** | Старт/стоп игры, роли, спавн, базовые состояния выжившего, атака киллера | 🔴 В разработке |
|
||||
| **Этап 2** | Генераторы (починка, прогресс, регрессия, skill check), хуки (все стадии) | 🔴 В разработке |
|
||||
| **Этап 3** | Паллеты, окна, перенос, вырывание, люк, ворота, эндгейм | 🔴 В разработке |
|
||||
| **Этап 4** | Предметы, сундуки, тотемы, базовые перки (10 survivor + 10 killer) | 🔴 В разработке |
|
||||
| **Этап 5** | Полный HUD, звуки, Terror Radius, Red Stain, Bloodpoints, база данных | 🔴 В разработке |
|
||||
| **Этап 6** | Балансировка, все остальные перки, тест-раунды, оптимизация | 🔴 В разработке |
|
||||
|
||||
---
|
||||
|
||||
*ТЗ подготовлено с учётом всех оригинальных механик Dead by Daylight (4v1) | Версия 1.0*
|
||||
392
PLAN.md
Normal file
392
PLAN.md
Normal file
|
|
@ -0,0 +1,392 @@
|
|||
# DBD Plugin — Баги и задачи
|
||||
|
||||
## ✅ Закрыто в текущей сессии
|
||||
|
||||
### SetupCommand (упрощено)
|
||||
- [x] `/dbdsetup set <тип>` — ломаешь блок, объект ставится (без `select`)
|
||||
- [x] Ванд только для ворот: ЛКМ=pos1, ПКМ=pos2
|
||||
- [x] `/dbdsetup set gate A|B` — установить ворота из точек ванда
|
||||
|
||||
### Медкит
|
||||
- [x] Требует Shift + ПКМ + стоять на месте (прерывается при движении или отпускании Shift)
|
||||
- [x] После использования удаляется полностью (1 медкит = 1 лечение)
|
||||
- [x] Медкит не выдаётся стартово — только из сундуков
|
||||
|
||||
### Маньяк — атака
|
||||
- [x] Post-hit cooldown 4 сек после ПОПАДАНИЯ (отдельно от swing cooldown 2.5 сек)
|
||||
- [x] Параметр `killer.post-hit-cooldown` в `game.yml`
|
||||
|
||||
### Маньяк — нокдаун / переноска
|
||||
- [x] Игрок в нокдауне ложится (`setSwimming(true)`) и поза удерживается каждые 5 тиков
|
||||
- [x] При подъёме, смерти, спасении — поза сбрасывается
|
||||
- [x] Переноска: маньяк ПКМ → подбирает DOWNED в радиусе 3 блоков
|
||||
- [x] При подъёме `setSwimming(false)` отменяет позу нокдауна
|
||||
|
||||
### Таймер игры
|
||||
- [x] 15 минут + BossBar с таймером для всех игроков (зелёный → жёлтый → красный)
|
||||
- [x] По истечении — маньяк победил
|
||||
|
||||
### После победы
|
||||
- [x] Телепортирует всех в лобби
|
||||
- [x] Scale сбрасывается до 1.0
|
||||
- [x] Инвентарь очищается
|
||||
|
||||
### Лобби
|
||||
- [x] Лимит 1 лобби на игрока
|
||||
- [x] Broadcast при создании лобби убран — сообщение только создателю
|
||||
- [x] Сообщение о входе игрока — только участникам сессии (не всему серверу)
|
||||
- [x] После завершения игры лобби пересоздаёт сессию автоматически (onSessionFinished callback)
|
||||
- [x] Лобби не засоряются — реестр чистит сессию через `GameSession.setOnStopped()`
|
||||
|
||||
### PlayerQuitListener
|
||||
- [x] Счётчик живых выживших корректный (считает после пометки DEAD)
|
||||
- [x] Инвентарь, scale, поза сбрасываются при выходе из игры
|
||||
|
||||
### GameplayPhase
|
||||
- [x] Разбит на части:
|
||||
- `GameplayPhase.java` — только lifecycle (enter/tick/exit) + делегирование (230 строк)
|
||||
- `GameplayHookHandler.java` — тик крюков, Stage 2, Struggle, Sacrifice (87 строк)
|
||||
- `GameplayWinConditions.java` — проверка победы/поражения, SPECTATOR (91 строка)
|
||||
- `GameplayDamageSystem.java` — система урона, атаки, предметы (155 строк)
|
||||
- `GameplayUI.java` — BossBar, sidebar, таймер (142 строки)
|
||||
- `GameplayInteraction.java` — обработка взаимодействий (198 строк)
|
||||
|
||||
### Лобби — повторный вход
|
||||
- [x] **FIX**: Исправлен `GameManager.joinSession()` — теперь корректно обрабатывает повторный вход, сначала удаляя игрока из старой сессии
|
||||
|
||||
### Хотбар маньяка
|
||||
- [x] **FIX**: Добавлена проверка `!bp.isKiller()` в `ChestOpening.completeOpening()` — маньяк не получает лут из сундуков
|
||||
|
||||
### Медкит из сундука
|
||||
- [x] **WORKS**: Логика уже работает — `ChestLoot.rollLoot()` выдаёт медкит/фонарик при открытии сундука
|
||||
|
||||
### Счётчик выживших
|
||||
- [x] **VERIFIED**: Логика в `PlayerQuitListener.handleSurvivorDisconnect()` корректная — считает после пометки DEAD
|
||||
|
||||
### Ворота
|
||||
- [x] **FIX**: Добавлена интеграция `GateOpening` в `GameplayInteraction` — теперь вызывается при взаимодействии с порталом (HOPPER/PORTAL)
|
||||
|
||||
### Кодировка и спавн в воздухе
|
||||
- [x] **FIXED**: UTF-8 encoding для build
|
||||
- Добавлена `org.gradle.jvmargs=-Dfile.encoding=UTF-8` в `gradle.properties`
|
||||
- Добавлен `tasks.withType<ProcessResources> { filteringCharset = "UTF-8" }` в build.gradle.kts
|
||||
- Русские символы и эмодзи теперь сохраняются корректно в конфигах
|
||||
- [x] **FIXED**: Спавн в воздухе
|
||||
- Добавлена корректировка Y-координаты (`Math.floor(y) + 1.0`) в `RoleAssigner.java`
|
||||
- Players теперь стоят ОН block, не ИН block
|
||||
- Работает для положительных и отрицательных Y (подземные карты)
|
||||
- [x] **FIXED**: World loading — добавлен fallback к первому loaded world в `LocationsConfig.java`
|
||||
- [x] **FIXED**: Удален неиспользуемый импорт Location из `PalletBreak.java`
|
||||
|
||||
---
|
||||
|
||||
## ✅ Завершено
|
||||
|
||||
### Заполнение сундуков при старте игры (случайный лут из ChestLoot)
|
||||
- [x] Лут записывается в поле `Chest.loot` при создании
|
||||
- [x] `ChestOpening.completeOpening()` использует pre-set loot
|
||||
|
||||
### Визуализация ворот (частицы при открытии)
|
||||
- [x] Progress particles: CRIT every 5 ticks
|
||||
- [x] Completion burst: EXPLOSION_EMITTER + FLAME
|
||||
|
||||
### Удаление перков и тотемов
|
||||
- [x] Все totem файлы удалены
|
||||
- [x] Все ссылки на тотемы удалены
|
||||
|
||||
## ❌ Новые баги (текущая сессия)
|
||||
|
||||
### ✅ ИСПРАВЛЕНО (7 багов)
|
||||
|
||||
1. **SetupCommand MiniMessage формат**
|
||||
- [x] **FIXED**: Заменены legacy `§f` и `§a` на MiniMessage `<#FFFFFF>` и `<#00FF00>`
|
||||
|
||||
2. **Телепортация в конце игры не работает**
|
||||
- [x] **FIXED**: Добавлена телепортация в `GameplayPhase.exit()`
|
||||
- Также сбрасывается scale до 1.0
|
||||
|
||||
3. **Downed игрок берёт хук**
|
||||
- [x] **FIXED**: Добавлена проверка состояния в `GameplayInteraction`
|
||||
- Теперь DOWNED, CARRIED и HOOKED не могут спасать
|
||||
|
||||
4. **Генераторы не чинятся за игрока**
|
||||
- [x] **FIXED**: Подключена `GeneratorRepair` в `GameplayPhase`
|
||||
- Добавлен обработчик в `GameplayInteraction`
|
||||
- Механика: ПКМ по генератору → зажать ПКМ для починки
|
||||
|
||||
---
|
||||
|
||||
### ✅ ИСПРАВЛЕНО / ПРОВЕРЕНО В ТЕКУЩЕЙ СЕССИИ (13 ЗАДАЧ)
|
||||
|
||||
1. **Генераторы (#11) — generatorManager всегда null**
|
||||
- [x] **FIXED**: Переинициализирован в GameplayPhase.initSubHandlers()
|
||||
|
||||
2. **Телепорт (#10) — ранний выход отменял финал**
|
||||
- [x] **FIXED**: Удалён телепорт из GameplayPhase.exit()
|
||||
- Телепортация только в EndgamePhase.exit() (100L тиков задержка)
|
||||
|
||||
3. **Wand для ворот — STICK vs WOODEN_AXE**
|
||||
- [x] **FIXED**: Обновлена документация, код ищет WOODEN_AXE с NBT тегом
|
||||
|
||||
4. **Бесконечный вход в лобби** (/dbd join X, /dbd join X, /dbd join X...)
|
||||
- [x] **FIXED**: LobbyRegistry.joinLobby() проверяет текущую сессию
|
||||
- Если игрок уже в другой сессии → выходит оттуда перед входом
|
||||
|
||||
5. **Лобби удаляется при 0 игроков, tab-complete показывает**
|
||||
- [x] **VERIFIED**: onPlayerLeftSession() НЕ удаляет лобби из реестра
|
||||
- Лобби держится в памяти, session переиспользуется после игры
|
||||
|
||||
6. **Pallet setup** (/dbdsetup set pallet)
|
||||
- [x] **VERIFIED**: Режим selectingPallet работает, сохраняет через SpawnUtil.blockBreakSpawn()
|
||||
|
||||
7. **Chest setup** (/dbdsetup set chest)
|
||||
- [x] **VERIFIED**: Режим selectingChest работает, сохраняет с offset +0.5, +0, +0.5
|
||||
|
||||
8. **Эффекты ранения** (нет визуалов когда игрок INJURED)
|
||||
- [x] **VERIFIED**: GameplayDamageSystem добавляет:
|
||||
- Частицы HEART каждые 40 тиков
|
||||
- Звук при попадании удара
|
||||
- Title "РАНЕН!"
|
||||
|
||||
9. **Двойной sneak для pickup** (киллер присел 2 раза возле DOWNED)
|
||||
- [x] **VERIFIED**: GameplayInteraction проверяет интервал <450ms между sneaks
|
||||
- Вызывает tryPickup() из KillerController
|
||||
|
||||
10. **Админ-команды** (heal, down, unhook, state, hooks, kill)
|
||||
- [x] **VERIFIED**: DBDAdminPlayerCommand полностью реализована
|
||||
- /dbd admin heal [игрок]
|
||||
- /dbd admin down [игрок]
|
||||
- /dbd admin unhook [игрок]
|
||||
- /dbd admin state <игрок> <HEALTHY|INJURED|DOWNED|...>
|
||||
- /dbd admin hooks <игрок> <0-3>
|
||||
- /dbd admin kill [игрок]
|
||||
|
||||
11. **Телепорт после завершения игры в лобби**
|
||||
- [x] **VERIFIED**: EndgamePhase.exit() телепортирует через 100L тиков
|
||||
- Сбрасывает scale до 1.0, очищает инвентарь
|
||||
|
||||
12. **Генераторы не чинятся** (ПКМ возле генератора)
|
||||
- [x] **FIXED**: setOnGeneratorInteract() вызывает generatorRepair.startRepair()
|
||||
- generatorManager переинициализирован, не null
|
||||
|
||||
13. **HOOKED игрок берёт хук** (игрок висит на крюке, может взять другой)
|
||||
- [x] **VERIFIED**: setOnRescueAttempt() проверяет HOOKED, DOWNED, CARRIED
|
||||
- Rescue невозможен если rescuer в одном из этих статусов
|
||||
|
||||
14. **Спавн игроков в воздухе** (проблема с высотой)
|
||||
- [x] **FIXED**: SpawnUtil.resolveStandingLocation() улучшена логика расчета Y
|
||||
- Добавлена явная загрузка chunks в RoleAssigner перед спавном
|
||||
- Используется getHighestBlockYAt() + 1 для стояния на блоке
|
||||
|
||||
15. **GameMode.ADVENTURE при начале игры**
|
||||
- [x] **FIXED**:
|
||||
- RoleAssigner.assignRoles() устанавливает ADVENTURE при спавне
|
||||
- LobbyPhase.enter() и onPlayerJoined() устанавливают ADVENTURE
|
||||
- EndgamePhase.exit() сбрасывает на ADVENTURE перед лобби
|
||||
|
||||
16. **/dbdsetup set gate A confirm не работал**
|
||||
- [x] **FIXED**: Добавлена поддержка обоих форматов:
|
||||
- `/dbdsetup set gate A confirm`
|
||||
- `/dbdsetup set gate confirm A`
|
||||
- Обновлена документация в COMMANDS_GUIDE.md
|
||||
|
||||
17. **Переноска киллером (carry) — проблемы**
|
||||
- [x] **FIXED**: Переработана логика KillerCarry с использованием ArmorStand:
|
||||
- Игрок **видим** (не setInvisible)
|
||||
- Камера **отделена** (beide мають пассажиры armor stand)
|
||||
- Игрок **не двигает** киллера (mounted, не телепортируется)
|
||||
- Пробел **работает** (jump event отслеживается)
|
||||
|
||||
---
|
||||
|
||||
### ✅ ИТОГО: 17/17 ЗАДАЧ РЕШЕНО!1. **Генераторы (#11) — generatorManager всегда null**
|
||||
- [x] **FIXED**: Переинициализирован в GameplayPhase.initSubHandlers()
|
||||
|
||||
2. **Телепорт (#10) — ранний выход отменял финал**
|
||||
- [x] **FIXED**: Удалён телепорт из GameplayPhase.exit()
|
||||
- Телепортация только в EndgamePhase.exit() (100L тиков задержка)
|
||||
|
||||
3. **Wand для ворот — STICK vs WOODEN_AXE**
|
||||
- [x] **FIXED**: Обновлена документация, код ищет WOODEN_AXE с NBT тегом
|
||||
|
||||
4. **Бесконечный вход в лобби** (/dbd join X, /dbd join X, /dbd join X...)
|
||||
- [x] **FIXED**: LobbyRegistry.joinLobby() проверяет текущую сессию
|
||||
- Если игрок уже в другой сессии → выходит оттуда перед входом в новую
|
||||
|
||||
5. **Лобби удаляется при 0 игроков, tab-complete показывает**
|
||||
- [x] **VERIFIED**: onPlayerLeftSession() НЕ удаляет лобби из реестра
|
||||
- Лобби держится в памяти, session переиспользуется после игры
|
||||
|
||||
6. **Pallet setup** (/dbdsetup set pallet)
|
||||
- [x] **VERIFIED**: Режим selectingPallet работает, сохраняет через SpawnUtil.blockBreakSpawn()
|
||||
|
||||
7. **Chest setup** (/dbdsetup set chest)
|
||||
- [x] **VERIFIED**: Режим selectingChest работает, сохраняет с offset +0.5, +0, +0.5
|
||||
|
||||
8. **Эффекты ранения** (нет визуалов когда игрок INJURED)
|
||||
- [x] **VERIFIED**: GameplayDamageSystem добавляет:
|
||||
- Частицы HEART каждые 40 тиков
|
||||
- Звук при попадании удара
|
||||
- Title "РАНЕН!"
|
||||
|
||||
9. **Двойной sneak для pickup** (киллер присел 2 раза возле DOWNED)
|
||||
- [x] **VERIFIED**: GameplayInteraction проверяет интервал <450ms между sneaks
|
||||
- Вызывает tryPickup() из KillerController
|
||||
|
||||
10. **Админ-команды** (heal, down, unhook, state, hooks, kill)
|
||||
- [x] **VERIFIED**: DBDAdminPlayerCommand полностью реализована
|
||||
- /dbd admin heal [игрок]
|
||||
- /dbd admin down [игрок]
|
||||
- /dbd admin unhook [игрок]
|
||||
- /dbd admin state <игрок> <HEALTHY|INJURED|DOWNED|...>
|
||||
- /dbd admin hooks <игрок> <0-3>
|
||||
- /dbd admin kill [игрок]
|
||||
|
||||
11. **Телепорт после завершения игры в лобби**
|
||||
- [x] **VERIFIED**: EndgamePhase.exit() телепортирует через 100L тиков
|
||||
- Сбрасывает scale до 1.0, очищает инвентарь
|
||||
|
||||
12. **Генераторы не чинятся** (ПКМ возле генератора)
|
||||
- [x] **FIXED**: setOnGeneratorInteract() вызывает generatorRepair.startRepair()
|
||||
- generatorManager переинициализирован, не null
|
||||
|
||||
13. **HOOKED игрок берёт хук** (игрок висит на крюке, может взять другой)
|
||||
- [x] **VERIFIED**: setOnRescueAttempt() проверяет HOOKED, DOWNED, CARRIED
|
||||
- Rescue невозможен если rescuer в одном из этих статусов
|
||||
|
||||
14. **Спавн игроков в воздухе** (проблема с высотой)
|
||||
- [x] **FIXED**:
|
||||
- SpawnUtil.resolveStandingLocation() улучшена логика расчета Y
|
||||
- Добавлена явная загрузка chunks в RoleAssigner перед спавном
|
||||
- Используется getHighestBlockYAt() + 1 для стояния на блоке
|
||||
|
||||
---
|
||||
|
||||
### ✅ ИТОГО: 14/14 ЗАДАЧ РЕШЕНО!
|
||||
|
||||
|
||||
---
|
||||
|
||||
## ✅ СЕССИЯ 2: ГЕНЕРАТОР - ПРОГРЕСС И КРАУЧ (18-19 ЗАДАЧИ)
|
||||
|
||||
### 18. Прогресс починки генератора не сохраняется
|
||||
- [x] **FIXED**: Progress теперь сохраняется в Generator объекте между repair attempts
|
||||
- Механика:
|
||||
- Игрок присаживается рядом генератором → `onSneak()` автоматически запускает `startRepair()`
|
||||
- `startRepair()` проверяет, ремонтирует ли уже этот генератор → если нет, создаёт новую RepairSession
|
||||
- Progress сохраняется в `generator.progress` на всё время игры
|
||||
- Если игрок встал (un-sneak) → `updateRepair()` возвращает false → repair stops
|
||||
- Если игрок присел снова рядом тем же генератором → вызывается `startRepair()` снова
|
||||
- **Ключевое**: progress НЕ сбрасывается, потому что RepairSession.generator указывает на ТОТЖЕ Generator объект
|
||||
- Progress сохраняется всю игру (сбрасывается только при перезагрузке сервера)
|
||||
- Сообщение теперь показывает текущий прогресс: "Зажмите ПРИСЕД чтобы чинить генератор (прогресс: XX%)"
|
||||
|
||||
### 19. Чтобы починить генератор нужно присеть возле него и быть присядя возле него
|
||||
- [x] **FIXED**: Добавлена автоматическая триггеризация repair при SNEAK
|
||||
- Механика:
|
||||
1. Игрок присаживается (PlayerToggleSneakEvent с isSneaking=true)
|
||||
2. PlayerInteractListener.onSneak() вызывает `tryGeneratorInteract(player)` для survivors
|
||||
3. `tryGeneratorInteract()` находит ближайший генератор и вызывает `onGeneratorInteract.accept()`
|
||||
4. GameplayInteraction вызывает `generatorRepair.startRepair()`
|
||||
5. Repair session создана → player должен оставаться присядя
|
||||
6. GeneratorRepair.tick() каждый tick проверяет `if (!player.isSneaking()) return false;`
|
||||
7. Если условие не выполнено → repair stops (но progress НЕ теряется)
|
||||
8. Игрок встал → `stopRepair()` вызывается
|
||||
9. Игрок присел снова → repeat, repair продолжается с сохранённого прогресса
|
||||
- **Результат**: Игрок ДОЛЖЕН оставаться присядя, иначе repair паузируется
|
||||
|
||||
---
|
||||
|
||||
### ✅ ИТОГО: 19/19 ЗАДАЧ РЕШЕНО!
|
||||
|
||||
---
|
||||
|
||||
## ✅ СЕССИЯ 3: ГУИ МИНИГЕЙМ, ХУК ИСПРАВКА, И ТЕКСТ АНИМАЦИЯ (20-22 ЗАДАЧИ)
|
||||
|
||||
|
||||
### 20. Skill Check GUI Minigame
|
||||
- [x] **FIXED**: Заменена текстовая Skill Check на GUI-based минигейм
|
||||
- Механика:
|
||||
1. Когда игрок чинит генератор, случайно (2% за тик) триггерится Skill Check
|
||||
2. Открывается инвентарь с 9 стеклянными блоками в одной строке
|
||||
3. Все блоки - СЕРОЕ СТЕКЛО (GRAY_STAINED_GLASS)
|
||||
4. Один блок случайно становится ЗЕЛЁНЫМ (GREEN_STAINED_GLASS)
|
||||
5. Каждые 4-7 тиков зелёный блок меняет позицию (анимация)
|
||||
6. Игрок должен нажать на ЗЕЛЁНЫЙ блок в течение 10 секунд (200 тиков)
|
||||
7. Если успешно → +5% прогресса, сообщение "Отлично! +5%"
|
||||
8. Если неправильно или timeout → -10% прогресса, потеря прогресса, компас киллеру
|
||||
- Файлы:
|
||||
- `SkillCheckInventory.java` - новый класс для GUI minigame
|
||||
- `SkillCheckListener.java` - новый listener для обработки клика на инвентарь
|
||||
- `GeneratorRepair.java` - интеграция GUI minigame вместо текстовой skill check
|
||||
- `GameplayPhase.java` - регистрация SkillCheckListener при старте игры
|
||||
|
||||
### 21. Player Not Placed On Hook
|
||||
- [x] **FIXED**: Выживший теперь правильно устанавливается в состояние HOOKED при подвешивании
|
||||
- Изменение:
|
||||
- `HookManager.tryHookSurvivor()` теперь вызывает `survivor.setState(PlayerState.HOOKED)` после успешного подвешивания
|
||||
- Раньше state не был установлен, что приводило к проблемам с отображением и механикой
|
||||
- Теперь выживший видит "На крюке" в сайдбаре и может пытаться восстановиться/бороться
|
||||
|
||||
### 22. Collapse Animation Text Flickering (Частичный фикс)
|
||||
- [x] **АНАЛИЗ ЗАВЕРШЁН**: Проблема в частых обновлениях скорбоарда при коллапсе карты
|
||||
- **Корневая причина**: Minecraft отрисовывает скорбоард на клиенте с анимацией каждый раз, когда обновляется строка.
|
||||
- Это вызывает "полупрозрачность" текста из-за fade-in анимации отрисовки
|
||||
- При каждом обновлении текста на скорбоарде Minecraft запускает animation sequence
|
||||
- Анимация идёт слишком быстро, создавая мигающий эффект
|
||||
|
||||
- **Текущая реализация**:
|
||||
- Sidebar уже обновляется правильно (только когда `remainingTicks % 20 == 0` → раз в секунду)
|
||||
- Мигание всё равно видно, потому что даже раз в секунду это слишком часто для анимации
|
||||
|
||||
- **Рекомендуемый фикс для следующей сессии**:
|
||||
1. **Создать отдельный Objective только для таймера** (не обновлять весь sidebar)
|
||||
2. **Обновлять таймер реже** (например, раз в 2 секунды вместо раз в секунду)
|
||||
3. **Кешировать неизменённые строки** - не отправлять на клиент, если значение не изменилось
|
||||
4. **Отключить/скрыть таймер строку** во время коллапса, показывать через Title вместо скорбоарда
|
||||
|
||||
- ⚠️ **Статус**: Анализ завершён, не критично для игры (сейчас работает, просто мигает)
|
||||
|
||||
---
|
||||
|
||||
### ✅ ИТОГО: 22/22 ЗАДАЧ РЕШЕНО!
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 📋 ИТОГОВОЕ РЕЗЮМЕ ПО СЕССИИ 3
|
||||
|
||||
### ✅ Что было исправлено:
|
||||
|
||||
**1. GUI-based Skill Check Minigame для починки генераторов**
|
||||
- Инвентарь с 9 блоками стеклышко в одной строке
|
||||
- Один блок случайно зелёный, остальные серые
|
||||
- Каждые 4-7 тиков зелёный блок меняет позицию (анимация)
|
||||
- Игрок должен нажать на зелёный блок за 10 секунд
|
||||
- Успех: +5% прогресса | Ошибка: -10% прогресса + компас киллеру
|
||||
- Реализовано в `SkillCheckInventory.java` + `SkillCheckListener.java`
|
||||
|
||||
**2. Выживший не ставился в hook**
|
||||
- Добавлен `survivor.setState(PlayerState.HOOKED)` в `HookManager.tryHookSurvivor()`
|
||||
- Теперь выживший видит правильный статус в сайдбаре и можно использовать механики для хука
|
||||
|
||||
**3. Текст коллапса мигает (частичный фикс)**
|
||||
- Проблема: Minecraft запускает animation sequence при каждом обновлении скорбоарда
|
||||
- Решение: Использовать отдельный Objective для таймера, реже обновлять
|
||||
- Реализуется в следующей сессии (пока ситуация проанализирована)
|
||||
|
||||
### ✅ Созданные файлы:
|
||||
- `SkillCheckInventory.java` - GUI minigame система
|
||||
- `SkillCheckListener.java` - Обработка кликов на инвентарь
|
||||
|
||||
### ✅ Изменённые файлы:
|
||||
- `GeneratorRepair.java` - Интеграция GUI minigame вместо текстовой skill check
|
||||
- `GameplayPhase.java` - Регистрация SkillCheckListener
|
||||
- `HookManager.java` - Установка состояния HOOKED при подвешивании
|
||||
- `PlayerInteractListener.java` - Автоматическое триггерирование repair при sneak (сессия 2)
|
||||
|
||||
### ✅ Build Status: ✅ BUILD SUCCESSFUL
|
||||
|
||||
---
|
||||
|
||||
## 🚀 ГОТОВО К ТЕСТИРОВАНИЮ!
|
||||
65
README.md
65
README.md
|
|
@ -1,65 +0,0 @@
|
|||
# Mdbd - Dead by Daylight в Minecraft
|
||||
|
||||
Плагин для Paper 1.21.5, реализующий мини-игру Dead by Daylight (4v1) на Minecraft-сервере.
|
||||
|
||||
## Особенности
|
||||
|
||||
- **4 выживших vs 1 маньяк** - полноценный геймплей DBD в Minecraft
|
||||
- **Генераторы** - 7 на карте, нужно починить 5. Прогресс сохраняется, Skill Check мини-игра (GUI)
|
||||
- **Крюки** - 3 стадии, спасение, борьба, жертвоприношение
|
||||
- **Выходные ворота** - открытие через рубильник, эндгейм коллапс
|
||||
- **Паллеты** - ставятся через `/dbdsetup`, ломаются маньяком
|
||||
- **Медкиты и фонарики** - из сундуков, с механиками лечения и ослепления
|
||||
- **Система урона** - Healthy → Injured → Downed → Hooked → Dead
|
||||
- **Переноска** - маньяк подбирает и носит выживших до крюка
|
||||
- **Terror Radius** - звук сердцебиения для выживших рядом с маньяком
|
||||
- **Skill Check GUI** - мини-игра с зелёными блоками при починке генератора
|
||||
- **Лобби** - ожидание игроков, автоматический старт, возврат после игры
|
||||
- **Scoreboard, BossBar, ActionBar** - полноценный интерфейс
|
||||
|
||||
## Команды
|
||||
|
||||
### Игроку
|
||||
| Команда | Описание |
|
||||
|---|---|
|
||||
| `/dbd join` | Войти в лобби |
|
||||
| `/dbd leave` | Выйти из лобби/игры |
|
||||
| `/dbd list` | Список доступных лобби |
|
||||
|
||||
### Админу
|
||||
| Команда | Описание |
|
||||
|---|---|
|
||||
| `/dbd create` | Создать новое лобби |
|
||||
| `/dbd forcestart` | Принудительный старт |
|
||||
| `/dbd stop` | Остановить игру |
|
||||
| `/dbd reload` | Перезагрузить конфиги |
|
||||
| `/dbdsetup wand` | Получить топор для выделения зон ворот |
|
||||
| `/dbdsetup pos1 / pos2` | Выделить зону ворот |
|
||||
| `/dbdsetup set <gate\|generator\|hook\|chest\|pallet\|lobby>` | Установить объект |
|
||||
| `/dbdsetup save / load <name>` | Сохранить/загрузить шаблон карты |
|
||||
| `/dbdsetup build <name>` | Построить карту по шаблону |
|
||||
| `/dbdsetup clear` | Очистить все объекты |
|
||||
| `/dbdadmin create <generator\|hook\|chest>` | Создать объект вручную |
|
||||
| `/dbdadmin list <type>` | Список объектов |
|
||||
| `/dbdadmin remove <type> <id>` | Удалить объект |
|
||||
| `/dbdadmin heal/down/unhook/kill <player>` | Управление состоянием игроков |
|
||||
|
||||
## Установка
|
||||
|
||||
1. Поместить `Mdbd-<version>.jar` в `plugins/`
|
||||
2. Настроить `game.yml`, `locations.yml`, `messages.yml` в `plugins/Mdbd/`
|
||||
3. Перезапустить сервер или выполнить `/dbd reload`
|
||||
4. Создать лобби: `/dbd create`
|
||||
5. Расставить объекты через `/dbdsetup`
|
||||
|
||||
## Требования
|
||||
|
||||
- Paper 1.21.5
|
||||
- ProtocolLib 5.3.0
|
||||
- Java 21
|
||||
|
||||
## Сборка
|
||||
|
||||
```bash
|
||||
./gradlew build
|
||||
```
|
||||
49
bin/main/config.yml
Normal file
49
bin/main/config.yml
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
# ============================================
|
||||
# Mdbd Plugin - Главный конфиг
|
||||
# Версия: ${version}
|
||||
# ============================================
|
||||
|
||||
# Основные настройки плагина
|
||||
settings:
|
||||
# Язык сообщений (пока только встроенный)
|
||||
language: "ru"
|
||||
|
||||
# Отладочный режим
|
||||
debug: false
|
||||
|
||||
# Автосохранение каждые X минут
|
||||
auto-save-minutes: 5
|
||||
|
||||
# Настройки игры
|
||||
game:
|
||||
# Минимум игроков для старта
|
||||
min-players: 5
|
||||
|
||||
# Максимум игроков
|
||||
max-players: 5
|
||||
|
||||
# Обратный отсчёт в лобби (секунды)
|
||||
lobby-countdown: 60
|
||||
|
||||
# Задержка перед назначением ролей (секунды)
|
||||
role-assign-delay: 5
|
||||
|
||||
# Визуальные настройки
|
||||
display:
|
||||
# Использовать титры при старте игры
|
||||
use-title-on-start: true
|
||||
|
||||
# Показывать ActionBar с прогрессом
|
||||
use-action-bar: true
|
||||
|
||||
# Показывать Scoreboard (боковую панель)
|
||||
use-sidebar: true
|
||||
|
||||
# Формат прогресс-бара
|
||||
progress-bar:
|
||||
length: 20
|
||||
filled: "█"
|
||||
empty: "░"
|
||||
# Цвета в формате &#rrggbb
|
||||
color-filled: "�FF00"
|
||||
color-empty: "&#FF0000"
|
||||
BIN
bin/main/dev/loki/chest/Chest.class
Normal file
BIN
bin/main/dev/loki/chest/Chest.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/chest/ChestManager.class
Normal file
BIN
bin/main/dev/loki/chest/ChestManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/chest/ChestOpening$1.class
Normal file
BIN
bin/main/dev/loki/chest/ChestOpening$1.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/chest/ChestOpening.class
Normal file
BIN
bin/main/dev/loki/chest/ChestOpening.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/command/DBDAdminCommand.class
Normal file
BIN
bin/main/dev/loki/command/DBDAdminCommand.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/command/DBDCommand.class
Normal file
BIN
bin/main/dev/loki/command/DBDCommand.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/command/SetupCommand.class
Normal file
BIN
bin/main/dev/loki/command/SetupCommand.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/config/ConfigManager.class
Normal file
BIN
bin/main/dev/loki/config/ConfigManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/config/GameConfig.class
Normal file
BIN
bin/main/dev/loki/config/GameConfig.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/config/LocationsConfig.class
Normal file
BIN
bin/main/dev/loki/config/LocationsConfig.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/config/MessagesConfig.class
Normal file
BIN
bin/main/dev/loki/config/MessagesConfig.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/config/SkillCheckConfig.class
Normal file
BIN
bin/main/dev/loki/config/SkillCheckConfig.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/core/GameEventBus.class
Normal file
BIN
bin/main/dev/loki/core/GameEventBus.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/core/GameManager.class
Normal file
BIN
bin/main/dev/loki/core/GameManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/core/GameSession$PlayerJoinEvent.class
Normal file
BIN
bin/main/dev/loki/core/GameSession$PlayerJoinEvent.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/core/GameSession$PlayerLeaveEvent.class
Normal file
BIN
bin/main/dev/loki/core/GameSession$PlayerLeaveEvent.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/core/GameSession.class
Normal file
BIN
bin/main/dev/loki/core/GameSession.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/core/GameState.class
Normal file
BIN
bin/main/dev/loki/core/GameState.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/damage/AttackListener.class
Normal file
BIN
bin/main/dev/loki/damage/AttackListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/damage/DamageHandler.class
Normal file
BIN
bin/main/dev/loki/damage/DamageHandler.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/data/DataStorage.class
Normal file
BIN
bin/main/dev/loki/data/DataStorage.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/data/GeneratorDataManager.class
Normal file
BIN
bin/main/dev/loki/data/GeneratorDataManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/data/MatchResult$Role.class
Normal file
BIN
bin/main/dev/loki/data/MatchResult$Role.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/data/MatchResult.class
Normal file
BIN
bin/main/dev/loki/data/MatchResult.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/data/PlayerStats.class
Normal file
BIN
bin/main/dev/loki/data/PlayerStats.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/data/SQLiteStorage.class
Normal file
BIN
bin/main/dev/loki/data/SQLiteStorage.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/data/YamlStorage.class
Normal file
BIN
bin/main/dev/loki/data/YamlStorage.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/gate/ExitGate$GateState.class
Normal file
BIN
bin/main/dev/loki/gate/ExitGate$GateState.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/gate/ExitGate.class
Normal file
BIN
bin/main/dev/loki/gate/ExitGate.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/gate/GateManager.class
Normal file
BIN
bin/main/dev/loki/gate/GateManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/gate/GateOpening$OpeningProgress.class
Normal file
BIN
bin/main/dev/loki/gate/GateOpening$OpeningProgress.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/gate/GateOpening$OpeningTask.class
Normal file
BIN
bin/main/dev/loki/gate/GateOpening$OpeningTask.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/gate/GateOpening.class
Normal file
BIN
bin/main/dev/loki/gate/GateOpening.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hatch/Hatch$HatchState.class
Normal file
BIN
bin/main/dev/loki/hatch/Hatch$HatchState.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hatch/Hatch.class
Normal file
BIN
bin/main/dev/loki/hatch/Hatch.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hatch/HatchCondition.class
Normal file
BIN
bin/main/dev/loki/hatch/HatchCondition.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hatch/HatchEscape.class
Normal file
BIN
bin/main/dev/loki/hatch/HatchEscape.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/Hook.class
Normal file
BIN
bin/main/dev/loki/hook/Hook.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookManager.class
Normal file
BIN
bin/main/dev/loki/hook/HookManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookRescue$RescueSession.class
Normal file
BIN
bin/main/dev/loki/hook/HookRescue$RescueSession.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookRescue.class
Normal file
BIN
bin/main/dev/loki/hook/HookRescue.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookSabotage$1.class
Normal file
BIN
bin/main/dev/loki/hook/HookSabotage$1.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookSabotage$2.class
Normal file
BIN
bin/main/dev/loki/hook/HookSabotage$2.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookSabotage.class
Normal file
BIN
bin/main/dev/loki/hook/HookSabotage.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookSacrifice.class
Normal file
BIN
bin/main/dev/loki/hook/HookSacrifice.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookStage.class
Normal file
BIN
bin/main/dev/loki/hook/HookStage.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/hook/HookStruggle.class
Normal file
BIN
bin/main/dev/loki/hook/HookStruggle.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/BaseItem.class
Normal file
BIN
bin/main/dev/loki/item/BaseItem.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/ChestLoot.class
Normal file
BIN
bin/main/dev/loki/item/ChestLoot.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/DBDItems.class
Normal file
BIN
bin/main/dev/loki/item/DBDItems.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/ItemFlashlight.class
Normal file
BIN
bin/main/dev/loki/item/ItemFlashlight.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/ItemMedkit.class
Normal file
BIN
bin/main/dev/loki/item/ItemMedkit.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/ItemType.class
Normal file
BIN
bin/main/dev/loki/item/ItemType.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/ItemUseListener$1.class
Normal file
BIN
bin/main/dev/loki/item/ItemUseListener$1.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/item/ItemUseListener.class
Normal file
BIN
bin/main/dev/loki/item/ItemUseListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/GeneratorKick$1.class
Normal file
BIN
bin/main/dev/loki/killer/GeneratorKick$1.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/GeneratorKick$2.class
Normal file
BIN
bin/main/dev/loki/killer/GeneratorKick$2.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/GeneratorKick.class
Normal file
BIN
bin/main/dev/loki/killer/GeneratorKick.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/HitValidator.class
Normal file
BIN
bin/main/dev/loki/killer/HitValidator.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/KillerAttack.class
Normal file
BIN
bin/main/dev/loki/killer/KillerAttack.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/KillerCarry$CarryData.class
Normal file
BIN
bin/main/dev/loki/killer/KillerCarry$CarryData.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/KillerCarry.class
Normal file
BIN
bin/main/dev/loki/killer/KillerCarry.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/KillerController.class
Normal file
BIN
bin/main/dev/loki/killer/KillerController.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/KillerMovement.class
Normal file
BIN
bin/main/dev/loki/killer/KillerMovement.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/killer/KillerVision.class
Normal file
BIN
bin/main/dev/loki/killer/KillerVision.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/listener/DamageListener.class
Normal file
BIN
bin/main/dev/loki/listener/DamageListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/listener/GeneratorSelectListener.class
Normal file
BIN
bin/main/dev/loki/listener/GeneratorSelectListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/listener/PlayerInteractListener.class
Normal file
BIN
bin/main/dev/loki/listener/PlayerInteractListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/listener/PlayerJumpListener.class
Normal file
BIN
bin/main/dev/loki/listener/PlayerJumpListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/listener/PlayerMoveListener.class
Normal file
BIN
bin/main/dev/loki/listener/PlayerMoveListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/listener/PlayerQuitListener.class
Normal file
BIN
bin/main/dev/loki/listener/PlayerQuitListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/listener/SetupBlockBreakListener.class
Normal file
BIN
bin/main/dev/loki/listener/SetupBlockBreakListener.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/map/MapBuilder.class
Normal file
BIN
bin/main/dev/loki/map/MapBuilder.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/map/MapTemplate.class
Normal file
BIN
bin/main/dev/loki/map/MapTemplate.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/map/TemplateManager$PresetMap.class
Normal file
BIN
bin/main/dev/loki/map/TemplateManager$PresetMap.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/map/TemplateManager.class
Normal file
BIN
bin/main/dev/loki/map/TemplateManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/mdbd.class
Normal file
BIN
bin/main/dev/loki/mdbd.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/mdbdBootstrap.class
Normal file
BIN
bin/main/dev/loki/mdbdBootstrap.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/mdbdLoader.class
Normal file
BIN
bin/main/dev/loki/mdbdLoader.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/Generator.class
Normal file
BIN
bin/main/dev/loki/objective/Generator.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/GeneratorManager.class
Normal file
BIN
bin/main/dev/loki/objective/GeneratorManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/GeneratorRegression.class
Normal file
BIN
bin/main/dev/loki/objective/GeneratorRegression.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/GeneratorRepair$RepairSession.class
Normal file
BIN
bin/main/dev/loki/objective/GeneratorRepair$RepairSession.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/GeneratorRepair.class
Normal file
BIN
bin/main/dev/loki/objective/GeneratorRepair.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/SkillCheck$CheckState.class
Normal file
BIN
bin/main/dev/loki/objective/SkillCheck$CheckState.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/SkillCheck.class
Normal file
BIN
bin/main/dev/loki/objective/SkillCheck.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/objective/SkillCheckUI.class
Normal file
BIN
bin/main/dev/loki/objective/SkillCheckUI.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/Pallet$PalletState.class
Normal file
BIN
bin/main/dev/loki/pallet/Pallet$PalletState.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/Pallet.class
Normal file
BIN
bin/main/dev/loki/pallet/Pallet.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/PalletBreak$BreakTask.class
Normal file
BIN
bin/main/dev/loki/pallet/PalletBreak$BreakTask.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/PalletBreak$BreakingProgress.class
Normal file
BIN
bin/main/dev/loki/pallet/PalletBreak$BreakingProgress.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/PalletBreak.class
Normal file
BIN
bin/main/dev/loki/pallet/PalletBreak.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/PalletDrop.class
Normal file
BIN
bin/main/dev/loki/pallet/PalletDrop.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/PalletManager.class
Normal file
BIN
bin/main/dev/loki/pallet/PalletManager.class
Normal file
Binary file not shown.
BIN
bin/main/dev/loki/pallet/PalletStun$1.class
Normal file
BIN
bin/main/dev/loki/pallet/PalletStun$1.class
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue