public void AddHeroToFormaiton(FormationPosition formationPosition, uint heroInstanceID)
        {
            FormationPosition oldFormationPosition = GetHeroFormationPosition(heroInstanceID);            //新英雄旧位置

            teamPosDictionary.Remove(oldFormationPosition);

            if (!IsPositionEmpty(formationPosition))            //新位置有英雄
            {
                uint newPositionOldCharacterInstanceID = teamPosDictionary.GetValue(formationPosition);
                if (oldFormationPosition != FormationPosition.Invalid_Position)                //新英雄已在队伍中
                {
                    teamPosDictionary[oldFormationPosition] = newPositionOldCharacterInstanceID;
                    teamPosDictionary[formationPosition]    = heroInstanceID;
                }
                else
                {
                    teamPosDictionary[formationPosition] = heroInstanceID;
                }
            }
            else if (teamPosDictionary.Count < 5)
            {
                teamPosDictionary.Add(formationPosition, heroInstanceID);
            }
            FormationTeamInfoLuaTable.GetLuaFunction("AddHeroToFormaiton").Call(FormationTeamInfoLuaTable, (int)formationPosition, (int)heroInstanceID);
        }
        public bool RemoveHeroFromFormation(FormationPosition formationPosition)
        {
            bool result = false;

            if (IsPositionEmpty(formationPosition))
            {
                return(result);
            }
            result = teamPosDictionary.Remove(formationPosition);
            FormationTeamInfoLuaTable.GetLuaFunction("RemoveHeroByFormationPosition").Call(FormationTeamInfoLuaTable, (int)formationPosition);
            return(result);
        }
        public void TransferPlayer(uint newPlayerInstanceID)
        {
            FormationTeamInfoLuaTable.GetLuaFunction("TransferPlayer").Call(FormationTeamInfoLuaTable, newPlayerInstanceID);

            foreach (var value in teamPosDictionary)
            {
                if (GameProxy.instance.IsPlayer(value.Value))
                {
                    teamPosDictionary[value.Key] = newPlayerInstanceID;
                    break;
                }
            }
        }
 public void SetFormationId(int id)
 {
     formationId = id;
     FormationTeamInfoLuaTable.GetLuaFunction("SetFormationId").Call(FormationTeamInfoLuaTable, id);
 }
 public void ClearTeam()
 {
     teamPosDictionary.Clear();
     FormationTeamInfoLuaTable.GetLuaFunction("ClearTeam").Call(FormationTeamInfoLuaTable);
 }
        public bool CanAddToFormationPosition(FormationPosition formationPosition, uint addCharacterInstanceID, bool playerCanLeaveTeam = false)
        {
            if (!formationInfo.formationData.GetPosEnalbe(formationPosition))
            {
                return(false);
            }

            FormationTeamInfoLuaTable.GetLuaFunction("CanAddToFormationPosition").Call(FormationTeamInfoLuaTable, (int)formationPosition, addCharacterInstanceID, playerCanLeaveTeam);

            uint oldId      = teamPosDictionary.GetValue(formationPosition);
            bool can        = true;
            bool isPosEmpty = IsPositionEmpty(formationPosition);
            bool playerFlag = playerCanLeaveTeam ? true : !GameProxy.instance.IsPlayer(oldId); //

            if (IsHeroInFormation(addCharacterInstanceID))                                     //新英雄在阵中
            {
                if (!isPosEmpty && oldId == addCharacterInstanceID)
                {
                    can = false;
                }
            }
            else
            {
                HeroInfo heroInfo = HeroProxy.instance.GetHeroInfo(addCharacterInstanceID);
                bool     hasSame  = GameProxy.instance.IsPlayer(addCharacterInstanceID) ? false : HasSameHeroInFormation(heroInfo.heroData.id);
                if (hasSame)                //有同类型英雄
                {
                    if (!isPosEmpty)
                    {
                        if (playerFlag && HeroProxy.instance.GetHeroInfo(oldId).heroData.id == heroInfo.heroData.id)
                        {
                            can = true;
                        }
                        else
                        {
                            can = false;
                        }
                    }
                    else
                    {
                        can = false;
                    }
                }
                else
                {
                    if (!isPosEmpty && !playerFlag)
                    {
                        can = false;
                    }
                    else
                    {
                        if (!HasEmptyFormationPosition())
                        {
                            if (!isPosEmpty)
                            {
                                can = true;
                            }
                            else
                            {
                                can = false;
                            }
                        }
                        else
                        {
                            can = true;
                        }
                    }
                }
            }
            return(can);
        }