// using Cal.DataTable; // using System; // using System.Collections.Generic; // // namespace ET // { // public class FamilyBossBattleAwakeSystem : AwakeSystem // { // public override void Awake(FamilyBossBattle self, Team team) // { // self.Awake(team); // } // } // public class FamilyBossBattleUpdateSystem : UpdateSystem // { // public override void Update(FamilyBossBattle self) // { // self.Update(); // } // } // public class FamilyBossBattleDestroySystem : DestroySystem // { // public override void Destroy(FamilyBossBattle self) // { // self.team.ChangeState(TeamState.None); // self.targetTeam.ChangeState(TeamState.None); // self.team = null; // foreach (Unit item in self.targetTeam.GetUnits()) // { // item.GetMap().Leave(item); // item.Dispose(); // } // self.targetTeam.Dispose(); // self.targetTeam = null; // self.bossId = 0; // self.mineKillInfo.Dispose(); // self.targetKillInfo.Dispose(); // self.family = null; // self.bossDamageMap = null; // self.hasSettle = false; // } // } // public static class FamilyBossBattleSystem // { // private const int StartTime = 5 * 1000; // //0.50f, 0.46f, 0.41f, 0.35f // public readonly static float[] HpDifficultyArr = { 0, 0.50f, 0.96f, 1.37f, 1.72f }; // // 0.18f, 0.16f, 0.12f, 0.08f // public readonly static float[] AtkDefDifficultyArr = { 0, 0.18f, 0.34f, 0.46f, 0.53f }; // public static void Awake(this FamilyBossBattle self, Team team) // { // self.team = team; // self.mineKillInfo = new MonsterKillInfo(self, team); // self.isRunning = false; // self.bossDamageMap = new BossDamageMap(); // foreach (Unit unit in team.GetUnits()) // { // self.bossDamageMap.DamageList.Add(new BossDamagePerMemberMap // { // Id = unit.Id, // Name = UserComponent.Instance.Get(unit.Id)?.NickName, // }); // } // self.quitBattleAction = OnQuitBattle; // } // public static void Init(this FamilyBossBattle self, int bossId, FamilyBoss family) // { // self.bossId = bossId; // self.family = family; // self.ReadyBeforeBattle(); // self.startTime = TimeHelper.ClientNow(); // } // public static void Update(this FamilyBossBattle self) // { // if (!self.isRunning) return; // long now = TimeHelper.ClientNow(); // if (now - self.startTime < StartTime) // return; // if (now - self.startTime > ConstDefine.FamilyBossBattleTime) // { // Team anotherTeam = self.GetAnotherTeam(self.team); // OnTargetVictory(self, anotherTeam); // return; // } // CheckCanStartSkill(self, now); // } // // private static void CheckCanStartSkill(FamilyBossBattle self, long now) // { // foreach (Unit unit in self.team.GetUnits()) // { // if (!unit.IsAlive) continue; // if (unit.GetComponent().CheckCD(now)) // { // BattleHelper.PlayerSkill(unit, now); // } // } // foreach (Unit unit in self.targetTeam.GetUnits()) // { // if (!unit.IsAlive) continue; // if (unit.GetComponent().CheckCD(now)) // { // BattleHelper.MonsterSkill(unit); // AddProperty(self, unit); // } // } // // } // // private static void AddProperty(FamilyBossBattle self, Unit unit) // { // FamilyBossConfig familyBossConfig = DataTableHelper.Get(self.bossId); // float additional = familyBossConfig.CharacterAdd; // // NumericComponent num = unit.GetComponent(); // int atk = MathHelper.RoundToInt(num.GetAsInt(NumericType.PhyAtkBase) * additional); // num.AddSet(NumericType.PhyAtk, atk); // atk = MathHelper.RoundToInt(num.GetAsInt(NumericType.SpiAtkBase) * additional); // num.AddSet(NumericType.SpiAtk, atk); // int def = MathHelper.RoundToInt(num.GetAsInt(NumericType.PhyDefBase) * additional); // num.AddSet(NumericType.PhyDef, def); // def = MathHelper.RoundToInt(num.GetAsInt(NumericType.SpiDefBase) * additional); // num.AddSet(NumericType.SpiDef, def); // } // // public static void ReadyBeforeBattle(this FamilyBossBattle self) // { // try // { // Team team = self.team; // // if (self.bossId == 0) // { // BattleMgrCompnent.Instance.RemoveBattle(self); // return; // } // team.ChangeState(TeamState.Fight); // LinkedList teamList = team.GetUnits(); // // FamilyBossConfig bossBase = MonsterFactoryHelper.FamilyBossGenerate(self, self.bossId, self.family); // // self.targetKillInfo = new MonsterKillInfo(self, self.targetTeam); // //!+设置每个人的状态 // foreach (Unit u in teamList) // { // u.GetComponent().BattleType = BattleType.FamilyBoss; // } // //!+设置目标/技能信息 // LinkedList monsterTeamList = self.targetTeam.GetUnits(); // Game.EventSystem.Publish(new EventType.BattleStart { teamList = teamList, targetTeamList = monsterTeamList }).Coroutine(); // foreach (Unit item in monsterTeamList) // { // CharacterHelper.SyncNumeric(item); // CharacterHelper.RecoverUnit(item); // } // BattleHelper.SetTargets(self,teamList, monsterTeamList); // //!+保存主怪Id // MainStoryMap.Instance.GetBattleInteractiveInfo(team.LeaderId).LeaderMonsterId = (int)bossBase.Id; // //!+创建怪物击破信息 // self.mineKillInfo.Init(self.targetTeam.MemberCount, OnVictory); // self.targetKillInfo.Init(self.team.MemberCount, OnTargetVictory); // // Log.Info($"\n{team.GetMemberName()}开始家族Boss战斗,[{self.bossId}阶Boss]*************"); // // self.SendMonsterInfo(); // self.isRunning = true; // } // catch (Exception e) // { // BattleMgrCompnent.Instance.RemoveBattle(self); // Log.Error(e); // } // } // private static void SendMonsterInfo(this FamilyBossBattle self) // { // M2C_SendFamilyBossInfo m2C_MainStoryMonsterInfo = new M2C_SendFamilyBossInfo(); // foreach (Unit unitMonster in self.targetTeam.GetUnits()) // { // //!给玩家返回怪物信息 // m2C_MainStoryMonsterInfo.BossId = unitMonster.GetComponent().monsterId; // m2C_MainStoryMonsterInfo.UnitId = unitMonster.Id; // m2C_MainStoryMonsterInfo.Hp = unitMonster.GetComponent().GetAsInt(NumericType.Hp); // } // foreach (Unit u in self.team.GetUnits()) // { // MessageHelper.SendActor(u, m2C_MainStoryMonsterInfo); // } // } // public static void ReSendMonsterInfo(this FamilyBossBattle self) // { // M2C_ReSendFamilyBossInfo m2C_MainStoryMonsterInfo = new M2C_ReSendFamilyBossInfo(); // foreach (Unit unitMonster in self.targetTeam.GetUnits()) // { // //!给玩家返回怪物信息 // m2C_MainStoryMonsterInfo.BossId = unitMonster.GetComponent().monsterId; // m2C_MainStoryMonsterInfo.UnitId = unitMonster.Id; // m2C_MainStoryMonsterInfo.Hp = unitMonster.GetComponent().GetAsInt(NumericType.Hp); // } // foreach (Unit u in self.team.GetUnits()) // { // MessageHelper.SendActor(u, m2C_MainStoryMonsterInfo); // } // } // public static void ChangeBossHp(this FamilyBossBattle self, Unit unit, int hp) // { // MonsterInfo monsterInfo = unit.GetComponent(); // self.family.SetBossHp(monsterInfo.monsterId, hp); // } // public static void ChangeDamageData(this FamilyBossBattle self, Unit unit, int damage) // { // BossDamageMap map = self.bossDamageMap; // map.TotalDamage += damage; // for (int i = map.DamageList.Count - 1; i >= 0; i--) // { // BossDamagePerMemberMap info = map.DamageList[i]; // if (info.Id == unit.Id) // { // info.Damage += damage; // return; // } // } // } // public static void ChangeTreatData(this FamilyBossBattle self, Unit unit, int treat) // { // BossDamageMap map = self.bossDamageMap; // for (int i = map.DamageList.Count - 1; i >= 0; i--) // { // BossDamagePerMemberMap info = map.DamageList[i]; // if (info.Id == unit.Id) // { // info.Treat += treat; // return; // } // } // } // /// // /// 结算Boss伤害数据 // /// // /// // private static void SettleBossDamageData(FamilyBossBattle self) // { // self.family.InsertDamageInfo(self.bossId, self.bossDamageMap); // } // private static void OnVictory(BattleBase self, Team team) // { // try // { // if (self == null) // { // Log.Error($"battle == null"); // return; // } // if (!self.isRunning) return; // Execute(self.As(), team).Coroutine(); // static async ETVoid Execute(FamilyBossBattle self, Team team) // { // self.isRunning = false; // // if (!self.hasSettle) // { // self.hasSettle = true; // // } // SettleBossDamageData(self); // LinkedList teamList = team.GetUnits(); // Unit unit = MapUnitComponent.Instance.Get(team.LeaderId); // // Log.Info($"{team.GetMemberName()}家族{self.bossId}阶Boss战斗胜利了!"); // // //!触发通关任务事件 // //BattleHelper.UpdateChangeMapTaskStateEvent(unitScene, teamList).Coroutine(); // await TimerComponent.Instance.WaitAsync(5500); // foreach (Unit item in teamList) // { // MessageHelper.SendActor(item, new M2C_BattleVictory() { BattleType = (int)self.battleType }); // } // await VictoryOption(self, team); // // Team anotherTeam = self.GetAnotherTeam(team); // BattleHelper.EnermyClearOption(self, anotherTeam); // BattleMgrCompnent.Instance.RemoveBattle(self); // } // } // catch (Exception e) // { // Log.Error(e); // BattleMgrCompnent.Instance.RemoveBattle(self); // } // } // // private static async ETTask VictoryOption(BattleBase self, Team team) // { // try // { // LinkedList teamList = team.GetUnits(); // team.ChangeState(TeamState.None); // // //!战斗结束事件(回血,奖励) // UnOrderMultiMapComponent rewordMapComponent = UnOrderMultiMapComponent.Create(); // foreach (Unit u in teamList) // { // Game.EventSystem.Publish(new EventType.BattleEnd { unit = u, team = team }).Coroutine(); // Game.EventSystem.Publish(new EventType.BattleEnd_AddHp { unit = u }).Coroutine(); // u.Live(); // } // // MainStoryInteractive battleInteractiveInfo = MainStoryMap.Instance.GetBattleInteractiveInfo(team.LeaderId); // battleInteractiveInfo.LeaderMonsterId = 0; // //!移除不在线玩家 // await TeamComponent.Instance.RemoveAllOffLineId(team); // } // catch (Exception e) // { // Log.Error(e); // } // } // // private static void OnTargetVictory(this BattleBase self, Team team) // { // try // { // if (self == null) // { // Log.Error($"battle == null"); // return; // } // if (!self.isRunning) return; // Execute(self.As(), team).Coroutine(); // static async ETVoid Execute(FamilyBossBattle self, Team team) // { // self.isRunning = false; // // if (!self.hasSettle) // { // self.hasSettle = true; // SettleBossDamageData(self); // } // SettleBossDamageData(self); // // LinkedList teamList = team.GetUnits(); // await TimerComponent.Instance.WaitAsync(5500); // // BattleHelper.EnermyClearOption(self, team); // // Team anotherTeam = self.GetAnotherTeam(team); // await self.OnDefeat(anotherTeam); // BattleMgrCompnent.Instance.RemoveBattle(self); // // } // } // catch (Exception e) // { // Log.Error(e); // BattleMgrCompnent.Instance.RemoveBattle(self); // } // } // private static void OnQuitBattle(BattleBase self, Team team,long Id) // { // try // { // if (team.AddVote(Id)) // { // Team anotherTeam = self.GetAnotherTeam(team); // OnTargetVictory(self, anotherTeam); // } // } // catch (Exception e) // { // Log.Error(e); // BattleMgrCompnent.Instance.RemoveBattle(self); // } // } // } // }