using System; using System.Collections.Generic; public class DangersModel : IDisposable { public List AliveShips; public List Projectiles; public event Action OnUpdate; public event Action OnProjectileSpawned; public DangersModel() { AliveShips = new List(); Projectiles = new List(); EnemyShip.ShipReleased += ShipReleased; EnemyShip.ShipSpawned += ShipSpawned; } public void ShipSpawned(EnemyShip enemyShip) { if (enemyShip == null) return; if (AliveShips.Contains(enemyShip)) return; AliveShips.Add(enemyShip); if (enemyShip.Shooter != null) { var weapon = enemyShip.Shooter.weapon; if (weapon != null) { weapon.OnShoot -= ProjectileSpawned; weapon.OnShoot += ProjectileSpawned; } } OnUpdate?.Invoke(this); } public void ShipReleased(EnemyShip enemyShip) { if (AliveShips.Contains(enemyShip)) { var weapon = enemyShip.Shooter.weapon; if (weapon != null) weapon.OnShoot -= ProjectileSpawned; AliveShips.Remove(enemyShip); } OnUpdate?.Invoke(this); } public void ProjectileSpawned(AbstractProjectile projectile) { Projectiles.Add(projectile); OnUpdate?.Invoke(this); OnProjectileSpawned?.Invoke(projectile); } public void ProjectileReleased(AbstractProjectile projectile) { if (Projectiles.Contains(projectile)) Projectiles.Remove(projectile); OnUpdate?.Invoke(this); } public void Dispose() { EnemyShip.ShipReleased -= ShipReleased; EnemyShip.ShipSpawned -= ShipSpawned; foreach (var ship in AliveShips) { if (ship?.Shooter.weapon != null) ship.Shooter.weapon.OnShoot -= ProjectileSpawned; } AliveShips.Clear(); Projectiles.Clear(); } }