yyl
2026-04-22 b8f554f03a6114db353736741eda63bdd6c63854
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System.Collections.Generic;
using UnityEngine;
 
// SkillBase(SubSkill 部分):前置内嵌子技能的收集与投递。
//
// 规则:
//   从 packList 头部连续收集"纯静默前置子技能"(没有动作、非死亡复活、不触发死亡)
//   直到遇到任何一个"需要等待"的包(带动作/SkillType==8/HB422)就停止。
//   已收集的前置子技能按 packUID 排序后投递到 ownRecordAction.innerRecordPlayer。
//
// 子技能递归判断:
//   当遇到 CustomHB426CombinePack 时,使用 combinePack.NeedWaiting() 判断,
//   NeedWaiting 内部会递归检查嵌套的 CustomHB426CombinePack,
//   因此"子技能里面的子技能"也会被正确判断。
public partial class SkillBase
{
    protected void ProcessSubSkill()
    {
        // 按packUID排序所有子技能
        var allSubSkills = new List<(ulong packUID, SkillRecordAction action)>();
 
        List<GameNetPackBasic> removePackList = new List<GameNetPackBasic>();
 
        foreach (var pack in packList)
        {
            if (pack is HB427_tagSCUseSkill skillPack)
            {
                SkillConfig ssc = SkillConfig.Get((int)skillPack.SkillID);
                SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig();
                if (!string.IsNullOrEmpty(sscSkin.SkillMotionName))
                {
                    break;
                }
                if (ssc.SkillType == 8)
                {
                    break;
                }
                SkillRecordAction skillRecordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic> { skillPack });
                allSubSkills.Add((skillPack.packUID, skillRecordAction));
                removePackList.Add(pack);
            }
            else if (pack is HB422_tagMCTurnFightObjDead dead)
            {
                break;
            }
            else if (pack is CustomHB426CombinePack combinePack)
            {
                // 递归判断:combinePack 自身或其嵌套包里只要含有动作 / SkillType==8 / HB422,
                // 就视为"需要等待",不作为静默前置子技能处理,
                // 留给后续 ResolvePackList 走正常队列流程。
                // NeedWaiting() 内部已递归遍历嵌套的 CustomHB426CombinePack。
                if (combinePack.NeedWaiting())
                {
                    break;
                }
 
                HB427_tagSCUseSkill sp = combinePack.GetMainHB427SkillPack();
                SkillRecordAction skillRecordAction = combinePack.CreateSkillAction();
                allSubSkills.Add((sp.packUID, skillRecordAction));
                removePackList.Add(pack);
            }
        }
 
        for (int i = 0; i < removePackList.Count; i++)
        {
            packList.Remove(removePackList[i]);
        }
 
        // 按packUID排序
        allSubSkills.Sort((a, b) => a.packUID.CompareTo(b.packUID));
 
        foreach (var (packUID, recordAction) in allSubSkills)
        {
            // 经过 NeedWaiting 过滤后,此处 recordAction.useParentRecordPlayer 理论上始终为 false,
            // 保留分支是防御式编码,行为与原实现一致。
            if (recordAction.useParentRecordPlayer)
            {
                ownRecordAction.GetInnerRecordPlayer().PlayRecord(recordAction, ownRecordAction);
            }
            else
            {
                ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction);
            }
        }
    }
}