- Add HookSabotage system for survivors to disable hooks temporarily - Add GeneratorKick killer ability to regress generator progress - Add PlayerJumpListener to track survivor jump actions - Add BossBarManager for displaying game state and objectives - Update generator regression logic to support killer kick mechanic - Update KillerController to integrate generator kick ability - Update PlayerInteractListener to handle new interaction types - Refactor game phases to use BossBarManager for UI updates - Update .gitignore to exclude compiled bin/ directory - Simplify PLAN.md documentation for easier maintenance
9.6 KiB
9.6 KiB
DBD Plugin — План разработки
Архитектурные принципы
- KISS: Нет абстракций ради абстракций. Простые классы с одной ответственностью.
- DRY: Общая логика в утилитах, не копипаста.
- SOLID: SRP, OCP, LSP, ISP, DIP. Max 150 строк/файл.
Статус реализации
✅ Этап 0: Скелет проекта
build.gradle(Paper 1.21.1, Java 21)plugin.ymlс пермишнамиDBDPlugin.java— onEnable/onDisableConfigManager— загрузка yaml без перезаписиLocationsConfig— координаты объектовGameConfig— все балансные цифры (BossBar, carry, heal limits, lobby timers, sizes, kick cooldown, sabotage)
✅ Этап 1: Core Game Loop
GameStateenumGameSession— хранит игроков, фазу, таймер; передаётGateManagerиcollapseSecondsвEndgamePhasePhaseinterfaceLobbyPhase— таймер 45 сек при 4 игроках, 15 сек при 5, min-players=4, анонс на ключевых секундахRoleAssigner+RoleQueue— выбор киллера; применяетGENERIC_SCALEчерез Attribute APIRoleAssignPhase— телепорты, задержка 5 секGameplayPhase— полная логика (см. ниже)EndgamePhase—collapseSecondsиз конфига, таймер вSidebar,GateManagerиз сессии, Adventure API title/dbd join,/dbd leave,/dbd forcestart,/dbd stop,/dbd reload,/dbd lobby,/dbd setlobby
✅ Этап 2: Игроки и состояния
BasePlayer,Survivor,KillerPlayerState: HEALTHY, INJURED, DOWNED, HOOKED, CARRIED, DEAD, ESCAPEDStateMachine— переходы с валидациейPlayerManager— map UUID → BasePlayerSpawnPosition— телепорт из конфига- Перевод в
GameMode.SPECTATORприPlayerState.DEAD(вGameplayPhase.checkWinConditionsиHookSacrifice) - Размеры через
Attribute.GENERIC_SCALE: Survivor=1.0, Killer=1.5 (вRoleAssignerиGameplayPhase)
✅ Этап 3: Киллер
KillerController— без дублирующей регистрацииAttackListenerKillerAttack— ЛКМ, кулдаун 2.5 с, hitboxHitValidator— line of sight, расстояниеDamageHandler— Healthy→Injured, Injured→DownedKillerCarry— побег через спам пробела (PlayerJumpListener), шкала в ActionBar, Speed I при побегеKillerMovement— скорость из конфига, замедление после удараGeneratorKick— Shift 3 сек → −20% прогресса, кулдаун 30 сек, progress barBossBarManager— BossBar с градиентом по дистанции до маньяка, читает все параметры из конфига
✅ Этап 4: Выживший
SurvivorController— передаётGameConfigвSurvivorHealingSurvivorMovement— sprint, exhaustionSurvivorHealing— таймеры из конфига (other=15 сек, self=30 сек), лимит 4 лечений из конфига, sneak-check, range-check- Downed movement — crawl 30% скорости
✅ Этап 5: Генераторы
Generator—setUnderRegression(bool, ticks),wasKicked()GeneratorManager—getCompletedCount()считает живое состояниеGeneratorRepair— ПКМ, прогресс в ActionBar; при фейле skillcheck:setUnderRegression+ компас маньяку наcompass-duration-secondsGeneratorRegression— скорость полностью из конфига (regression-rate,kick-regression-rate), без хардкодированных константSkillCheck+SkillCheckUI— QTE система
✅ Этап 6: Крюки
Hook— полеdisabled+isDisabled()/setDisabled()HookManager—maxHooksиз конфига,tryHookSurvivorпроверяет лимит → при превышении сразуDEAD;findNearestUnoccupiedHookиfindAvailableHookучитываютisDisabled()HookStage— Stage 1 (60 с), Stage 2 (60 с)HookStruggle—struggleIntervalTicksиз конфига (hooks.struggle-interval)HookRescue— 60 тиков (3 сек из конфига), sneak-check, range-check, Speed I после спасенияHookSacrifice— смерть + SPECTATOR modeHookSabotage— выживший держит Shift 10 сек → крюк отключён, восстановление 60 сек (всё из конфига), progress bar, broadcast
✅ Этап 7: UI
ActionBar— статус, прогресс-барыSidebar— сердца ♥ (поhooksTaken), цвета ников по состоянию,GeneratorManager(живой счёт), таймер коллапсаTitleUI,ProgressBar,StatusIconsBossBarManager— BossBar для каждого выжившего, градиент по дистанции- Шкала wiggle в
KillerCarry.showWiggleProgress()(ActionBar)
✅ Этап 8: Паллеты и окна
Pallet,PalletManager,PalletDrop,PalletBreak,PalletStunWindow,WindowManager,WindowVault,WindowFastVault
✅ Этап 9: Ворота и люк
ExitGate—savedProgress+getSavedProgress()/saveProgress()/restoreProgress()/setProgressDirect();reset()чиститsavedProgressGateManager—activateEndgame()только включает питание, без авто-открытияGateOpening— линейный прогресс (setProgressDirect), сохраняет/восстанавливает прогресс при уходе/возврате игрокаHatch,HatchCondition,HatchEscape
✅ Этап 10: Звук
TerrorRadiusSound—terrorRadiusпараметр конструктора (из конфига), дефолт 32SoundManager,GeneratorSound,SoundLevels
✅ Этап 11: Слушатели
PlayerJumpListener— прыжки для wiggle при переноскеPlayerInteractListener—setOnKillerSneak+PlayerToggleSneakEvent(маньяк → GeneratorKick, выживший → HookSabotage)PlayerMoveListener,PlayerQuitListener,DamageListener
✅ Этап 12: Данные и хранение
DataStorage,YamlStorage,SQLiteStorage,PlayerStats,MatchResult
❌ Не реализовано (следующие этапы)
Пользовательские лобби
LobbySession— пользовательское лобби (пароль, владелец, приватность)LobbyRegistry— реестр серверных и пользовательских лобби, YAML persistence/dbd create <name> [password] [private]— для обычных игроков (сейчас требуетmdbd.admin)/dbd join <name>— вход в конкретное лобби
Механики крюков
HookRecovery— самостоятельное слезание с крюка на Stage 2
Перки
IPerkинтерфейс,PerkRegistry- Survivor:
SelfCarePerk,DeadHardPerk,SprintBurstPerk,BorrowedTimePerk - Killer:
HexRuinPerk,CorruptInterventionPerk,BBQChiliPerk
Предметы из конфига
ChestLoot— читать веса и типы предметов изgame.yml(сейчас захардкожено)
Конфиги (game.yml) — актуальные ключи
lobby:
min-players: 4
max-players: 5
countdown-4-players: 45
countdown-5-players: 15
role-assign-delay: 5
players:
survivor-scale: 1.0
killer-scale: 1.5
generators:
total-count: 7
required-count: 5
repair-seconds: 90
regression-rate: 0.25
kick-regression-rate: 2.5
kick-regression-percent: 20.0
kick-duration-seconds: 30
kick-cooldown-seconds: 30
kick-charge-seconds: 3
interaction-range: 3.0
hooks:
stage1-seconds: 60
stage2-seconds: 60
struggle-interval: 2
max-hooks: 3
interaction-range: 3.0
rescue-seconds: 3
sabotage-seconds: 10
sabotage-recovery-seconds: 60
healing:
other-heal-seconds: 15
self-heal-seconds: 30
medkit-bonus: 0.5
interrupt-on-move: true
max-heals-per-match: 4
heal-range: 3.0
carry:
escape-jumps: 15
escape-speed-seconds: 3
jump-fill-percent: 6.67
killer:
attack-cooldown: 2.5
attack-range: 3.0
pallet-stun-seconds: 2.0
pallet-break-seconds: 3.0
terror-radius: 32
pallet-interaction-range: 3.0
bossbar:
enabled: true
title: "<red>☠ МАНЬЯК РЯДОМ ☠</red>"
color: RED
style: SOLID
appear-range: 32
full-range: 8
endgame:
gate-open-seconds: 20
collapse-seconds: 120
chest-open-seconds: 3
gate-interaction-range: 3.0
killer-notification:
compass-duration-seconds: 5
scoreboard:
show-hearts: true
heart-symbol: "♥"
color-healthy: "WHITE"
color-injured: "RED"
color-healing: "GREEN"
color-hooked: "DARK_RED"