hch
2025-10-09 6cb439c3b2462c9f9099bf341f92e88a2d5bb6b8
Main/System/Battle/Skill/SkillBase.cs
@@ -36,6 +36,8 @@
    public int fromSkillId;
   public bool isPlay = false;
    public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
   {
      caster = _caster;
@@ -48,13 +50,12 @@
      battleField = _battleField;
      packList = _packList;
      // Debug.LogError("start a skill id " + skillConfig.SkillID + " caster " + caster.teamHero.heroId + " pos " + caster.teamHero.positionNum + " camp " + caster.Camp);
   }
   public virtual void Run()
   {
      if (null != skillEffect)
      {
         if (skillEffect.IsFinished())
@@ -66,6 +67,7 @@
         {
            skillEffect.Run();
         }
         return;
      }
      if (otherSkillAction != null)
@@ -77,8 +79,12 @@
         }
         else
         {
            otherSkillAction.Run();
            if (moveFinished)
            {
               otherSkillAction.Run();
            }
         }
         return;
      }
   }
@@ -86,6 +92,7 @@
   // 1·移动到距离阵容位置n码的距离(如2号位,5号位)释放(即战场中央此类)
   public virtual void Cast()
   {
      // Debug.LogError("Cast skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode);
      string guid = battleField.guid;
      TeamHero teamHero = caster.teamHero;
      EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero);
@@ -159,6 +166,8 @@
         _onComplete?.Invoke();
      }, speed);
      battleField.battleTweenMgr.OnPlayTween(tweener);
      // Debug.LogError("move to tarrget " + target.name + " offset " + offset + " speed " + speed + " time " + tweener.Duration());
   }
   protected void TurnBack(Action _onComplete, float forward)
@@ -241,6 +250,16 @@
   protected virtual void OnAllAttackMoveFinished()
   {
      moveFinished = true;
      List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
      for (int i = 0; i < allList.Count; i++)
      {
         BattleObject bo = allList[i];
         bo.layerMgr.SetFront();
         // bo.heroRectTrans.SetParent(battleField.GetTeamNode(bo.Camp, bo.teamHero.positionNum), true);
         bo.heroInfoBar.SetActive(true);
      }
      battleField.battleRootNode.skillMaskNode.SetActive(false);
      // Debug.LogError("OnAllAttackMoveFinished skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode);
   }
   protected void CastToAllies()
@@ -289,6 +308,7 @@
      // OnMiddleFrameEnd 中摇结束
      // OnFinalFrameStart 后摇开始
      // OnFinalFrameEnd 后摇结束
      return caster.motionBase.PlaySkillAnimation(skillConfig, this, onComplete);
   }
@@ -302,6 +322,8 @@
         );
      skillEffect.Play(OnHitTargets);
      isPlay = true;
   }
   //   技能前摇帧结束
@@ -347,6 +369,8 @@
   protected void HighLightAllTargets()
   {
      caster.layerMgr.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
      if (skillConfig.FuncType != 2)
         return;
@@ -359,6 +383,8 @@
      caster.heroInfoBar.SetActive(false);
      for (int i = 0; i < allList.Count; i++)
      {
         BattleObject bo = allList[i];
@@ -366,12 +392,12 @@
         {
            bo.layerMgr.SetFront();
            bo.heroInfoBar.SetActive(true);
            bo.heroRectTrans.SetParent(battleField.battleRootNode.skillFrontNode, true);
            // bo.heroRectTrans.SetParent(battleField.battleRootNode.skillFrontNode, true);
         }
         else
         {
            bo.layerMgr.SetBack();
            bo.heroRectTrans.SetParent(battleField.battleRootNode.skillBackNode, true);
            // bo.heroRectTrans.SetParent(battleField.battleRootNode.skillBackNode, true);
         }
         if (targetList.Contains(bo))
@@ -384,10 +410,9 @@
         }
      }
      caster.layerMgr.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
      battleField.battleRootNode.skillMaskNode.SetActive(true);
      battleField.battleRootNode.SetSortingOrder();
      // caster.battleField.skillMask
      //   把这些BO全高亮 或者说把除了这些的都放在遮罩后面
      //   YYL TODO
@@ -417,6 +442,7 @@
   {
      // 伤害分布 (万分比)
      // Debug.LogError("skillConfig.DamageDivide.Count " + skillConfig.DamageDivide.Length + " _hitIndex " + _hitIndex);
      bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1;
      int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
      long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
@@ -434,7 +460,12 @@
      //   TODO YYL AttackTypes  要表现成什么样呢? 支持多种类型并存,如无视防御且暴击同时被格挡,二进制或运算最终值;0-失败;1-普通;2-回血;5-格挡;6-无视防御;7-暴击;9-闪避
      target.Hurt(damageList, totalDamage, hurt, skillConfig);
      List<HB422_tagMCTurnFightObjDead> deadPacks = BattleUtility.FindDeadPack(packList);
      bool isTargetDead = deadPacks.Exists(p => p.ObjID == target.ObjID);
      bool playAnimation = !(isLastHit && isTargetDead);
      target.Hurt(damageList, totalDamage, hurt, skillConfig, playAnimation);
      //   TODO YYL 这里是要做统一计算后再hurt跟suckhp还是怎样
      caster.SuckHp(hurt.SuckHP, skillConfig);//   吸血
@@ -604,11 +635,22 @@
   }
   public virtual bool IsFinished()
   {
      if (!isPlay)
      {
         return false;
      }
      if (skillEffect != null)
      {
         if (!skillEffect.IsFinished())
         {
            return false;
         }
         else
         {
            skillEffect = null;
            OnSkillFinished();
            return false;
         }
      }
@@ -618,19 +660,22 @@
         {
            return false;
         }
         else
         {
            otherSkillAction = null;
            OnSkillFinished();
            return false;
         }
      }
      if (isFinished && moveFinished)
      {
         List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
         for (int i = 0; i < allList.Count; i++)
         if (packList.Count > 0)
         {
            BattleObject bo = allList[i];
            bo.layerMgr.SetFront();
            bo.heroRectTrans.SetParent(battleField.GetTeamNode(bo.Camp, bo.teamHero.positionNum), true);
            bo.heroInfoBar.SetActive(true);
            OnSkillFinished();
            return false;
         }
         battleField.battleRootNode.skillMaskNode.SetActive(false);
         return true;
      }
@@ -643,8 +688,15 @@
   public virtual void ForceFinished()
   {
      skillEffect?.ForceFinished();
      if (otherSkillAction != null)
      {
         otherSkillAction.ForceFinish();
         otherSkillAction = null;
      }
      HandleDead();
      isFinished = true;
      moveFinished = true;
      isPlay = true;
      while (packList.Count > 0)
      {
@@ -655,18 +707,16 @@
         {
            if (combinePack.startTag.Tag.StartsWith("Skill_"))
            {
               BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
               otherSkillAction = combinePack.CreateSkillAction();
               otherSkillAction.fromSkillId = skillConfig.SkillID;
               //   强制结束其他技能
               otherSkillAction.ForceFinish();
               return;
               continue;
            }
         }
         else if (pack is CustomB421ActionPack actionPack)
         {
            actionPack.Distribute();
            return;
         }
         PackageRegedit.Distribute(pack);
      }
@@ -679,6 +729,25 @@
         if (!skillEffect.IsFinished())
         {
            return;
         }
         else
         {
            skillEffect = null;
            OnSkillFinished();
         }
      }
      if (otherSkillAction != null)
      {
         if (!otherSkillAction.IsFinished())
         {
            return;
         }
         else
         {
            otherSkillAction = null;
            OnSkillFinished();
         }
      }
@@ -701,8 +770,9 @@
         else if (pack is CustomB421ActionPack actionPack)
         {
            actionPack.Distribute();
            return;
         }
         // Debug.LogError("Distribute pack " + pack.GetType().ToString());
         PackageRegedit.Distribute(pack);
      }