86 lines
2.1 KiB
C#
86 lines
2.1 KiB
C#
using System.Collections.Generic;
|
|
using SepCore.Entity;
|
|
using UnityEngine;
|
|
|
|
namespace SepCore.EnemyManager
|
|
{
|
|
public class EnemyRegistry
|
|
{
|
|
private readonly List<EntityBase> _enemies;
|
|
private readonly Dictionary<int, EntityBase> _enemyById;
|
|
|
|
public int Count { get; private set; }
|
|
public List<EntityBase> Enemies => _enemies;
|
|
|
|
public EnemyRegistry()
|
|
{
|
|
_enemies = new List<EntityBase>();
|
|
_enemyById = new Dictionary<int, EntityBase>();
|
|
}
|
|
|
|
public void Register(EnemyBase enemy)
|
|
{
|
|
if (enemy == null) return;
|
|
|
|
Count++;
|
|
RemoveFromCache(enemy.Id);
|
|
_enemies.Add(enemy);
|
|
_enemyById[enemy.Id] = enemy;
|
|
}
|
|
|
|
public void Remove(int entityId)
|
|
{
|
|
if (Count > 0)
|
|
{
|
|
Count--;
|
|
}
|
|
|
|
RemoveFromCache(entityId);
|
|
}
|
|
|
|
public bool TryGet(int entityId, out EntityBase enemy)
|
|
{
|
|
enemy = null;
|
|
if (!_enemyById.TryGetValue(entityId, out EntityBase cachedEnemy))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (cachedEnemy == null || !cachedEnemy.Available)
|
|
{
|
|
_enemyById.Remove(entityId);
|
|
return false;
|
|
}
|
|
|
|
enemy = cachedEnemy;
|
|
return true;
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
_enemies.Clear();
|
|
_enemyById.Clear();
|
|
Count = 0;
|
|
}
|
|
|
|
private void RemoveFromCache(int entityId)
|
|
{
|
|
_enemyById.Remove(entityId);
|
|
|
|
for (int i = _enemies.Count - 1; i >= 0; i--)
|
|
{
|
|
EntityBase cachedEnemy = _enemies[i];
|
|
if (cachedEnemy == null || cachedEnemy.Id == entityId)
|
|
{
|
|
if (cachedEnemy != null)
|
|
{
|
|
_enemyById.Remove(cachedEnemy.Id);
|
|
}
|
|
|
|
_enemies.RemoveAt(i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|