using NLDPB; using System; using PhxhSDK; using Gameplay; using Framework; using System.Linq; using Gameplay.Net; using cfg.CharacterCfg; using Cysharp.Threading.Tasks; using System.Collections.Generic; using Constants = Framework.Constants; public class TeamEditStoreData { public int TeamSelectID = 0; } public class VehicleSound { private int _vehicleSoundID = -1; /// /// 播放载具引擎 /// public void PlayVehicleSound() { var team = TeamEditManager.Instance.GetSelectTeam(); if (team.IsContainsVehicle() && _vehicleSoundID == -1) { _vehicleSoundID = AudioManager.Instance.PlayAudio(Constants.Sound.TEAM_VEHICLE, loop: true); } else if (!team.IsContainsVehicle() && _vehicleSoundID != -1) { CloseVehicleSound(); } } /// /// 关闭载具引擎 /// public void CloseVehicleSound() { AudioManager.Instance.StopSoundById(_vehicleSoundID); _vehicleSoundID = -1; } } /// /// 编队系统管理器 /// public class TeamEditManager : Singlenton, IInitable { #region 常量 public const int MaxTeamCount = 10; private const int DefaultConductorID = 0; private const string DefaultTeamIndex = "DefaultTeamIndex"; #endregion #region 私有成员变量 /// /// 队伍列表 /// private List _teamList; /// /// 选择队伍 /// private Team _selectTeam; /// /// 选择队伍索引 /// private int _selectTeamIdx; /// /// 当前节点 /// private TeamPreviewNode _teamPreviewNode; /// /// 展示节点列表 /// private readonly List previewNodeOpenList = new(); #endregion #region 成员变量 public int VehicleBgmID = -1; 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 Team GetSelectTeam() { if (_teamList.Count == 0) { DebugUtil.LogError("当前没有任何编队,返回测试编队"); return GetTestTeam(); } _selectTeam = GetTeamByIndex(_selectTeamIdx); return _selectTeam; } /// /// 根据索引获取队伍 /// public Team GetTeamByIndex(int idx) { if (_teamList.Count == 0) { DebugUtil.LogError("当前没有任何编队,返回测试编队"); return GetTestTeam(); } return _teamList.FirstOrDefault(team => team.TeamIndex == idx); } /// /// 设置当前选择的队伍 /// public void SetSelectTeam(int idx) { try { if (_teamList.Count <= 0) { DebugUtil.LogError("----- 当前编队列表为空,请检查!!!-----"); } // DebugUtil.LogError("更换队伍:{0}", idx); _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; EventManager.Instance.Send(EventManager.EventName.SetSelectTeam); } catch (Exception e) { DebugUtil.LogError("TeamEditManager.SetSelectTeam Error, Team Index:{0}, Exception:{1}", idx, e); } } /// /// 检查默认队伍是否合法 /// public bool CheckTeamIsLegal(Team team) { return team.TeamIndex != 0 || !team.IsMemberEmpty(); } /// /// 保存队伍 /// public void SaveTeam(Team team) { try { if (team == null) { return; } /*DebugUtil.LogWarning("保存的第{0}队的队名:{1},Icon:{2}, 指挥官:{3}", team.TeamIndex, team.Name, (uint)team.IconNumber, team.Commander); foreach (var unit in team.GetUnitIDs()) { DebugUtil.LogWarning("及其保存的成员有:{0}", unit); }*/ NetHelper.CreateTeam((uint)team.TeamIndex, team.Name, (uint)team.IconNumber, team.Commander, team.GetUnitIDs(), team.GetPlayerSkillIDs()); } catch (Exception e) { DebugUtil.LogError("TeamEditManager.SaveTeam Error, Exception:{0}", e); } } /// /// 判断两只队伍是否相同 /// public bool SameTeamContent(Team team1, Team team2) { try { if (!team1.Name.Equals(team2.Name)) return false; if (team1.IconNumber != team2.IconNumber) return false; if (team1.Commander != team2.Commander) return false; var units1 = team1.GetUnitIDs(); var units2 = team2.GetUnitIDs(); for (var i = 0; i < units1.Count; i++) { if (units1[i] != units2[i]) return false; } return true; } catch (Exception e) { DebugUtil.LogError("TeamEditManager.SameTeamContent Error, Exception:{0}", e); return false; } } /// /// 通过索引更换Team /// public void ChangeTeamByIndex(int idx, Team team) { if (idx < 0 || idx >= _teamList.Count) return; _teamList[idx] = new Team(idx, team.Name, team.IconNumber, team.Commander, team.GetUnitIDs(), team.GetPlayerSkillIDs()); } /// /// 通过索引清空恢复队伍 /// public void EmptyTeamByIndex(int idx) { if (idx < 0 || idx >= _teamList.Count) return; var defaultName = CommonUtils.GetLocalizeText("team_edit_default" + idx); _teamList[idx] = new Team(idx, defaultName, Team.DefaultMark, 0, new List(), new uint[] { Team.DefaultSkillID }); } /// /// 检查成员是否已经上阵 /// public bool IsUnitInAllTeam(uint id) { if (id == Team.NoneID) { DebugUtil.LogError("检查角色ID错误:{0}", id); return false; } foreach (var team in _teamList) { if (team.IsInTeam(id)) return true; } return false; } #endregion #region 内部函数 /// /// 刷新队伍列表 /// private void RefreshOwnTeams() { try { _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); // 获取队伍不为空 if (info != null) { var name = info.Name; if (string.IsNullOrEmpty(name)) { name = defaultName; } // 技能暂时处理为默认技能 uint[] skillIDs = { Team.DefaultSkillID }; CreateTeam(i, name, (int)info.Icon, info.Conductor, info.UnitIDs, skillIDs); } else { uint[] skillIDs = { Team.DefaultSkillID }; CreateTeam(i, defaultName, Team.DefaultMark, DefaultConductorID, new List(), skillIDs); } } } var storeData = StorageMgr.Instance.GetStorage(DefaultTeamIndex); var storeIdx = 0; if (storeData != null) { storeIdx = storeData.TeamSelectID; } _selectTeamIdx = storeIdx; } catch (Exception e) { DebugUtil.LogError("TeamEditManager.RefreshOwnTeams Error, Exception:{0}", e); } } /// /// 内部创建Team /// private void CreateTeam(int idx, string name, int icon, uint conductor, List unitIDs, uint[] playerSkillIDs) { /*DebugUtil.LogError("队伍:{0},队伍名字:{1},图标:{2},指挥官:{3},成员数量:{4}", idx, name, icon, conductor, unitIDs.Count); foreach (var unit in unitIDs) { DebugUtil.LogError("发过来的队伍成员:{0}", unit); }*/ /*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); } } }*/ if (icon == Team.NoneID) icon = Team.DefaultMark; //DebugUtil.LogError("创建:{0},索引:{1},指挥官:{2}", name, idx, conductor); _teamList.Add(new Team(idx, name, icon, conductor, unitIDs, playerSkillIDs)); } #endregion #region 模型展示相关 /// /// 加载队伍成员展示节点 /// public async UniTask LoadTeamPreviewNode(int teamIdx, string openPanel = "") { try { 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); } catch (Exception e) { DebugUtil.LogError("TeamEditManager.LoadTeamPreviewNode Error, Exception:{0}", e); } } /// /// 释放展示节点 /// public void ReleaseTeamPreviewNode(string releasePanel) { try { if (string.IsNullOrEmpty(releasePanel)) { return; } previewNodeOpenList.Remove(releasePanel); if (_teamPreviewNode && previewNodeOpenList.Count <= 0) { DoReleaseTeamPreviewNode(); } } catch (Exception e) { DebugUtil.LogError("TeamEditManager.ReleaseTeamPreviewNode Error, Exception:{0}", e); } } /// /// 强制释放 /// public void CompulsoryReleasePreviewNode() { try { previewNodeOpenList.Clear(); DoReleaseTeamPreviewNode(); } catch (Exception e) { DebugUtil.LogError("TeamEditManager.CompulsoryReleasePreviewNode Error, Exception:{0}", e); } } /// /// 通过队伍索引加载队伍展示节点 /// private async UniTask LoadNewTeamPreviewNode(int teamIdx) { try { DoReleaseTeamPreviewNode(); var team = _teamList[teamIdx]; var charIDs = team.GetAllCharacters().ToArray(); var vehicleIDs = team.GetVehicleIDs().ToArray(); var node = await TeamPreviewNode.LoadNode(); _teamPreviewNode = node; node.SetData(teamIdx, charIDs, vehicleIDs); node.CreateRt(); await node.Refresh(); } catch (Exception e) { DebugUtil.LogError("TeamEditManager.LoadNewTeamPreviewNode Error, TeamIndex:{1}, Exception:{0}", e, teamIdx); } } /// /// 通过队伍索引刷新队伍展示节点 /// private async void RefreshPreviewNode(int teamIdx) { try { if (!_teamPreviewNode) return; var team = _teamList[teamIdx]; if (team == null) return; var charIDs = team.GetAllCharacters().ToArray(); var vehicleIDs = team.GetVehicleIDs().ToArray(); _teamPreviewNode.SetData(teamIdx, charIDs, vehicleIDs); await _teamPreviewNode.Refresh(); } catch (Exception e) { DebugUtil.LogError("TeamEditManager.RefreshPreviewNode Error, Exception:{0}", e); } } /// /// 释放展示节点 /// private void DoReleaseTeamPreviewNode() { try { if (_teamPreviewNode) { TeamPreviewNode.ReleaseNode(_teamPreviewNode); _teamPreviewNode = null; } } catch (Exception e) { DebugUtil.LogError("TeamEditManager.DoReleaseTeamPreviewNode Error, Exception:{0}", e); } } #endregion #region 事件监听 private void OnTeamUpdate() { RefreshOwnTeams(); EventManager.Instance.Send(EventManager.EventName.TeamUpdate); } #endregion #region 测试队伍 public Team GetTestTeam() { try { var defalutIndex = 0; var defaultName = CommonUtils.GetLocalizeText("team_edit_default" + defalutIndex); var defaultIcon = TableManager.Instance.Tables.GlobalConfig.DefaultTeamIcon; var defaultCommander = (uint)TableManager.Instance.Tables.GlobalConfig.DefaultCommander; var unitIDs = TableManager.Instance.Tables.GlobalConfig.DefaultUnitIDs.Select(id => (uint)id).ToList(); var skills = new uint[] { 911, 0, 0 }; return new Team(defalutIndex, defaultName, defaultIcon, defaultCommander, unitIDs, skills); } catch (Exception e) { DebugUtil.LogError("TeamEditManager.GetTestTeam Error, Exception:{0}", e); return null; } } #endregion } /// /// 队列类 /// public class Team { public const int ConductorIndex = -1; public const uint NoneID = 0; public const int DefaultMark = 510001; public const int DefaultSkillID = 911; #region 私有成员变量 /// /// 队伍名称 /// private string _name; /// /// 队伍图标 /// private int _icon; /// /// 指挥官ID /// private uint _commander; /// /// 队伍所有成员 (不包含指挥官) /// private List _unitIDs; /// /// 队伍中角色成员 /// private List _characterIDs; /// /// 队伍中载具成员 /// private List _vehicleIDs; /// /// 角色技能 /// private uint[] _playerSkillIDs; /// /// 队伍索引 /// private int _teamIdx; /// /// 该队伍所花费领导力 /// private int _allLeadership; /// /// 指挥官所提供的列表 /// private List _provideJob; #endregion #region 成员变量 public List ProvideJobs { get => _provideJob; } public uint Commander { get => _commander; } public string Name { get => _name; } public int IconNumber { get => _icon; set => _icon = value; } public int TeamIndex { get => _teamIdx; } public int AllLeaderShip { get => _allLeadership; } public int ProvideJobCount { get { return _provideJob == null ? 0 : _provideJob.Count(job => job == cfg.CharacterCfg.ProvideJob.ProvideJob_Vehicle); } } #endregion #region 构造函数 public Team(int teamIdx, string name, int icon, uint commander, List unitIDs, uint[] playerSkillIDs) { try { //DebugUtil.LogError("创建队伍:名字:{0},指挥官:{1},队标:{2}", name, commander, icon); _teamIdx = teamIdx; _name = name; _icon = icon; _commander = commander; // 指挥合法 if (CheckConductorLegal(_commander) && unitIDs != null && unitIDs.Count > 0) { _provideJob = CharacterDataInfoManager.Instance.GetCharacterInfo(_commander).Cfg.ProvideJob.ToList(); if (CheckTeamLegal(unitIDs)) { _unitIDs = unitIDs; //DebugUtil.LogError("有成员数量:{0}",unitIDs.Count); } else { _unitIDs = new List(); foreach (var job in ProvideJobs) { _unitIDs.Add(NoneID); } } } else { _commander = NoneID; _unitIDs = new List(); _provideJob = new List(); } PartUnits(); RefreshSpendLeadership(); // 技能 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(); } catch (Exception e) { DebugUtil.LogError("Team 构造函数 Error, Team Index:{0}, name:{1}, icon:{2}, commander:{3}, Exception:{4}", teamIdx, name, icon, commander, e); } } private Team() { } #endregion #region 编辑队伍成员 /// /// 上阵角色 /// /// 角色在队伍中的索引 /// 角色ID public async void AddCharacter(int idx, uint id = 0) { try { if (_unitIDs == null || _characterIDs == null) return; if (idx == ConductorIndex) { AddCommander(id); return; } // 该索引不存在 if (idx >= _unitIDs.Count) return; // 替换队内角色 if (IsUnitInTeam(id)) { var oldIndex = _unitIDs.IndexOf(id); if (oldIndex >= 0) { _unitIDs[oldIndex] = NoneID; _characterIDs[oldIndex] = NoneID; } } _characterIDs[idx] = id; _unitIDs[idx] = id; RefreshSpendLeadership(); } catch (Exception e) { DebugUtil.LogError("Team.DoCharacterUp, CharacterIndex:{0}, CharacterID:{1}, Exception:{2}", idx, id, e); } } /// /// 通过索引下阵角色 (直接点空角色) /// /// 角色在队伍中的索引 public void RemoveCharacter(int idx) { try { if (idx == ConductorIndex) { RemoveCommander(); return; } if (_unitIDs == null || _characterIDs == null) return; if (idx >= _unitIDs.Count) { DebugUtil.LogError("队伍{0}下阵角色时索引{1}错误", _teamIdx, idx); return; } var oldCharacter = _unitIDs[idx]; _unitIDs[idx] = 0; var idxCharacter = _characterIDs.IndexOf(oldCharacter); if (idxCharacter >= 0) _characterIDs[idxCharacter] = 0; RefreshSpendLeadership(); } catch (Exception e) { DebugUtil.LogError("Team.DoCharacterDown with Index, CharacterIndex:{0}, Exception:{1}", idx, e); } } /// /// 通过ID下阵角色 (更换) /// /// 角色ID public void RemoveCharacter(uint id) { try { if (_unitIDs == null || _characterIDs == null) return; if (id >= _unitIDs.Count) return; var idxUnits = _unitIDs.IndexOf(id); _unitIDs[idxUnits] = 0; var idxCharacter = _characterIDs.IndexOf(id); if (idxCharacter >= 0) _characterIDs[idxCharacter] = 0; RefreshSpendLeadership(); } catch (Exception e) { DebugUtil.LogError("Team.DoCharacterDown with ID, CharacterID:{0}, Exception:{1}", id, e); } } /// /// 上阵载具 /// /// 载具在队伍中的索引 载具排在角色后面 /// 载具ID public void AddVehicle(int idx, uint id = 0) { try { if (_unitIDs == null || _vehicleIDs == null) return; if (IsUnitInTeam(id)) { var unitIndex = _unitIDs.IndexOf(id); var vehicleIndex = _vehicleIDs.IndexOf(id); _unitIDs[unitIndex] = NoneID; _vehicleIDs[vehicleIndex] = NoneID; // 添加到新位置 var newVehicleIndex = idx - _characterIDs.Count; if (newVehicleIndex < _vehicleIDs.Count) _vehicleIDs[newVehicleIndex] = id; } else { var oldVehicle = _unitIDs[idx]; var oldVehicleIndex = _vehicleIDs.IndexOf(oldVehicle); if (oldVehicleIndex >= 0) _vehicleIDs[oldVehicleIndex] = id; } _unitIDs[idx] = id; } catch (Exception e) { DebugUtil.LogError("Team.DoVehicleUp, VehicleIndex:{0}, VehicleID:{1}, Exception:{2}", idx, id, e); } } /// /// 通过索引下阵载具 (直接点空载具) /// /// 载具在队伍中的索引 public void RemoveVehicle(int idx) { try { if (_unitIDs == null || _vehicleIDs == null) return; if (idx >= _unitIDs.Count) { DebugUtil.LogError("队伍{0}下阵载具时索引{1}错误", _teamIdx, idx); return; } var oldVehicle = _unitIDs[idx]; var vehicleIndex = _vehicleIDs.IndexOf(oldVehicle); //DebugUtil.LogError("传来的载具的索引{0},找到的载具索引:{1}",idx,vehicleIndex); if (vehicleIndex >= 0) _vehicleIDs[vehicleIndex] = 0; _unitIDs[idx] = NoneID; } catch (Exception e) { DebugUtil.LogError("Team.DoVehicleDown with Index, VehicleIndex:{0}, Exception:{1}", idx, e); } } /// /// 通过ID下阵载具 (更换) /// /// 载具ID public void RemoveVehicle(uint id) { try { if (_unitIDs == null || _vehicleIDs == null) return; if (id >= _unitIDs.Count) return; var idxUnits = _unitIDs.IndexOf(id); _unitIDs[idxUnits] = 0; var idxVehicle = _vehicleIDs.IndexOf(id); if (idxVehicle >= 0) _vehicleIDs[idxVehicle] = 0; } catch (Exception e) { DebugUtil.LogError("Team.DoVehicleDown with ID, VehicleIndex:{0}, Exception:{1}", id, e); } } private async void AddCommander(uint id) { try { _commander = id; var info = CharacterDataInfoManager.Instance.GetCharacterInfo(id); if (info == null) { return; } var jobs = info.Cfg.ProvideJob; if (jobs.Length == 0) { DebugUtil.LogError("该指挥 {0} 提供职业为空", id); return; } _provideJob = jobs.ToList(); // 重置队伍 ResetUnits(); RefreshSpendLeadership(); // 刷新一下节点 await TeamEditManager.Instance.LoadTeamPreviewNode(_teamIdx, UINameConst.UI_TeamAndSkillSelect); /*DebugUtil.LogError("------上指挥官后-----------"); foreach (var job in _unitIDs) { DebugUtil.LogError("有:{0}", job); } DebugUtil.LogError("-----------------");*/ } catch (Exception e) { DebugUtil.LogError("Team.DoCommanderUp, ID:{0}, Exception:{1}", id, e); } } /// /// 下阵指挥官 /// private void RemoveCommander() { try { ClearUnits(); EventManager.Instance.Send(EventManager.EventName.TeamEditAllModelClear); _commander = NoneID; RefreshSpendLeadership(); } catch (Exception e) { DebugUtil.LogError("Team.DoCommanderUp, Exception:{0}", e); } } /// /// 更新该队伍花费的领导力 /// public void RefreshSpendLeadership() { try { if (_commander == NoneID) { _allLeadership = 0; return; } _allLeadership = 0; foreach (var unitID in _unitIDs) { if (unitID == NoneID) continue; if (VehicleCultivateDataManager.Instance.DataDic.ContainsKey(unitID)) { _allLeadership += VehicleCultivateDataManager.Instance.GetSpendLeadership(unitID); } else { _allLeadership += CharacterDataInfoManager.Instance.GetSpendLeadership(unitID); } } EventManager.Instance.Send(EventManager.EventName.TeamLeadershipUpdate); } catch (Exception e) { DebugUtil.LogError("Team.RefreshSpendLeadership, Exception:{0}", e); } } #endregion #region 技能相关 /// /// 更换技能 /// public void ChangeSkill(int index, uint skillId) { if (_playerSkillIDs == null) { DebugUtil.LogError("技能列表为空"); return; } if (index >= _playerSkillIDs.Length) { DebugUtil.LogError("传入索引越界错误,index:{0}", index); return; } _playerSkillIDs[index] = skillId; } #endregion #region 修改队伍属性相关 /// /// 更改队伍名称 /// public void ChangeName(string newName) { _name = newName; } #endregion #region 对外方法 /// /// 获取提供职业 /// /// public List GetProvideJobs() { return _provideJob; } /// /// 获取队伍成员 (不包含指挥官) /// public List GetUnitIDs() { return _unitIDs; } /// /// 获得队伍成员 (包含指挥官) /// public List GetUintIDsIncludeCommander() { try { var allUints = new List { _commander }; allUints.AddRange(_vehicleIDs); allUints.AddRange(_characterIDs); return allUints; } catch (Exception e) { DebugUtil.LogError("Team.GetAllCharacters Error, Exception:{0}", e); return null; } } /// /// 获取队伍载具 /// public List GetVehicleIDs() { return _vehicleIDs; } /// /// 获取队伍角色 (不包含指挥官) /// public List GetAllCharactersButCommander() { return _characterIDs; } /// /// 获得所有角色 (包括指挥官) /// public List GetAllCharacters() { try { var characters = new List(); characters.Add(_commander); foreach (var id in _characterIDs) { characters.Add(id); } return characters; } catch (Exception e) { DebugUtil.LogError("Team.GetAllCharacters Error, Exception:{0}", e); return null; } } /// /// 队伍成员是否全为空 /// public bool IsMemberEmpty() { // 只根据指挥判断 return _commander == NoneID; } /// /// 队伍领导力是否超过等级领导力 /// /// public bool IsOverLeadership() { var level = Actor.Instance.Base.GetProp(ActorProp.Level); var actorCfg = ActorLevelTableHelper.Instance.Get((int)level); var leadership = actorCfg.Leadership; return leadership < _allLeadership; } /// /// 判断队伍中是否包含某成员(不含指挥) /// public bool IsUnitInTeam(uint id) { return _unitIDs.Contains(id); } /// /// 判断队伍中是否包含某成员(含指挥) /// public bool IsInTeam(uint id) { if (id == _commander) { return true; } return _unitIDs.Contains(id); } /// /// 获取指挥官技能id /// public uint[] GetPlayerSkillIDs() { return _playerSkillIDs; } /// /// 判断是否包含某个技能 /// public bool IsSkillInTeam(uint id, ref int index) { for (var i = 0; i < _playerSkillIDs.Length; ++i) { if (id == _playerSkillIDs[i]) { index = i; return true; } } return false; } /// /// 获取所有角色数量 /// public int GetAllCharacterCount() { return GetAllCharacters()?.Count ?? 0; } /// /// 通过ID获取角色在所有单位中的索引 /// public int GetCharacterIdxInAllUnits(uint id) { if (id != NoneID) return GetUintIDsIncludeCommander().IndexOf(id); return -1; } /// /// 通过ID获取载具在所有单位中的索引 /// public int GetVehicleIdxInAllUnits(uint id) { if (id != NoneID) return GetUintIDsIncludeCommander().IndexOf(id); return -1; } /// /// 通过ID获取角色列表的索引(包含指挥官) /// public int GetAllCharacterIdx(uint id) { var characters = GetAllCharacters(); if (characters != null && id != NoneID) return characters.IndexOf(id); return -1; } /// /// 通过ID获取载具列表的索引 /// public int GetVehicleIdxInVehicles(uint id) { if (id != NoneID) return _vehicleIDs.IndexOf(id); return -1; } /// /// 通过units索引获取载具列表的索引 /// public int GetVehicleByUnitsIndex(int idx) { if (idx < 0) return -1; var vehicle = _unitIDs[idx]; return _vehicleIDs.IndexOf(vehicle); } /// /// 根据索引判断该位置是否为空角色 /// public bool IsEmptyCharacter(int idx) { try { if (idx == -1) return _commander == NoneID; if (idx >= 0 && idx < _characterIDs.Count) { return _characterIDs[idx] == NoneID; } return true; } catch (Exception e) { DebugUtil.LogError("Team.IsEmptyCharacter Error, Exception:{0}", e); return false; } } public bool IsContainsVehicle() { foreach (var vehicle in _vehicleIDs) { if (vehicle != NoneID) return true; } return false; } public Team Clone() { try { return new Team( _teamIdx, _name, _icon, _commander, new List(_unitIDs.Select(id => id)), (uint[])_playerSkillIDs.Clone() ) { // 深拷贝其他字段 _characterIDs = new List(_characterIDs.Select(id => id)), _vehicleIDs = new List(_vehicleIDs.Select(id => id)), _allLeadership = _allLeadership, _provideJob = new List(_provideJob.Select(job => job)) }; } catch (Exception e) { DebugUtil.LogError("Team.Clone Error, Exception:{0}", e); return null; } } /// /// 清除队伍(但不保存) /// public void ClearTeam() { try { _commander = NoneID; for (int i = 0; i < _unitIDs.Count; ++i) { _unitIDs[i] = NoneID; } for (int i = 0; i < _characterIDs.Count; ++i) { _characterIDs[i] = NoneID; } for (int i = 0; i < _vehicleIDs.Count; ++i) { _vehicleIDs[i] = NoneID; } EventManager.Instance.Send(EventManager.EventName.TeamClear); } catch (Exception e) { DebugUtil.LogError("Team.ClearTeam Error, Exception:{0}", e); } } #endregion #region 内部函数 /// /// 检查指挥官是否合法 /// private bool CheckConductorLegal(uint conductorID) { try { if (conductorID == NoneID) return false; var info = CharacterDataInfoManager.Instance.GetCharacterInfo(conductorID); if (info == null) return false; return info.Cfg.Job == Ejob.Job_Commander; } catch (Exception e) { DebugUtil.LogError("Team.CheckConductorLegal, CommanderID:{0}, Error, Exception:{1}", conductorID, e); return false; } } /// /// 检查队伍成员是否合法 /// private bool CheckTeamLegal(List units) { if (units == null || units.Count <= 0) return false; /*// 获取推荐职业 var jobs = CharacterDataInfoManager.Instance.GetCharacterInfo(_commander).Cfg.ProvideJob.ToList(); var index = 0; if (jobs.Count != units.Count) return false; foreach (var unit in units) { if (jobs[index] == ProvideJob.Job_Unlimited) { index++; continue; } // 有角色职业不为指挥所提供 if (CharacterDataInfoManager.Instance.DataDic.ContainsKey(unit)) { var job = CharacterDataInfoManager.Instance.GetCharacterJob(unit); if (jobs.All(pJob => (int)pJob != (int)job)) return false; } // 有载具但是不为指挥所提供 if (VehicleCultivateDataManager.Instance.DataDic.ContainsKey(unit) && !jobs.Contains(ProvideJob.Job_Vehicle)) { return false; } }*/ return true; } /// /// 区分角色与载具 /// private void PartUnits() { try { _characterIDs = new List(); _vehicleIDs = new List(); if (_provideJob?.Count <= 0) return; var index = 0; foreach (var unit in _unitIDs) { if (index >= _provideJob.Count) { continue; } //DebugUtil.LogError("索引「{0}」,推荐大小:「{1}」,units的大小:「{2}」", index, _provideJob.Count, _unitIDs.Count); if (CharacterDataInfoManager.Instance.DataDic.ContainsKey(unit) || (unit == NoneID && _provideJob[index] != ProvideJob.ProvideJob_Vehicle)) { //DebugUtil.LogError("添加角色:{0},其职业是:{1}", unit, _provideJob[index]); _characterIDs.Add(unit); } if (VehicleCultivateDataManager.Instance.DataDic.ContainsKey(unit) || (unit == NoneID && _provideJob[index] == ProvideJob.ProvideJob_Vehicle)) { //DebugUtil.LogError("添加载具:{0},其职业是:{1}", unit, _provideJob[index]); _vehicleIDs.Add(unit); } index++; } } catch (Exception e) { DebugUtil.LogError("Team.PartUnits Error, Exception:{0}", e); } } /// /// 清空队伍 /// private void ClearUnits() { _unitIDs.Clear(); _characterIDs.Clear(); _vehicleIDs.Clear(); _provideJob.Clear(); } /// /// 根据推荐职业重置队伍 /// private void ResetUnits() { try { _unitIDs.Clear(); _characterIDs.Clear(); _vehicleIDs.Clear(); foreach (var job in ProvideJobs) { // DebugUtil.LogError("指挥官更换后,提供的职业有:{0}", job); _unitIDs.Add(NoneID); if (job == ProvideJob.ProvideJob_Vehicle) { _vehicleIDs.Add(NoneID); } else { _characterIDs.Add(NoneID); } } /* DebugUtil.LogError("------更换指挥官后-----------"); foreach (var job in _provideJob) { DebugUtil.LogError("职业有:{0}", job); } DebugUtil.LogError("-----------------");*/ } catch (Exception e) { DebugUtil.LogError("Team.ResetUnits Error, Exception:{0}", e); } } #endregion }