using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay;
using Gameplay.Net;
using PhxhSDK;
using TGS;
using UnityEngine;
using UnityEngine.TextCore.Text;
///
/// 编队系统管理器
///
public class TeamEditManager : Singlenton, IInitable
{
public const int MAX_TEAM_COUNT = 10;
private List _teamList;
private Team _selectTeam;
private int _selectTeamIdx;
private TeamPreviewNode _teamPreviewNode;
public static readonly List PreviewNodeOpenList = new List();
private bool _isOpeningUI;
public List TeamList => _teamList;
public TeamPreviewNode TeamPreviewNode => _teamPreviewNode;
public int SelectTeamIdx
{
get
{
var teamStoreData = StorageMgr.Instance.GetStorage("DefaultTeamIndex");
if (_selectTeamIdx <= 0)
{
if (teamStoreData != null)
{
_selectTeamIdx = teamStoreData.teamSelectID;
}
}
return _selectTeamIdx;
}
}
public int ImageSceneWidth = 1200;
public int ImageSceneHeight = 600;
void IInitable.Init()
{
_teamList = new List();
EventManager.Instance.Register(EventManager.EventName.TeamEditCreateSucc, OnTeamUpdate);
}
void IInitable.Release()
{
_teamList.Clear();
EventManager.Instance.Unregister(EventManager.EventName.TeamEditCreateSucc, OnTeamUpdate);
}
public void RefreshTeams()
{
RefreshOwnTeams();
}
public Team GetSelectTeam()
{
if (_teamList.Count == 0)
{
DebugUtil.LogError("当前没有任何编队");
return null;
}
_selectTeam = _teamList[_selectTeamIdx];
return _selectTeam;
}
//设置编队界面场景RawImage长宽
public void SetRawImageRect(int width, int height)
{
ImageSceneWidth = width;
ImageSceneHeight = height;
}
//资源预加载
public async void LoadTeamEditAssets()
{
var headEmptyImgStr =
"Assets/Art/UI/Texture/UI_Pic_Main/UI_Pic_CultivateAll/UI_Pic_Cultivate/UI_Cultivate_RankPlus.png";
await AssetManager.Instance.PostPreload(headEmptyImgStr);
}
//在管理器内部创建一个成员Team
public void CreateTeam(int idx, string name, int icon, uint[] characterIDs, uint[] playerSkillIDs, uint vehicleID)
{
//test
for (int i = 0; i < characterIDs.Length; i++)
{
var dataDic = CharacterDataInfoManager.Instance.DataDic;
bool isValid = characterIDs[i] == 0 || dataDic.ContainsKey(characterIDs[i]);
if (!isValid)
{
characterIDs[i] = 0;
}
}
_teamList.Add(new Team(idx, name, icon, characterIDs, playerSkillIDs, vehicleID));
}
public void CreateTeam(Team team)
{
CreateTeam(team.TeamIndex, team.Name, team.IconNumber, team.GetCharacterIDs(), team.GetPlayerSkillIDs(), team.GetVehicleID());
}
public Team GetTeamByIndex(uint idx)
{
for (int i = 0; i < _teamList.Count; i++)
{
if (_teamList[i].TeamIndex == idx)
{
return _teamList[i];
}
}
return null;
}
//设置选中上阵的Team
public void SetSelectTeam(uint idx)
{
if (_teamList.Count <= 0)
{
DebugUtil.LogError("----- 当前编队列表为空,请检查!!!-----");
}
_selectTeamIdx = (int)idx;
for (int i = 0; i < _teamList.Count; i++)
{
if (_teamList[i].TeamIndex == idx)
{
_selectTeam = _teamList[i];
}
}
var teamStoreData = StorageMgr.Instance.GetStorage("DefaultTeamIndex");
if (teamStoreData != null)
{
teamStoreData.teamSelectID = _selectTeamIdx;
}
StorageMgr.Instance.SyncForce = true;
}
public void SaveTeam(Team team)
{
if (team == null)
{
return;
}
uint[] charIds = team.GetCharacterIDs();
uint[] playerSkillIds = team.GetPlayerSkillIDs();
NetHelper.CreateTeam((uint)team.TeamIndex, team.Name, (uint)team.IconNumber, charIds, playerSkillIds, team.GetVehicleID());
}
public async UniTask LoadTeamPreviewNode(int teamIdx, string openPanel = "")
{
if (string.IsNullOrEmpty(openPanel))
{
DebugUtil.LogError("----- 请传入打开TeamPreviewNode的界面名!!!-----");
}
bool isRefresh = _teamPreviewNode && PreviewNodeOpenList.Count > 0;
if (!PreviewNodeOpenList.Contains(openPanel))
{
PreviewNodeOpenList.Add(openPanel);
}
if (isRefresh)
{
RefreshPreviewNode(teamIdx);
return;
}
await LoadNewTeamPreviewNode(teamIdx);
}
public async UniTask LoadNewTeamPreviewNode(int teamIdx)
{
DoReleaseTeamPreviewNode();
var team = _teamList[teamIdx];
var charIDs = team.GetCharacterIDs();
var vehicleID = team.GetVehicleID();
var node = await TeamPreviewNode.LoadNode();
_teamPreviewNode = node;
node.SetData(teamIdx, charIDs, vehicleID);
node.CreateRt();
await node.Init();
}
public async void RefreshPreviewNode(int teamIdx)
{
if (_teamPreviewNode)
{
var team = _teamList[teamIdx];
if (team != null)
{
var charIDs = team.GetCharacterIDs();
var vehicleID = team.GetVehicleID();
_teamPreviewNode.SetData(teamIdx, charIDs, vehicleID);
await _teamPreviewNode.Init();
//_teamPreviewNode.RefreshNode(teamIdx);
}
}
}
public void ReleaseTeamPreviewNode(string releasePanel = "")
{
if (string.IsNullOrEmpty(releasePanel))
{
//DebugUtil.LogError("----- 请传入释放TeamPreviewNode的界面名!!!-----");
return;
}
PreviewNodeOpenList.Remove(releasePanel);
if (_teamPreviewNode && PreviewNodeOpenList.Count <= 0)
{
DoReleaseTeamPreviewNode();
}
}
public void CompulsoryReleasePreviewNode()
{
PreviewNodeOpenList.Clear();
DoReleaseTeamPreviewNode();
}
public async UniTask PreLoadAssets()
{
// for (int i = 0; i < _teamList.Count; i++)
// {
// var team = _teamList[i];
// if (team.IsCharEmpty())
// {
// continue;
// }
//
// var charIDs = team.GetCharacterIDs();
// for (int j = 0; j < charIDs.Length; j++)
// {
// var id = charIDs[j];
// if (id != Team.NONE_ID)
// {
// var headIconPath = CommonUtils.GetDefaultHeadPathByUid(id);
// AssetManager.Instance.PostPreload(headIconPath);
// }
// }
// }
var charList = CharacterDataInfoManager.Instance.DataList;
for (int i = 0; i < charList.Count; i++)
{
var path = CommonUtils.GetDefaultHeadPathByUid(charList[i].Uid);
await AssetManager.Instance.PostPreload(path);
}
await AssetManager.Instance.WaitAllPreloads();
}
//外部打开编队信息界面
public async UniTask OpenTeamInfoUI(int idx)
{
if (_isOpeningUI)
{
return;
}
_isOpeningUI = true;
Team team = TeamEditManager.Instance.TeamList[idx];
await TeamEditManager.Instance.LoadTeamPreviewNode(idx, UINameConst.UITeamInfo);
await UIManager.Instance.CreateAndOpenWindow(UINameConst.UITeamInfo, team);
_isOpeningUI = false;
}
private void DoReleaseTeamPreviewNode()
{
if (_teamPreviewNode)
{
TeamPreviewNode.ReleaseNode(_teamPreviewNode);
_teamPreviewNode = null;
}
}
private void RefreshOwnTeams()
{
_teamList.Clear();
var partTeam = Actor.Instance.Team;
var teamInfos = partTeam.Get();
if (teamInfos != null)
{
for (int i = 0; i < teamInfos.Length; i++)
{
var info = teamInfos[i];
if (info != null)
{
CreateTeam(i, info.Name, (int)info.Icon, info.CharacterIDs, info.PlayerSkillIDs, info.VehicleID);
}
else
{
//test
uint[] testIDs = {0, 0, 0, 0, 0, 0};
uint[] testSkillIDs = { 0, 0, 0 };
CreateTeam(i, CommonUtils.GetLocalizeText("team_edit_default" + i), 1, testIDs, testSkillIDs, 0);
}
}
}
var storeData = StorageMgr.Instance.GetStorage("DefaultTeamIndex");
int storeIdx = 0;
if (storeData != null)
{
storeIdx = storeData.teamSelectID;
}
_selectTeamIdx = storeIdx;
}
private void OnTeamUpdate()
{
RefreshOwnTeams();
EventManager.Instance.Send(EventManager.EventName.TeamUpdate);
}
}
///
/// 队列类
///
public class Team
{
private string _name;
private int _icon;
private uint[] _characterIDs;
private uint[] _playerSkillIDs;
private uint _vehicleID;
private int _teamIdx;
public const int MAX_CHARACTER_COUNT = 7;
public const int MAX_VEHICLE_COUNT = 1;
public const uint NONE_ID = 0;
public Team(int teamIdx, string name, int icon, uint[] characterIDs, uint[] playerSkillIDs, uint vehicleID)
{
_teamIdx = teamIdx;
_name = name;
_icon = icon;
uint[] tempIDs =
{
NONE_ID, NONE_ID, NONE_ID, NONE_ID, NONE_ID, NONE_ID, NONE_ID
};
//判断一下传入的队员列表是否达到固定长度,未达到后面添加0到满足固定长度
if (characterIDs.Length < MAX_CHARACTER_COUNT)
{
for (int i = 0; i < tempIDs.Length; i++)
{
if (i < characterIDs.Length)
{
tempIDs[i] = characterIDs[i];
}
}
_characterIDs = tempIDs;
}
else
{
_characterIDs = (uint[]) characterIDs.Clone();
}
uint[] tempSkillIDs = { NONE_ID, NONE_ID, NONE_ID };
// 判断一下传入的技能列表是否达到固定长度,未达到后面添加0到满足固定长度
if (playerSkillIDs.Length < CommandSkillManager.COMMAND_SKILL_COUNT)
{
for (int i = 0; i < tempSkillIDs.Length; i++)
{
if (i < playerSkillIDs.Length)
tempSkillIDs[i] = playerSkillIDs[i];
}
_playerSkillIDs = tempSkillIDs;
}
else
_playerSkillIDs = (uint[])playerSkillIDs.Clone();
_vehicleID = vehicleID;
}
public string Name
{
get => _name;
}
public int IconNumber
{
get => _icon;
}
public int TeamIndex
{
get => _teamIdx;
}
/*************** 静态方法 ***************/
public static bool IsTeamIdxCharacterEmpty(Team team, int idx)
{
if (!ValueValidator.IsIdValid(team._characterIDs[idx]))
{
return true;
}
return false;
}
/*************** End ***************/
//获取队列成员
public uint[] GetCharacterIDs()
{
return _characterIDs;
}
///
/// 获取指挥官技能id
///
///
public uint[] GetPlayerSkillIDs()
{
return _playerSkillIDs;
}
public uint GetVehicleID()
{
return _vehicleID;
}
public uint[] GetVehicleIDs()
{
if (_vehicleID == 0)
{
return Array.Empty();
}
return new[]
{
_vehicleID
};
}
//上阵角色
public void DoCharacterUp(int idx, uint id = 0)
{
if (idx > MAX_CHARACTER_COUNT)
{
return;
}
_characterIDs[idx] = id;
}
//下阵角色
public void DoCharacterDown(int idx)
{
if (idx > MAX_CHARACTER_COUNT)
{
return;
}
_characterIDs[idx] = NONE_ID;
}
public void DoCharacterDown(uint id)
{
if (!_characterIDs.Contains(id))
{
return;
}
var idx = Array.IndexOf(_characterIDs, id);
if (idx > -1)
{
_characterIDs[idx] = NONE_ID;
}
}
///
/// 更换技能
///
///
///
public void ChangeSkill(int index, uint skillId)
{
if (_playerSkillIDs == null)
{
DebugUtil.LogError("空");
return;
}
if (index >= _playerSkillIDs.Length)
{
DebugUtil.LogError("越界");
return;
}
_playerSkillIDs[index] = skillId;
}
public void DoVehicleDown()
{
_vehicleID = 0;
}
public void DoVehicleUp(uint id)
{
_vehicleID = id;
}
//判断某个队列位置是否有角色
public bool IsIndexCharacterEmpty(int idx)
{
if (!ValueValidator.IsIdValid(_characterIDs[idx]))
{
return true;
}
return false;
}
public bool IsVehicleEmpty()
{
if (_vehicleID != NONE_ID)
{
return false;
}
return true;
}
public bool IsCharEmpty()
{
for (int i = 0; i < _characterIDs.Length; i++)
{
if (_characterIDs[i] != NONE_ID)
{
return false;
}
}
return true;
}
public bool IsMemberEmpty()
{
return IsVehicleEmpty() && IsCharEmpty();
}
//修改属性
public void ChangeName(string newName)
{
_name = newName;
}
public void ChangeIcon(int icon)
{
_icon = icon;
}
public void ChangeCharacterID(int idx, uint newID)
{
if (idx > MAX_CHARACTER_COUNT)
{
return;
}
_characterIDs[idx] = newID;
}
public void ChangeVehicleID(uint newID)
{
_vehicleID = newID;
}
//清理掉所有队伍成员
public void ClearAllMembers()
{
uint[] tempIDs =
{
NONE_ID, NONE_ID, NONE_ID, NONE_ID, NONE_ID, NONE_ID
};
_characterIDs = tempIDs;
_vehicleID = NONE_ID;
}
///
/// 判断是否包含某个角色
///
///
///
public bool IsCharacterInTeam(uint id)
{
return _characterIDs.Contains(id);
}
///
/// 判断是否包含某个技能
///
///
///
public bool IsSkillInTeam(uint id)
{
return _playerSkillIDs.Contains(id);
}
public bool IsVehicleInTeam(uint id)
{
return _vehicleID == id;
}
///
/// 获取队伍角色数量
///
///
public int GetCharacterCount()
{
int count = 0;
foreach (uint id in _characterIDs)
{
if (NONE_ID == id)
continue;
++count;
}
return count;
}
//获取角色索引
public int GetCharacterIdx(uint id)
{
return Array.IndexOf(_characterIDs, id) + 1;
}
}
public class TeamEditStoreData
{
public int teamSelectID = 0;
}