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 (var 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 (var 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; var now = TimeHelper.ClientNow(); if (now - self.startTime < StartTime) return; if (now - self.startTime > ConstDefine.FamilyBossBattleTime) { var anotherTeam = self.GetAnotherTeam(self.team); OnTargetVictory(self, anotherTeam); return; } CheckCanStartSkill(self, now); } private static void CheckCanStartSkill(FamilyBossBattle self, long now) { foreach (var unit in self.team.GetUnits()) { if (!unit.IsAlive) continue; if (unit.GetComponent().CheckCD(now)) { BattleHelper.PlayerSkill(unit, now); } } foreach (var 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; var 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 { var team = self.team; if (self.bossId == 0) { BattleMgrCompnent.Instance.RemoveBattle(self); return; } team.ChangeState(TeamState.Fight); var teamList = team.GetUnits(); var bossBase = MonsterFactoryHelper.FamilyBossGenerate(self, self.bossId, self.family); self.targetKillInfo = new MonsterKillInfo(self, self.targetTeam); //!+设置每个人的状态 foreach (var u in teamList) { u.GetComponent().BattleType = BattleType.FamilyBoss; } //!+设置目标/技能信息 var monsterTeamList = self.targetTeam.GetUnits(); Game.EventSystem.Publish(new EventType.BattleStart { teamList = teamList, targetTeamList = monsterTeamList }).Coroutine(); foreach (var 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 (var 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 (var 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 (var 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 (var u in self.team.GetUnits()) { MessageHelper.SendActor(u, m2C_MainStoryMonsterInfo); } } public static void ChangeBossHp(this FamilyBossBattle self, Unit unit, int hp) { var monsterInfo = unit.GetComponent(); self.family.SetBossHp(monsterInfo.monsterId, hp); } public static void ChangeDamageData(this FamilyBossBattle self, Unit unit, int damage) { var map = self.bossDamageMap; map.TotalDamage += damage; for (int i = map.DamageList.Count - 1; i >= 0; i--) { var info = map.DamageList[i]; if (info.Id == unit.Id) { info.Damage += damage; return; } } } public static void ChangeTreatData(this FamilyBossBattle self, Unit unit, int treat) { var map = self.bossDamageMap; for (int i = map.DamageList.Count - 1; i >= 0; i--) { var 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); } var 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 (var item in teamList) { MessageHelper.SendActor(item, new M2C_BattleVictory() { BattleType = (int)self.battleType }); } await BattleHelper.VictoryOption(self, team); var anotherTeam = self.GetAnotherTeam(team); BattleHelper.EnermyClearOption(self, anotherTeam); BattleMgrCompnent.Instance.RemoveBattle(self); } } catch (Exception e) { Log.Error(e); BattleMgrCompnent.Instance.RemoveBattle(self); } } public 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); } var teamList = team.GetUnits(); await TimerComponent.Instance.WaitAsync(5500); BattleHelper.EnermyClearOption(self, team); var 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)) { var anotherTeam = self.GetAnotherTeam(team); OnTargetVictory(self, anotherTeam); } } catch (Exception e) { Log.Error(e); BattleMgrCompnent.Instance.RemoveBattle(self); } } } }