yyl
2025-08-14 d90b3f1814240745b59c16af6c3e4aebe3451244
Main/System/Battle/Skill/SkillBase.cs
@@ -3,6 +3,8 @@
using System;
using DG.Tweening;
using Spine;
using System.Linq;
using PlasticGui.WorkspaceWindow.BranchExplorer;
public class SkillBase
@@ -65,20 +67,7 @@
   }
   protected virtual void OnActiveSkillFrame()
   {
   }
   protected virtual void OnStartSkillFrame()
   {
   }
   protected virtual void OnEndSkillFrame()
   {
   }
   public void Pause()
   {
@@ -141,26 +130,10 @@
      }
   }
   //   冲刺的技能 动作 跟移动 是同时进行的 移动到目标的一瞬间就要进行技能逻辑
   // protected void DashToTarget(Action _onComplete)
   // {
   //    TrackEntry entry = PlayCastAnimation();
   //    BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.AttackID);
   //    if (mainTarget == null)
   //    {
   //       Debug.LogError("目标为空 mainTarget == null AttackID : " + tagUseSkillAttack.AttackID);
   //       _onComplete?.Invoke();
   //       return;
   //    }
   //    //   做一个微微的提前
   //    MoveToTarget(mainTarget.Camp, mainTarget.teamHero.positionNum, entry.AnimationEnd - 0.05f, () => DoSkillLogic(_onComplete));
   // }
   //   这里其实是技能后摇结束的地方
   protected virtual void DoSkillLogic(Action _onComplete = null)
   {
   }
   protected TrackEntry PlayCastAnimation(Action onComplete = null)
@@ -226,7 +199,7 @@
      // 高亮所有目标
      HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack));
      highlightList.Add(caster);
      //   把这些BO全高亮 或者说把除了这些的都放在遮罩后面
      //   YYL TODO
@@ -256,7 +229,103 @@
         OnHitEachTarget(target, totalDamage, damageList, ref hurt);
      }
   }
      HandleDead();
   }
   protected void HandleDead()
   {
      var deadPackList = FindDeadPack();
      CheckAfterDeadhPack();
      // 处理掉落包 提前distribute之后 PackManager才有掉落物 所以不跟assignexp一样distribute
      foreach (var _dropPack in dropPackList)
      {
         PackageRegedit.Distribute(_dropPack);
         packList.Remove(_dropPack);
      }
      // 获取掉落物品
      var dropPack = PackManager.Instance.GetSinglePack(PackType.DropItem);
      var itemDict = dropPack.GetAllItems();
      List<ItemModel> itemList = new List<ItemModel>(
         from item in itemDict.Values
         where item != null && item.isAuction
         select item);
      int deadCount = deadPackList.Count;
      // 分配掉落和经验
      var dropAssign = AssignDrops(itemList, deadCount);
      var expAssign = AssignExp(expPackList, deadCount);
      // 构造 BattleDrops 并分配
      for (int i = 0; i < deadCount; i++)
      {
         BattleObject deadTarget = battleField.battleObjMgr.GetBattleObject((int)deadPackList[i].ObjID);
         List<ItemModel> itemModelDrops = dropAssign[i];
         List<int> itemModelDropsIndexList = new List<int>(
            from item in itemModelDrops  select item.gridIndex);
         BattleDrops battleDrops = new BattleDrops()
         {
            rectTransform = deadTarget.heroRectTrans,
            dropItemPackIndex = itemModelDropsIndexList,
            expDrops = expAssign[i]
         };
         deadTarget.PushDropItems(battleDrops);
      }
      // 分发死亡包
      foreach (var deadPack in deadPackList)
      {
         PackageRegedit.Distribute(deadPack);
         packList.Remove(deadPack);
      }
      deadPackList.Clear();
   }
   // 分配掉落
   protected List<List<ItemModel>> AssignDrops(List<ItemModel> itemList, int deadCount)
   {
      var dropAssign = new List<List<ItemModel>>(deadCount);
      for (int i = 0; i < deadCount; i++)
         dropAssign.Add(new List<ItemModel>());
      for (int i = 0; i < itemList.Count; i++)
         dropAssign[i % deadCount].Add(itemList[i]);
      return dropAssign;
   }
   // 分配经验:每个原始包都平均分配到每个死亡对象
   protected List<List<HB405_tagMCAddExp>> AssignExp(List<HB405_tagMCAddExp> expList, int deadCount)
   {
      var expAssign = new List<List<HB405_tagMCAddExp>>(deadCount);
      for (int i = 0; i < deadCount; i++)
         expAssign.Add(new List<HB405_tagMCAddExp>());
      foreach (var expPack in expList)
      {
         long totalExp = GeneralDefine.GetFactValue(expPack.Exp, expPack.ExpPoint);
         long avgExp = totalExp / deadCount;
         long remain = totalExp % deadCount;
         for (int i = 0; i < deadCount; i++)
         {
            long assignExp = avgExp + (i < remain ? 1 : 0);
            long expPoint = assignExp / 100000000;
            long exp = assignExp % 100000000;
            var newPack = new HB405_tagMCAddExp
            {
               Exp = (uint)exp,
               ExpPoint = (uint)expPoint,
               Source = expPack.Source // 保持原包来源
            };
            expAssign[i].Add(newPack);
         }
         packList.Remove(expPack);
      }
      return expAssign;
   }
   /// <summary>
   /// 保证所有分配项加起来等于totalDamage,避免因整除导致的误差
@@ -299,41 +368,6 @@
            target.heroGo.transform
         );
      }
      //   受伤之后辨别死亡状态 死亡包其实前后帧会多次触发 应该要即时remove其他的包来保证不重复
      if (target.IsDead())
      {
         // SkillRecordAction里的drop事件前移到dead之后
         HB422_tagMCTurnFightObjDead deadPack = FindDeadPack(target);
         CheckAfterDeadhPack(target, deadPack);
         if (deadPack != null)
         {
            //   处理掉落包
            for (int i = 0; i < dropPackList.Count; i++)
            {
               PackageRegedit.Distribute(dropPackList[i]);
            }
            dropPackList.Clear();
            target.PushExpPackList(new List<HB405_tagMCAddExp>(expPackList));
            expPackList.Clear();
            // 处理死亡包
            PackageRegedit.Distribute(deadPack);
            packList.Remove(deadPack);
         }
         //   复活包暂时不管 可能是技能的包
         // HB423_tagMCTurnFightObjReborn rebornPack = FindRebornPack(target);
         // if (rebornPack != null)
         // {
         //    //   处理复活包
         //    PackageRegedit.Distribute(rebornPack);
         //    packList.Remove(rebornPack);
         // }
      }
   }
   protected HB423_tagMCTurnFightObjReborn FindRebornPack(BattleObject target)
@@ -362,20 +396,17 @@
      return null;
   }
   protected HB422_tagMCTurnFightObjDead FindDeadPack(BattleObject target)
   protected List<HB422_tagMCTurnFightObjDead> FindDeadPack()
   {
      HB422_tagMCTurnFightObjDead deadPack = null;
      List<HB422_tagMCTurnFightObjDead> deadPacks = new List<HB422_tagMCTurnFightObjDead>();
      for (int i = 0; i < packList.Count; i++)
      {
         var pack = packList[i];
         //   寻找死亡包 找到死亡包之后要找掉落包 不能超过技能包
         if (pack is HB422_tagMCTurnFightObjDead)
         {
            deadPack = pack as HB422_tagMCTurnFightObjDead;
            if (deadPack.ObjID == target.ObjID)
            {
               return deadPack;
            }
            var deadPack = pack as HB422_tagMCTurnFightObjDead;
            deadPacks.Add(deadPack);
         }
         else if (pack is CustomHB426CombinePack)
         {
@@ -387,22 +418,13 @@
            }
         }
      }
      return null;
      return deadPacks;
   }
   protected void CheckAfterDeadhPack(BattleObject target, HB422_tagMCTurnFightObjDead deadPack)
   protected void CheckAfterDeadhPack()
   {
      if (null == deadPack)
      {
         return;
      }
      var deadPackIndex = packList.IndexOf(deadPack);
      if (deadPackIndex < 0)
      {
         return;
      }
      List<int> removeIndexList = new List<int>();
      for (int i = deadPackIndex + 1; i < packList.Count; i++)
      for (int i = 0; i < packList.Count; i++)
      {
         var pack = packList[i];
@@ -485,4 +507,20 @@
      isFinished = true;
   }
   protected virtual void OnActiveSkillFrame()
   {
   }
   protected virtual void OnStartSkillFrame()
   {
   }
   protected virtual void OnEndSkillFrame()
   {
   }
}