CTT/Server/Hotfix/Game/System/Battle/New/FamilyBossBattleSystem.cs

346 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Cal.DataTable;
using System;
using System.Collections.Generic;
namespace ET
{
public class FamilyBossBattleAwakeSystem : AwakeSystem<FamilyBossBattle, Team>
{
public override void Awake(FamilyBossBattle self, Team team)
{
self.Awake(team);
}
}
public class FamilyBossBattleUpdateSystem : UpdateSystem<FamilyBossBattle>
{
public override void Update(FamilyBossBattle self)
{
self.Update();
}
}
public class FamilyBossBattleDestroySystem : DestroySystem<FamilyBossBattle>
{
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<SkillAI>().CheckCD(now))
{
BattleHelper.PlayerSkill(unit, now);
}
}
foreach (var unit in self.targetTeam.GetUnits())
{
if (!unit.IsAlive) continue;
if (unit.GetComponent<SkillAI>().CheckCD(now))
{
BattleHelper.MonsterSkill(unit);
AddProperty(self, unit);
}
}
}
private static void AddProperty(FamilyBossBattle self, Unit unit)
{
FamilyBossConfig familyBossConfig = DataTableHelper.Get<FamilyBossConfig>(self.bossId);
float additional = familyBossConfig.CharacterAdd;
var num = unit.GetComponent<NumericComponent>();
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<BattleComponent>().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<MonsterInfo>().monsterId;
m2C_MainStoryMonsterInfo.UnitId = unitMonster.Id;
m2C_MainStoryMonsterInfo.Hp = unitMonster.GetComponent<NumericComponent>().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<MonsterInfo>().monsterId;
m2C_MainStoryMonsterInfo.UnitId = unitMonster.Id;
m2C_MainStoryMonsterInfo.Hp = unitMonster.GetComponent<NumericComponent>().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<MonsterInfo>();
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;
}
}
}
/// <summary>
/// 结算Boss伤害数据
/// </summary>
/// <param name="self"></param>
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<FamilyBossBattle>(), 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<FamilyBossBattle>(), 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);
}
}
}
}