---
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

Если окажется, что генератор чанков работает и на клиенте, убедиться, что спавн вызывается только на сервере.
