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

257 lines
8.9 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 PKBattleAwakeSystem : AwakeSystem<PKBattle, Team>
{
public override void Awake(PKBattle self, Team team)
{
self.Awake(team);
}
}
public class PKBattleUpdateSystem : UpdateSystem<PKBattle>
{
public override void Update(PKBattle self)
{
self.Update();
}
}
public class PKBattleDestroySystem : DestroySystem<PKBattle>
{
public override void Destroy(PKBattle self)
{
self.team.ChangeState(TeamState.None);
self.targetTeam.ChangeState(TeamState.None);
self.team = null;
self.targetTeam = null;
self.mineKillInfo.Dispose();
self.targetKillInfo.Dispose();
}
}
public static class PKBattleSystem
{
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 PKBattle self, Team team)
{
self.team = team;
self.mineKillInfo = new MonsterKillInfo(self, team);
self.isRunning = false;
self.quitBattleAction = OnQuitBattle;
}
public static void Init(this PKBattle self, Team targetTeam)
{
self.targetTeam = targetTeam;
self.ReadyBeforeBattle();
self.startTime = TimeHelper.ClientNow();
}
public static void Update(this PKBattle 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;
CheckCanStartSkill(self, now);
}
private static void CheckCanStartSkill(PKBattle 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.PlayerSkill(unit, now);
}
}
}
public static void ReadyBeforeBattle(this PKBattle self)
{
try
{
2021-04-11 19:50:39 +08:00
Team team = self.team;
2021-04-08 20:09:59 +08:00
team.ChangeState(TeamState.Fight);
self.targetTeam.ChangeState(TeamState.Fight);
self.targetKillInfo = new MonsterKillInfo(self, self.targetTeam);
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
foreach (Unit u in teamList)
2021-04-08 20:09:59 +08:00
{
u.GetComponent<BattleComponent>().BattleType = BattleType.TrialCopy;
}
//!+设置目标/技能信息
2021-04-11 19:50:39 +08:00
LinkedList<Unit> monsterTeamList = self.targetTeam.GetUnits();
foreach (Unit u in monsterTeamList)
2021-04-08 20:09:59 +08:00
{
u.GetComponent<BattleComponent>().BattleType = BattleType.TrialCopy;
}
Game.EventSystem.Publish(new EventType.BattleStart { teamList = teamList, targetTeamList = monsterTeamList, isPvp = true }).Coroutine();
BattleHelper.SetTargets(self, teamList, monsterTeamList);
//!+保存主怪Id
//MainStoryMap.Instance.GetBattleInteractiveInfo(team.LeaderId).LeaderMonsterId = trialCopy.MonsterId;
//!+创建击破信息
int totalCount = self.targetTeam.MemberCount;
self.mineKillInfo.Init(totalCount, OnVictory);
int mineTotalCount = self.team.MemberCount;
self.targetKillInfo.Init(mineTotalCount, OnVictory);
Log.Info($"\n{team.GetMemberName()}开始PK战斗对方队伍:\n{self.targetTeam.GetMemberName()}*************");
self.SendMonsterInfo();
self.isRunning = true;
}
catch (Exception e)
{
BattleMgrCompnent.Instance.RemoveBattle(self);
Log.Error(e);
}
}
private static void SendMonsterInfo(this PKBattle self)
{
Team team = self.team;
Team targetTeam = self.targetTeam;
//!同步血量
Game.EventSystem.Publish(new EventType.ChangeAllUnitCharacter { team = team, targetTeam = targetTeam }).Coroutine();
//!给双方通知
2021-04-11 19:50:39 +08:00
M2C_SendStartPK sendProto = new M2C_SendStartPK();
2021-04-08 20:09:59 +08:00
sendProto.TargetIdList.AddRange(targetTeam.GetUnitIds());
2021-04-11 19:50:39 +08:00
foreach (Unit unit in team.GetUnits())
2021-04-08 20:09:59 +08:00
{
MessageHelper.SendActor(unit, sendProto);
}
sendProto = new M2C_SendStartPK();
sendProto.TargetIdList.AddRange(team.GetUnitIds());
2021-04-11 19:50:39 +08:00
foreach (Unit unit in targetTeam.GetUnits())
2021-04-08 20:09:59 +08:00
{
MessageHelper.SendActor(unit, sendProto);
}
}
public static void ReSendMonsterInfo(this PKBattle self,Unit unit)
{
Team team = self.team;
Team targetTeam = self.targetTeam;
2021-04-11 19:50:39 +08:00
M2C_SendStartPK sendProto = new M2C_SendStartPK();
2021-04-08 20:09:59 +08:00
sendProto.TargetIdList.AddRange(targetTeam.GetUnitIds());
sendProto.TargetIdList.AddRange(team.GetUnitIds());
MessageHelper.SendActor(unit, sendProto);
}
private static void OnVictory(BattleBase self, Team team)
{
try
{
if (self == null)
{
Log.Error($"battle == null");
return;
}
if (!self.isRunning) return;
Execute(self.As<PKBattle>(), team).Coroutine();
static async ETVoid Execute(PKBattle 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()} PK胜利了");
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(5000);
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 });
}
BattleHelper.VictoryOption(self, team).Coroutine();
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)
{
try
{
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
OnVictory(self, anotherTeam);
}
}
catch (Exception e)
{
Log.Error(e);
BattleMgrCompnent.Instance.RemoveBattle(self);
}
}
#region 公共方法
public static Team GetAnotherTeam(this BattleBase self, Team team)
{
try
{
if (team.Id == self.team.Id)
return self.targetTeam;
return self.team;
}
catch (Exception e)
{
Log.Error(e);
}
return null;
}
public static async ETTask OnDefeat(this BattleBase self, Team team)
{
try
{
if (self == null)
{
Log.Error($"battle == null");
return;
}
if (team.MemberCount <= 5)
Log.Info($"{team.GetMemberName()} {self.battleType}失败了!");
await BattleHelper.DefeatOption(self, team);
}
catch (Exception e)
{
Log.Error(e);
}
}
#endregion
}
}