Files

96 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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
Если окажется, что генератор чанков работает и на клиенте, убедиться, что спавн вызывается только на сервере.