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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|