using TGS; using System; using PhxhSDK; using Gameplay; using Framework; using UnityEngine; using System.Linq; using Gameplay.Net; using cfg.CharacterCfg; using Cysharp.Threading.Tasks; using System.Collections.Generic; /// /// 编队系统管理器 /// 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; } } 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; } //在管理器内部创建一个成员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 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) { string name = info.Name; if (info.Name == "") { name = CommonUtils.GetLocalizeText("team_edit_default" + (i + 1)); } CreateTeam(i, 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)), 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 Team GetTestTeam() { var characterIDs = new uint[] { 100001, 100002, 100003, 100004, 100005, 100011, 100025, }; var vehicleIDs = new uint[] { 300001, 300007, 300008 }; var team = new Team(0, "测试编队", 0, characterIDs, new uint[] { 911, 0, 0 }, vehicleIDs); return team; } } /// /// 队列类 /// public class Team { private string _name; private int _icon; private uint[] _characterIDs; private uint[] _playerSkillIDs; private uint[] _vehicleIDs; private uint _vehicleID; private int _teamIdx; private int _allLeadership; private ProvideJob[] _provideJob; 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; } /// /// Test /// 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(); _vehicleIDs = vehicleID; } public string Name { get => _name; } public int IconNumber { get => _icon; } public int TeamIndex { get => _teamIdx; } //获取队列成员 public uint[] GetCharacterIDs() { return _characterIDs; } /// /// 获取指挥官技能id /// public uint[] GetPlayerSkillIDs() { return _playerSkillIDs; } public uint GetVehicleID() { return _vehicleID; } public uint[] GetVehicleIDs() { return _vehicleIDs; } //上阵角色 public void DoCharacterUp(int idx, uint id = 0) { if (idx > MAX_CHARACTER_COUNT) { return; } _characterIDs[idx] = id; RefreshSpendLeadership(id); } //下阵角色 public void DoCharacterDown(int idx) { if (idx > MAX_CHARACTER_COUNT) { return; } var oldCharacter = _characterIDs[idx]; _characterIDs[idx] = NONE_ID; RefreshSpendLeadership(oldCharacter, false); } public void DoCharacterDown(uint id) { if (!_characterIDs.Contains(id)) { return; } var idx = Array.IndexOf(_characterIDs, id); if (idx > -1) { var oldCharacter = _characterIDs[idx]; _characterIDs[idx] = NONE_ID; RefreshSpendLeadership(oldCharacter, false); } } /// /// 更新该队伍花费的领导力 /// /// 角色ID /// 是否为上阵 private void RefreshSpendLeadership(uint id, bool characterUp = true) { var leadership = CharacterDataInfoManager.Instance.GetCharacterInfo(id).Cfg.SpendLeadership; if (leadership <= 0) { DebugUtil.LogWarning("角色领导力配置错误为:{0}", leadership); } //DebugUtil.LogError("原来领导力:{0},需要改变的领导力:{1}", _allLeadership, leadership); if (characterUp) _allLeadership += leadership; else _allLeadership -= leadership; //DebugUtil.LogError("上阵后总领导力:{0}", _allLeadership); } /// /// 更换技能 /// 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 bool IsCharacterInTeam(uint id) { return _characterIDs.Contains(id); } /// /// 判断是否包含某个技能 /// /// /// public bool IsSkillInTeam(uint id, ref int index) { for (int i = 0; i < _playerSkillIDs.Length; ++i) { if (id == _playerSkillIDs[i]) { index = i; return true; } } return false; } /// /// 获取队伍角色数量 /// /// 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 int GetVehicleIdx(uint id) { if (_vehicleIDs != null && _vehicleIDs.Length > 0) { return Array.IndexOf(_vehicleIDs, id); } return _characterIDs.Length; } } public class TeamEditStoreData { public int teamSelectID = 0; } /// /// 编队系统管理器 /// public class TeamEditManagerNew : Singlenton, IInitable { #region 常量 public const int MaxTeamCount = 10; private const int DefaultIconID = 1; private const int DefaultConductorID = 0; private const string DefaultTeamIndex = "DefaultTeamIndex"; #endregion #region 私有成员变量 /// /// 队伍列表 /// private List _teamList; /// /// 选择队伍 /// private TeamNew _selectTeam; /// /// 选择队伍索引 /// private int _selectTeamIdx; /// /// 当前节点 /// private TeamPreviewNode _teamPreviewNode; /// /// 展示节点列表 /// private readonly List previewNodeOpenList = new(); #endregion #region 成员变量 public List TeamList => _teamList; public TeamPreviewNode TeamPreviewNode => _teamPreviewNode; public int SelectTeamIdx { get { var teamStoreData = StorageMgr.Instance.GetStorage(DefaultTeamIndex); if (_selectTeamIdx > 0) return _selectTeamIdx; if (teamStoreData != null) { _selectTeamIdx = teamStoreData.teamSelectID; } return _selectTeamIdx; } } #endregion #region 初始化与释放 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); } #endregion #region 对外方法 /// /// 刷新队伍列表 /// public void RefreshTeams() { RefreshOwnTeams(); } /// /// 创建队伍 /// public void CreateTeam(TeamNew team) { CreateTeam(team.TeamIndex, team.Name, team.IconNumber, team.Conductor, team.GetUnitIDs(), team.GetPlayerSkillIDs()); } /// /// 获取当前选择队伍 /// public TeamNew GetSelectTeam() { if (_teamList.Count == 0) { DebugUtil.LogError("当前没有任何编队"); return null; } _selectTeam = GetTeamByIndex(_selectTeamIdx); return _selectTeam; } /// /// 根据索引获取队伍 /// public TeamNew GetTeamByIndex(int idx) { if (_teamList.Count == 0) { DebugUtil.LogError("当前没有任何编队"); return null; } return _teamList.FirstOrDefault(team => team.TeamIndex == idx); } /// /// 设置当前选择的队伍 /// public void SetSelectTeam(int idx) { if (_teamList.Count <= 0) { DebugUtil.LogError("----- 当前编队列表为空,请检查!!!-----"); } _selectTeamIdx = idx; foreach (var team in _teamList.Where(team => team.TeamIndex == idx)) { _selectTeam = team; } var teamStoreData = StorageMgr.Instance.GetStorage(DefaultTeamIndex); if (teamStoreData != null) { teamStoreData.teamSelectID = _selectTeamIdx; } StorageMgr.Instance.SyncForce = true; } /// /// 保存队伍 /// public void SaveTeam(TeamNew team) { if (team == null) { return; } NetHelper.CreateTeamNew((uint)team.TeamIndex, team.Name, (uint)team.IconNumber, team.Conductor, team.GetUnitIDs(), team.GetPlayerSkillIDs()); } #endregion #region 内部函数 /// /// 刷新队伍列表 /// private void RefreshOwnTeams() { _teamList.Clear(); var partTeam = Actor.Instance.Team; var teamInfos = partTeam.Get(); if (teamInfos != null) { for (var i = 0; i < teamInfos.Length; i++) { var info = teamInfos[i]; var defaultName = CommonUtils.GetLocalizeText("team_edit_default" + (i + 1)); // 获取队伍不为空 if (info != null) { var name = info.Name; if (string.IsNullOrEmpty(name)) { name = defaultName; } CreateTeam(i, name, (int)info.Icon, info.Conductor, info.UnitIDs, info.PlayerSkillIDs); } else { uint[] testSkillIDs = { 0, 0, 0 }; CreateTeam(i, defaultName, DefaultIconID, DefaultConductorID, null, testSkillIDs); } } } var storeData = StorageMgr.Instance.GetStorage(DefaultTeamIndex); var storeIdx = 0; if (storeData != null) { storeIdx = storeData.teamSelectID; } _selectTeamIdx = storeIdx; } /// /// 内部创建Team /// private void CreateTeam(int idx, string name, int icon, uint conductor, List unitIDs, uint[] playerSkillIDs) { var characterDataDic = CharacterDataInfoManager.Instance.DataDic; var vehicleDataDic = VehicleCultivateDataManager.Instance.DataDic; if (unitIDs != null) { // 检索不合法成员 var illegalIDs = unitIDs.Where(unit => unit != 0 && !vehicleDataDic.ContainsKey(unit) && !characterDataDic.ContainsKey(unit)).ToList(); foreach (var illegalID in illegalIDs) { if (unitIDs.Contains(illegalID)) { unitIDs.Remove(illegalID); } } } _teamList.Add(new TeamNew(idx, name, icon, conductor, unitIDs, playerSkillIDs)); } #endregion #region 模型展示相关 /// /// 加载队伍成员展示节点 /// public async UniTask LoadTeamPreviewNode(int teamIdx, string openPanel = "") { if (string.IsNullOrEmpty(openPanel)) { DebugUtil.LogError("----- 请传入打开TeamPreviewNode的界面名!!!-----"); } var isRefresh = _teamPreviewNode && previewNodeOpenList.Count > 0; if (!previewNodeOpenList.Contains(openPanel)) { previewNodeOpenList.Add(openPanel); } if (isRefresh) { RefreshPreviewNode(teamIdx); return; } await LoadNewTeamPreviewNode(teamIdx); } /// /// 释放展示节点 /// public void ReleaseTeamPreviewNode(string releasePanel) { if (string.IsNullOrEmpty(releasePanel)) { return; } previewNodeOpenList.Remove(releasePanel); if (_teamPreviewNode && previewNodeOpenList.Count <= 0) { DoReleaseTeamPreviewNode(); } } /// /// 强制释放 /// public void CompulsoryReleasePreviewNode() { previewNodeOpenList.Clear(); DoReleaseTeamPreviewNode(); } /// /// 通过队伍索引加载队伍展示节点 /// private async UniTask LoadNewTeamPreviewNode(int teamIdx) { DoReleaseTeamPreviewNode(); var team = _teamList[teamIdx]; var charIDs = team.GetCharacterIDs().ToArray(); var vehicleIDs = team.GetVehicleIDs().ToArray(); var node = await TeamPreviewNode.LoadNode(); _teamPreviewNode = node; node.SetDataNew(teamIdx, charIDs, vehicleIDs); node.CreateRt(); await node.Init(); } /// /// 通过队伍索引刷新队伍展示节点 /// private async void RefreshPreviewNode(int teamIdx) { if (!_teamPreviewNode) return; var team = _teamList[teamIdx]; if (team == null) return; var charIDs = team.GetCharacterIDs().ToArray(); var vehicleIDs = team.GetVehicleIDs().ToArray(); _teamPreviewNode.SetDataNew(teamIdx, charIDs, vehicleIDs); await _teamPreviewNode.Init(); } /// /// 释放展示节点 /// private void DoReleaseTeamPreviewNode() { if (_teamPreviewNode) { TeamPreviewNode.ReleaseNode(_teamPreviewNode); _teamPreviewNode = null; } } #endregion #region 事件监听 private void OnTeamUpdate() { RefreshOwnTeams(); EventManager.Instance.Send(EventManager.EventName.TeamUpdate); } #endregion #region 测试队伍 public TeamNew GetTestTeam() { var unitIDs = new List() { 100002, 100003, 100004, 100005, 100011, 100025, }; return new TeamNew(0, "测试编队", 0, 100001, unitIDs, new uint[] { 911, 0, 0 }); } #endregion } /// /// 队列类 /// public class TeamNew { private const int ConductorIndex = -1; private const uint NoneID = 0; #region 私有成员变量 /// /// 队伍名称 /// private string _name; /// /// 队伍图标 /// private int _icon; /// /// 指挥官ID /// private uint _conductor; /// /// 队伍所有成员 /// private List _unitIDs; /// /// 队伍中角色成员 /// private List _characterIDs; /// /// 队伍中载具成员 /// private List _vehicleIDs; /// /// 角色技能 /// private uint[] _playerSkillIDs; /// /// 队伍索引 /// private int _teamIdx; /// /// 该队伍所花费领导力 /// private int _allLeadership; /// /// 指挥官所提供的职业列表 /// private List _provideJob; #endregion #region 成员变量 public uint Conductor { get => _conductor; } public string Name { get => _name; } public int IconNumber { get => _icon; } public int TeamIndex { get => _teamIdx; } public int AllLeaderShip { get => _allLeadership; } #endregion #region 构造函数 public TeamNew(int teamIdx, string name, int icon, uint conductor, List unitIDs, uint[] playerSkillIDs) { _teamIdx = teamIdx; _name = name; _icon = icon; _conductor = conductor; // 指挥合法 if (CheckConductorLegal(_conductor) && unitIDs is { Count: > 0 }) { _unitIDs = CheckTeamLegal(unitIDs) ? unitIDs : new List(); _provideJob = CharacterDataInfoManager.Instance.GetCharacterInfo(_conductor).Cfg.ProvideJob.ToList(); } else { _conductor = NoneID; _unitIDs = new List(); _provideJob = new List(); } InitCharacters(); InitVehicleIDs(); // 技能 uint[] tempSkillIDs = { NoneID, NoneID, NoneID }; // 判断一下传入的技能列表是否达到固定长度,未达到后面添加0到满足固定长度 if (playerSkillIDs.Length < CommandSkillManager.COMMAND_SKILL_COUNT) { for (var i = 0; i < tempSkillIDs.Length; i++) { if (i < playerSkillIDs.Length) tempSkillIDs[i] = playerSkillIDs[i]; } _playerSkillIDs = tempSkillIDs; } else _playerSkillIDs = (uint[])playerSkillIDs.Clone(); } #endregion #region 编辑队伍成员 /// /// 上阵角色 /// /// 角色在队伍中的索引 /// 角色ID public void DoCharacterUp(int idx, uint id = 0) { if (idx == ConductorIndex) { ChangeConductor(id); return; } _unitIDs ??= new List(); _characterIDs ??= new List(); // 该索引不存在 if (idx >= _unitIDs.Count) { _unitIDs.Add(id); _characterIDs.Add(id); } else { var oldCharacter = _unitIDs[idx]; var characterIndex = _characterIDs.IndexOf(oldCharacter); if (characterIndex >= 0) _characterIDs[characterIndex] = id; _unitIDs[idx] = id; } RefreshSpendLeadership(id); } /// /// 通过索引下阵角色 (直接点空角色) /// /// 角色在队伍中的索引 public void DoCharacterDown(int idx) { if (idx == ConductorIndex) { ChangeConductor(NoneID); return; } if (_unitIDs == null || _characterIDs == null) return; if (idx >= _unitIDs.Count) { DebugUtil.LogError("队伍{0}下阵角色时索引{1}错误", _teamIdx, idx); return; } var oldCharacter = _unitIDs[idx]; _unitIDs.RemoveAt(idx); _characterIDs.Remove(oldCharacter); RefreshSpendLeadership(oldCharacter, false); } /// /// 通过ID下阵角色 (更换) /// /// 角色ID public void DoCharacterDown(uint id) { if (_unitIDs == null || _characterIDs == null) return; _unitIDs.Remove(id); _characterIDs.Remove(id); RefreshSpendLeadership(id, false); } /// /// 上阵载具 /// /// 载具在队伍中的索引 /// 载具ID public void DoVehicleUp(int idx, uint id = 0) { _unitIDs ??= new List(); _vehicleIDs ??= new List(); // 该索引不存在 if (idx >= _unitIDs.Count) { _unitIDs.Add(id); _vehicleIDs.Add(id); } else { var oldVehicle = _unitIDs[idx]; var vehicleIndex = _characterIDs.IndexOf(oldVehicle); if (vehicleIndex >= 0) _vehicleIDs[vehicleIndex] = id; _unitIDs[idx] = id; } RefreshSpendLeadership(id, true, true); } /// /// 通过索引下阵载具 (直接点空载具) /// /// 载具在队伍中的索引 public void DoVehicleDown(int idx) { if (_unitIDs == null || _characterIDs == null) return; if (idx >= _unitIDs.Count) { DebugUtil.LogError("队伍{0}下阵载具时索引{1}错误", _teamIdx, idx); return; } var oldVehicle = _unitIDs[idx]; _unitIDs.RemoveAt(idx); _vehicleIDs.Remove(oldVehicle); RefreshSpendLeadership(oldVehicle, false, true); } /// /// 通过ID下阵载具 (更换) /// /// 载具ID public void DoVehicleDown(uint id) { if (_unitIDs == null || _characterIDs == null) return; _unitIDs.Remove(id); _vehicleIDs.Remove(id); RefreshSpendLeadership(id, false, true); } /// /// 更新该队伍花费的领导力 /// /// 角色ID /// 是否为上阵 /// 是否为载具 private void RefreshSpendLeadership(uint id, bool isUp = true, bool isVehicle = false) { var leadership = isVehicle ? VehicleCultivateDataManager.Instance.GetVehicleCultivateData(id).Cfg.SpendLeadership : CharacterDataInfoManager.Instance.GetCharacterInfo(id).Cfg.SpendLeadership; if (leadership <= 0) { DebugUtil.LogWarning("角色领导力配置错误为:{0}", leadership); } //DebugUtil.LogError("原来领导力:{0},需要改变的领导力:{1}", _allLeadership, leadership); if (isUp) _allLeadership += leadership; else _allLeadership -= leadership; //DebugUtil.LogError("上阵后总领导力:{0}", _allLeadership); } /// /// 更换指挥 /// private void ChangeConductor(uint id) { if (IsCharacterInTeam(id)) return; // 错误或为空都需要清空队伍 ClearAllCharacter(); _conductor = id; if (id == NoneID) return; var info = CharacterDataInfoManager.Instance.GetCharacterInfo(id); if (info == null) { DebugUtil.LogError("更换指挥官角色错误:{0}, 没有该角色配置", id); return; } var jobs = info.Cfg.ProvideJob; if (jobs.Length == 0) { DebugUtil.LogError("该指挥 {0} 提供职业为空", id); return; } _provideJob = jobs.ToList(); } #endregion #region 技能相关 /// /// 更换技能 /// public void ChangeSkill(int index, uint skillId) { if (_playerSkillIDs == null) { DebugUtil.LogError("空"); return; } if (index >= _playerSkillIDs.Length) { DebugUtil.LogError("越界"); return; } _playerSkillIDs[index] = skillId; } #endregion #region 修改队伍属性相关 /// /// 更改队伍名称 /// public void ChangeName(string newName) { _name = newName; } /// /// 更改图标 /// public void ChangeIcon(int icon) { _icon = icon; } #endregion #region 对外方法 /// /// 获取队伍成员 /// public List GetUnitIDs() { return _unitIDs; } /// /// 获取队伍角色列表 /// public List GetVehicleIDs() { return _vehicleIDs; } /// /// 获取队伍载具列表 /// public List GetCharacterIDs() { return _characterIDs; } /// /// 获取指挥官技能id /// public uint[] GetPlayerSkillIDs() { return _playerSkillIDs; } /// /// 队伍成员是否全为空 /// public bool IsMemberEmpty() { // 只根据指挥判断 return _conductor == NoneID; } /// /// 判断队伍中是否包含某成员 /// public bool IsCharacterInTeam(uint id) { return _unitIDs.Contains(id); } /// /// 判断是否包含某个技能 /// public bool IsSkillInTeam(uint id, ref int index) { for (int i = 0; i < _playerSkillIDs.Length; ++i) { if (id == _playerSkillIDs[i]) { index = i; return true; } } return false; } /// /// 获取队伍角色数量 /// public int GetCharacterCount() { //TODO 需判断是否安全正确 return _characterIDs?.Count ?? 0; } /// /// 通过ID获取角色索引 TODO 需联调确定是否正确 /// public int GetCharacterIdx(uint id) { if (_unitIDs != null) return _unitIDs.IndexOf(id); return -1; } /// /// 通过ID获取载具索引 TODO 需联调确定是否正确 /// public int GetVehicleIdx(uint id) { if (_unitIDs != null) return _unitIDs.IndexOf(id); return -1; } #endregion #region 内部函数 /// /// 检查指挥官是否合法 /// private bool CheckConductorLegal(uint conductorID) { if (conductorID == NoneID) return false; var info = CharacterDataInfoManager.Instance.GetCharacterInfo(conductorID); if (info == null) return false; return info.Cfg.Job == Ejob.Job_Commander; } /// /// 检查队伍成员是否合法 /// private bool CheckTeamLegal(List characters) { if (characters is not { Count: > 0 }) return false; // 获取推荐职业 var jobs = CharacterDataInfoManager.Instance.GetCharacterInfo(_conductor).Cfg.ProvideJob; _provideJob = jobs.ToList(); // 有职业不为指挥所提供 foreach (var character in characters) { var job = CharacterDataInfoManager.Instance.GetCharacterJob(character); if (_provideJob.All(pJob => (int)pJob != (int)job)) return false; } return true; } /// /// 初始化角色列表 /// private void InitCharacters() { _characterIDs = new List(); foreach (var unit in _unitIDs.Where(unit => CharacterDataInfoManager.Instance.DataDic.ContainsKey(unit))) { _characterIDs.Add(unit); } } /// /// 初始化载具列表 /// private void InitVehicleIDs() { _vehicleIDs = new List(); foreach (var unit in _unitIDs.Where(unit => VehicleCultivateDataManager.Instance.DataDic.ContainsKey(unit))) { _vehicleIDs.Add(unit); } } /// /// 获取提供职业中的角色数量 /// private int GetCharacterCountFromProvideJob() { return _provideJob.Count(job => job != ProvideJob.Job_Vehicle); } /// /// 获取提供职业中的载具数量 /// private int GetVehicleCountFromProvideJob() { return _provideJob.Count(job => job == ProvideJob.Job_Vehicle); } /// /// 清空队伍 /// private void ClearAllCharacter() { _unitIDs.Clear(); _characterIDs.Clear(); _vehicleIDs.Clear(); _provideJob.Clear(); } #endregion }