| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525 | using System.Collections;using System.Collections.Generic;using Animancer;using Common.Utility.CombatEvent;using Core.Utility;using Fort23.Common;using Fort23.Core;using Fort23.UTool;using GameLogic.Combat.Buff;using GameLogic.Combat.CombatTool;using GameLogic.Combat.CombatTool.CombatReport;using GameLogic.Combat.Hero;using GameLogic.Combat.Hero.HeroGPU;using GameLogic.Player;using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;using UnityEngine;using UnityEngine.AI;using UnityEngine.Rendering;using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;public class CombatHeroEntity : ShowBaiscEntity, ITimeLineAnimtion, ITimeLineGetAttSpeed,    IHero{    /// <summary>    /// 死亡时的节点ID    /// </summary>    public int heroDieNodeId;    public bool isPlayer;    public bool isCreateHeroHp;    public string guidName    {        get { return CurrCombatHeroInfo.modelName; }    }    public bool isFollowState;    private float _injuriedShowTime;    private bool _isAddinjuriedShow;    private float _addInjuiedValue = (1.0f / 0.2f) * 0.3f;    private bool _isDis;    public float DisTime;    public MagicWeaponControl heroMagicWeaponControl;    public float HpBl    {        get { return CurrCombatHeroInfo.hp.Value * 100f / MaxCombatHeroInfo.hp.Value; }    }    public Vector3 dotPos    {        get { return combatHeroGameObject.position; }    }    public T GetThis<T>() where T : IHero    {        return (T)(object)this;    }    public GameObject GameObject    {        get { return combatHeroGameObject.transform.gameObject; }    }    public Vector3 faceDir    {        get { return combatHeroGameObject.transform.forward; }    }    public async CTask<CombatHeroEntity> InitForObject(GameObjectPool poolInterface, CombatAIBasic combatAIBasic,        CombatHeroInfo combatHeroInfo,        Vector3 pos,        System.Action<CombatHeroEntity> callBack = null, bool isPlayer = false)    {        //后面记到检查战斗里面不要出现异步加载,也不要出现同步IO加载        this.isPlayer = isPlayer;        string modelName = combatHeroInfo.modelName;        if (combatHeroInfo.isGpu)        {            modelName += "_gpu";        }        CurrCombatHeroInfo = combatHeroInfo.Copy();        MaxCombatHeroInfo = combatHeroInfo.Copy();        poolInterface.own.transform.position = pos;        // if (!IsEnemy)        // {        //     GameObjectPool fx_hero_quan =        //         await GObjectPool.Instance.FetchAsync<GameObjectPool>("fx_hero_quan.prefab", null);        //     fx_hero_quan.own.transform.SetParent(poolInterface.own.transform);        //     fx_hero_quan.own.transform.localPosition = Vector3.zero;        // }        // poolInterface.own.SetActive(false);        heroMagicWeaponControl = new MagicWeaponControl();        combatHeroTimeLineControl = new CombatHeroTimeLineControl();        combatHeroTimeLineControl.Init(this);        AssetHandle assetHandle =            await AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>(combatHeroInfo.modelName + "_TD.txt");        if (assetHandle != null)        {            TextAsset textAsset = assetHandle.AssetObject<TextAsset>();            TimeLienData timeLienData = JsonManager.FromJson<TimeLienData>(textAsset.text);            timeLienData.DeserializeData();            assetHandle.Release();            combatHeroTimeLineControl.AddTimeLienData(timeLienData);        }        combatHeroGameObject = new CombatHeroGameObject();        combatHeroGameObject.Init(this, poolInterface);        BuffControl = new BuffControl();        BuffControl.Init(this);        NavMeshAgent navMeshAgent = poolInterface.own.GetComponent<NavMeshAgent>();        if (combatAIBasic == null)        {            combatAIBasic = new CombatAIBasic();        }        HeroEntityMono heroEntityMono = poolInterface.own.GetComponent<HeroEntityMono>();        if (heroEntityMono == null)        {            CombatHeroColliderRoot combatHeroColliderRoot=  poolInterface.own.GetComponent<CombatHeroColliderRoot>();            if (combatHeroColliderRoot != null)            {                heroEntityMono = combatHeroColliderRoot.root.GetOrAddComponent<HeroEntityMono>();            }            else            {                heroEntityMono =  poolInterface.own.GetOrAddComponent<HeroEntityMono>();            }        }        heroEntityMono.combatHeroEntity = this;        CombatAIBasic = combatAIBasic;        CombatAIBasic.Init(this);        CombatHeroSkillControl = new CombatHeroSkillControl();        await CombatHeroSkillControl.Init(this);        await InitShieldsFx();        AnimancerComponent animancerComponent = poolInterface.own.GetComponent<AnimancerComponent>();        combatHeroAnimtion = new CombatHeroAnimtion();        // if (animancerComponent != null)        {        }        // else        // {        //     combatHeroAnimtion = new CombatHeroGPUAnimtion();        // }        poolInterface.own.SetActive(true);        combatHeroAnimtion.Init(this);        CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian);        if (isCreateHeroHp)        {            CreateHeroHpEventData createHeroHpEventData = CreateHeroHpEventData.Create();            createHeroHpEventData.combatHeroEntity = this;            EventManager.Instance.Dispatch(CustomEventType.CreateHeroHp, createHeroHpEventData);        }        await heroMagicWeaponControl.InitMagicWeapon(this, isPlayer);        CombatReportManager.Instance.AddCombatReportInfo(this);        callBack?.Invoke(this);        return this;    }    public virtual async CTask<CombatHeroEntity> Init(CombatAIBasic combatAIBasic, CombatHeroInfo combatHeroInfo,        Vector3 pos,        System.Action<CombatHeroEntity> callBack = null, bool isPlayer = false)    {        //后面记到检查战斗里面不要出现异步加载,也不要出现同步IO加载        this.isPlayer = isPlayer;        string modelName = combatHeroInfo.modelName;        if (combatHeroInfo.isGpu)        {            modelName += "_gpu";        }        CurrCombatHeroInfo = combatHeroInfo.Copy();        MaxCombatHeroInfo = combatHeroInfo.Copy();        // GameTimeLineParticleFactory        CombatHeroGameObjectPool poolInterface =            await GObjectPool.Instance.FetchAsync<CombatHeroGameObjectPool>(modelName + ".prefab", null);        if (poolInterface == null || poolInterface.own == null)        {            return null;        }        return await InitForObject(poolInterface, combatAIBasic, combatHeroInfo, pos, callBack, isPlayer);    }    public virtual void Update(float t)    {        CombatAIBasic.Update(t);        CombatHeroSkillControl.Update(t);        combatHeroTimeLineControl.Update(t);        combatHeroAnimtion.Update(t);        combatHeroGameObject.Update(t);        BuffControl.Update(t);        heroMagicWeaponControl?.Update(t);        if (combatHeroGameObject.HeroGPUMono != null)        {            if (_injuriedShowTime > 0)            {                _injuriedShowTime -= t;                if (_isAddinjuriedShow)                {                    combatHeroGameObject.HeroGPUMono.injuriedStrength += t * (_addInjuiedValue);                    if (combatHeroGameObject.HeroGPUMono.injuriedStrength >= 0.3f)                    {                        _isAddinjuriedShow = false;                    }                }                else                {                    combatHeroGameObject.HeroGPUMono.injuriedStrength -= t * (_addInjuiedValue);                    if (combatHeroGameObject.HeroGPUMono.injuriedStrength < 0)                    {                        combatHeroGameObject.HeroGPUMono.injuriedStrength = 0;                    }                }            }            else            {                combatHeroGameObject.HeroGPUMono.injuriedStrength = 0;            }        }    }    public T This<T>()    {        return (T)(object)this;    }    public override T GetILifetCycleHitPoint<T>(string hitPoinName, bool isStandType, bool isIgnoreHind)    {        return combatHeroGameObject.GetILifetCycleHitPoint<T>(hitPoinName, isStandType, isIgnoreHind);    }    public override T GetMainHotPoin<T>(bool isIgnoreHind = false)    {        return combatHeroGameObject.GetMainHotPoin<T>(isIgnoreHind);    }    public void PlayAnim(string animName, bool isLoop, int layerId, bool repeat, float speed)    {        combatHeroAnimtion.Play(animName, speed);    }    public SpecialDotInfo GetSpecialDotInfo(string specialDotName)    {        return combatHeroGameObject.GetMainHotPoin<CombatHeroHitPoint>(true).GetSpecialDotInfo(specialDotName);    }    public virtual float GetAttSpeed()    {        // CombatHeroSkillControl combatHeroSkillControl = CombatHeroSkillControl as CombatHeroSkillControl;        // if (combatHeroSkillControl != null)        // {        //     if (combatHeroSkillControl.useSkillCount > 1)        //     {        //         return 4;        //     }        //        //     return CurrCombatHeroInfo.GetAnimationSpeed;        // }        return 1;    }    public void HeroResurrection()    {        isDie = false;        CombatAIBasic.ChangeState(CombatHeroStateType.idle, isQiangZhi: true);        HeroHpUpdateEventData heroHpUpdateEventData = HeroHpUpdateEventData.Create();        heroHpUpdateEventData.combatHeroEntity = this;        CombatEventManager.Instance.Dispatch(CombatEventType.HeroHpUpdate, heroHpUpdateEventData);        HeroResurrectionEventData heroResurrectionEventData = HeroResurrectionEventData.Create();        heroResurrectionEventData.combatHeroEntity = this;        CombatEventManager.Instance.Dispatch(CombatEventType.HeroResurrection, heroResurrectionEventData);    }    public void HeroDie(HarmReturnInfo harmReturnInfo)    {        heroDieNodeId = CombatController.currActiveCombat.CombatTypeBasic.allWinNodeCount;        isDie = true;        HeroDieEventData heroDieEventData = HeroDieEventData.Create();        heroDieEventData.combatHeroEntity = this;        heroDieEventData.HarmReturnInfo = harmReturnInfo;        CombatEventManager.Instance.Dispatch(CombatEventType.HeroDie, heroDieEventData);        combatHeroGameObject.HeroDie();        CombatAIBasic.ChangeState(CombatHeroStateType.dile);        CombatEventManager.Instance.Dispatch(CombatEventType.HeroDieFinish, heroDieEventData);     }    /// <summary>    /// 是否被控制    /// </summary>    /// <returns></returns>    public bool IsControl()    {        BuffBasic basic = BuffControl.GetBuffBasicForIdGroup(1006);        if (basic != null)        {            return true;        }        b_1025 b1025 = BuffControl.GetBuffBasicForType<b_1025>();        if (b1025 != null)        {            return true;        }        return false;    }    /// <summary>    /// 是否不能添加功法    /// </summary>    /// <returns></returns>    public bool IsCantAddGongFa()    {        BuffBasic basic = BuffControl.GetBuffBasicForIdGroup(1006);        if (basic != null)        {            return false;        }        return true;    }    public void HeroHurt(HarmReturnInfo harmReturnInfo)    {        if (isDie)        {            return;        }        b_1015 b1015 = BuffControl.GetBuffBasicForType<b_1015>();        if (b1015 != null)        {            return;        }        long att = harmReturnInfo.att;        IBarrier shieldsBarrier = harmReturnInfo.triggerData.IBarrier as IBarrier;        if (shieldsBarrier != null)        {            att = shieldsBarrier.Harm(harmReturnInfo);            harmReturnInfo.harmType |= HarmType.Shields;        }        else        {            harmReturnInfo.isHitHero = true;        }        if (att > 0)        {            CurrCombatHeroInfo.hp -= att;        }        if (isZhanZhuang)        {            CurrCombatHeroInfo.hp = MaxCombatHeroInfo.hp;        }        UpdateHarmText(harmReturnInfo);        if (combatHeroGameObject.HeroGPUMono != null)        {            _injuriedShowTime = 0.4f;            combatHeroGameObject.HeroGPUMono.injuriedStrength = 0;            _isAddinjuriedShow = true;        }        HeroInjuredEventData heroInjured = HeroInjuredEventData.Create();        heroInjured.HarmReturnInfo = harmReturnInfo;        CombatEventManager.Instance.Dispatch(CombatEventType.HeroInjured, heroInjured);        HeroHpUpdateEventData heroHpUpdateEventData = HeroHpUpdateEventData.Create();        heroHpUpdateEventData.combatHeroEntity = this;        CombatEventManager.Instance.Dispatch(CombatEventType.HeroHpUpdate, heroHpUpdateEventData);        if (CurrCombatHeroInfo.hp <= 0)        {            HeroDie(harmReturnInfo);        }    }    private void UpdateHarmText(HarmReturnInfo harmReturnInfo)    {        // float currTime = Time.time;        // // if (currTime - _lasetShowHarmTime < 0.1f)        // // {        // //     return;        // // }        // _lasetShowHarmTime = currTime;        HarmUpdateEventData harmUpdateEventData = HarmUpdateEventData.Create();        harmUpdateEventData.HarmReturnInfo = harmReturnInfo;        CombatEventManager.Instance.Dispatch(CombatEventType.HarmUpdate, harmUpdateEventData);    }    public void Recover(HarmReturnInfo harmReturnInfo)    {        CurrCombatHeroInfo.hp += harmReturnInfo.att;        if (CurrCombatHeroInfo.hp > MaxCombatHeroInfo.hp)        {            CurrCombatHeroInfo.hp = MaxCombatHeroInfo.hp;        }        HarmUpdateEventData harmUpdateEventData = HarmUpdateEventData.Create();        harmUpdateEventData.HarmReturnInfo = harmReturnInfo;        CombatEventManager.Instance.Dispatch(CombatEventType.RecoverUpdate, harmUpdateEventData);        HeroHpUpdateEventData heroHpUpdateEventData = HeroHpUpdateEventData.Create();        heroHpUpdateEventData.combatHeroEntity = this;        CombatEventManager.Instance.Dispatch(CombatEventType.HeroHpUpdate, heroHpUpdateEventData);    }    public void CloseLoopFx()    {        for (int i = 0; i < heroLoopParticle.Count; i++)        {            GObjectPool.Instance.Recycle(heroLoopParticle[i]);        }        heroLoopParticle.Clear();    }    public void DisposeForOnetCombat()    {        if (_isDis)        {            return;        }        _isDis = true;        BuffControl.Dispose();        _isDis = true;        CombatHeroSkillControl.Dispose();        CombatAIBasic.Dispose();        combatHeroTimeLineControl.Dispose();        combatHeroAnimtion.Dispose();        CloseLoopFx();        ShieldsBarrier?.Dispose();        ShieldsBarrier = null;    }    public void Dispose()    {        if (_isDis)        {            return;        }        _isDis = true;        BuffControl.Dispose();        combatHeroGameObject.Dispose();        isDie = true;        CombatHeroSkillControl.Dispose();        CombatAIBasic.Dispose();        combatHeroTimeLineControl.Dispose();        combatHeroAnimtion.Dispose();        CloseLoopFx();        ShieldsBarrier?.Dispose();        ShieldsBarrier = null;    }    private void ProDormancyObj()    {        CombatHeroSkillControl.ProDormancyObj();    }    public override void ActiveObj()    {        isDie = false;        _isDis = false;    }    public override void DormancyObj()    {        Dispose();        ProDormancyObj();        _isDis = false;        CombatAIBasic = null;        combatHeroGameObject = null;        CurrCombatHeroInfo = null;        MaxCombatHeroInfo = null;        combatHeroTimeLineControl = null;        combatHeroAnimtion = null;        CombatHeroSkillControl = null;        isFollowState = false;        heroLoopParticle.Clear();        isDie = true;    }}
 |