using Cysharp.Threading.Tasks; using Framework; using Gameplay.Net; using Google.Protobuf.Collections; using NLDPB; using PhxhSDK; using System.Collections.Generic; using UnityEngine; namespace Gameplay.LegionBattle { public sealed partial class LegionBattleManager : Singlenton, IUpdatable { /// /// 是否军团战中 /// public bool IsLegionBattle { get; private set; } /// /// 是否进入军团战完成 /// public bool IsLegionBattleOK { get; private set; } /// /// 初始化同步完成军团数据 /// private bool isInitAsynLegionData; /// /// 初始化同步完成玩家数据 /// private bool isInitAsynActorData; /// /// 初始化同步完成建筑数据 /// private bool isInitAsynBuildingData; private void InitAction() { IsLegionBattle = false; IsLegionBattleOK = false; EventManager.Instance.Register(EventManager.EventName.EnterLegionBattle, OnServerEnterLegionBattle); EventManager.Instance.Register(EventManager.EventName.EnterLegionBattleSuccess, OnServerEnterLegionBattleOK); EventManager.Instance.Register(EventManager.EventName.ExitLegionBattle, OnServerExitLegionBattle); } private void ReleaseAction() { EventManager.Instance.Unregister(EventManager.EventName.ExitLegionBattle, OnServerExitLegionBattle); EventManager.Instance.Unregister(EventManager.EventName.EnterLegionBattleSuccess, OnServerEnterLegionBattleOK); EventManager.Instance.Unregister(EventManager.EventName.EnterLegionBattle, OnServerEnterLegionBattle); } #region 进入军团战 /// /// 进入军团战观察地图 /// public void EnterLegionBattleAndInspect() { GameStateManager.Instance.ChangeState(new GameStateLegionBattleInspect()); } /// /// 向服务器发送消息进入军团战 /// /// /// /// /// 剧情加载完成后是否立即播放 public void TryEnterLegionBattleByServer() { WaitingForServer.Instance.EventWaiting(WaitingForServer.EventName.FightEnter, false); if (IsLegionBattle) { DebugUtil.LogError($"进入军团战失败!当前正处于军团战中!"); WaitingForServer.Instance.EventDone(WaitingForServer.EventName.FightEnter); return; } CurBattle = new(); isInitAsynLegionData = false; isInitAsynActorData = false; isInitAsynBuildingData = false; NetHelper.EnterLegionBattle(); // 进入军团战消息 } /// /// 向服务器发送消息退出军团战 /// public void TryExitLegionBattleByServer() { WaitingForServer.Instance.EventWaiting(WaitingForServer.EventName.FightEnter, false); if (!IsLegionBattleOK) { DebugUtil.LogError($"退出军团战失败!当前不处于军团战中!"); WaitingForServer.Instance.EventDone(WaitingForServer.EventName.FightEnter); return; } NetHelper.ExitLegionBattle(); // 退出军团战消息 } /// /// 进入军团战(不经过服务器) /// public void EnterLegionBattle() { IsLegionBattle = true; GameStateManager.Instance.ChangeState(new GameStateLegionBattle()); } /// /// 退出军团战(经过服务器) /// public void ExitLegionBattle() { IsLegionBattleOK = false; IsLegionBattle = false; GameStateManager.Instance.ChangeState(new GameStateCampScene()); } /// /// 退出军团战观察地图 /// public void ExitLegionBattleInspect() { GameStateManager.Instance.ChangeState(new GameStateCampScene()); } #endregion #region 同步数据 /// /// 同步初始化军团战军团数据 /// public void InitLegionData(int mapId, uint startTime, int timeLength, MSG_LB_Legion legionAData, MSG_LB_Legion legionBData) { CurBattle.InitLegionData(mapId, startTime, timeLength, legionAData, legionBData); Debug("军团战初始数据同步完成"); isInitAsynLegionData = true; } /// /// 同步初始化军团战玩家数据 /// public async void InitActorData(RepeatedField actorDatas) { await UniTask.WaitUntil(() => { return isInitAsynLegionData; }); foreach (MSG_LB_Actor actorData in actorDatas) { CurBattle.InitActorUnit(actorData); //View.AddActor(actorData.Id, actorData.MoveTime); } Debug("军团战初始玩家数据同步完成"); isInitAsynActorData = true; } /// /// 同步初始化军团战建筑数据 /// public async void InitBuildingData(RepeatedField buildingDatas) { await UniTask.WaitUntil(() => { return isInitAsynActorData && CurBattle.IsLoadComplete; }); foreach (MSG_LB_Building buildingData in buildingDatas) { CurBattle.InitBuildingInfo(buildingData); } Debug("军团战初始建筑数据同步完成"); isInitAsynBuildingData = true; } /// /// 更新军团战玩家数据 /// /// /// public void UpdateActorData(MSG_LB_ActorUpdate actorData) { CurBattle.UpdateActorData(actorData); } /// /// 通过id更新军团战玩家数据 /// /// /// /// /// /// /// public void UpdateActorDataById(uint id, BattlefieldActorCommand command, int x, int z, RepeatedField pathX, RepeatedField pathZ) { CurBattle.UpdateActorInfoById(id, command, x, z, pathX, pathZ); } /// /// 通过索引更新军团战建筑数据 /// public void UpdateBuildingDataByIndex(int index, BattlefieldActorCamp camp, int defCount, int total, RepeatedField actorIds) { CurBattle.UpdateBuildingInfoByIndex(index, camp, defCount, total, actorIds); } /// /// 设置军团战分数 /// /// /// public void UpdateScore(int aScore, int bScore) { CurBattle.SetScore(aScore, bScore); if (IsLegionBattle) EventManager.Instance.Send(EventManager.EventName.UpdateLegionBattleScore); } /// /// 更新通知 /// public async void UpdateNotice(BattlefieldActorCamp camp, int x, int y, E_LegionBattleNotice notice) { if (camp == CurBattle.MyCamp || camp == BattlefieldActorCamp.BacNone) // 友方阵营或者无阵营 { Vector2Int pos = new(x, y); await UI_LegionBattleNoticeController.Open(notice, CurBattle.Map.BlockPosition2TGSCellIndex(pos)); } } /// /// 攻击玩家 /// /// /// /// public void AttackActor(Vector2Int attackPos, uint attackActorId, uint targetActorId) { CurBattle.AttackActor(attackPos, attackActorId, targetActorId); Debug($"{attackActorId}攻击玩家{targetActorId}"); } /// /// 攻击建筑 /// /// /// /// public void AttackBuilding(int index, uint actorId, RepeatedField targets) { CurBattle.AttackBuilding(index, actorId, targets); Debug($"{actorId}攻击建筑"); } /// /// 军团战结算 /// public async void LegionBattleOver(BattlefieldActorCamp winCamp, RepeatedField a, RepeatedField b) { if (!IsLegionBattle) return; await UniTask.WaitUntil(() => { return IsLegionBattleOK; }); // 等待军团战加载完成,防止正好有人在加载阶段 CurBattle.EndLegionBattle(new LegionSettleData(winCamp, a, b)); } #endregion #region 获取数据 /// /// 尝试获取友方军团数据 /// /// /// public bool TryGetMyLegionData(out LegionData legionData) { return CurBattle.TryGetLegionData(CurBattle.MyCamp, out legionData); } /// /// 尝试获取敌方军团数据 /// /// /// public bool TryGetEnemyLegionData(out LegionData legionData) { if (BattlefieldActorCamp.CampA == CurBattle.MyCamp) return CurBattle.TryGetLegionData(BattlefieldActorCamp.CampB, out legionData); else return CurBattle.TryGetLegionData(BattlefieldActorCamp.CampA, out legionData); } /// /// 尝试获取军团数据 /// public bool TryGetLegionData(BattlefieldActorCamp camp, out LegionData legionData) { return CurBattle.TryGetLegionData(camp, out legionData); } /// /// 尝试获取玩家数据 /// /// /// /// public bool TryGetActorData(uint actorId, out LegionActorData actorData) { return CurBattle.TryGetActorData(actorId, out actorData); } /// /// 尝试获取玩家自己的数据 /// /// /// public bool TryGetMyActorData(out LegionActorData actorData) { return CurBattle.TryGetActorData(Actor.Instance.Base.GetProp(ActorProp.ActorId), out actorData); } /// /// 获取友方军团玩家列表 /// public void GetMyLegionActorList(ref List listActorData) { CurBattle.GetActorDataListByCamp(CurBattle.MyCamp, ref listActorData); } /// /// 尝试通过索引获取建筑数据 /// /// /// /// public bool TryGetBuildingDataByIndex(int index, out LegionBuildingData buildingData) { return CurBattle.TryGetBuildingDataByIndex(index, out buildingData); } /// /// 判断位置是否安全区 /// /// public bool IsSafeZone(int index) { return CurBattle.IsSafeZone(index); } #endregion /// /// 获取阵营通过玩家id /// /// public BattlefieldActorCamp GetCampByActorId(uint actorId) { if (!TryGetActorData(actorId, out LegionActorData actorData)) return BattlefieldActorCamp.BacNone; return actorData.Camp; } #region 回调 /// /// 服务器回调进入军团战 /// private void OnServerEnterLegionBattle() { WaitingForServer.Instance.EventDone(WaitingForServer.EventName.FightEnter); EnterLegionBattle(); } /// /// 服务器回调进入军团战完成 /// private void OnServerEnterLegionBattleOK() { IsLegionBattleOK = true; } /// /// 服务器退出军团战 /// private void OnServerExitLegionBattle() { WaitingForServer.Instance.EventDone(WaitingForServer.EventName.FightEnter); ExitLegionBattle(); } #endregion /// /// 军团战测试Log /// public static void Debug(string content) { DebugUtil.Log($"(军团战){content}"); } } }