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

221 lines
8.5 KiB
C#
Raw Normal View History

2021-04-08 20:09:59 +08:00
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)
{
2021-04-11 19:50:39 +08:00
BossComponent self = BossComponent.Instance;
BossTime boosTime = self.BossTime;
2021-04-08 20:09:59 +08:00
if (boosTime != null)
boosTime.TimeDic.Clear();
else
{
boosTime = EntityFactory.Create<BossTime>(self.Domain);
}
2021-04-11 19:50:39 +08:00
foreach (KeyValuePair<int, BossBase> kp in self.bossInfoDic)
2021-04-08 20:09:59 +08:00
{
try
{
boosTime.TimeDic.Add(kp.Key, args.now);
//!刷新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)
{
2021-04-11 19:50:39 +08:00
BossComponent self = BossComponent.Instance;
foreach (KeyValuePair<int, BossBase> kp in self.bossInfoDic)
2021-04-08 20:09:59 +08:00
{
2021-04-11 19:50:39 +08:00
long time = await self.QueryTime(kp.Key);
2021-04-08 20:09:59 +08:00
if (DateTimeOffset.FromUnixTimeMilliseconds(time - args.now).Minute==5)
{
//!刷新Boss
self.BossWillRefresh(kp.Key);
}
else
if (args.now >= time)
{
//!刷新Boss
self.BossRefresh(kp.Key);
}
}
}
}
public static void Awake(this BossComponent self)
{
self.Load();
}
public static void Load(this BossComponent self)
{
self.bossInfoDic.Clear();
self.bossStateDic.Clear();
2021-04-11 19:50:39 +08:00
IEnumerable<BossBase> arr = DataTableHelper.GetAll<BossBase>();
2021-04-08 20:09:59 +08:00
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)
{
2021-04-11 19:50:39 +08:00
List<BossTime> list = await DBComponent.Instance.QueryJson<BossTime>("{}");
2021-04-08 20:09:59 +08:00
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;
}
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)
{
2021-04-11 19:50:39 +08:00
if(self.bossInfoDic.TryGetValue(layer,out BossBase boss))
2021-04-08 20:09:59 +08:00
{
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);
//Log.Debug($"*****************************" +
// $"第{layer}层Boss刷新了" +
// $"***************************");
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)
{
2021-04-11 19:50:39 +08:00
self.bossStateDic.TryGetValue(layer, out BossComponent.BossState state);
2021-04-08 20:09:59 +08:00
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:
{
2021-04-11 19:50:39 +08:00
MapScene map = MapSceneComponent.Instance.GetMap(Sys_SceneId.Scene_Boss * 100 + layer);
IEnumerable<Unit> list = map.GetAll();
2021-04-08 20:09:59 +08:00
if(self.bossIdDic.TryGetValue(layer,out long id))
{
2021-04-11 19:50:39 +08:00
foreach (Unit unit in list)
2021-04-08 20:09:59 +08:00
{
MessageHelper.SendActor(unit, new M2C_BossDead() { UnitId = id });
}
}
}
break;
case BossComponent.BossState.Idle:
{
2021-04-11 19:50:39 +08:00
MapScene map = MapSceneComponent.Instance.GetMap(Sys_SceneId.Scene_Boss * 100 + layer);
IEnumerable<Unit> list = map.GetAll();
foreach (Unit unit in list)
2021-04-08 20:09:59 +08:00
{
MessageHelper.SendActor(unit, new M2C_BossRefresh { BossId = self.GetBossId(layer) });
}
}
break;
case BossComponent.BossState.Battle:
break;
default:
break;
}
self.bossStateDic[layer] = bossState;
}
}
}