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 { get; private set; } = 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[hero.positionNum] = hero;
serverHeroes[hero.positionNum] = 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())
{
SysNotifyMgr.Instance.ShowTip("HeroFunc3");
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];
int index = 0;
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[index] = new CB412_tagCSHeroLineupSave.tagCSHeroLineupPos
{
ItemIndex = (ushort)heroInfo.itemHero.gridIndex,
PosNum = (byte)(posNum + 1)
};
index++;
}
}
GameNetSystem.Instance.SendInfo(savePack);
SysNotifyMgr.Instance.ShowTip("HeroFunc4");
//非主线阵容客户端自己做战力变化,主线阵容服务端战力变更会同步推送
}
public void OnChangeShapeType(int newShapeType)
{
ShapeType = newShapeType;
}
public void OnServerChangeShapeType(int newShapeType)
{
ServerShapeType = newShapeType;
ShapeType = newShapeType;
}
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 GetHeroByHeroID(int heroId)
{
foreach (var hero in tempHeroes)
{
if (hero != null && hero.heroId == heroId)
{
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 bool HasHeroInServer(string guid)
{
foreach (var hero in serverHeroes)
{
if (hero != null && hero.guid == guid)
{
return true;
}
}
return false;
}
public TeamHero GetServerHeroByIndex(int index)
{
if (index < 0 || index >= serverHeroes.Length)
{
return null;
}
return serverHeroes[index];
}
public TeamHero GetNextServerHero(string guid)
{
if (string.IsNullOrEmpty(guid))
{
//取第一个
foreach (var hero in serverHeroes)
{
if (hero != null)
{
return hero;
}
}
return null;
}
else
{
//取下一个
bool findNext = false;
foreach (var hero in serverHeroes)
{
if (hero != null && hero.guid == guid)
{
findNext = true;
}
else if (findNext && hero != null)
{
return hero;
}
}
//没找到 取第一个
return GetNextServerHero("");
}
}
//客户端从0开始,服务端从1开始
public int GetEmptyPosition()
{
for (int i = 0; i < tempHeroes.Length; i++)
{
if (tempHeroes[i] == null)
{
return i;
}
}
return -1; // No empty position
}
public int GetPosition(string guid)
{
foreach (var hero in serverHeroes)
{
if (hero != null && hero.guid == guid)
{
return hero.positionNum;
}
}
return -1;
}
// 布阵接口
private void SetTeamHero(int posNum, TeamHero hero)
{
tempHeroes[posNum] = hero;
}
// 布阵接口
private void SetServerTeamHero(int posNum, TeamHero hero)
{
serverHeroes[posNum] = hero;
tempHeroes[posNum] = hero;
}
// 布阵接口: 恢复阵容
public void RestoreTeam()
{
for (int i = 0; i < tempHeroes.Length; i++)
{
tempHeroes[i] = serverHeroes[i];
}
}
public void AddHero(HeroInfo heroInfo, int targetPosition)
{
if (targetPosition < 0 || targetPosition >= tempHeroes.Length)
{
Debug.LogError("Invalid target position for adding hero.");
return;
}
SetTeamHero(targetPosition, new TeamHero(heroInfo, targetPosition, this));
}
// add只可能是点下面卡牌
public bool AddHero(HeroInfo heroInfo, out int pos)
{
pos = -1;
if (heroInfo == null || heroInfo.itemHero == null) return false;
// 同一英雄 只能上阵一个
if (GetHeroByHeroID(heroInfo.heroId) != null)
{
SysNotifyMgr.Instance.ShowTip("HeroFunc2");
return false;
}
else
{
pos = GetEmptyPosition();
if (pos < 0)
{
SysNotifyMgr.Instance.ShowTip("HeroFunc1");
return false; // No empty position available
}
TeamHero teamHero = new TeamHero(heroInfo, pos, this);
SetTeamHero(teamHero.positionNum, teamHero);
return true;
}
}
public bool RemoveHero(HeroInfo heroInfo, out int pos)
{
pos = -1;
if (heroInfo == null || heroInfo.itemHero == null) return false;
TeamHero teamHero = GetHero(heroInfo.itemHero.guid);
if (teamHero != null)
{
pos = teamHero.positionNum;
// 从当前队伍里移除该英雄
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 bool RemoveHero(int pos)
{
SetTeamHero(pos, null);
return true;
}
public void RemoveAllHeroes()
{
tempHeroes = new TeamHero[TeamConst.MaxTeamHeroCount];
}
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;
}
}