NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/LegionBattle/LegionBattleManager.cs

226 lines
6.4 KiB
C#

using Cysharp.Threading.Tasks;
using Framework;
using Gameplay.SubSystems;
using NLDPB;
using PhxhSDK;
using System;
using UnityEngine;
namespace Gameplay.LegionBattle
{
public sealed partial class LegionBattleManager : Singlenton<LegionBattleManager>, IInitable, IUpdatable
{
/// <summary>
/// 按钮CD(秒)
/// </summary>
private const float BUTTON_CD = 3f;
/// <summary>
/// 服务器操作消息冷却(秒)
/// </summary>
private const float Net_CD = 1f;
/// <summary>
/// 服务器消息冷却完成的时间
/// </summary>
private DateTime netCDEndTime;
/// <summary>
/// 当前军团战阶段
/// </summary>
public LegionBattleStatus CurBattleStatus { get; private set; }
/// <summary>
/// 当前军团战报名状态
/// </summary>
private LegionBattleSignStatus _curBattleLegionBattleSignStatus;
/// <summary>
/// 军团长指挥按钮CD结束时间
/// </summary>
public DateTime ButtonCDEndTime { get; private set; }
/// <summary>
/// 是否可以发送消息
/// </summary>
public bool IsSendNet
{
get { return CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server) >= netCDEndTime; }
}
/// <summary>
/// 军团战
/// </summary>
public LegionBattle CurBattle { get; private set; }
/*
private LegionBattleView v;
public LegionBattleView View {
get {
if(v == null) {
var go = new GameObject();
go.name = "LegionBattleView";
GameObject.DontDestroyOnLoad(go);
v = go.AddComponent<LegionBattleView>();
v.Init();
}
return v;
}
}*/
public LegionBattleSignStatus CurBattleLegionBattleSignStatus
{
get
{
return _curBattleLegionBattleSignStatus;
}
set
{
_curBattleLegionBattleSignStatus = value;
}
}
public void Init()
{
InitAction();
EventManager.Instance.Register<LegionBattleStatus>(EventManager.EventName.LegionBattleStatus, OnBattleLegionStatus);
}
public void Update(float deltaTime)
{
if (IsLegionBattle)
CurBattle?.Update(deltaTime);
}
public void Release()
{
EventManager.Instance.Unregister<LegionBattleStatus>(EventManager.EventName.LegionBattleStatus, OnBattleLegionStatus);
ReleaseAction();
}
#region API
/// <summary>
/// 加载军团战
/// </summary>
/// <param name="legionBattleMapId"></param>
/// <returns></returns>
public async UniTask<E_LoadingResult> LoadLegionBattle()
{
await CurBattle.Load();
return E_LoadingResult.Success;
}
/// <summary>
/// 加载军团战查看地图
/// </summary>
/// <returns></returns>
public async UniTask<E_LoadingResult> LoadLegionBattleInspect()
{
CurBattle = new(MapID);
await CurBattle.LoadInspect();
return E_LoadingResult.Success;
}
/// <summary>
/// 卸载军团战
/// </summary>
public async void UnloadLegionBattle()
{
if (null != CurBattle)
{
await CurBattle.Unload();
CurBattle.Release();
CurBattle = null;
}
}
public static string GetStartTimeStr(int scheduleID)
{
var startTime = CommonUtils.GetScheduleStartDateTime(scheduleID);
var timeStr = startTime.ToString("HH:mm");
return CommonUtils.GetLocalizeText("legionbattle_start_time",
startTime.Year, startTime.Month, startTime.Day, timeStr);
}
public static string GetEndTimeStr(int scheduleID)
{
var endTime = CommonUtils.GetScheduleStartDateTime(scheduleID);
var timeStr = endTime.ToString("HH:mm");
return CommonUtils.GetLocalizeText("legionbattle_start_time",
endTime.Year, endTime.Month, endTime.Day, timeStr);
}
/// <summary>
/// 是否以进行编队
/// </summary>
/// <returns></returns>
public bool CheckIsEditTeam()
{
var teams = TeamEditManager.Instance.TeamLegionList;
foreach (var team in teams)
{
if (!team.IsMemberEmpty())
{
return true;
}
}
return false;
}
/// <summary>
/// 获取阵营对应名称
/// </summary>
/// <param name="camp"></param>
/// <returns></returns>
public static string GetTeamName(BattlefieldActorCamp camp)
{
switch (camp)
{
case BattlefieldActorCamp.CampA:
return CommonUtils.GetLocalizeText("legionbattle_team_blue");
case BattlefieldActorCamp.CampB:
return CommonUtils.GetLocalizeText("legionbattle_team_red");
default:
return CommonUtils.GetLocalizeText("legionbattle_team_none");
}
}
/// <summary>
/// 设置指挥冷却时间
/// </summary>
public void SetCommandCD()
{
ButtonCDEndTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server).AddSeconds(BUTTON_CD);
EventManager.Instance.Send(EventManager.EventName.UpdateLegionBattleButtonCD);
}
/// <summary>
/// 设置军团战所有消息冷却时间
/// </summary>
public void SetNetCD()
{
netCDEndTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server).AddSeconds(Net_CD);
}
#endregion
/// <summary>
/// 军团战状态变化
/// </summary>
/// <param name="legionBattleStatus"></param>
private void OnBattleLegionStatus(LegionBattleStatus legionBattleStatus)
{
CurBattleStatus = legionBattleStatus;
if (IsLegionBattleOK && LegionBattleStatus.Combat != CurBattleStatus)
{
Debug("军团战结束"); // TODO 进入结算
}
}
}
}