using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using PhoenixLib.Events; using WingsEmu.Game.Act4.Entities; using WingsEmu.Game.Entities; using WingsEmu.Game.Maps; using WingsEmu.Game.Raids; using WingsEmu.Game.Triggers; namespace WingsEmu.Game.Act4; public class DungeonSubInstance : IEventTriggerContainer { private readonly List _bosses = new(); private readonly IEventTriggerContainer _eventTriggerContainer; public DungeonSubInstance(IMapInstance mapInstance, IAsyncEventPipeline asyncEventPipeline, HatusHeads hatusHeads = null) { MapInstance = mapInstance; _eventTriggerContainer = new EventTriggerContainer(asyncEventPipeline); HatusHeads = hatusHeads; } public IMapInstance MapInstance { get; } public HatusHeads HatusHeads { get; } public IReadOnlyList Bosses => _bosses; public List LoopWaves { get; private set; } public DateTime? LastDungeonWaveLoop { get; set; } public List LinearWaves { get; private set; } public DateTime? LastDungeonWaveLinear { get; set; } public List PortalGenerators { get; private set; } public DateTime? LastPortalGeneration { get; set; } public void AddEvent(string key, IAsyncEvent notification, bool removedOnTrigger = false) => _eventTriggerContainer.AddEvent(key, notification, removedOnTrigger); public Task TriggerEvents(string key) => _eventTriggerContainer.TriggerEvents(key); public void SetLoopWaves(List dungeonWaves) { LoopWaves = dungeonWaves; } public void SetLinearWaves(IEnumerable dungeonWaves) { LinearWaves = dungeonWaves.OrderBy(x => x.Delay).ToList(); } public void SetPortalGenerators(IEnumerable portalGenerators) { PortalGenerators = portalGenerators.OrderBy(x => x.Delay).ToList(); } public void AddDungeonMonster(IMonsterEntity monster) { if (monster.IsBoss) { _bosses.Add(monster); } } public void AddDungeonButton(ButtonMapItem buttonMapItem) { MapInstance.AddDrop(buttonMapItem); } } public class DungeonLoopWave { public DateTime FirstSpawnWave { get; set; } public TimeSpan Delay { get; init; } public IReadOnlyList Monsters { get; init; } public TimeSpan TickDelay { get; init; } public DateTime LastMonsterSpawn { get; set; } public bool IsScaledWithPlayerAmount { get; set; } } public class DungeonLinearWave { public IReadOnlyList Monsters { get; init; } public TimeSpan Delay { get; init; } } public class PortalGenerator { public IPortalEntity Portal { get; init; } public TimeSpan Delay { get; init; } }