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);
|
}
|
}
|
}
|
}
|