CTT/Server/Hotfix/Game/System/Boss/BossComponentSystem.cs

220 lines
8.4 KiB
C#
Executable File

using Cal.DataTable;
using System;
using System.Collections.Generic;
namespace ET
{
public class BossComponentAwakeSystem : AwakeSystem<BossComponent>
{
public override void Awake(BossComponent self)
{
BossComponent.Instance = self;
self.Awake();
}
}
public class BossComponentLoadSystem : LoadSystem<BossComponent>
{
public override void Load(BossComponent self)
{
self.Load();
}
}
public class BossComponentDestroySystem : DestroySystem<BossComponent>
{
public override void Destroy(BossComponent self)
{
self.Destroy();
}
}
public static class BossComponentSystem
{
public class BossMonitorPer1DayEvent : AEvent<EventType.UpdatePer1DayOfMonth>
{
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<BossTime>(self.Domain);
}
foreach (KeyValuePair<int, BossBase> 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<EventType.UpdatePer1MinuteOfDay>
{
public override async ETTask Run(EventType.UpdatePer1MinuteOfDay args)
{
BossComponent self = BossComponent.Instance;
foreach (KeyValuePair<int, BossBase> 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<BossBase> arr = DataTableHelper.GetAll<BossBase>();
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<long> QueryTime(this BossComponent self, int bossIndex)
{
if (self.BossTime == null)
{
List<BossTime> list = await DBComponent.Instance.QueryJson<BossTime>("{}");
if (list == null || list.Count == 0)
{
self.BossTime = EntityFactory.Create<BossTime>(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<Unit> 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<Unit> 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;
}
}
}