using System; using System.Collections.Generic; using UnityEngine; // 阵型基础 public partial class TeamBase { // 该阵容在本阵营的编号,不同阵营的阵容编号可能相同,都是从1开始,一般1V1时每个阵营为1个阵容,多V多时则每个阵营为多个阵容 private int teamIndex = 0; private uint playerId = 0; // 本地可变阵型 public bool IsPlayer { get { return playerId == 0; } } // 服务器下发的阵型和阵容,只能通过网络协议赋值,外部只读 public TeamType teamType { get; private set; } private int ShapeType; public int ServerShapeType { get; private set; } public TeamHero[] tempHeroes = new TeamHero[TeamConst.MaxTeamHeroCount]; public TeamHero[] serverHeroes { get; private set; } = new TeamHero[TeamConst.MaxTeamHeroCount]; public TeamBase(TeamType _teamType) { teamType = _teamType; teamIndex = 0; playerId = PlayerDatas.Instance.baseData.PlayerID; } // 这边来的可以没有队伍类型 public TeamBase(HB424_tagSCTurnFightInit.tagSCTurnFightLineup lineUp) { teamIndex = lineUp.Num; playerId = lineUp.OwnerID; ShapeType = lineUp.ShapeType; ServerShapeType = lineUp.ShapeType; for (int i = 0; i < lineUp.ObjCnt; i++) { if (i < tempHeroes.Length) { var fightObj = lineUp.ObjList[i]; TeamHero hero = new TeamHero(fightObj, this); tempHeroes[fightObj.PosNum] = hero; serverHeroes[fightObj.PosNum] = hero; } else { Debug.LogError("TeamBase: Too many heroes in lineup, exceeding MaxTeamHeroCount."); } } // 刷新服务器数据 UpdateProperties(); } public int GetTeamHeroCount() { int count = 0; for (int i = 0; i < tempHeroes.Length; i++) { if (tempHeroes[i] != null) { count++; } } return count; } public bool IsFull() { return GetTeamHeroCount() >= tempHeroes.Length; } public bool IsEmpty() { return GetTeamHeroCount() == 0; } /// /// 保存阵容(预留接口) /// public void SaveTeam() { if (IsEmpty()) { Debug.LogError("Cannot save an empty team. You should at least have one hero in the team."); return; } CB412_tagCSHeroLineupSave savePack = new CB412_tagCSHeroLineupSave(); savePack.LineupID = (byte)teamType; savePack.ShapeType = (byte)ShapeType; savePack.PosCnt = (byte)GetTeamHeroCount(); savePack.HeroPosList = new CB412_tagCSHeroLineupSave.tagCSHeroLineupPos[savePack.PosCnt]; foreach (var hero in tempHeroes) { if (hero != null) { int posNum = hero.positionNum; var heroInfo = HeroManager.Instance.GetHero(hero.guid); if (heroInfo == null) { Debug.LogError($"Hero with GUID {hero.guid} not found in HeroManager."); continue; } savePack.HeroPosList[posNum] = new CB412_tagCSHeroLineupSave.tagCSHeroLineupPos { ItemIndex = (ushort)heroInfo.itemHero.gridIndex, PosNum = (byte)posNum }; } } GameNetSystem.Instance.SendInfo(savePack); } public void OnChangeShapeType(int newShapeType) { ShapeType = newShapeType; } public void OnServerChangeShapeType(int newShapeType) { ServerShapeType = newShapeType; ShapeType = newShapeType; } // hero info could be null if the hero is removed from the team public void RefreshServerData(int shapeType, int positionIndex, HeroInfo heroInfo) { TeamHero teamHero = heroInfo == null ? null : new TeamHero(heroInfo, positionIndex, this); SetServerTeamHero(positionIndex, teamHero); OnServerChangeShapeType(shapeType); } public void CreateDefault(List heroInfos) { teamIndex = 0; playerId = PlayerDatas.Instance.baseData.PlayerID; OnServerChangeShapeType(0); for (int i = 0; i < heroInfos.Count; i++) { if (i < tempHeroes.Length) { var heroInfo = heroInfos[i]; TeamHero hero = new TeamHero(heroInfo, i, this); SetServerTeamHero(i, hero); } else { Debug.LogError("TeamBase: Too many heroes in lineup"); } } } public TeamHero GetHero(string guid) { foreach (var hero in tempHeroes) { if (hero != null && hero.guid == guid) { return hero; } } return null; } public TeamHero GetServerHero(string guid) { foreach (var hero in serverHeroes) { if (hero != null && hero.guid == guid) { return hero; } } return null; } // 布阵接口 public bool HasHero(string guid) { foreach (var hero in tempHeroes) { if (hero != null && hero.guid == guid) { return true; } } return false; } public int GetEmptyPosition() { for (int i = 0; i < tempHeroes.Length; i++) { if (tempHeroes[i] == null) { return i; } } return -1; // No empty position } // 布阵接口 public void SetTeamHero(int posNum, TeamHero hero) { tempHeroes[posNum] = hero; } // 布阵接口 public void SetServerTeamHero(int posNum, TeamHero hero) { serverHeroes[posNum] = hero; tempHeroes[posNum] = hero; } public void AddHero(HeroInfo heroInfo, int targetPosition) { if (targetPosition < 0 || targetPosition >= tempHeroes.Length) { Debug.LogError("Invalid target position for adding hero."); return; } TeamHero targetHero = tempHeroes[targetPosition]; if (null == targetHero) { TeamHero newHero = new TeamHero(heroInfo, targetPosition, this); SetTeamHero(targetPosition, newHero); } else { SetTeamHero(targetPosition, new TeamHero(heroInfo, targetPosition, this)); } } // add只可能是点下面卡牌 public bool AddHero(HeroInfo heroInfo) { if (heroInfo == null || heroInfo.itemHero == null) return false; // 如果当前英雄已经在队伍里了 就不处理了 if (GetHero(heroInfo.itemHero.guid) != null) { return false; // Hero already in team } else { int emptyPosition = GetEmptyPosition(); if (emptyPosition < 0) { Debug.LogError("No empty position available in the team."); return false; // No empty position available } TeamHero teamHero = new TeamHero(heroInfo, GetEmptyPosition(), this); SetTeamHero(teamHero.positionNum, teamHero); return true; } } public bool RemoveHero(HeroInfo heroInfo) { if (heroInfo == null || heroInfo.itemHero == null) return false; TeamHero teamHero = GetHero(heroInfo.itemHero.guid); if (teamHero != null) { // 从当前队伍里移除该英雄 SetTeamHero(teamHero.positionNum, null); return true; } else { return false; } } public bool RemoveHero(TeamHero teamHero) { if (teamHero == null) return false; for (int i = 0; i < tempHeroes.Length; i++) { if (tempHeroes[i] != null && tempHeroes[i].guid == teamHero.guid) { SetTeamHero(i, null); return true; // Hero removed successfully } } return false; // Hero not found } public void SwapPosition(int index1, int index2) { if (index1 < 0 || index1 >= tempHeroes.Length || index2 < 0 || index2 >= tempHeroes.Length) { Debug.LogError("Invalid indices for swapping positions."); return; } TeamHero temp = tempHeroes[index1]; tempHeroes[index1] = tempHeroes[index2]; tempHeroes[index2] = temp; // 更新位置编号 if (tempHeroes[index1] != null) tempHeroes[index1].positionNum = index1; if (tempHeroes[index2] != null) tempHeroes[index2].positionNum = index2; } }