/// <summary>
    /// 判断HeroInfo.szClientWeaponCID与WeaponCID是否相同
    /// </summary>
    /// <param name="heroCID"></param>
    /// <param name="weaponCID"></param>
    /// <returns></returns>
    public bool NeedChangeWeapon(byte[] heroCID, byte[] weaponCID)
    {
        var heroInfo = PlayerDataMgr.instance.GetHeroInfoByCID(heroCID);

        if (heroInfo == null || weaponCID == null || PortalMgr.CompareCID(weaponCID, emptyCID))
        {
            return(false);
        }
        else
        {
            return(!PortalMgr.CompareCID(heroInfo.szClientWeaponCID, weaponCID));
        }
    }
Exemple #2
0
    /// <summary>
    /// 更新虚拟底座需要显示的已拥有、尚未拥有、死亡的非实体英雄列表
    /// </summary>
    public void UpdateVirtualHero()
    {
        //实体模式下不需要更新
        if (CoreEntry.toyMgr.GameMode == GameMode.TOY)
        {
            return;
        }

        //更新虚拟英雄VirtualHero
        //更新时机:添加新英雄\有虚拟英雄死亡\退出关卡
        if (listVirtualHeroInfo == null)
        {
            return;
        }
        listVirtualHero.Clear();
        List <VirtualHero> ownedHeroList    = new List <VirtualHero>();
        List <VirtualHero> notOwnedHeroList = new List <VirtualHero>();
        List <VirtualHero> deadHeroList     = new List <VirtualHero>();
        VirtualHero        currentHero      = null;

        //区分还需购买哪些虚拟英雄
        List <int> listResIds = GlobalFunctions.GetHeroResIds((sbyte)HERO_KIND_GROUP.HERO_KIND_ADVANCED);

        for (int i = 0; i < listResIds.Count; i++)
        {
            HeroInfo info = PlayerDataMgr.instance.GetHeroInfoByResId(listResIds[i]);
            if (info == null)
            {
                //尚未拥有该类型虚拟英雄
                var data = BuildVirtualHero(listResIds[i], null, VirtualHeroStatus.NOT_OWNED);
                if (!notOwnedHeroList.Contains(data))
                {
                    notOwnedHeroList.Add(data);
                }
            }
        }

        //区分虚拟英雄是否死亡
        foreach (HeroInfo hero in listVirtualHeroInfo)
        {
            //如果英雄数据是当前英雄数据,不加入list
            var  currentCID    = CoreEntry.portalMgr.GetCurrentHeroInstanceId();
            bool isCurrentHero = PortalMgr.CompareCID(currentCID, hero.szCID);

            var heroData = PlayerDataMgr.instance.GetHeroDataByInstanceId(hero.szCID);
            if (heroData != null)
            {
                if (heroData.currentHp > 0)
                {
                    var data = BuildVirtualHero(hero.nResID, hero, VirtualHeroStatus.OWNED);
                    if (!isCurrentHero)
                    {
                        ownedHeroList.Add(data);
                    }
                    else
                    {
                        currentHero = data;
                    }
                }
                else
                {
                    var data = BuildVirtualHero(hero.nResID, hero, VirtualHeroStatus.DEAD);
                    if (!isCurrentHero)
                    {
                        deadHeroList.Add(data);
                    }
                    else
                    {
                        currentHero = data;
                    }
                }
            }
        }
        //listVirtualHeroInfo分为三部分
        //1、已经拥有且未死亡的英雄
        //2、尚未拥有的英雄
        //3、已经拥有且死亡的英雄
        //排序按照resId,相同resId按照英雄等级排序
        if (currentHero != null)                //理论上虚拟模式下当前底座CID不会为空,因此currentHero数据不会为空。不过为了未考虑到的异常,增加判空
        {
            listVirtualHero.Add(currentHero);
        }
        listVirtualHero.AddRange(ownedHeroList);
        listVirtualHero.AddRange(notOwnedHeroList);
        listVirtualHero.AddRange(deadHeroList);
    }
    public void FinishEffect(string actionName, System.Action cb)
    {
        float finishTime = EFFECT_FINISH;

        //是否需要展示进化相关特效
        if (evolutionCID != null && PortalMgr.CompareCID(usingHeroCID, evolutionCID))
        {
            finishTime = EFFECT_FINISH_EVOLUTION;
            Scheduler.Create(this, (sche, t, s) =>
            {
                evolutionObj = CoreEntry.resourceMgr.InstantiateObject("Prefabs/Effect/common/" + evolutionBase, SceneMgr.FarAway, Quaternion.identity);
                if (heroObj != null && evolutionObj != null)
                {
                    GlobalFunctions.MountTransform(evolutionObj.transform, heroObj.transform);
                    GlobalFunctions.ChangeLayer(evolutionObj, LayerMask.NameToLayer("ChangePlayer"), "Untagged");
                }
            }, 0, 0, EFFECT_PRE_FINISH, ActionMgr.Priority.Normal, true);
            Scheduler.Create(this, (sche, t, s) =>
            {
                wingObj = CoreEntry.resourceMgr.InstantiateObject("Prefabs/Character/Hero/Wings/" + wing, SceneMgr.FarAway, Quaternion.identity);
                var evolutionWingObj = CoreEntry.resourceMgr.InstantiateObject("Prefabs/Effect/common/" + evolutionWing, SceneMgr.FarAway, Quaternion.identity);

                if (heroObj != null)
                {
                    var wingPoint = GlobalFunctions.GetTransform(heroObj.transform, "FloatingItem");
                    if (wingPoint != null && wingObj != null && evolutionWingObj != null)
                    {
                        GlobalFunctions.MountTransform(wingObj.transform, wingPoint);
                        GlobalFunctions.MountTransform(evolutionWingObj.transform, wingPoint);
                        GlobalFunctions.ChangeLayer(wingObj, LayerMask.NameToLayer("ChangePlayer"), "Untagged");
                        GlobalFunctions.ChangeLayer(evolutionWingObj, LayerMask.NameToLayer("ChangePlayer"), "Untagged");
                    }
                }
            }, 0, 0, EFFECT_PRE_FINISH + 0.5f, ActionMgr.Priority.Normal, true);
            Scheduler.Create(this, (sche, t, s) =>
            {
                //TODO:先看效果,英雄进化资源到位后替换
                var namePoint = GlobalFunctions.GetTransform(switchEffect.transform, "NamePoint");
                if (playerData != null && namePoint != null)                    //进化特效不展示英雄名字
                {
                    var name = CoreEntry.resourceMgr.InstantiateObject("Prefabs/Effect/ui/zi/p_ui_jinhuachenggong", SceneMgr.FarAway, Quaternion.identity);
                    if (name != null)
                    {
                        name.transform.parent        = namePoint;
                        name.transform.localPosition = Vector3.zero;
                        name.transform.localRotation = Quaternion.identity;
                    }
                }
            }, 0, 0, EFFECT_PRE_FINISH + 1.0f, ActionMgr.Priority.Normal, true);
        }

        Scheduler.Create(this, (sche, t, s) =>
        {
            if (switchEffect != null)
            {
                GameObject.Destroy(switchEffect);
            }
            if (evolutionObj != null)
            {
                GameObject.Destroy(evolutionObj);
            }
            if (wingObj != null)
            {
                GameObject.Destroy(wingObj);
            }
            if (cb != null)
            {
                cb();
            }
        }, 0, 0, finishTime, ActionMgr.Priority.Normal, true);
    }
    void CreateEffect(int heroResId, string actionName, System.Action cb)
    {
        // 清除旧的特效
        CloseEmpty();
        ClearEffect();


        // 切换过程中都只认这个CID
        usingHeroCID = showingCID == null?CoreEntry.portalMgr.GetLastHeroCID() : showingCID;

        usingHeroResId     = heroResId;
        isShowingEmptyBase = false;

        // 创建特效
        float     costTime  = 0;
        Transform heroPoint = null;

        //ChardLi需求,进化后英雄第一次进入时,应播放进化之前对应的英雄动画
        if (evolutionCID != null && PortalMgr.CompareCID(usingHeroCID, evolutionCID))
        {
            var heroAttr = CoreEntry.gameDataMgr.heroAttr.GetRecord(heroResId);
            if (heroAttr != null)
            {
                heroResId = heroAttr.iInitialID;
            }
        }
        createHeroAction = () =>
        {
            //创建英雄
            if (CoreEntry.gameDataMgr.GetPlayerDataByResId(heroResId, out playerData))
            {
                if (heroObj != null)
                {
                    UnityEngine.Object.Destroy(heroObj);
                }
                heroObj = CoreEntry.resourceMgr.InstantiateObject(playerData.resPath + "_hd", Vector3.one, Quaternion.identity);
            }
            if (heroObj == null)
            {
                cb();
                return;
            }
            //加载翅膀
            CoreEntry.resourceMgr.LoadWing(heroObj, heroResId);
            // 关闭脚本
            var cs = heroObj.GetComponents <Creature>();
            for (int i = 0; i < cs.Length; ++i)
            {
                cs[i].enabled = false;
            }
            GlobalFunctions.ChangeLayer(heroObj, LayerMask.NameToLayer("ChangePlayer"), "Untagged");
            if (CoreEntry.sceneMgr.isPauseGame)
            {
                GlobalFunctions.AnimationIgnoreTime(heroObj);
            }
        };


        if (IsDeadType(changeType))
        {
            if (CoreEntry.toyMgr.GameMode == GameMode.VIRTUAL)
            {
                //如果是虚拟英雄的话走单独流程
                CoreEntry.globalObject.GetComponent <CoreEntry>().StartCoroutine(SceneMgr.DelayToInvoke(() =>
                {
                    // 关闭主摄像机,直接使用美术的
                    CoreEntry.cameraMgr.CloseMainCamera();
                    var panel = CoreEntry.uiMgr.GetPanelSimply(AIToyMgr.VIRTUAL_PANEL);
                    cb();
                }));
                return;
            }

            // 关闭主摄像机,直接使用美术的
            CoreEntry.cameraMgr.CloseMainCamera();
            //英雄死亡的逻辑走这里
            switchEffect = CoreEntry.resourceMgr.InstantiateObject("Prefabs/Effect/pet/p_pet_catch_lose", SceneMgr.FarAway, Quaternion.identity);
            costTime     = EFFECT_DIE_TIME;

            // 检查是否还有可以更换的英雄玩偶
            bool isAllDead = CoreEntry.virtualHeroMgr.ToyHeroAllDead();

            // 获取文字特效
            Transform goShowText1 = switchEffect.transform.Find("HeroPoint/p_pet_lose");
            if (null != goShowText1)
            {
                goShowText1.gameObject.SetActive(isAllDead);
            }
            Transform goShowText2 = switchEffect.transform.FindChild("HeroPoint/p_pet_lose02");
            if (null != goShowText2)
            {
                goShowText2.gameObject.SetActive(!isAllDead);
            }

            heroPoint = GlobalFunctions.GetTransform(switchEffect.transform, "HeroPoint");
            if (heroPoint != null)
            {
                //延后执行,不显示英雄生成时站立画面,直接显示失败动画
                Scheduler.Create(this, (sche, t, s) =>
                {
                    createHeroAction();
                    if (heroObj != null)
                    {
                        GlobalFunctions.MountTransform(heroObj.transform, heroPoint);
                    }
                    // 播放英雄死亡公共特效
                    CoreEntry.actionMgr.PlayAction("hero_dead", heroObj);
                    //执行回调函数
                    cb();
                }, 0, 0, costTime, ActionMgr.Priority.Normal, true);
            }
        }
        else
        {
            // 关闭主摄像机,直接使用美术的
            CoreEntry.cameraMgr.CloseMainCamera();
            //英雄正常进入走这里
            createHeroAction();
            switchEffect = CoreEntry.resourceMgr.InstantiateObject("Prefabs/Effect/scene/switchball/" + switchBg, SceneMgr.FarAway * 2, Quaternion.identity);
            costTime     = EFFECT_SHOW_TIME;

            // 使用美术坐标

            heroPoint = GlobalFunctions.GetTransform(switchEffect.transform, "NonHeroPoint");
#if true
            if (heroPoint != null && heroObj != null)
            {
                //播放切换英雄时音效
                //GlobalFunctions.ChangeLayer(heroPoint.gameObject, LayerMask.NameToLayer("ChangePlayer"));
                GlobalFunctions.MountTransform(heroObj.transform, heroPoint);
                var actor = heroObj.GetComponent <Actor>();
                if (actor != null)
                {
                    actor.ignoreTimeScale = true;
                }
                CoreEntry.actionMgr.PlayAction("switchFlyIn", heroObj);
            }
#endif

            // 创建名字特效
            Scheduler.Create(this, (sche, t, s) =>
            {
                // mount name
                if (switchEffect == null)
                {
                    cb();
                    return;
                }
                var namePoint = GlobalFunctions.GetTransform(switchEffect.transform, "NamePoint");
                if (playerData != null && namePoint != null && evolutionCID == null)                    //进化特效不展示英雄名字
                {
                    var name = CoreEntry.resourceMgr.InstantiateObject(playerData.namePath, SceneMgr.FarAway, Quaternion.identity);
                    if (name != null)
                    {
                        name.transform.parent        = namePoint;
                        name.transform.localPosition = Vector3.zero;
                        name.transform.localRotation = Quaternion.identity;
                    }
                }
                cb();
            }, 0, 0, costTime, ActionMgr.Priority.Normal, true);
        }

        // 设置场景对象,用于设置soundListener
        CoreEntry.sceneMgr.soundPlayerTransform = heroPoint.transform;
    }
    void ShowHeroDeadAnim(ChangeType changeType)
    {
        switch (changeType)
        {
        case ChangeType.HERO_DEAD:
        {
            // play dead and wait for hero
            int hero = CoreEntry.portalMgr.GetLastHeroResId();
            this.changeType = ChangeType.HERO_DEAD;

            //正在播放本英雄死亡动画时,不再切换
            if (isPlayingHeroDead == true &&
                PortalMgr.CompareCID(UsingHeroCID, CoreEntry.portalMgr.GetCurrentHeroInstanceId()) == true)
            {
                return;
            }

            isPlayingHeroDead = true;
            //回调函数
            System.Action cb = () =>
            {
                CoreEntry.eventMgr.TriggerEvent <bool>("showHeroSwitch", true);
                DeadPanel deadPanel = null;
                VirtualHeroSwitchPanel virtualPanel = null;

                if (CoreEntry.toyMgr.GameMode == GameMode.TOY)
                {
                    deadPanel = CoreEntry.uiMgr.GetPanelSimply("DeadPanel") as DeadPanel;

                    soundId = CoreEntry.soundMgr.PlaySound("MainUIsfx", "Play_Hero_Change_Before", deadPanel.gameObject);
                }
                else
                {
                    virtualPanel = CoreEntry.uiMgr.GetPanelSimply(AIToyMgr.VIRTUAL_PANEL) as VirtualHeroSwitchPanel;

                    soundId = CoreEntry.soundMgr.PlaySound("MainUIsfx", "Play_Hero_Change_Before", virtualPanel.gameObject);
                }

                deadAction = () =>
                {
                    isAllDead = true;
                    CoreEntry.eventMgr.TriggerEvent("HeroDeadShowEnd");
                    EndSwitch();
                    CoreEntry.eventMgr.TriggerEvent(EventDefine.EVENT_LOSE_BATTLE);
                };
                if (deadPanel != null)
                {
                    deadPanel.onRestart = deadAction;
                }
                else
                {
                    virtualPanel.onRestart = deadAction;
                }
            };
            //播放特效
            CreateEffect(hero, "hero_dead", cb);
        }
        break;

        case ChangeType.PVE_HERO_DEAD:
        {
            AiToyDebug.Log("pve英雄死亡, 检查英雄是否已死亡完");

            if (CoreEntry.uiMgr.GetPanel(PvePanelMgr.PveResultPanel) != null)
            {
                isChanging = false;
                return;
            }

            if (CoreEntry.areaMgr.IsDoublePveScene() && PveMgr.instance.heroMgr.IsAllDie())
            {
                isChanging = false;
                return;
            }
            // play dead and wait for hero
            int hero = CoreEntry.portalMgr.GetLastHeroResId();
            this.changeType   = ChangeType.PVE_HERO_DEAD;
            isPlayingHeroDead = true;

            CreateEffect(hero, "hero_dead", () =>
                {
                    pveDeadAction = () =>
                    {
                        isAllDead         = true;
                        isChanging        = false;
                        isPlayingHeroDead = false;
                        CoreEntry.uiMgr.DestroyPanel("DeadPanel");
                        CoreEntry.eventMgr.TriggerEvent("CancelPauseChallengeScene");
                    };
                    CoreEntry.eventMgr.TriggerEvent <bool>("showHeroSwitch", true);
                    DeadPanel deadPanel = null;
                    VirtualHeroSwitchPanel virtualPanel = null;
                    if (CoreEntry.toyMgr.GameMode == GameMode.TOY)
                    {
                        deadPanel = CoreEntry.uiMgr.GetPanelSimply("DeadPanel") as DeadPanel;
                    }
                    else
                    {
                        virtualPanel = CoreEntry.uiMgr.GetPanelSimply(AIToyMgr.VIRTUAL_PANEL) as VirtualHeroSwitchPanel;
                    }

                    if (deadPanel != null)
                    {
                        deadPanel.onRestart = pveDeadAction;
                    }
                    else
                    {
                        virtualPanel.onRestart = pveDeadAction;
                    }
                });
        }
        break;
        }
    }