using Cal.DataTable; using System; using System.Collections.Generic; namespace ET { public class BossComponentAwakeSystem : AwakeSystem { public override void Awake(BossComponent self) { BossComponent.Instance = self; self.Awake(); } } public class BossComponentLoadSystem : LoadSystem { public override void Load(BossComponent self) { self.Load(); } } public class BossComponentDestroySystem : DestroySystem { public override void Destroy(BossComponent self) { self.Destroy(); } } public static class BossComponentSystem { public class BossMonitorPer1DayEvent : AEvent { public override async ETTask Run(EventType.UpdatePer1DayOfMonth args) { BossComponent self = BossComponent.Instance; BossTime boosTime = self.BossTime; if (boosTime != null) boosTime.TimeDic.Clear(); else { boosTime = EntityFactory.Create(self.Domain); } foreach (KeyValuePair kp in self.bossInfoDic) { try { boosTime.TimeDic.Add(kp.Key, args.now+self.bossInfoDic[kp.Key].RefreshInterval); //!刷新Boss self.BossRefresh(kp.Key); } catch (Exception e) { Log.Error(e); } } await DBComponent.Instance.Save(boosTime); } } public class BossMonitorPer1MintueEvent : AEvent { public override async ETTask Run(EventType.UpdatePer1MinuteOfDay args) { BossComponent self = BossComponent.Instance; foreach (KeyValuePair kp in self.bossInfoDic) { long time = await self.QueryTime(kp.Key); var dTime = time - args.now; if (dTime<=0) { //!刷新Boss self.BossRefresh(kp.Key); } else if (MathF.Abs(dTime/60_1000f - 5)<0.5f) { //!刷新Boss self.BossWillRefresh(kp.Key); } } } } public static void Awake(this BossComponent self) { self.Load(); } public static void Load(this BossComponent self) { self.bossInfoDic.Clear(); self.bossStateDic.Clear(); IEnumerable arr = DataTableHelper.GetAll(); int index = 0; foreach (BossBase bossbase in arr) { if (index == 0) { self.firstBossId = (int)bossbase.Id; } self.bossInfoDic.Add(++index, bossbase); self.bossStateDic.Add(index, BossComponent.BossState.Dead); } } public static void Destroy(this BossComponent self) { self.bossInfoDic.Clear(); self.bossStateDic.Clear(); self.bossIdDic.Clear(); self.keyDic.Clear(); self.BossTime.Dispose(); } public static async ETTask QueryTime(this BossComponent self, int bossIndex) { if (self.BossTime == null) { List list = await DBComponent.Instance.QueryJson("{}"); if (list == null || list.Count == 0) { self.BossTime = EntityFactory.Create(self.Domain); } else { self.BossTime = list[0]; } } if (!self.BossTime.TimeDic.TryGetValue(bossIndex, out long time)) { time = TimeHelper.ClientNow() + self.bossInfoDic[bossIndex].RefreshInterval; self.BossTime.TimeDic[bossIndex] = time; self.Save().Coroutine(); } return time; } public static async ETVoid Save(this BossComponent self) { await DBComponent.Instance.Save(self.BossTime); } public static string GetBossBossName(this BossComponent self, int layer) { if(self.bossInfoDic.TryGetValue(layer,out BossBase boss)) { return boss.Name; } return string.Empty; } public static void BossWillRefresh(this BossComponent self, int layer) { Chat.Instance.SendSystemCaht($"[color=#00cc00]【{self.GetBossBossName(layer)}】[/color]大约在5分钟后刷新,大家做好准备,及时攻打!"); } public static void BossRefresh(this BossComponent self, int layer) { if (self.GetState(layer) != BossComponent.BossState.Dead) return; self.ChangeState(layer, BossComponent.BossState.Idle); Chat.Instance.SendSystemCaht($"[color=#00cc00]【{self.GetBossBossName(layer)}】[/color]刷新了,大家赶紧去击杀吧,奖励多多!"); } public static void BossDead(this BossComponent self,string names, int layer) { if (self.GetState(layer) == BossComponent.BossState.Dead) { Log.Error($"boss index = {layer}已经死亡"); return; } Log.Debug($"*****************************" + $"第{layer}层Boss被击败了" + $"***************************"); Chat.Instance.SendSystemCaht($"[color=#ff0000]随着一声巨响,在[color=#ffff00]{names}[/color]队伍强力攻击和完美防御下,[color=#00cc00]【{self.GetBossBossName(layer)}】[/color]应地倒下![/color]"); self.ChangeState(layer, BossComponent.BossState.Dead); self.BossTime.TimeDic[layer] = TimeHelper.ClientNow() + self.bossInfoDic[layer].RefreshInterval; self.Save().Coroutine(); } public static int GetBossId(this BossComponent self, int layer) { return self.firstBossId + layer - 1; } public static BossComponent.BossState GetState(this BossComponent self, int layer) { self.bossStateDic.TryGetValue(layer, out BossComponent.BossState state); return state; } public static void ChangeState(this BossComponent self, int layer, BossComponent.BossState bossState, bool isBrocast = true) { if (isBrocast) switch (bossState) { case BossComponent.BossState.None: break; case BossComponent.BossState.Dead: { MapScene map = MapSceneComponent.Instance.GetMap(Sys_SceneId.Scene_Boss * 100 + layer); IEnumerable list = map.GetAll(); if(self.bossIdDic.TryGetValue(layer,out long id)) { foreach (Unit unit in list) { MessageHelper.SendActor(unit, new M2C_BossDead() { UnitId = id }); } } } break; case BossComponent.BossState.Idle: { MapScene map = MapSceneComponent.Instance.GetMap(Sys_SceneId.Scene_Boss * 100 + layer); IEnumerable list = map.GetAll(); foreach (Unit unit in list) { MessageHelper.SendActor(unit, new M2C_BossRefresh { BossId = self.GetBossId(layer) }); } } break; case BossComponent.BossState.Battle: break; default: break; } self.bossStateDic[layer] = bossState; } } }