yyl
2025-09-12 a966d3ece73d1a7be49c8187702b94480d8f7861
125 战斗 伤害问题修复1
5个文件已修改
109 ■■■■■ 已修改文件
Main/System/Battle/BattleObject/BattleObject.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleUtility.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/BattleDmgInfo.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/DamageType.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs
@@ -353,8 +353,14 @@
            battleField.recordPlayer.InsertRecord(dodgeFinish);
        }
        heroInfoBar.UpdateHP(teamHero.curHp, Math.Max(0, teamHero.curHp - _totalDamage), teamHero.maxHp);
        teamHero.curHp = Math.Max(0, teamHero.curHp - _totalDamage);
        int currentHurtHp = 0;
        for (int i = 0; i < damageValues.Count; i++)
        {
            currentHurtHp += (int)damageValues[i];
        }
        heroInfoBar.UpdateHP(teamHero.curHp, Math.Max(0, teamHero.curHp - currentHurtHp), teamHero.maxHp);
        teamHero.curHp = Math.Max(0, teamHero.curHp - currentHurtHp);
        // YYL TODO 是否需要挂在在自身的follow点上
        EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
Main/System/Battle/BattleUtility.cs
@@ -289,24 +289,13 @@
    public static List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
    {
        List<long> fixedDamageList = new List<long>();
        long assigned = 0;
        int count = damageDivide.Length;
        for (int i = 0; i < count; i++)
        for (int i = 0; i < damageDivide.Length; i++)
        {
            long damage;
            if (i == count - 1)
            {
                // 最后一个分配项修正为剩余
                damage = totalDamage - assigned;
            float fixedDamage = (float)totalDamage * (float)damageDivide[i] / 10000f;
            fixedDamageList.Add((int)fixedDamage);
            }
            else
            {
                damage = (totalDamage * damageDivide[i] + 5000) / 10000; // 四舍五入
                assigned += damage;
            }
            fixedDamageList.Add(damage);
        }
        return fixedDamageList;
    }
Main/System/Battle/Define/BattleDmgInfo.cs
@@ -29,9 +29,24 @@
        this.hurtObj = hurtObj;
        this.hurt = hurt;
        this.skillConfig = skillConfig;
        HandleDamageType();
        HandleAttackTypeAndDamage();
    }
    private void HandleDamageType()
    {
        int attackTypes = 0;
        foreach (ServerDamageType serverDamageType in System.Enum.GetValues(typeof(ServerDamageType)))
        {
            int nsdt = (int)serverDamageType;
            if ((hurt.AttackTypes & nsdt) == nsdt)
            {
                attackTypes += nsdt;
            }
        }
        hurt.AttackTypes = (uint)attackTypes;
    }
    private void HandleAttackTypeAndDamage()
    {
        isBlocked = HaveBlockDamage();
Main/System/Battle/Define/DamageType.cs
@@ -9,6 +9,19 @@
//
// 101011111
//    服务器拥有的DamageType
public enum ServerDamageType
{
    Damage = 2,
    Recovery = 4,
    Reflect = 8,
    Bloody = 16,
    Block = 32,
    Crit = 128,
    Dodge = 512
}
public enum DamageType
{
    Damage = 2,         //普通伤害 (2^1)
Main/System/Battle/Motion/MotionBase.cs
@@ -26,6 +26,8 @@
    public Action OnHitAnimationComplete;
    public Action<string> onAnimationComplete;
    private List<Action> runActionList = new List<Action>();
    #region 组件引用
    
    protected SkeletonGraphic skeletonGraphic;
@@ -42,6 +44,7 @@
    #endregion
    private Spine.TrackEntry currentTrackEntry;
    #region 初始化方法
@@ -134,6 +137,16 @@
        return currentTrackEntry;
    }
    private void RunAction(Action _action)
    {
        runActionList.Add(_action);
    }
    private void RemoveRunAction(Action _action)
    {
        runActionList.Remove(_action);
    }
    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, Action _onComplete = null)
    {
        // 参数校验
@@ -174,12 +187,10 @@
        }
        // 关键帧参数
        float fps = BattleConst.skillMotionFps;
        float middleBeginTime = skillConfig.StartupFrames / fps;
        int loopCount = skillConfig.LoopCount;
        int[] activeFrames = skillConfig.ActiveFrames;
        int activeFrameCount = activeFrames.Length;
        float recoveryFrameTime = skillConfig.RecoveryFrames / fps;
        float recoveryFrame = skillConfig.RecoveryFrames;
        // 播放动画
        var skillTrackEntry = spineAnimationState.SetAnimation(0, anim, false);
@@ -198,21 +209,23 @@
        skillBase.OnSkillStart();
        // 动画帧更新处理
        Spine.Unity.UpdateBonesDelegate updateLocalHandler = null;
        updateLocalHandler = (ISkeletonAnimation animated) =>
        int triggerMFEndCount = 0;
        Action updateLocalHandler = null;
        updateLocalHandler = () =>
        {
            if (isFinish) return;
            float trackTime = skillTrackEntry.TrackTime;
            float frame = (skillTrackEntry.TrackTime * (float)BattleConst.skillMotionFps);
            // 前摇结束(只触发一次)
            if (!beginPhaseTriggered && trackTime >= middleBeginTime && curLoop == 0)
            if (!beginPhaseTriggered && frame >= skillConfig.StartupFrames && curLoop == 0)
            {
                beginPhaseTriggered = true;
                skillBase.OnStartSkillFrameEnd();
            }
            // 中摇开始(每轮loop的开始,只触发一次)
            if (!middleFrameStarted && trackTime >= middleBeginTime && curLoop <= loopCount)
            if (!middleFrameStarted && frame >= skillConfig.StartupFrames && curLoop <= loopCount)
            {
                middleFrameStarted = true;
                skillBase.OnMiddleFrameStart(curLoop);
@@ -221,10 +234,10 @@
            // 多段攻击帧触发
            for (int hitIndex = 0; hitIndex < activeFrameCount; hitIndex++)
            {
                float activeFrameTime = activeFrames[hitIndex] / fps;
                if (!triggeredActiveFrame[hitIndex] && trackTime >= activeFrameTime)
                float activeFrame = activeFrames[hitIndex];
                if (!triggeredActiveFrame[hitIndex] && frame >= activeFrame)
                {
                    skillBase.OnMiddleFrameEnd(curLoop, hitIndex);
                    skillBase.OnMiddleFrameEnd(curLoop, triggerMFEndCount++);
                    triggeredActiveFrame[hitIndex] = true;
                }
            }
@@ -250,7 +263,7 @@
                if (curLoop < loopCount)
                {
                    // 重新设置到第一次的中摇时间
                    skillTrackEntry.TrackTime = middleBeginTime;
                    skillTrackEntry.TrackTime = skillConfig.StartupFrames / BattleConst.skillMotionFps;
                    beginPhaseTriggered = false;
                }
                else
@@ -264,16 +277,16 @@
            // 收尾阶段:OnFinalFrameStart 和 OnFinalFrameEnd
            if (curLoop >= loopCount)
            {
                if (!finalFrameStarted && trackTime >= recoveryFrameTime)
                if (!finalFrameStarted && frame >= recoveryFrame)
                {
                    finalFrameStarted = true;
                    skillBase.OnFinalFrameStart();
                }
                if (finalFrameStarted && !finalFrameEnded && trackTime >= recoveryFrameTime)
                if (finalFrameStarted && !finalFrameEnded && frame >= recoveryFrame)
                {
                    finalFrameEnded = true;
                    skillBase.OnFinalFrameEnd();
                    skeletonGraphic.UpdateLocal -= updateLocalHandler;
                    RemoveRunAction(updateLocalHandler);
                    isFinish = true;
                }
            }
@@ -284,7 +297,8 @@
            trackEntryCompleteDict[currentTrackEntry] = _onComplete;
        }
        skeletonGraphic.UpdateLocal += updateLocalHandler;
        RunAction(updateLocalHandler);
        return skillTrackEntry;
    }
@@ -334,7 +348,10 @@
    public virtual void Run()
    {
        for (int i = runActionList.Count - 1; i >= 0; i--)
        {
            runActionList[i]?.Invoke();
        }
    }
    public virtual void Pause()
@@ -352,6 +369,7 @@
    public void HaveRest()
    {
        trackEntryCompleteDict.Clear();
        runActionList.Clear();
        PlayAnimation(MotionName.idle, true);
    }