using System; 
 | 
using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using DG.Tweening; 
 | 
using DG.Tweening.Core; 
 | 
using DG.Tweening.Plugins.Options; 
 | 
using Spine.Unity; 
 | 
using UnityEngine.UI; 
 | 
using System.Linq; 
 | 
  
 | 
public enum BattleCamp 
 | 
{ 
 | 
    Red, 
 | 
    Blue 
 | 
} 
 | 
  
 | 
public enum BattleState 
 | 
{ 
 | 
    None = 0, 
 | 
    Stunned = 1 << 0, 
 | 
    Poisoned = 1 << 1, 
 | 
    Bleeding = 1 << 2, 
 | 
    Silenced = 1 << 3, 
 | 
    Frozen = 1 << 4, 
 | 
    Burned = 1 << 5 
 | 
} 
 | 
  
 | 
public class BattleObject 
 | 
{ 
 | 
    public BattleField battleField; 
 | 
  
 | 
    public BattleObjectBuffMgr buffMgr; 
 | 
  
 | 
    public int ObjID { get; set; } 
 | 
  
 | 
    public BattleCamp Camp { get; protected set; } 
 | 
  
 | 
    public TeamHero teamHero { get; protected set; } 
 | 
  
 | 
    // public BuffMgr buffMgr; 
 | 
  
 | 
    public MotionBase motionBase; 
 | 
  
 | 
    public GameObject heroGo 
 | 
    { 
 | 
        get; 
 | 
        private set; 
 | 
    } 
 | 
  
 | 
    protected BattleDrops battleDrops; 
 | 
  
 | 
    private RectTransform m_heroRectTrans; 
 | 
  
 | 
    public RectTransform heroRectTrans 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            if (m_heroRectTrans == null) 
 | 
            { 
 | 
                m_heroRectTrans = heroGo.GetComponent<RectTransform>(); 
 | 
            } 
 | 
            return m_heroRectTrans; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    protected Action onDeathAnimationComplete; 
 | 
  
 | 
    protected Renderer[] renderers; 
 | 
  
 | 
    public Transform effectNode; 
 | 
  
 | 
    private List<HB405_tagMCAddExp> hB405_tagMCAddExps = new List<HB405_tagMCAddExp>(); 
 | 
  
 | 
    public BattleObject(BattleField _battleField) 
 | 
    { 
 | 
        battleField = _battleField; 
 | 
    } 
 | 
  
 | 
    public virtual void Init(GameObject _heroGo, TeamHero _teamHero, BattleCamp _camp) 
 | 
    { 
 | 
        heroGo = _heroGo; 
 | 
        teamHero = _teamHero; 
 | 
        Camp = _camp; 
 | 
        motionBase = new MotionBase(); 
 | 
        motionBase.Init(heroGo.GetComponentInChildren<SkeletonGraphic>(true)); 
 | 
        motionBase.onAnimationComplete += OnAnimationComplete; 
 | 
        buffMgr = new BattleObjectBuffMgr(); 
 | 
        buffMgr.Init(this); 
 | 
  
 | 
        renderers = heroGo.GetComponentsInChildren<Renderer>(true); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public virtual void Run() 
 | 
    { 
 | 
        motionBase.Run(); 
 | 
    } 
 | 
  
 | 
    public virtual void Pause() 
 | 
    { 
 | 
        motionBase.Pause(); 
 | 
    } 
 | 
  
 | 
    public virtual void Resume() 
 | 
    { 
 | 
        motionBase.Resume(); 
 | 
    } 
 | 
  
 | 
    public virtual void Destroy() 
 | 
    { 
 | 
        motionBase.onAnimationComplete -= OnAnimationComplete; 
 | 
  
 | 
        motionBase.Release(); 
 | 
        motionBase = null; 
 | 
        teamHero = null; 
 | 
        ObjID = 0; 
 | 
  
 | 
        if (heroGo != null) 
 | 
        { 
 | 
            GameObject.DestroyImmediate(heroGo); 
 | 
            heroGo = null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void OnObjInfoRefresh(H0418_tagObjInfoRefresh _refreshInfo) 
 | 
    { 
 | 
        switch ((PlayerDataType)_refreshInfo.RefreshType) 
 | 
        { 
 | 
            case PlayerDataType.HP: 
 | 
                teamHero.curHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx); 
 | 
                break; 
 | 
            case PlayerDataType.MaxHP: 
 | 
                teamHero.maxHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx); 
 | 
                break; 
 | 
            case PlayerDataType.XP: 
 | 
                teamHero.rage = (int)GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx); 
 | 
                break; 
 | 
            default: 
 | 
                BattleDebug.LogError("BattleObject.ObjInfoRefresh 出现意外类型 " + _refreshInfo.RefreshType.ToString()); 
 | 
                break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    //  眩晕 
 | 
    public bool IsStunned() 
 | 
    { 
 | 
        return teamHero.isStunned; 
 | 
    } 
 | 
  
 | 
    //  冰冻 
 | 
    public bool IsFrozen() 
 | 
    { 
 | 
        return teamHero.isFrozen; 
 | 
    } 
 | 
  
 | 
    //  石化 
 | 
    public bool IsStoned() 
 | 
    { 
 | 
        return teamHero.isStoned; 
 | 
    } 
 | 
  
 | 
    //  被沉默 
 | 
    public bool IsSlient() 
 | 
    { 
 | 
        return teamHero.isSlient; 
 | 
    } 
 | 
  
 | 
    //  被缴械 
 | 
    public bool IsDisarmed() 
 | 
    { 
 | 
        return teamHero.isDisarmed; 
 | 
    } 
 | 
  
 | 
    //  是否无敌 
 | 
    public bool IsInvincable() 
 | 
    { 
 | 
        return teamHero.isInvinceble; 
 | 
    } 
 | 
  
 | 
    //  是否死亡 
 | 
    public bool IsDead() 
 | 
    { 
 | 
        return teamHero.isDead; 
 | 
    } 
 | 
  
 | 
    //  是否被控住了 
 | 
    public bool IsCrowdControlled() 
 | 
    { 
 | 
        return IsStunned() || IsStoned() || IsFrozen(); 
 | 
    } 
 | 
  
 | 
    public virtual bool IsCanCastSkill() 
 | 
    { 
 | 
        //  被控住 
 | 
        if (IsCrowdControlled()) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        //  被沉默 
 | 
        if (IsSlient()) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        //  看看怒气是否达到释放要求 
 | 
        return teamHero.rage >= 100; 
 | 
    } 
 | 
  
 | 
    public virtual bool IsCanNormalAttack() 
 | 
    { 
 | 
        //  被控住 
 | 
        if (IsCrowdControlled()) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        //  缴械 
 | 
        if (IsDisarmed()) 
 | 
        { 
 | 
            return false; 
 | 
        } 
 | 
  
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    public virtual void Hurt(List<long> damageValues, long _totalDamage, uint attackType) 
 | 
    { 
 | 
        PopDamage(teamHero.curHp, damageValues, attackType); 
 | 
  
 | 
        motionBase.PlayAnimation(MotionName.hit, false); 
 | 
  
 | 
        //  扣血 
 | 
        teamHero.curHp -= _totalDamage; 
 | 
    } 
 | 
  
 | 
    //  闪避开始 
 | 
    public virtual void OnDodgeBegin() 
 | 
    { 
 | 
        float pingpongTime = 0.2f; 
 | 
        RectTransform rectTrans = heroRectTrans; 
 | 
        var tween = rectTrans.DOAnchorPos(new Vector3(-50, 50, 0), pingpongTime) 
 | 
            .SetEase(Ease.OutCubic); 
 | 
  
 | 
        battleField.battleTweenMgr.OnPlayTween(tween); 
 | 
    } 
 | 
  
 | 
    //  闪避结束 
 | 
    public virtual void OnDodgeEnd() 
 | 
    { 
 | 
        float pingpongTime = 0.2f; 
 | 
        RectTransform rectTrans = heroRectTrans; 
 | 
  
 | 
        var tween = rectTrans.DOAnchorPos(Vector3.zero, pingpongTime) 
 | 
                            .SetEase(Ease.OutCubic); 
 | 
  
 | 
        battleField.battleTweenMgr.OnPlayTween(tween); 
 | 
    } 
 | 
  
 | 
    public virtual void OnDeath(Action _onDeathAnimationComplete) 
 | 
    { 
 | 
        BattleDebug.LogError(ObjID + " OnDeath called"); 
 | 
        onDeathAnimationComplete = _onDeathAnimationComplete; 
 | 
        motionBase.PlayAnimation(MotionName.dead, false); 
 | 
    } 
 | 
  
 | 
    protected virtual void OnAnimationComplete(MotionName motionName) 
 | 
    { 
 | 
        if (motionName == MotionName.dead) 
 | 
        { 
 | 
            OnDeadAnimationComplete(); 
 | 
            onDeathAnimationComplete?.Invoke(); 
 | 
            onDeathAnimationComplete = null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    protected virtual void OnDeadAnimationComplete() 
 | 
    { 
 | 
        //  或许看看溶解特效? YYL TODO 
 | 
        heroGo.SetActive(false); 
 | 
    } 
 | 
  
 | 
    public void OnReborn(HB423_tagMCTurnFightObjReborn vNetData) 
 | 
    { 
 | 
        // 处理复活逻辑 
 | 
        teamHero.curHp = GeneralDefine.GetFactValue(vNetData.HP, vNetData.HPEx); 
 | 
        heroGo.SetActive(true); 
 | 
        motionBase.PlayAnimation(MotionName.idle, true); 
 | 
    } 
 | 
  
 | 
    // 伤害还要看 是否闪避 暴击 and so on 需要有一个DamageType 服务器应该会给 
 | 
    protected virtual void PopDamage(long curHp, List<long> damageValues, uint attackType) 
 | 
    { 
 | 
        //  其实应该通知出去给UI界面解耦 让UI界面自己来显示的 YYL TODO 
 | 
        //  播放伤害数字 
 | 
        //  这里可以实现一个伤害数字的弹出效果 
 | 
        //  比如使用一个UI组件来显示伤害数字 
 | 
        foreach (var damage in damageValues) 
 | 
        { 
 | 
            Debug.Log($"Damage: {damage}"); 
 | 
        } 
 | 
  
 | 
        // YYL TODO 是否需要挂在在自身的follow点上 
 | 
        EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleField.guid, this, damageValues); 
 | 
    } 
 | 
  
 | 
    public RectTransform GetAliasTeamNode() 
 | 
    { 
 | 
        return battleField.GetTeamNode(Camp); 
 | 
    } 
 | 
  
 | 
    public RectTransform GetEnemyTeamNode() 
 | 
    { 
 | 
        return battleField.GetTeamNode(Camp == BattleCamp.Red ? BattleCamp.Blue : BattleCamp.Red); 
 | 
    } 
 | 
  
 | 
    public BattleCamp GetEnemyCamp() 
 | 
    { 
 | 
        return Camp == BattleCamp.Red ? BattleCamp.Blue : BattleCamp.Red; 
 | 
    } 
 | 
  
 | 
    public void HaveRest() 
 | 
    { 
 | 
        // YYL TODO 
 | 
        //  休息状态 
 | 
        //  多一个zzz的一个特效 
 | 
        heroGo.SetActive(true); 
 | 
        motionBase.PlayAnimation(MotionName.idle, true); 
 | 
        heroRectTrans.anchoredPosition = Vector2.zero; 
 | 
    } 
 | 
  
 | 
    public void PushDropItems(BattleDrops _battleDrops) 
 | 
    { 
 | 
        battleDrops = _battleDrops; 
 | 
    } 
 | 
  
 | 
    public void PerformDrop() 
 | 
    { 
 | 
        if (null == battleDrops) 
 | 
            return; 
 | 
  
 | 
        EventBroadcast.Instance.Broadcast<string, BattleDrops, Action>( 
 | 
            EventName.BATTLE_DROP_ITEMS, battleField.guid, battleDrops, OnPerformDropFinish); 
 | 
    } 
 | 
  
 | 
    protected void OnPerformDropFinish() 
 | 
    { 
 | 
        battleDrops = null; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
#if UNITY_EDITOR_STOP_USING 
 | 
    public void EditorRevive() 
 | 
    { 
 | 
        teamHero.curHp = 100; 
 | 
        heroGo.SetActive(true); 
 | 
        motionBase.PlayAnimation(MotionName.idle, true); 
 | 
    } 
 | 
  
 | 
    public List<int> TryAttack(BattleObject obj, SkillConfig skillConfig) 
 | 
    { 
 | 
        List<int> damageList = new List<int>(); 
 | 
  
 | 
        int totalDamage = 100; 
 | 
  
 | 
        int damage1 = (int)((float)totalDamage * 0.3f); 
 | 
  
 | 
        int damage2 = (int)((float)totalDamage * 0.25f); 
 | 
  
 | 
        int damage3 = totalDamage - damage1 - damage2; 
 | 
  
 | 
        damageList.Add(damage1); 
 | 
        damageList.Add(damage2); 
 | 
        damageList.Add(damage3); 
 | 
  
 | 
        return damageList; 
 | 
    } 
 | 
#endif 
 | 
  
 | 
} 
 |