From 19a7598ad9ae6e30a6e5096c104091ebe116d414 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 14 一月 2026 18:37:28 +0800
Subject: [PATCH] 125 战斗 修复内嵌技能中死亡播放技能的顺序问题(司马懿) 修复卑弥呼复活报错的问题
---
Main/System/Battle/Skill/SkillBase.cs | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 201 insertions(+), 31 deletions(-)
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index f07de9d..938659f 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -28,9 +28,6 @@
protected List<H0704_tagRolePackRefresh> dropPackList = new List<H0704_tagRolePackRefresh>();
protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
- protected List<SkillRecordAction> waitingCastSkillRecordAction = new List<SkillRecordAction>();
-
-
protected bool moveFinished = false;
public SkillBase fromSkill;
public bool isPlay = false;
@@ -500,44 +497,48 @@
skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack);
skillEffect.Play(OnHitTargets);
ProcessSubSkill();
- HandleWaitingCastSkill();
isPlay = true;
}
protected void ProcessSubSkill()
{
+ // 鎸塸ackUID鎺掑簭鎵�鏈夊瓙鎶�鑳�
+ var allSubSkills = new List<(ulong packUID, SkillRecordAction action)>();
+
foreach (var subSkillPack in tagUseSkillAttack.subSkillList)
{
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
- recordAction.fromSkill = this;
- // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
- waitingCastSkillRecordAction.Add(recordAction);
- battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
+ if (recordAction != null)
+ {
+ recordAction.fromSkill = this;
+ allSubSkills.Add((subSkillPack.packUID, recordAction));
+ }
}
tagUseSkillAttack.subSkillList.Clear();
+
foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
{
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
- recordAction.fromSkill = this;
- // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
- waitingCastSkillRecordAction.Add(recordAction);
+ if (recordAction != null)
+ {
+ recordAction.fromSkill = this;
+ ulong packUID = subCombinePack.packList.Count > 0 ? GetPackUID(subCombinePack.packList[0]) : 0;
+ allSubSkills.Add((packUID, recordAction));
+ }
}
tagUseSkillAttack.subSkillCombinePackList.Clear();
- waitingCastSkillRecordAction.OrderBy(recordAction => recordAction.hB427_TagSCUseSkill.packUID);
+ // 鎸塸ackUID鎺掑簭
+ allSubSkills.Sort((a, b) => a.packUID.CompareTo(b.packUID));
-
- }
-
- protected void HandleWaitingCastSkill()
- {
+ // 渚濇娣诲姞鍒皉ecordPlayer锛屾瘡涓瓑寰呭墠涓�涓畬鎴�
RecordAction waitingRecordAction = null;
-
- for (int i = 0; i < waitingCastSkillRecordAction.Count; i++)
+ foreach (var (packUID, recordAction) in allSubSkills)
{
- var recordAction = waitingCastSkillRecordAction[i];
-
+ // 銆愪娇鐢� BattleField.recordPlayer銆�
+ // 鍘熷洜锛氬瓙鎶�鑳芥槸鐙珛鐨凷killRecordAction锛屽簲璇ユ槸椤跺眰RecordAction锛岀敱BattleField鐨勪富RecordPlayer绠$悊
+ // 閫氳繃璁剧疆鐖跺瓙鍏崇郴鍜學aitingPlay锛屽彲浠ユ帶鍒跺瓙鎶�鑳界殑鎵ц鏃舵満
if (waitingRecordAction != null)
{
// 姣忎釜閮藉簲璇ョ瓑鍓嶄竴涓粨鏉熷悗
@@ -561,19 +562,19 @@
// 鎶�鑳戒腑鎽囧紑濮嬪洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗕腑鎽囧紑濮�
public virtual void OnMiddleFrameStart(int times)
{
- skillEffect?.OnMiddleFrameStart(times); // 淇锛氭坊鍔犵┖鍊兼鏌�
+ skillEffect.OnMiddleFrameStart(times); // 淇锛氭坊鍔犵┖鍊兼鏌�
}
// 鎶�鑳戒腑鎽囩粨鏉熷洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗕腑鎽囩粨鏉�
public virtual void OnMiddleFrameEnd(int times, int hitIndex)
{
- skillEffect?.OnMiddleFrameEnd(times, hitIndex); // 淇锛氭坊鍔犵┖鍊兼鏌�
+ skillEffect.OnMiddleFrameEnd(times, hitIndex); // 淇锛氭坊鍔犵┖鍊兼鏌�
}
// 鎶�鑳藉悗鎽囧紑濮嬪洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗗悗鎽囧紑濮�
public virtual void OnFinalFrameStart()
{
- skillEffect?.OnFinalFrameStart(); // 淇锛氭坊鍔犵┖鍊兼鏌�
+ skillEffect.OnFinalFrameStart(); // 淇锛氭坊鍔犵┖鍊兼鏌�
}
// 鎶�鑳藉悗鎽囩粨鏉熷洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗗悗鎽囩粨鏉�
@@ -899,7 +900,10 @@
if (refreshPack != null)
{
// 鍒嗗彂HP鍒锋柊鍖�
- PackageRegedit.Distribute(refreshPack);
+ // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+ // 鍘熷洜锛欻P鍒锋柊鍖呮槸鎶�鑳藉唴閮ㄤ骇鐢熺殑锛屽簲璇ョ敱褰撳墠SkillRecordAction鐨刬nnerRecordPlayer绠$悊
+ // 杩欐牱鍙互纭繚HP鍒锋柊涓庢妧鑳界殑鐢熷懡鍛ㄦ湡缁戝畾锛孎orceFinish鏃朵竴骞跺鐞�
+ PackageRegeditEx.DistributeToRecordAction(refreshPack, parentRecordAction);
packList.Remove(refreshPack);
}
}
@@ -910,13 +914,123 @@
List<BattleDeadPack> deadPackList = BattleUtility.FindDeadPack(packList);
if (deadPackList.Count <= 0) return;
+ // 鎵惧埌鏈�澶х殑姝讳骸鍖� packUID锛堝寘鎷浜″寘鍜屾浜¤Е鍙戞妧鑳斤級
+ ulong maxDeathPackUID = 0;
+ foreach (var deadPack in deadPackList)
+ {
+ if (deadPack.deadPack != null && deadPack.deadPack.packUID > maxDeathPackUID)
+ {
+ maxDeathPackUID = deadPack.deadPack.packUID;
+ }
+
+ if (deadPack.deadTriggerSkill != null)
+ {
+ var skillPack = deadPack.deadTriggerSkill.GetMainHB427SkillPack();
+ if (skillPack != null && skillPack.packUID > maxDeathPackUID)
+ {
+ maxDeathPackUID = skillPack.packUID;
+ }
+ }
+ }
+
+ // 濡傛灉鎵惧埌浜嗘浜″寘锛屾敹闆嗘墍鏈� packUID > maxDeathPackUID 鐨勫寘
+ if (maxDeathPackUID > 0)
+ {
+ BattleDebug.LogError($"SkillBase.HandleDead: 鎵惧埌姝讳骸鍖咃紝maxDeathPackUID = {maxDeathPackUID}锛屽紑濮嬫敹闆嗘浜″悗鐨勫寘");
+
+ // 1. 鏀堕泦 packList 涓� packUID 澶т簬姝讳骸鍖呯殑鍖�
+ List<GameNetPackBasic> packsToRemove = new List<GameNetPackBasic>();
+ foreach (var pack in packList)
+ {
+ ulong packUID = GetPackUID(pack);
+ if (packUID > maxDeathPackUID)
+ {
+ BattleDebug.LogError($"SkillBase.HandleDead: 浠巔ackList鏀堕泦姝讳骸鍚庣殑鍖� - Type: {pack.GetType().Name}, UID: {packUID}");
+ foreach (var deadPack in deadPackList)
+ {
+ deadPack.packListAfterDeath.Add(pack);
+ }
+ packsToRemove.Add(pack);
+ }
+ }
+
+ // 浠� packList 涓Щ闄よ繖浜涘寘
+ foreach (var pack in packsToRemove)
+ {
+ packList.Remove(pack);
+ }
+
+ // 2. 鏀堕泦 subSkillList 涓� packUID 澶т簬姝讳骸鍖呯殑瀛愭妧鑳�
+ if (tagUseSkillAttack.subSkillList != null && tagUseSkillAttack.subSkillList.Count > 0)
+ {
+ var subSkillsToRemove = new List<HB427_tagSCUseSkill>();
+ foreach (var subSkillPack in tagUseSkillAttack.subSkillList)
+ {
+ ulong subSkillUID = GetPackUID(subSkillPack);
+ if (subSkillUID > maxDeathPackUID)
+ {
+ BattleDebug.LogError($"SkillBase.HandleDead: 浠巗ubSkillList鏀堕泦姝讳骸鍚庣殑鍖� - Type: {subSkillPack.GetType().Name}, UID: {subSkillUID}");
+ foreach (var deadPack in deadPackList)
+ {
+ deadPack.packListAfterDeath.Add(subSkillPack);
+ }
+ subSkillsToRemove.Add(subSkillPack);
+ }
+ }
+
+ // 浠� subSkillList 涓Щ闄よ繖浜涘瓙鎶�鑳�
+ foreach (var subSkill in subSkillsToRemove)
+ {
+ tagUseSkillAttack.subSkillList.Remove(subSkill);
+ }
+ }
+
+ // 3. 鏀堕泦 subSkillCombinePackList 涓� packUID 澶т簬姝讳骸鍖呯殑缁勫悎鍖�
+ if (tagUseSkillAttack.subSkillCombinePackList != null && tagUseSkillAttack.subSkillCombinePackList.Count > 0)
+ {
+ var combinePacksToRemove = new List<CustomHB426CombinePack>();
+ foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
+ {
+ // 鎵惧埌缁勫悎鍖呬腑鐨勬渶灏� packUID锛堢粍鍚堝寘鐨� packUID 浠ョ涓�涓寘涓哄噯锛�
+ ulong combinePackUID = 0;
+ if (subCombinePack.packList != null && subCombinePack.packList.Count > 0)
+ {
+ combinePackUID = GetPackUID(subCombinePack.packList[0]);
+ }
+
+ if (combinePackUID > maxDeathPackUID)
+ {
+ BattleDebug.LogError($"SkillBase.HandleDead: 浠巗ubSkillCombinePackList鏀堕泦姝讳骸鍚庣殑鍖� - UID: {combinePackUID}, 鍖呭惈 {subCombinePack.packList.Count} 涓瓙鍖�");
+ // 灏嗙粍鍚堝寘涓殑鎵�鏈夊寘閮芥坊鍔犲埌 packListAfterDeath
+ foreach (var pack in subCombinePack.packList)
+ {
+ foreach (var deadPack in deadPackList)
+ {
+ deadPack.packListAfterDeath.Add(pack);
+ }
+ }
+ combinePacksToRemove.Add(subCombinePack);
+ }
+ }
+
+ // 浠� subSkillCombinePackList 涓Щ闄よ繖浜涚粍鍚堝寘
+ foreach (var combinePack in combinePacksToRemove)
+ {
+ tagUseSkillAttack.subSkillCombinePackList.Remove(combinePack);
+ }
+ }
+ }
+
CheckAfterDeadhPack();
// 淇锛氬厛鏀堕泦瑕佸垹闄ょ殑鍖咃紝閬垮厤鍦╢oreach涓慨鏀归泦鍚�
var dropPacksToRemove = new List<H0704_tagRolePackRefresh>(dropPackList);
foreach (var _dropPack in dropPacksToRemove)
{
- PackageRegedit.Distribute(_dropPack);
+ // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+ // 鍘熷洜锛氭帀钀藉寘鏄妧鑳芥晥鏋滅殑涓�閮ㄥ垎锛屽簲璇ョ敱褰撳墠SkillRecordAction绠$悊
+ // 鎺夎惤鍖呯殑鍒嗗彂涓庢妧鑳藉畬鎴愮粦瀹氾紝纭繚鍦ㄦ妧鑳紽orceFinish鏃舵纭鐞�
+ PackageRegeditEx.DistributeToRecordAction(_dropPack, parentRecordAction);
packList.Remove(_dropPack);
}
@@ -991,6 +1105,48 @@
for (int i = 0; i < itemList.Count; i++)
dropAssign[i % deadCount].Add(itemList[i]);
return dropAssign;
+ }
+
+ // 鑾峰彇鍖呯殑 packUID
+ protected ulong GetPackUID(GameNetPackBasic pack)
+ {
+ if (pack == null) return 0;
+
+ if (pack is HB422_tagMCTurnFightObjDead deadPack)
+ return deadPack.packUID;
+
+ if (pack is CustomHB426CombinePack combinePack)
+ {
+ var mainSkillPack = combinePack.GetMainHB427SkillPack();
+ return mainSkillPack?.packUID ?? 0;
+ }
+
+ if (pack is HB427_tagSCUseSkill skillPack)
+ return skillPack.packUID;
+
+ if (pack is HB428_tagSCBuffRefresh buffRefresh)
+ return buffRefresh.packUID;
+
+ if (pack is HB429_tagSCBuffDel buffDel)
+ return buffDel.packUID;
+
+ if (pack is HB419_tagSCObjHPRefresh hpRefresh)
+ return hpRefresh.packUID;
+
+ if (pack is HB405_tagMCAddExp expPack)
+ return expPack.packUID;
+
+ if (pack is H0704_tagRolePackRefresh dropPack)
+ return dropPack.packUID;
+
+ // 灏濊瘯閫氳繃鍙嶅皠鑾峰彇 packUID
+ var packUIDField = pack.GetType().GetField("packUID");
+ if (packUIDField != null)
+ {
+ return (ulong)packUIDField.GetValue(pack);
+ }
+
+ return 0;
}
// 鍒嗛厤缁忛獙鍊硷細灏嗙粡楠屽寘骞冲潎鍒嗛厤缁欐瘡涓浜″璞�
@@ -1198,7 +1354,10 @@
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
recordAction.fromSkill = this;
otherSkillActionList.Add(recordAction);
- // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+
+ // 銆愪娇鐢� BattleField.recordPlayer銆�
+ // 鍘熷洜锛氬嵆浣垮湪ForceFinished涓紝瀛愭妧鑳戒篃鏄《灞俁ecordAction锛屽簲璇ョ敱涓籖ecordPlayer绠$悊
+ // 杩欎簺瀛愭妧鑳戒細绔嬪嵆琚獸orceFinish锛屼絾浠嶉渶瑕佹纭殑鎾斁鍣ㄤ笂涓嬫枃
battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
}
tagUseSkillAttack.subSkillList.Clear();
@@ -1207,7 +1366,9 @@
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
recordAction.fromSkill = this;
otherSkillActionList.Add(recordAction);
- // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+
+ // 銆愪娇鐢� BattleField.recordPlayer銆�
+ // 鍘熷洜锛氬嵆浣垮湪ForceFinished涓紝瀛愭妧鑳戒篃鏄《灞俁ecordAction锛屽簲璇ョ敱涓籖ecordPlayer绠$悊
battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
}
tagUseSkillAttack.subSkillCombinePackList.Clear();
@@ -1298,7 +1459,10 @@
{
if (pack is CustomB421ActionPack actionPack)
actionPack.Distribute();
- PackageRegedit.Distribute(pack);
+ // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+ // 鍘熷洜锛欶orceFinished鏃跺墿浣欑殑鍖呬篃鏄妧鑳藉唴閮ㄤ骇鐢熺殑锛屽簲璇ョ敱innerRecordPlayer绠$悊
+ // 杩欐牱鍙互纭繚鍗充娇寮哄埗缁撴潫锛屽寘鐨勫鐞嗕篃鍦ㄦ纭殑涓婁笅鏂囦腑
+ PackageRegeditEx.DistributeToRecordAction(pack, parentRecordAction);
}
}
}
@@ -1408,7 +1572,10 @@
}
else
{
- PackageRegedit.Distribute(pack);
+ // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+ // 鍘熷洜锛氭妧鑳芥墽琛岃繃绋嬩腑鐨勫寘锛圔uff銆佸睘鎬у埛鏂扮瓑锛夋槸鎶�鑳芥晥鏋滅殑涓�閮ㄥ垎
+ // 搴旇鐢盨killRecordAction鐨刬nnerRecordPlayer绠$悊锛岀‘淇濅笌鎶�鑳界敓鍛藉懆鏈熶竴鑷�
+ PackageRegeditEx.DistributeToRecordAction(pack, parentRecordAction);
}
}
@@ -1476,7 +1643,10 @@
foreach (var pack in buffPacks)
{
- PackageRegedit.Distribute(pack);
+ // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+ // 鍘熷洜锛欱uff鍖呮槸鎶�鑳芥晥鏋滅殑鏍稿績缁勬垚閮ㄥ垎锛屽簲璇ョ敱SkillRecordAction绠$悊
+ // 鍗充娇鏄己鍒跺垎鍙戠殑鎯呭喌锛屼篃瑕佷繚鎸佸湪姝g‘鐨凴ecordAction涓婁笅鏂囦腑
+ PackageRegeditEx.DistributeToRecordAction(pack, parentRecordAction);
}
}
--
Gitblit v1.8.0