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

297 lines
11 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 IdleBattleAwakeSystem : AwakeSystem<IdleBattle, Team>
{
public override void Awake(IdleBattle self, Team team)
{
self.Awake(team);
}
}
public class IdleBattleUpdateSystem : UpdateSystem<IdleBattle>
{
public override void Update(IdleBattle self)
{
self.Update();
}
}
public class IdleBattleDestroySystem : DestroySystem<IdleBattle>
{
public override void Destroy(IdleBattle self)
{
self.team.ChangeState(TeamState.None);
self.targetTeam.ChangeState(TeamState.None);
self.team = null;
2021-04-11 19:50:39 +08:00
foreach (Unit item in self.targetTeam.GetUnits())
2021-04-08 20:09:59 +08:00
{
item.GetMap().Leave(item);
item.Dispose();
}
self.targetTeam.Dispose();
self.targetTeam = null;
self.mainStory = null;
self.mineKillInfo.Dispose();
self.targetKillInfo.Dispose();
}
}
public static class IdleBattleSystem
{
private const int StartTime = 5 * 1000;
public static void Awake(this IdleBattle self, Team team)
{
self.team = team;
self.mineKillInfo = new MonsterKillInfo(self, team);
self.isRunning = false;
self.quitBattleAction = OnQuitBattle;
}
public static void Init(this IdleBattle self, MainStory mainStory)
{
self.mainStory = mainStory;
self.ReadyBeforeBattle();
2021-04-11 19:50:39 +08:00
long now = TimeHelper.ClientNow();
2021-04-08 20:09:59 +08:00
self.startTime = now;
}
public static void Update(this IdleBattle self)
{
if (!self.isRunning) return;
2021-04-11 19:50:39 +08:00
long now = TimeHelper.ClientNow();
2021-04-08 20:09:59 +08:00
if (now - self.startTime < StartTime)
return;
if (now - self.startTime > ConstDefine.MainStoryBattleTime)
{
2021-04-11 19:50:39 +08:00
Team anotherTeam = self.GetAnotherTeam(self.team);
2021-04-08 20:09:59 +08:00
OnTargetVictory(self, anotherTeam);
return;
}
CheckCanStartSkill(self, now);
}
private static void CheckCanStartSkill(IdleBattle self, long now)
{
2021-04-11 19:50:39 +08:00
foreach (Unit unit in self.team.GetUnits())
2021-04-08 20:09:59 +08:00
{
if (!unit.IsAlive) continue;
if (unit.GetComponent<SkillAI>().CheckCD(now))
{
BattleHelper.PlayerSkill(unit, now);
}
}
2021-04-11 19:50:39 +08:00
foreach (Unit unit in self.targetTeam.GetUnits())
2021-04-08 20:09:59 +08:00
{
if (!unit.IsAlive) continue;
if (unit.GetComponent<SkillAI>().CheckCD(now))
{
BattleHelper.MonsterSkill(unit);
}
}
}
public static void ReadyBeforeBattle(this IdleBattle self)
{
try
{
2021-04-11 19:50:39 +08:00
Team team = self.team;
2021-04-08 20:09:59 +08:00
MainStory mainStory = self.mainStory;
if (mainStory == null)
{
BattleMgrCompnent.Instance.RemoveBattle(self);
return;
}
team.ChangeState(TeamState.Fight);
2021-04-11 19:50:39 +08:00
LinkedList<Unit> teamList = team.GetUnits();
2021-04-08 20:09:59 +08:00
2021-04-11 19:50:39 +08:00
MonsterBase monsterBase = MonsterFactoryHelper.MainstoryGenerate(self, mainStory);
2021-04-08 20:09:59 +08:00
self.targetKillInfo = new MonsterKillInfo(self, self.targetTeam);
//!+设置每个人的状态/行动值
2021-04-11 19:50:39 +08:00
foreach (Unit u in teamList)
2021-04-08 20:09:59 +08:00
{
u.GetComponent<BattleComponent>().BattleType = BattleType.IdleBattle;
2021-04-11 19:50:39 +08:00
NumericComponent num = u.GetComponent<NumericComponent>();
2021-04-08 20:09:59 +08:00
int energy = num.GetAsInt(NumericType.Energy);
if (energy > 0)
{
int oldEnergy = energy;
switch ((MonsterType)monsterBase.MonsterType)
{
case MonsterType.None:
throw new Exception("怪物类型错误");
case MonsterType.Normal:
energy -= 3;
break;
case MonsterType.Elite:
energy -= 3;
break;
case MonsterType.Suzerain:
energy -= 1;
break;
default:
break;
}
num.Set(NumericType.Energy, energy);
StatisticsHelper.AddEnergyCost(u.Id, StatisticsTypes.EnergyCostType_IdleBattle,oldEnergy-energy);
}
}
//!+设置目标/技能信息
2021-04-11 19:50:39 +08:00
LinkedList<Unit> monsterTeamList = self.targetTeam.GetUnits();
2021-04-08 20:09:59 +08:00
Game.EventSystem.Publish(new EventType.BattleStart { teamList = teamList, targetTeamList = monsterTeamList }).Coroutine();
2021-04-11 19:50:39 +08:00
foreach (Unit item in monsterTeamList)
2021-04-08 20:09:59 +08:00
{
CharacterHelper.SyncNumeric(item);
CharacterHelper.RecoverUnit(item);
}
BattleHelper.SetTargets(self, teamList, monsterTeamList);
//!+保存主怪Id
MainStoryMap.Instance.GetBattleInteractiveInfo(team.LeaderId).LeaderMonsterId = mainStory.Monster_1Arr[0].Monster_1_Id;
//!+创建怪物击破信息
self.mineKillInfo.Init(self.targetTeam.MemberCount, OnVictory);
self.targetKillInfo.Init(self.team.MemberCount, OnTargetVictory);
Log.Info($"\n{team.GetMemberName()}开始挂机战斗,[{mainStory.SceneId}][{mainStory.Layer}]*************");
self.SendMonsterInfo();
self.isRunning = true;
}
catch (Exception e)
{
BattleMgrCompnent.Instance.RemoveBattle(self);
Log.Error(e);
}
}
private static void SendMonsterInfo(this IdleBattle self)
{
M2C_MainStoryMonsterInfo m2C_MainStoryMonsterInfo = new M2C_MainStoryMonsterInfo();
2021-04-11 19:50:39 +08:00
foreach (Unit unitMonster in self.targetTeam.GetUnits())
2021-04-08 20:09:59 +08:00
{
//!给玩家返回怪物信息
MonsterUnitInfo retUnitInfo = new MonsterUnitInfo()
{
Id = unitMonster.Id,
MonsterId = unitMonster.GetComponent<MonsterInfo>().monsterId
};
m2C_MainStoryMonsterInfo.MonsterUnitInfoList.Add(retUnitInfo);
}
2021-04-11 19:50:39 +08:00
foreach (Unit u in self.team.GetUnits())
2021-04-08 20:09:59 +08:00
{
MessageHelper.SendActor(u, m2C_MainStoryMonsterInfo);
}
}
public static void ReSendMonsterInfo(this IdleBattle self, Unit unit)
{
M2C_ReMainStoryMonsterInfo m2C_MainStoryMonsterInfo = new M2C_ReMainStoryMonsterInfo();
2021-04-11 19:50:39 +08:00
foreach (Unit unitMonster in self.targetTeam.GetUnits())
2021-04-08 20:09:59 +08:00
{
//!给玩家返回怪物信息
2021-04-11 19:50:39 +08:00
NumericComponent num = unitMonster.GetComponent<NumericComponent>();
2021-04-08 20:09:59 +08:00
ReMonsterUnitInfo retUnitInfo = new ReMonsterUnitInfo()
{
Id = unitMonster.Id,
MonsterId = unitMonster.GetComponent<MonsterInfo>().monsterId,
Hp = num.GetAsInt(NumericType.Hp),
MaxHp = num.GetAsInt(NumericType.MaxHp),
};
m2C_MainStoryMonsterInfo.MonsterUnitInfoList.Add(retUnitInfo);
}
MessageHelper.SendActor(unit, m2C_MainStoryMonsterInfo);
}
private static void OnVictory(BattleBase self, Team team)
{
try
{
if (self == null)
{
Log.Error($"battle == null");
return;
}
if (!self.isRunning) return;
Execute(self.As<IdleBattle>(), team).Coroutine();
static async ETVoid Execute(IdleBattle self, Team team)
{
self.isRunning = false;
2021-04-11 19:50:39 +08:00
LinkedList<Unit> teamList = team.GetUnits();
2021-04-08 20:09:59 +08:00
Unit unit = MapUnitComponent.Instance.Get(team.LeaderId);
Log.Info($"{team.GetMemberName()}挂机战斗胜利了!");
2021-04-11 19:50:39 +08:00
UnitScene unitScene = unit.GetComponent<UnitScene>();
2021-04-08 20:09:59 +08:00
//!触发通关任务事件
BattleHelper.UpdateChangeMapTaskStateEvent(unitScene, teamList).Coroutine();
await TimerComponent.Instance.WaitAsync(6000);
2021-04-11 19:50:39 +08:00
foreach (Unit item in teamList)
2021-04-08 20:09:59 +08:00
{
MessageHelper.SendActor(item, new M2C_BattleVictory() { BattleType = (int)self.battleType });
}
//!结束挂机战斗
BattleIdleMap.Instance.Get(team.LeaderId)?.SetFightEnd();
await BattleHelper.VictoryOption(self, team,self.mainStory.Id);
2021-04-11 19:50:39 +08:00
Team anotherTeam = self.GetAnotherTeam(team);
2021-04-08 20:09:59 +08:00
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<IdleBattle>(), team).Coroutine();
static async ETVoid Execute(IdleBattle self, Team team)
{
self.isRunning = false;
2021-04-11 19:50:39 +08:00
LinkedList<Unit> teamList = team.GetUnits();
2021-04-08 20:09:59 +08:00
await TimerComponent.Instance.WaitAsync(5500);
BattleHelper.EnermyClearOption(self, team);
2021-04-11 19:50:39 +08:00
Team anotherTeam = self.GetAnotherTeam(team);
2021-04-08 20:09:59 +08:00
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)
{
if (team.AddVote(Id))
{
2021-04-11 19:50:39 +08:00
Team anotherTeam = self.GetAnotherTeam(team);
2021-04-08 20:09:59 +08:00
OnTargetVictory(self, anotherTeam);
}
}
}
}