少年修仙传客户端代码仓库
hch
2025-03-27 664e7b2e0608fa9a3f93ea408e01db37ef461f6e
LogicProject/System/ArenaActivity/ArenaManagerModel.cs
@@ -19,11 +19,9 @@
        }
    }
    /// stage
    public static readonly Vector3 leftBornPoint = new Vector3(4.9f, 0.2f, 3.5f);
    static readonly Vector3 rightBornPoint = new Vector3(20f, 0.2f, 18.8f);
    public static readonly Vector3 leftBornPoint = new Vector3(4f, 0.2f, 11.5f);
    static readonly Vector3 rightBornPoint = new Vector3(11.5f, 0.2f, 4f);
    static readonly Vector3 initPoint = new Vector3(30f, 0.2f, 30f);
    public int[] s_StepTimes = null;
@@ -31,8 +29,6 @@
    static ILPKStageType pkStageType;
    public static GA_PlayerClient.PlayerInfo playerInfo;
    static GA_ILClientPlayer opponentPlayer;
    static GA_Player mirrorPlayer;
    public static bool isMirrorFight { get; set; }
    static uint roundWiner = 0;
    static ILPKStage currentStage;
    public DateTime dungeonEndTime;
@@ -77,7 +73,6 @@
        HeroBehaviour.OnUserClickSkill += OnILUserClickSkill;
        //显示PK UI
        ArenaManager.OnILPKWinShow += OnILPKWinShow;
    }
    protected override void UnInit()
    {
@@ -131,28 +126,7 @@
        recordDataMapId = dataMapId;
    }
    
    //副本结算界面
    public void UpdateFBEnd()
    {
        if (dungeonModel.dungeonResult.isWin == 1)
        {
            roundWiner = PlayerDatas.Instance.baseData.PlayerID;
        }
        else
        {
            roundWiner = ArenaModel.Instance.OPPONENT_PLAYERID;
        }
        //ArenaModel.Instance.SendArenaBattle(ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID,
        //    (byte)(dungeonModel.dungeonResult.isWin == 1 ? 1 : 2));
        if (ArenaManager.IsArenaStage())
            WindowCenter.Instance.OpenIL<ArenaSettlementWin>();
        else
            PopupWindowsProcessor.Instance.Add("ArenaSettlementWin");
        //更新排名
        ArenaRankModel.Instance.SetMyRank(ArenaModel.Instance.RankType, dungeonModel.dungeonResult.updOrder);
    }
    void OnILPKWinShow(bool bShow)
    {
        if (bShow)
@@ -172,13 +146,13 @@
    }
    void OnILStopHandupAI()
    {
        if (!ArenaManager.IsArenaClientNotMirrorFight)
        if (!ArenaManager.isArenaClient)
            return;
        PlayerDatas.Instance.hero.SkillMgr.ResetAllCD();
    }
    void OnILCastSkill(int SkillID)
    {
        if (!ArenaManager.IsArenaClientNotMirrorFight)
        if (!ArenaManager.isArenaClient)
            return;
        Skill _skill = PlayerDatas.Instance.hero.SkillMgr.Get(SkillID);
        if (!_skill.IsValid())
@@ -308,7 +282,7 @@
    }
    void OnILPlayerUpdateAI()
    {
        if (!ArenaManager.IsArenaClientNotMirrorFight)
        if (!ArenaManager.isArenaClient)
            return;
        if (Application.isEditor)
        {
@@ -322,7 +296,8 @@
                PlayerDatas.Instance.hero.ActorInfo.Hp = 0;
            }
        }
        CameraController.Instance.rotationX = 45;
        CameraController.Instance.Apply();
        if (!ArenaModel.Instance.bILAI)
            return;
        if (dungeonModel.dungeonFightStage != DungeonFightStage.Normal)
@@ -632,7 +607,7 @@
    }
    //////////////////////////////////////////////////////////////////Arena Stage控制///////////////////////////////////////////////////////////////
    void OnILStageInitialize()
    {
    {
        ArenaModel.Instance.FakeMatchOk();
        fightInfo = default(ILFightInfo);
        fightInfo.isOver = false;
@@ -651,6 +626,7 @@
            opponentPlayer = null;
        }
        
        ArenaManager.isArenaClient = false;
        ArenaManager.isArenaPK = false;
        ArenaManagerModel.Instance.ReleasePlayer();
        ClientDungeonStageUtility.SetClientDungeon(false, 0);
@@ -663,9 +639,9 @@
    {
        if (!ArenaManager.IsArenaStage())
            return;
        ArenaManager.isArenaPK = true;
        ArenaManager.isArenaClient = true;
        ArenaManager.isArenaPK = true;
        ArenaModel.Instance.IsArenaWork = true;
        recordDataMapId = ArenaManager.MapID;
        ArenaModel.Instance.StartInit();
@@ -673,10 +649,7 @@
        // B2 10 竞技场挑战玩家  通知后端登记挑战目标ID
        uint PlayerID = ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID;
        if (PlayerID > 10000)
            isMirrorFight = true;
        ArenaModel.Instance.SendArenaBattle(PlayerID, 0);
        ArenaModel.Instance.SendArenaBattle(ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID, 0);
        if (opponentPlayer != null)
        {
@@ -710,70 +683,36 @@
        }
        else
        {
            ArenaManager.isArenaRobot = false;
            //发送命令获得个人详细信息
            PersonalEnemy.OnMirrorPlayerAppear += OnPlayerAppear;
            //RoleParticularModel.OnRevPackage += OnRevA705;
            //ModelCenter.Instance.GetModel<RoleParticularModel>().ViewPlayerCacheData((int)PlayerID, (int)ViewPlayerType.viewPlayerDataArena);
            ArenaManager.isArenaRobot = false;
            //发送命令获得个人详细信息
            CA212_tagCMViewPlayerInfo pak = new CA212_tagCMViewPlayerInfo();
            pak.PlayerID = (uint)PlayerID;
            GameNetSystem.Instance.SendInfo(pak);
            //DTCA705_tagSCQueryPlayerCacheResult.OnRevPackage += OnRevA705;
        }
    }
    //private void OnRevA705(int viewType, int playerID, RoleParticularModel.ViewPlayerData data)
    //{
    //    uint PlayerID = ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID;
    //    if (playerID != PlayerID)
    //        return;
    //    RoleParticularModel.OnRevPackage -= OnRevA705;
    //    playerInfo = GetRealPlayerInfo(data.rolePropData);
    //    playerInfo.playerID = PlayerID;
    //    //PersonalEnemy.Create(30000, rightBornPoint, playerInfo,false);
    //    PersonalEnemy.OnILPlayerAppear += OnPlayerAppear;
    //    SnxxzGame.Instance.StartCoroutine(WaitForPlayerCreate());
    //    ArenaModel.Instance.CallUpdatePKInfo(1);
    //}
    private void OnRevA705(HA705_tagSCQueryPlayerCacheResult package)
    {
        uint PlayerID = ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID;
        if (package.PlayerID != PlayerID)
            return;
        //DTCA705_tagSCQueryPlayerCacheResult.OnRevPackage -= OnRevA705;
        RoleParticularModel.RolePropData propData = LitJson.JsonMapper.ToObject<RoleParticularModel.RolePropData>(package.PropData);
        playerInfo = GetRealPlayerInfo(propData);
        playerInfo.playerID = PlayerID;
        PersonalEnemy.Create(30000, rightBornPoint, playerInfo,false);
        PersonalEnemy.OnILPlayerAppear += OnPlayerAppear;
        SnxxzGame.Instance.StartCoroutine(WaitForPlayerCreate());
    }
    
    private void OnPlayerAppear(GA_ILClientPlayer player)
    {
        PersonalEnemy.OnILPlayerAppear -= OnPlayerAppear;
        opponentPlayer = player;
        opponentPlayer.Pos = rightBornPoint;
        isMirrorFight = false;
        opponentPlayer.Pos = ArenaModel.Instance.myPlace == 1 ? rightBornPoint : leftBornPoint;
        dungeonModel.dungeonFightStage = DungeonFightStage.Normal;
    }
    private void OnPlayerAppear(GA_Player player)
    {
        if (pkStageType != ILPKStageType.Fight)
        {
            currentStage = new ILWaitStartStage();
            currentStage.Begin();
        }
        playerInfo  = new GA_PlayerClient.PlayerInfo()
        {
            maxHp = player.ActorInfo.MaxHp,
            hp = player.ActorInfo.Hp,
            level = (ushort)player.ActorInfo.LV,
            job = (byte)player.ActorInfo.Job,
            face = AvatarHelper.GetAvatarDefaultID(player.ActorInfo.Job),
            facePic = AvatarHelper.GetAvatarFrameDefaultID(player.ActorInfo.Job),
            pos = Vector3.zero,
            name = player.ActorInfo.PlayerName,
        };
        playerInfo.playerID = player.ActorInfo.sid;
        ArenaModel.Instance.ArenaPKUpInfoData.MaxProDef = (int)player.ActorInfo.maxProDef;
        ArenaModel.Instance.ArenaPKUpInfoData.opponentMaxHp = playerInfo.maxHp;
        ArenaModel.Instance.ArenaPKUpInfoData.opponentShield = (int)player.ActorInfo.curProDef;
        ArenaModel.Instance.ArenaPKUpInfoData.opponentLevel = player.ActorInfo.LV;
        ArenaModel.Instance.ArenaPKUpInfoData.realmLV = (int)player.ActorInfo.realm;
        PersonalEnemy.OnMirrorPlayerAppear -= OnPlayerAppear;
        mirrorPlayer = player;
        ArenaModel.Instance.CallUpdatePKInfo(1);
        dungeonModel.dungeonFightStage = DungeonFightStage.Normal;
    }
    public void ReleasePlayer()
    {
        if (opponentPlayer != null && !opponentPlayer.ActorInfo.serverDie)
@@ -856,8 +795,6 @@
            hp = maxHp,
            level = (ushort)level,
            job = (byte)job,
            face = AvatarHelper.GetAvatarDefaultID(job),
            facePic = AvatarHelper.GetAvatarFrameDefaultID(job),
            pos = Vector3.zero,
            name = playerName,
            itemDatas = equipInfos,
@@ -894,8 +831,6 @@
            hp = (ulong)propData.MaxHP,
            level = (ushort)propData.LV,
            job = (byte)propData.Job,
            face = (int)propData.Face,
            facePic = (int)propData.FacePic,
            pos = Vector3.zero,
            name = propData.Name,
            itemDatas = equipInfos,
@@ -955,7 +890,7 @@
        if (pkStageType != ILPKStageType.Fight)
        {
            opponentPlayer.Pos = rightBornPoint;
            opponentPlayer.Pos = ArenaModel.Instance.myPlace == 1 ? rightBornPoint : leftBornPoint;
            currentStage = new ILWaitStartStage();
            currentStage.Begin();
        }
@@ -974,7 +909,17 @@
                        currentStage = new ILFightStage();
                        break;
                    case ILPKStageType.Fight:
                        currentStage = new ILFightOverStage();
                        if (fightInfo.isOver)
                        {
                            currentStage = new ILFightOverStage();
                        }
                        else
                        {
                            currentStage = new ILRoundPrepareState();
                        }
                        break;
                    case ILPKStageType.RoundPrepare:
                        //currentStage = new ILFightStage();
                        break;
                    case ILPKStageType.FightOver:
                        currentStage = null;
@@ -1007,14 +952,10 @@
        public override void Begin()
        {
            pkStageType = ILPKStageType.WaitStart;
            duration = ArenaManagerModel.Instance.s_StepTimes[1];
            if (opponentPlayer != null)
            {
                opponentPlayer.ActorInfo.serverDie = false;
                opponentPlayer.IdleImmediate();
                opponentPlayer.Pos = rightBornPoint;
            }
            duration = ArenaManagerModel.Instance.s_StepTimes[1];
            opponentPlayer.ActorInfo.serverDie = false;
            opponentPlayer.IdleImmediate();
            PlayerDatas.Instance.baseData.HP = PlayerDatas.Instance.extersion.MaxHP;
            var maxHp = PlayerDatas.Instance.extersion.MaxHP;
@@ -1024,8 +965,8 @@
            PlayerDatas.Instance.hero.Behaviour.StopHandupAI(true);
            PlayerDatas.Instance.hero.StopPathFind();
            PlayerDatas.Instance.hero.Pos = leftBornPoint;
            opponentPlayer.Pos = ArenaModel.Instance.myPlace == 1 ? rightBornPoint : leftBornPoint;
            PlayerDatas.Instance.hero.Pos = ArenaModel.Instance.myPlace == 1 ? leftBornPoint : rightBornPoint;
            ArenaModel.Instance.FakeWaitFight((int)duration);
            ArenaModel.Instance.CallUpdatePKInfo(1);
@@ -1040,10 +981,7 @@
        public override void Update()
        {
            timer += Time.deltaTime;
            if (isMirrorFight)
                completed = timer >= duration;
            else
                completed = timer >= duration && opponentPlayer != null;
            completed = timer >= duration && opponentPlayer != null;
        }
    }
    public class ILFightOverStage : ILPKStage
@@ -1052,14 +990,12 @@
        {
            if (ArenaModel.Instance.WinnerID != PlayerDatas.Instance.baseData.PlayerID)
            {
                if (!isMirrorFight)
                    ArenaModel.Instance.SendArenaBattle(ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID, 2);
                ArenaModel.Instance.SendArenaBattle(ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID, 2);
                LocalSave.SetString("MatchInfoPlayerFightNow" + PlayerDatas.Instance.PlayerId, "");
            }
            else
            {
                if (!isMirrorFight)
                    ArenaModel.Instance.SendArenaBattle(ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID, 1);
                ArenaModel.Instance.SendArenaBattle(ArenaModel.Instance.m_PlayerInfo[ArenaModel.Instance.SelectMatchPlayer].PlayerID, 1);
                string MatchInfoPlayerFightNow = LocalSave.GetString("MatchInfoPlayerFightNow" + PlayerDatas.Instance.PlayerId);
                if(MatchInfoPlayerFightNow != "")
                {
@@ -1095,9 +1031,10 @@
    public class ILFightStage : ILPKStage
    {
        bool figthCompleted = false;
        float restTime = 0.5f;
        float restTime = 2f;
        float restTimeTimer = 0f;
        public override void Begin()
        {
            pkStageType = ILPKStageType.Fight;
@@ -1106,19 +1043,11 @@
            figthCompleted = false;
            restTimeTimer = 0f;
            if (isMirrorFight)
            {
                if (mirrorPlayer != null)
                    PlayerDatas.Instance.hero.SelectTarget = mirrorPlayer;
            }
            else
            {
                opponentPlayer.Pos = rightBornPoint;
                opponentPlayer.SelectTarget = PlayerDatas.Instance.hero;
                PlayerDatas.Instance.hero.SelectTarget = opponentPlayer;
            }
            ArenaModel.Instance.bILAI = true;
            opponentPlayer.Pos = ArenaModel.Instance.myPlace == 1 ? rightBornPoint : leftBornPoint;
            PlayerDatas.Instance.hero.Behaviour.StartHandupAI();
            ArenaModel.Instance.bILAI = true;
            opponentPlayer.SelectTarget = PlayerDatas.Instance.hero;
            PlayerDatas.Instance.hero.SelectTarget = opponentPlayer;
        }
        public override void End()
@@ -1132,11 +1061,8 @@
            if (fightInfo.isOver)
            {
                if (opponentPlayer != null)
                {
                    PersonalEnemy.ReleaseILPlayer(opponentPlayer,false);
                    opponentPlayer.Destroy();
                }
                PersonalEnemy.ReleaseILPlayer(opponentPlayer,false);
                opponentPlayer.Destroy();
            }
            ArenaModel.Instance.FakeRoundEnd(fightInfo.isOver, fightInfo.roundCount, fightInfo.roundWinnerIds.ToArray());
@@ -1148,32 +1074,24 @@
                return;
            if (PlayerDatas.Instance.hero == null)
                return;
            timer += Time.deltaTime;
            if (isMirrorFight)
            if (PlayerDatas.Instance.hero.ActorInfo.Hp <= 0)
            {
                if (roundWiner != 0)
                {
                    figthCompleted = true;
                    ArenaModel.Instance.WinnerID = roundWiner;
                }
                figthCompleted = true;
                PlayerDatas.Instance.hero.Behaviour.StopHandupAI(true);
                PlayerDatas.Instance.hero.StopPathFind();
                ArenaModel.Instance.bILAI = false;
                roundWiner = ArenaModel.Instance.OPPONENT_PLAYERID;
                ArenaModel.Instance.WinnerID = ArenaModel.Instance.OPPONENT_PLAYERID;
            }
            else
            {
                if (PlayerDatas.Instance.hero.ActorInfo.Hp <= 0)
                {
                    figthCompleted = true;
                    roundWiner = ArenaModel.Instance.OPPONENT_PLAYERID;
                    ArenaModel.Instance.WinnerID = ArenaModel.Instance.OPPONENT_PLAYERID;
                }
                if (opponentPlayer.ActorInfo.Hp <= 0)
                {
                    figthCompleted = true;
                    roundWiner = PlayerDatas.Instance.baseData.PlayerID;
                    ArenaModel.Instance.WinnerID = PlayerDatas.Instance.baseData.PlayerID;
                }
            if (opponentPlayer.ActorInfo.Hp <= 0)
            {
                figthCompleted = true;
                PlayerDatas.Instance.hero.Behaviour.StopHandupAI(true);
                PlayerDatas.Instance.hero.StopPathFind();
                ArenaModel.Instance.bILAI = false;
                roundWiner = PlayerDatas.Instance.baseData.PlayerID;
                ArenaModel.Instance.WinnerID = PlayerDatas.Instance.baseData.PlayerID;
            }
            if (!figthCompleted)
            {
@@ -1183,12 +1101,18 @@
                if (roundWiner != 0)
                {
                    figthCompleted = true;
                    PlayerDatas.Instance.hero.Behaviour.StopHandupAI(true);
                    PlayerDatas.Instance.hero.StopPathFind();
                    ArenaModel.Instance.bILAI = false;
                }
                else if (EndTime <= 0)
                //else if (timer >= duration)
                {
                    figthCompleted = true;
                    if (!isMirrorFight && opponentPlayer.ActorInfo.RealHp <= 0)
                    PlayerDatas.Instance.hero.Behaviour.StopHandupAI(true);
                    PlayerDatas.Instance.hero.StopPathFind();
                    ArenaModel.Instance.bILAI = false;
                    if (opponentPlayer.ActorInfo.RealHp <= 0)
                    {
                        roundWiner = PlayerDatas.Instance.baseData.PlayerID;
                    }
@@ -1206,21 +1130,100 @@
            if (figthCompleted)
            {
                PlayerDatas.Instance.hero.StopAll();
                ArenaModel.Instance.bILAI = false;
                restTimeTimer += Time.deltaTime;
                completed = restTimeTimer >= restTime;
                completed = restTimeTimer >= restTime;
            }
        }
    }
    public class ILRoundPrepareState : ILPKStage
    {
        public override void Begin()
        {
            pkStageType = ILPKStageType.RoundPrepare;
            GA_PVPClientPlayer.AutoAI(false);
            duration = 3f;
            Debug.LogFormat("进入阶段:{0}", pkStageType);
            if (fightInfo.roundWinnerIds[fightInfo.roundWinnerIds.Count - 1] == PlayerDatas.Instance.baseData.PlayerID)
            {
                if (!opponentPlayer.ActorInfo.serverDie)
                {
                    PersonalEnemy.ReleaseILPlayer(opponentPlayer, false);
                    opponentPlayer = null;
                }
                playerInfo.hp = playerInfo.maxHp;
                PersonalEnemy.Create(30000, ArenaModel.Instance.myPlace == 1 ? rightBornPoint : leftBornPoint, playerInfo,false);
                PersonalEnemy.OnILPlayerAppear += OnPlayerAppear;
                SnxxzGame.Instance.StartCoroutine(WaitForPlayerCreate());
                if (PlayerDatas.Instance.hero.ActorInfo.RealHp <= 0)
                {
                    PlayerDatas.Instance.baseData.HP = 1;
                    PlayerDatas.Instance.hero.ActorInfo.ResetHp(1, (long)PlayerDatas.Instance.extersion.MaxHP);
                    PlayerDatas.Instance.FightRefreshPlayerHp(1);
                    PlayerDatas.Instance.hero.IdleImmediate();
                }
            }
            else
            {
                PlayerDatas.Instance.baseData.HP = PlayerDatas.Instance.extersion.MaxHP;
                var maxHp = PlayerDatas.Instance.extersion.MaxHP;
                PlayerDatas.Instance.hero.ActorInfo.ResetHp((long)maxHp, (long)maxHp);
                PlayerDatas.Instance.FightRefreshPlayerHp(maxHp);
                PlayerDatas.Instance.hero.IdleImmediate();
                if (opponentPlayer.ActorInfo.RealHp <= 0)
                {
                    opponentPlayer = null;
                    playerInfo.hp = 1;
                    PersonalEnemy.Create(30000, rightBornPoint, playerInfo,false);
                    PersonalEnemy.OnILPlayerAppear += OnPlayerAppear;
                    SnxxzGame.Instance.StartCoroutine(WaitForPlayerCreate());
                }
            }
            PlayerDatas.Instance.hero.Pos = ArenaModel.Instance.myPlace == 1 ? leftBornPoint : rightBornPoint;
        }
        private void OnPlayerAppear(GA_ILClientPlayer player)
        {
            PersonalEnemy.OnILPlayerAppear -= OnPlayerAppear;
            opponentPlayer = player;
            opponentPlayer.Pos = ArenaModel.Instance.myPlace == 1 ? rightBornPoint : leftBornPoint;
        }
        private IEnumerator WaitForPlayerCreate()
        {
            while (opponentPlayer == null)
            {
                yield return null;
            }
            opponentPlayer.Pos = ArenaModel.Instance.myPlace == 1 ? rightBornPoint : leftBornPoint;
            opponentPlayer.ActorInfo.ResetHp((long)playerInfo.maxHp, (long)playerInfo.maxHp);
        }
        public override void End()
        {
            fightInfo.roundCount++;
            ArenaModel.Instance.FakeRoundBegin(fightInfo.roundCount, fightInfo.roundWinnerIds.ToArray());
        }
        public override void Update()
        {
            timer += Time.deltaTime;
            completed = timer >= duration && opponentPlayer != null;
        }
    }
    public enum ILPKStageType
    {
        WaitStart,
        Fight,
        RoundPrepare,
        FightOver,
    }