--- id: TASK-0022 title: Интегрировать спавн врагов в VoxelWorldGenerator summary: Добавить в воксельный генератор мира интеграцию спавна врагов при загрузке чанков, используя детерминированные правила и kill-state. priority: Highest area: worldgen owner: unassigned created: 2026-03-31 updated: 2026-03-31 execution_time: 1d depends_on: - TASK-0003 - TASK-0005 - TASK-0006 canonical_docs: - docs/tasks/Index.md related_files: - Assets/Features/VoxelWorld/Runtime/VoxelWorldGenerator.cs --- # TASK-0022 - Интегрировать спавн врагов в VoxelWorldGenerator ## Status Статус задачи ведется в `docs/tasks/Index.md` и является каноническим там. ## Why Спавн врагов должен быть частью runtime world loop: при появлении/активации чанка сервер должен спавнить deterministic roster, а при повторной загрузке учитывать kill-state, чтобы мир ощущался стабильным и сохраняемым. ## Expected Outcome - При загрузке чанка сервер вычисляет deterministic spawn roster для этого чанка. - Сервер спавнит врагов в пределах чанка (или в заданных spawn zones), не создавая дублей. - При наличии kill-state для чанка повторный спавн не создает уже убитых врагов. ## Current Context В проекте уже есть `VoxelWorldGenerator`, который управляет жизненным циклом чанков. Задачи `TASK-0005` и `TASK-0006` описывают deterministic roster и kill-state, но без интеграции в мир спавн не работает end-to-end. ## Source Of Truth - `docs/tasks/items/TASK-0005.md` - `docs/tasks/items/TASK-0006.md` - `Assets/Features/VoxelWorld/Runtime/VoxelWorldGenerator.cs` ## Scope In - точка интеграции: событие/хук на появление чанка в runtime - вычисление spawn roster для `(seed, chunkCoord)` - привязка `enemySlotIndex` к конкретному spawned enemy - применение kill-state при (ре)загрузке чанка ## Scope Out - AI поведение врагов (это `TASK-0012`) - сложные spawn director механики ## Constraints - сервер является источником истины для спавна - результат должен быть детерминированным ## Suggested Approach 1. Выделить интерфейс/сервис `IChunkSpawnService` (или аналог) и вызывать его из `VoxelWorldGenerator` при загрузке чанка. 2. Реализовать вычисление roster, используя уже согласованный контракт из `TASK-0005`. 3. Перед фактическим спавном проверить kill-state из `TASK-0006`. 4. Зафиксировать правила despawn при выгрузке чанка. ## Acceptance Criteria - при повторной загрузке одного и того же чанка сервер спавнит одинаковый roster - убитые слоты не спавнятся повторно после загрузки world save ## Verification - ручной тест: зайти/выйти из зоны чанка и убедиться, что roster стабилен - тест: убить врага, сохранить/перезагрузить мир, проверить отсутствие этого слота ## Risks / Open Questions - нужно решить, где хранить runtime mapping `enemySlotIndex -> NetworkObject` и когда его очищать ## Human Decisions Needed - none currently ## Decision Log - `2026-03-31` - задача выделена отдельно как интеграция deterministic spawn в runtime voxel-chunk loop. ## Handoff Notes Если окажется, что генератор чанков работает и на клиенте, убедиться, что спавн вызывается только на сервере.