From ed9bf64c03bf5fee5e115645de5a975baaa9041d Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 09 一月 2026 11:04:53 +0800
Subject: [PATCH] 125 战斗 修改死亡表现 带动作的子技能同时触发导致的卡死
---
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs | 271 ++++++++++++++++++++
Main/System/Battle/Motion/MotionBase.cs | 29 ++
Main/System/Battle/BattleField/BattleField.cs | 12
Main/System/Battle/RecordPlayer/RecordAction.cs | 121 +++++++++
Main/System/Battle/RecordPlayer/RecordPlayer.cs | 69 ++++
Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs | 7
Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs | 6
Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs | 6
Main/System/Battle/BattleObject/BattleObject.cs | 4
Main/System/Battle/Skill/SkillBase.cs | 122 ++++++++-
Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs | 7
Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs | 73 +++++
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs | 47 +++
13 files changed, 743 insertions(+), 31 deletions(-)
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
index c072818..f3ee457 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
@@ -86,6 +86,10 @@
}
}
#if UNITY_EDITOR
+ // 瑙f瀽鎵�鏈塿PackList閲岀殑姣忎釜瀛楁锛堟繁搴︼級骞朵笖杈撳嚭鍒癆pplication.dataPath + "/../BattleReport/PackageDetailAnalysis_鏃堕棿鎴�.txt鏂囦欢閲�
+
+
+
string originPack = string.Empty;
BattleField battleField = BattleManager.Instance.GetBattleField(guid);
@@ -172,7 +176,23 @@
}
#endif
-
+#region Start Print Pack List Detail
+ if (Launch.Instance.isOpenSkillLogFile)
+ {
+ try
+ {
+ string detailAnalysis = PrintPackageDetailAnalysis(vPackList, guid);
+ string filePath = Application.dataPath + "/../BattleReport/PackageDetailAnalysis_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
+ System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(filePath));
+ System.IO.File.WriteAllText(filePath, detailAnalysis);
+ Debug.Log("鍖呰缁嗗垎鏋愬凡淇濆瓨鍒�: " + filePath);
+ }
+ catch (Exception e)
+ {
+ Debug.LogError("淇濆瓨鍖呰缁嗗垎鏋愬け璐�: " + e.Message);
+ }
+ }
+#endregion
for (int i = 0; i < vPackList.Count; i++)
{
@@ -571,4 +591,253 @@
}
return returnList;
}
+
+#if UNITY_EDITOR
+ /// <summary>
+ /// 娣卞害瑙f瀽鍖呭垪琛ㄤ腑鐨勬墍鏈夊瓧娈�
+ /// </summary>
+ private string PrintPackageDetailAnalysis(List<GameNetPackBasic> packList, string guid)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine("=====================================================");
+ sb.AppendLine("鎴樻姤鍖呰缁嗗垎鏋� - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+ sb.AppendLine("GUID: " + guid);
+ sb.AppendLine("鍖呮�绘暟: " + packList.Count);
+ sb.AppendLine("=====================================================\n");
+
+ BattleField battleField = BattleManager.Instance.GetBattleField(guid);
+
+ for (int i = 0; i < packList.Count; i++)
+ {
+ sb.AppendLine($"銆愬寘 #{i}銆� ==========================================");
+ PrintObjectDetail(sb, packList[i], 0, battleField, new HashSet<object>());
+ sb.AppendLine();
+ }
+
+ return sb.ToString();
+ }
+
+ /// <summary>
+ /// 閫掑綊鎵撳嵃瀵硅薄鐨勬墍鏈夊瓧娈靛拰灞炴��
+ /// </summary>
+ private void PrintObjectDetail(StringBuilder sb, object obj, int indent, BattleField battleField, HashSet<object> visitedObjects)
+ {
+ if (obj == null)
+ {
+ sb.AppendLine(GetIndent(indent) + "null");
+ return;
+ }
+
+ Type type = obj.GetType();
+ string indentStr = GetIndent(indent);
+
+ // 闃叉寰幆寮曠敤
+ if (visitedObjects.Contains(obj))
+ {
+ sb.AppendLine(indentStr + $"<寰幆寮曠敤: {type.Name}>");
+ return;
+ }
+
+ // 鍩烘湰绫诲瀷鍜屽瓧绗︿覆鐩存帴杈撳嚭
+ if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal))
+ {
+ sb.AppendLine(indentStr + obj.ToString());
+ return;
+ }
+
+ // 鏋氫妇绫诲瀷
+ if (type.IsEnum)
+ {
+ sb.AppendLine(indentStr + $"{obj} ({(int)obj})");
+ return;
+ }
+
+ // 娣诲姞鍒板凡璁块棶闆嗗悎锛堜粎瀵瑰紩鐢ㄧ被鍨嬶級
+ if (!type.IsValueType)
+ {
+ visitedObjects.Add(obj);
+ }
+
+ // 杈撳嚭绫诲瀷鍚�
+ sb.AppendLine(indentStr + $"[{type.Name}]");
+
+ // 澶勭悊鏁扮粍
+ if (type.IsArray)
+ {
+ Array array = obj as Array;
+ sb.AppendLine(indentStr + $"Length: {array.Length}");
+
+ if (array.Length > 0)
+ {
+ for (int i = 0; i < array.Length; i++)
+ {
+ sb.AppendLine(indentStr + $" [{i}]:");
+ PrintObjectDetail(sb, array.GetValue(i), indent + 2, battleField, visitedObjects);
+ }
+ }
+ return;
+ }
+
+ // 澶勭悊List銆丠ashSet绛夐泦鍚�
+ if (obj is System.Collections.IEnumerable && !(obj is string))
+ {
+ var enumerable = obj as System.Collections.IEnumerable;
+ int count = 0;
+ var enumerator = enumerable.GetEnumerator();
+ while (enumerator.MoveNext()) count++;
+
+ sb.AppendLine(indentStr + $"Count: {count}");
+
+ if (count > 0)
+ {
+ int index = 0;
+ foreach (var item in enumerable)
+ {
+ sb.AppendLine(indentStr + $" [{index}]:");
+ PrintObjectDetail(sb, item, indent + 2, battleField, visitedObjects);
+ index++;
+ }
+ }
+ return;
+ }
+
+ // 鑾峰彇鎵�鏈夊叕鍏卞瓧娈�
+ var fields = type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
+
+ foreach (var field in fields)
+ {
+ // 璺宠繃Unity鍜孲ystem搴撶殑澶嶆潅绫诲瀷锛堜絾淇濈暀鍩烘湰绫诲瀷锛�
+ Type fieldType = field.FieldType;
+ if (ShouldSkipType(fieldType))
+ {
+ continue;
+ }
+
+ try
+ {
+ object value = field.GetValue(obj);
+
+ // 鐗规畩澶勭悊锛氭樉绀篛bjID瀵瑰簲鐨勬灏嗗悕瀛�
+ if (field.Name == "ObjID" && value is uint objId && battleField != null)
+ {
+ var battleObj = battleField.battleObjMgr.GetBattleObject((int)objId);
+ string heroName = battleObj?.teamHero?.name ?? "Unknown";
+ sb.AppendLine(indentStr + $" {field.Name} ({fieldType.Name}): {value} [{heroName}]");
+ }
+ // 鐗规畩澶勭悊锛氭樉绀篠killID瀵瑰簲鐨勬妧鑳藉悕瀛�
+ else if (field.Name == "SkillID" && value is uint skillId)
+ {
+ string skillName = SkillConfig.Get((int)skillId)?.SkillName ?? "Unknown";
+ sb.AppendLine(indentStr + $" {field.Name} ({fieldType.Name}): {value} [{skillName}]");
+ }
+ // 鐗规畩澶勭悊锛氭樉绀篐eroID瀵瑰簲鐨勮嫳闆勫悕瀛�
+ else if (field.Name == "HeroID" && value is uint heroId)
+ {
+ string heroName = HeroConfig.Get((int)heroId)?.Name ?? "Unknown";
+ sb.AppendLine(indentStr + $" {field.Name} ({fieldType.Name}): {value} [{heroName}]");
+ }
+ else if (IsSimpleType(fieldType))
+ {
+ sb.AppendLine(indentStr + $" {field.Name} ({fieldType.Name}): {value}");
+ }
+ else
+ {
+ sb.AppendLine(indentStr + $" {field.Name} ({fieldType.Name}):");
+ PrintObjectDetail(sb, value, indent + 2, battleField, visitedObjects);
+ }
+ }
+ catch (Exception e)
+ {
+ sb.AppendLine(indentStr + $" {field.Name}: <瑙f瀽閿欒: {e.Message}>");
+ }
+ }
+
+ // 鑾峰彇鎵�鏈夊叕鍏卞睘鎬�
+ var properties = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
+
+ foreach (var prop in properties)
+ {
+ // 璺宠繃绱㈠紩鍣�
+ if (prop.GetIndexParameters().Length > 0)
+ {
+ continue;
+ }
+
+ // 璺宠繃Unity鍜孲ystem搴撶殑澶嶆潅绫诲瀷
+ Type propType = prop.PropertyType;
+ if (ShouldSkipType(propType))
+ {
+ continue;
+ }
+
+ // 鍙鍙栨湁getter鐨勫睘鎬�
+ if (!prop.CanRead)
+ {
+ continue;
+ }
+
+ try
+ {
+ object value = prop.GetValue(obj, null);
+
+ if (IsSimpleType(propType))
+ {
+ sb.AppendLine(indentStr + $" {prop.Name} ({propType.Name}): {value}");
+ }
+ else
+ {
+ sb.AppendLine(indentStr + $" {prop.Name} ({propType.Name}):");
+ PrintObjectDetail(sb, value, indent + 2, battleField, visitedObjects);
+ }
+ }
+ catch (Exception e)
+ {
+ sb.AppendLine(indentStr + $" {prop.Name}: <瑙f瀽閿欒: {e.Message}>");
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鍒ゆ柇鏄惁涓虹畝鍗曠被鍨嬶紙鐩存帴杈撳嚭鍊硷級
+ /// </summary>
+ private bool IsSimpleType(Type type)
+ {
+ return type.IsPrimitive ||
+ type == typeof(string) ||
+ type == typeof(decimal) ||
+ type == typeof(DateTime) ||
+ type.IsEnum;
+ }
+
+ /// <summary>
+ /// 鍒ゆ柇鏄惁搴旇璺宠繃璇ョ被鍨嬶紙Unity鍜孲ystem搴撶殑澶嶆潅绫诲瀷锛�
+ /// </summary>
+ private bool ShouldSkipType(Type type)
+ {
+ if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal) || type.IsEnum)
+ {
+ return false;
+ }
+
+ string typeNamespace = type.Namespace ?? "";
+
+ // 璺宠繃Unity鐩稿叧绫诲瀷锛堥櫎浜嗗熀鏈被鍨嬶級
+ if (typeNamespace.StartsWith("UnityEngine") ||
+ typeNamespace.StartsWith("Unity.") ||
+ typeNamespace.StartsWith("System.") && !typeNamespace.StartsWith("System.Collections"))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// 鑾峰彇缂╄繘瀛楃涓�
+ /// </summary>
+ private string GetIndent(int indent)
+ {
+ return new string(' ', indent * 2);
+ }
+#endif
}
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 00bb580..760a665 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -510,7 +510,7 @@
}
}
- public virtual void OnObjsDead(List<BattleDeadPack> deadPackList)
+ public virtual void OnObjsDead(List<BattleDeadPack> deadPackList, RecordAction causingRecordAction = null)
{
if (deadPackList.Count > 0)
{
@@ -545,7 +545,15 @@
if (validDeadList.Count > 0)
{
DeathRecordAction recordAction = new DeathRecordAction(this, validDeadList);
- recordPlayer.ImmediatelyPlay(recordAction);
+ // 濡傛灉鏈夊鑷存浜$殑鎶�鑳斤紝灏咲eathRecordAction浣滀负鍏跺瓙鑺傜偣锛屽苟璁剧疆涓篧aitingPlay
+ if (causingRecordAction != null)
+ {
+ recordPlayer.ImmediatelyPlay(recordAction, causingRecordAction, true);
+ }
+ else
+ {
+ recordPlayer.ImmediatelyPlay(recordAction);
+ }
}
}
}
diff --git a/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs b/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
index 1f0c5bc..5a46323 100644
--- a/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
@@ -22,6 +22,7 @@
{
base.Run();
+ isActionCompleted = true;
isFinish = true;
onComplete?.Invoke();
}
@@ -34,6 +35,11 @@
onComplete?.Invoke();
}
+ public override bool IsActionCompleted()
+ {
+ return isActionCompleted || isFinish;
+ }
+
public override bool IsFinished()
{
return isFinish;
diff --git a/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
index 6321135..e01ae0b 100644
--- a/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
@@ -16,6 +16,11 @@
return isFinish;
}
+ public override bool IsActionCompleted()
+ {
+ return isActionCompleted || isFinish;
+ }
+
public override void Run()
{
@@ -55,6 +60,7 @@
private void StartBattleCallback()
{
+ isActionCompleted = true;
isFinish = true;
EventBroadcast.Instance.Broadcast(EventName.DISPLAY_BATTLE_UI, battleField.guid, true);
battleField.DistributeNextPackage();
diff --git a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
index bcd04bd..c46e151 100644
--- a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
@@ -15,10 +15,28 @@
protected Dictionary<int, bool> dropStateDict = new Dictionary<int, bool>();
- public DeathRecordAction(BattleField _battleField, List<BattleDeadPack> _deadPackList)
+ protected RecordAction causingRecordAction = null;
+
+ protected bool hasDeathTriggerSkill = false;
+
+ public DeathRecordAction(BattleField _battleField, List<BattleDeadPack> _deadPackList, RecordAction _causingRecordAction = null)
: base(RecordActionType.Death, _battleField, null)
{
deadPackList = _deadPackList;
+ causingRecordAction = _causingRecordAction;
+ CheckHasDeathTriggerSkill();
+ }
+
+ protected void CheckHasDeathTriggerSkill()
+ {
+ foreach (var battleDeadPack in deadPackList)
+ {
+ if (battleDeadPack.deadTriggerSkill != null)
+ {
+ hasDeathTriggerSkill = true;
+ break;
+ }
+ }
}
@@ -42,6 +60,10 @@
if (null != skillAction)
{
deathActionDict.Add(battleDeadPack, skillAction);
+ // 姝讳骸瑙﹀彂鎶�鑳介兘璁剧疆WaitingPlay=true锛岀瓑寰呯埗鑺傜偣鍔ㄤ綔瀹屾垚
+ // 濡傛灉DeathRecordAction鏈夌埗鑺傜偣锛堝鑷存浜$殑鎶�鑳斤級锛屽垯绛夊緟閭d釜鐖惰妭鐐�
+ // 鍚﹀垯绛夊緟DeathRecordAction鏈韩
+ battleField.recordPlayer.ImmediatelyPlay(skillAction, causingRecordAction == null ? this : causingRecordAction, true);
}
}
else
@@ -78,6 +100,11 @@
deathActionDict.Remove(key);
}
+ if (0 == deathActionDict.Count)
+ {
+ hasDeathTriggerSkill = false;
+ }
+
int completeNum = 0;
foreach (var kv in deadActionStatesDict)
@@ -90,9 +117,18 @@
if (completeNum == deadPackList.Count)
{
+ isActionCompleted = true;
isFinish = true;
}
}
+ }
+
+
+
+ // 閲嶅啓IsActionCompleted锛屾浜″姩浣滄槸鍚﹀畬鎴�
+ public override bool IsActionCompleted()
+ {
+ return isActionCompleted || isFinish;
}
private Func<bool> CreateDeadActionState(BattleDeadPack deadPack, bool withoutAnime = false)
@@ -166,4 +202,39 @@
deadObj.PerformDrop();
}
}
+
+ protected bool HasDeathTriggerSkill()
+ {
+ return hasDeathTriggerSkill;
+ }
+
+ public override bool CanStartExecution()
+ {
+ // 濡傛灉涓嶆槸WaitingPlay妯″紡锛岀洿鎺ュ彲浠ユ墽琛�
+ if (!isWaitingPlay)
+ {
+ return true;
+ }
+
+ // 濡傛灉娌℃湁鐖惰妭鐐癸紝涔熷彲浠ユ墽琛�
+ if (parentAction == null)
+ {
+ return true;
+ }
+
+ // 鍙互鍏堟墽琛屾病鏈夋浜¤Е鍙戞妧鑳界殑姝讳骸鍔ㄤ綔
+ if (!HasDeathTriggerSkill())
+ {
+ return true;
+ }
+
+ // WaitingPlay妯″紡涓嬶紝闇�瑕佺瓑寰呯洿鎺ョ埗鑺傜偣鐨勫姩浣滃畬鎴愶紙涓嶇鐖惰妭鐐规槸鍚aitingPlay锛�
+ if (!parentAction.IsActionCompleted())
+ {
+ BattleDebug.LogError($"RecordAction.CanStartExecution: {this.GetType().Name} 绛夊緟鐖惰妭鐐� {parentAction.GetType().Name} 鍔ㄤ綔瀹屾垚");
+ return false;
+ }
+
+ return true;
+ }
}
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
index 109c976..b0eb08f 100644
--- a/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
@@ -36,6 +36,12 @@
}
}
+ // 閲嶅啓IsActionCompleted锛屽綋鍔ㄧ敾鎾斁缁撴潫鏃舵爣璁颁负瀹屾垚
+ public override bool IsActionCompleted()
+ {
+ return isActionCompleted || isFinish;
+ }
+
// 鍋氫竴涓粠閫忔槑鍒版仮澶嶇殑娓愬彉鐨勫悓鏃� 鎾斁鐗规晥
public void PlayRebornEffect()
{
@@ -58,6 +64,7 @@
battleObject?.AfterReborn();
actionCallback?.Invoke();
actionCallback = null;
+ isActionCompleted = true; // 鏍囪鍔ㄤ綔瀹屾垚
isFinish = true;
}));
diff --git a/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs b/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs
index 9587aa2..968a75e 100644
--- a/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/RoundChangeAction.cs
@@ -18,6 +18,7 @@
return;
roundChangeCallback?.Invoke();
+ isActionCompleted = true;
isFinish = true;
}
@@ -27,6 +28,12 @@
return;
base.Run();
roundChangeCallback?.Invoke();
+ isActionCompleted = true;
isFinish = true;
}
+
+ public override bool IsActionCompleted()
+ {
+ return isActionCompleted || isFinish;
+ }
}
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
index 8f13aa1..e6cb300 100644
--- a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -5,6 +5,8 @@
{
protected SkillBase skillBase;
+ public HB427_tagSCUseSkill hB427_TagSCUseSkill;
+
private bool isCast = false;
public SkillBase fromSkill = null;
@@ -15,12 +17,26 @@
// Debug.LogError("_caster == null : " + (_caster == null));
skillBase = SkillFactory.CreateSkill(_caster, vNetData, packList, _battleField);
-
+ hB427_TagSCUseSkill = vNetData;
if (null == skillBase)
{
BattleUtility.ForceFinishBattlePackList(battleField, packList);
}
+ else
+ {
+ // 璁㏒killBase鐭ラ亾鑷繁鐨凴ecordAction
+ skillBase.SetParentRecordAction(this);
+ }
}
+ public override bool IsNeedWaiting()
+ {
+ if (skillBase == null)
+ {
+ return false;
+ }
+ return !string.IsNullOrEmpty(skillBase.skillConfig.SkillMotionName);
+ }
+
public override bool IsFinished()
{
@@ -29,6 +45,16 @@
return true;
}
return skillBase.IsFinished();
+ }
+
+ // 妫�鏌ヨ嚜韬姩浣滄槸鍚﹀畬鎴愶紙涓嶅寘鎷瓙鑺傜偣锛�
+ public override bool IsActionCompleted()
+ {
+ if (null == skillBase)
+ {
+ return true;
+ }
+ return skillBase.IsFinishedForJudge();
}
public bool IsFinishedForJudge()
@@ -49,6 +75,23 @@
}
base.ForceFinish();
}
+
+ public override bool CanStartExecution()
+ {
+ if (null == skillBase)
+ {
+ return false;
+ }
+
+ if (!skillBase.CanStartExecution())
+ {
+ return false;
+ }
+
+
+ return base.CanStartExecution();
+ }
+
public override void Run()
{
@@ -67,6 +110,8 @@
if (isCast)
return;
+ Played();
+
if (fromSkill != null)
{
BattleDebug.LogError("cast skill from skill : " + fromSkill.skillConfig.SkillID);
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index 71a9942..cba9472 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -315,7 +315,7 @@
return true;
}
- public virtual void Hurt(BattleHurtParam battleHurtParam)
+ public virtual void Hurt(BattleHurtParam battleHurtParam, RecordAction causingRecordAction = null)
{
bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
bool firstHit = battleHurtParam.hitIndex == 0;
@@ -352,7 +352,7 @@
{
PushDropItems(battleHurtParam.battleDrops);
}
- battleField.OnObjsDead(new List<BattleDeadPack>() { battleHurtParam.deadPack });
+ battleField.OnObjsDead(new List<BattleDeadPack>() { battleHurtParam.deadPack }, causingRecordAction);
}
else
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 673ddbd..87bddfe 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using UnityEngine;
using Spine.Unity;
+using Cysharp.Threading.Tasks;
public class MotionBase
{
@@ -64,6 +65,7 @@
PlayAnimation(MotionName.idle, true);
SetupAnimationHandlers();
+ skillTrack = null;
if (skelAnim.gameObject != null)
illusionShadow = skelAnim.gameObject.AddMissingComponent<SkeletonIllusionShadow>();
@@ -173,6 +175,9 @@
return ExecuteSkillAnim(skillConfig, skillBase, onComplete, targetAnim, true, isSubSkill);
}
+ private Spine.TrackEntry skillTrack = null;
+
+
private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete,
Spine.Animation targetAnim, bool hasAnim, bool isSubSkill)
{
@@ -215,10 +220,22 @@
}
}
- Spine.TrackEntry skillTrack = null;
if (hasAnim)
{
+ if (null != skillTrack)
+ {
+ //绛夊緟涓婁竴鎶�鑳藉姩鐢荤粨鏉� 鏆傛椂澶勭悊鍔炴硶
+ UniTaskExtension.DelayFrames((GameObject)null, 1, () =>
+ {
+ if (skillBase != null && !skillBase.IsFinished())
+ {
+ PlaySkillAnimation(skillConfig, skillBase, isSubSkill, onComplete);
+ }
+ });
+ return null;
+ }
+
skillTrack = animState.SetAnimation(trackIndex, targetAnim, false);
if (null == skillTrack)
{
@@ -441,6 +458,7 @@
RemoveAction(frameHandler);
onComplete?.Invoke();
skillBase.OnFinalFrameEnd();
+ skillTrack = null;
}
}
};
@@ -599,6 +617,8 @@
availableSubTracks.Enqueue(i);
currentTrack = null;
+
+ skillTrack = null;
playingSkillAnim = false;
PlayAnimation(MotionName.idle, true);
@@ -657,7 +677,7 @@
skeleton.SetToSetupPose();
// skeleton.UpdateWorldTransform();
}
-
+ skillTrack = null;
// 10. 鎾斁寰呮満鍔ㄧ敾
PlayAnimation(MotionName.idle, true);
skeletonAnim.LateUpdate();
@@ -678,4 +698,9 @@
}
}
+ public bool CanCastSkill()
+ {
+ // 涓婃閲婃斁鐨勬妧鑳� 閲婃斁缁撴潫浜嗘病鏈�
+ return !playingSkillAnim;
+ }
}
\ No newline at end of file
diff --git a/Main/System/Battle/RecordPlayer/RecordAction.cs b/Main/System/Battle/RecordPlayer/RecordAction.cs
index bc5ee39..76bdc10 100644
--- a/Main/System/Battle/RecordPlayer/RecordAction.cs
+++ b/Main/System/Battle/RecordPlayer/RecordAction.cs
@@ -14,6 +14,19 @@
protected bool isRunOnce = false;
+ // ===== 鐖跺瓙鍏崇郴鍜岀瓑寰呮満鍒� =====
+ // 鐖禦ecordAction寮曠敤锛堝鏋滄槸閫氳繃鍏朵粬RecordAction鍐呴儴瑙﹀彂鐨勶級
+ public RecordAction parentAction;
+
+ // 瀛怰ecordAction鍒楄〃锛堟RecordAction鍐呴儴瑙﹀彂鐨勫叾浠朢ecordAction锛�
+ protected List<RecordAction> childActionList = new List<RecordAction>();
+
+ // 鏄惁鏄疻aitingPlay妯″紡锛堥渶瑕佺瓑寰呯埗鑺傜偣鍔ㄤ綔瀹屾垚锛�
+ public bool isWaitingPlay = false;
+
+ // 鑷韩鍔ㄤ綔鏄惁瀹屾垚锛堜笉鍖呮嫭瀛愯妭鐐圭殑瀹屾垚鐘舵�侊級
+ protected bool isActionCompleted = false;
+
public RecordAction(RecordActionType _actionType, BattleField _battleField, BattleObject _battleObj)
{
actionType = _actionType;
@@ -21,11 +34,105 @@
battleObject = _battleObj;
}
+ public virtual void Played()
+ {
+
+ }
+
public RecordActionType actionType;
+ // 娣诲姞瀛怰ecordAction
+ public virtual void AddChildAction(RecordAction child)
+ {
+ if (child == null) return;
+
+ // 闃叉閲嶅娣诲姞
+ if (childActionList.Contains(child)) return;
+
+ // 闃叉寰幆渚濊禆
+ if (child == this)
+ {
+ BattleDebug.LogError("RecordAction.AddChildAction: 涓嶈兘灏嗚嚜宸辨坊鍔犱负瀛愯妭鐐�");
+ return;
+ }
+
+ childActionList.Add(child);
+ BattleDebug.LogError($"RecordAction.AddChildAction: {this.GetType().Name} 娣诲姞瀛愯妭鐐� {child.GetType().Name}");
+ }
+
+ // 璁剧疆鐖禦ecordAction
+ public virtual void SetParentAction(RecordAction parent)
+ {
+ parentAction = parent;
+ if (parent != null)
+ {
+ BattleDebug.LogError($"RecordAction.SetParentAction: {this.GetType().Name} 鐨勭埗鑺傜偣璁剧疆涓� {parent.GetType().Name}");
+ }
+ }
+
+ // 璁剧疆WaitingPlay鏍囪
+ public virtual void SetWaitingPlay(bool waiting)
+ {
+ isWaitingPlay = waiting;
+ BattleDebug.LogError($"RecordAction.SetWaitingPlay: {this.GetType().Name} WaitingPlay={waiting}");
+ }
+
+ // 妫�鏌ヨ嚜韬姩浣滄槸鍚﹀畬鎴愶紙涓嶅寘鎷瓙鑺傜偣锛�
+ // 瀛愮被搴旇閲嶅啓姝ゆ柟娉曟潵瀹炵幇鑷繁鐨勫姩浣滃畬鎴愬垽鏂�
+ public virtual bool IsActionCompleted()
+ {
+ return isActionCompleted;
+ }
+
+ // 妫�鏌ユ槸鍚﹀彲浠ュ紑濮嬫墽琛岋紙WaitingPlay鏉′欢妫�鏌ワ級
+ public virtual bool CanStartExecution()
+ {
+ // 濡傛灉涓嶆槸WaitingPlay妯″紡锛岀洿鎺ュ彲浠ユ墽琛�
+ if (!isWaitingPlay)
+ {
+ return true;
+ }
+
+ // 濡傛灉娌℃湁鐖惰妭鐐癸紝涔熷彲浠ユ墽琛�
+ if (parentAction == null)
+ {
+ return true;
+ }
+
+ // WaitingPlay妯″紡涓嬶紝闇�瑕佺瓑寰呯洿鎺ョ埗鑺傜偣鐨勫姩浣滃畬鎴愶紙涓嶇鐖惰妭鐐规槸鍚aitingPlay锛�
+ if (!parentAction.IsActionCompleted())
+ {
+ BattleDebug.LogError($"RecordAction.CanStartExecution: {this.GetType().Name} 绛夊緟鐖惰妭鐐� {parentAction.GetType().Name} 鍔ㄤ綔瀹屾垚");
+ return false;
+ }
+
+ return true;
+ }
+
+ public virtual bool IsNeedWaiting()
+ {
+ return false;
+ }
+
+ // 妫�鏌ユ槸鍚﹀畬鍏ㄥ畬鎴愶紙鍖呮嫭鎵�鏈夊瓙鑺傜偣锛�
public virtual bool IsFinished()
{
- return isFinish;
+ // 棣栧厛鑷韩鍔ㄤ綔蹇呴』瀹屾垚
+ if (!isActionCompleted && !isFinish)
+ {
+ return false;
+ }
+
+ // 妫�鏌ユ墍鏈夊瓙鑺傜偣鏄惁瀹屾垚
+ foreach (var child in childActionList)
+ {
+ if (!child.IsFinished())
+ {
+ return false;
+ }
+ }
+
+ return true;
}
public virtual void Run()
@@ -36,6 +143,18 @@
public virtual void ForceFinish()
{
isFinish = true;
+ isActionCompleted = true;
+
+ // 寮哄埗缁撴潫鎵�鏈夊瓙鑺傜偣
+ for (int i = childActionList.Count - 1; i >= 0; i--)
+ {
+ var child = childActionList[i];
+ child?.ForceFinish();
+ }
+
+ // 娓呯悊鐖跺瓙寮曠敤锛岄槻姝㈠唴瀛樻硠婕�
+ childActionList.Clear();
+ parentAction = null;
}
public virtual string GetBattleFieldGuid()
diff --git a/Main/System/Battle/RecordPlayer/RecordPlayer.cs b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
index 2994bea..f73d78d 100644
--- a/Main/System/Battle/RecordPlayer/RecordPlayer.cs
+++ b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -43,7 +43,7 @@
public void PlayRecord(RecordAction recordAction)
{
if (recordAction == null) return;
- BattleDebug.LogError("Enqueue record action " + recordAction.GetType());
+ // Debug.LogError("Enqueue record action " + recordAction.GetType() + " to queue");
if (isForceFinish || stepForcefinish)
{
recordAction.ForceFinish();
@@ -69,7 +69,7 @@
return;
}
- BattleDebug.LogError("Insert record action " + recordAction.GetType());
+ // Debug.LogError("Insert record action " + recordAction.GetType() + " at front of queue");
if (currentRecordAction != null)
{
Queue<RecordAction> tempQueue = new Queue<RecordAction>();
@@ -97,13 +97,39 @@
immediatelyActionList.Add(recordAction);
}
+ // 澧炲己鐗堟湰锛氭敮鎸佺埗瀛愬叧绯诲拰WaitingPlay鏍囪
+ public void ImmediatelyPlay(RecordAction recordAction, RecordAction parentAction, bool isWaitingPlay)
+ {
+ if (recordAction == null) return;
+ if (isForceFinish || stepForcefinish)
+ {
+ recordAction.ForceFinish();
+ return;
+ }
+
+ // Debug.LogError("insert recordAction ImmediatelyPlay: " + recordAction.GetType().Name + " parentAction: " + (parentAction != null ? parentAction.GetType().Name : "null") + " isWaitingPlay: " + isWaitingPlay);
+
+ // 璁剧疆鐖跺瓙鍏崇郴
+ if (parentAction != null)
+ {
+ recordAction.SetParentAction(parentAction);
+ parentAction.AddChildAction(recordAction);
+ }
+
+ // 璁剧疆WaitingPlay鏍囪
+ recordAction.SetWaitingPlay(isWaitingPlay);
+
+ immediatelyActionList.Add(recordAction);
+ }
+
protected void ImmediatelyPlayRun()
{
if (immediatelyActionList.Count > 0)
{
List<int> removeIndexList = new List<int>();
- for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
+ // 鍏抽敭淇锛氫粠鍓嶅線鍚庨亶鍘嗭紝纭繚鎸夊姞鍏ラ『搴忔墽琛�
+ for (int i = 0; i < immediatelyActionList.Count; i++)
{
var action = immediatelyActionList[i];
if (action == null)
@@ -111,6 +137,38 @@
removeIndexList.Add(i);
continue;
}
+
+ // 妫�鏌ユ槸鍚﹀彲浠ュ紑濮嬫墽琛岋紙WaitingPlay鏉′欢妫�鏌ワ級
+ if (!action.CanStartExecution())
+ {
+ continue;
+ }
+
+ // 妫�鏌ュ悓绾х殑鍓嶇疆鍏勫紵鑺傜偣锛氬鏋滄湁鐩稿悓鐖惰妭鐐逛笖绱㈠紩鏇村皬鐨勮妭鐐硅繕鍦ㄦ墽琛岋紝鍒欑瓑寰�
+ bool shouldWaitForSibling = false;
+ if (action.isWaitingPlay && action.parentAction != null)
+ {
+ for (int j = 0; j < i; j++)
+ {
+ var prevAction = immediatelyActionList[j];
+ if (prevAction != null && prevAction.parentAction == action.parentAction)
+ {
+ // 鎵惧埌鍚岀骇鍓嶇疆鑺傜偣锛屽鏋滃畠杩樺湪鎵ц涓紝鍒欏綋鍓嶈妭鐐归渶瑕佺瓑寰�
+ if (!prevAction.IsFinished())
+ {
+ shouldWaitForSibling = true;
+ // BattleDebug.LogError($"RecordPlayer: {action.GetType().Name} 绛夊緟鍚岀骇鍓嶇疆鑺傜偣 {prevAction.GetType().Name} 瀹屾垚");
+ break;
+ }
+ }
+ }
+ }
+
+ if (shouldWaitForSibling)
+ {
+ continue;
+ }
+
if (!action.IsFinished())
{
action.Run();
@@ -120,6 +178,7 @@
removeIndexList.Add(i);
}
+ // 浠庡悗寰�鍓嶅垹闄わ紝纭繚绱㈠紩涓嶄細鍥犱负鍒犻櫎鑰岄敊浣�
for (int i = removeIndexList.Count - 1; i >= 0; i--)
{
int index = removeIndexList[i];
@@ -166,7 +225,7 @@
if (currentRecordAction != null && currentRecordAction.IsFinished())
{
var guid = currentRecordAction.GetBattleFieldGuid();
- BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
+ // BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
currentRecordAction = null;
isWaitingNextAction = true;
waitTimer = 0f;
@@ -179,7 +238,7 @@
if (recordActionQueue.Count > 0)
{
currentRecordAction = recordActionQueue.Dequeue();
- BattleDebug.LogError("play record action " + currentRecordAction.GetType());
+ // BattleDebug.LogError("play record action " + currentRecordAction.GetType());
}
}
}
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 056b849..da38c42 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -28,11 +28,18 @@
protected List<H0704_tagRolePackRefresh> dropPackList = new List<H0704_tagRolePackRefresh>();
protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
- protected List<BattleDeadPack> endDeadPackList = new List<BattleDeadPack>();
+ protected List<SkillRecordAction> waitingCastSkillRecordAction = new List<SkillRecordAction>();
+
protected bool moveFinished = false;
public SkillBase fromSkill;
public bool isPlay = false;
+
+ // 鐖禦ecordAction锛圫killRecordAction锛夛紝鐢ㄤ簬瀛愭妧鑳藉缓绔嬬埗瀛愬叧绯�
+ protected RecordAction parentRecordAction;
+
+ // 鎶�鑳藉姩鐢绘槸鍚︽挱鏀惧畬鎴愶紙閽堝鏈夊姩鐢荤殑鎶�鑳斤級
+ protected bool isMotionCompleted = false;
private float MoveSpeed = 750f;
@@ -59,12 +66,12 @@
}
SafetyCheck();
-#if UNITY_EDITOR
- if (Launch.Instance.isOpenSkillLogFile)
- {
- PinrtHB427Hp();
- }
-#endif
+ }
+
+ // 璁剧疆鐖禦ecordAction
+ public void SetParentRecordAction(RecordAction recordAction)
+ {
+ parentRecordAction = recordAction;
}
#if UNITY_EDITOR
@@ -144,6 +151,13 @@
private void SafetyCheck()
{
+#if UNITY_EDITOR
+ if (Launch.Instance.isOpenSkillLogFile)
+ {
+ PinrtHB427Hp();
+ }
+#endif
+
bool safety = caster != null
&& skillConfig != null
&& tagUseSkillAttack != null
@@ -485,24 +499,60 @@
skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack);
skillEffect.Play(OnHitTargets);
+ ProcessSubSkill();
+ HandleWaitingCastSkill();
+
+ isPlay = true;
+ }
+
+ protected void ProcessSubSkill()
+ {
foreach (var subSkillPack in tagUseSkillAttack.subSkillList)
{
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
recordAction.fromSkill = this;
- otherSkillActionList.Add(recordAction);
- battleField.recordPlayer.ImmediatelyPlay(recordAction);
+ // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+ waitingCastSkillRecordAction.Add(recordAction);
+ battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
}
tagUseSkillAttack.subSkillList.Clear();
foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
{
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
recordAction.fromSkill = this;
- otherSkillActionList.Add(recordAction);
- battleField.recordPlayer.ImmediatelyPlay(recordAction);
+ // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+ waitingCastSkillRecordAction.Add(recordAction);
}
tagUseSkillAttack.subSkillCombinePackList.Clear();
- isPlay = true;
+ waitingCastSkillRecordAction.OrderBy(recordAction => recordAction.hB427_TagSCUseSkill.packUID);
+
+
+ }
+
+ protected void HandleWaitingCastSkill()
+ {
+ RecordAction waitingRecordAction = null;
+
+ for (int i = 0; i < waitingCastSkillRecordAction.Count; i++)
+ {
+ var recordAction = waitingCastSkillRecordAction[i];
+
+ if (waitingRecordAction != null)
+ {
+ // 姣忎釜閮藉簲璇ョ瓑鍓嶄竴涓粨鏉熷悗
+ battleField.recordPlayer.ImmediatelyPlay(recordAction, waitingRecordAction, true);
+ }
+ else
+ {
+ battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
+ }
+
+ if (recordAction.IsNeedWaiting())
+ {
+ waitingRecordAction = recordAction;
+ }
+ }
}
// 鎶�鑳藉墠鎽囩粨鏉熷洖璋�
@@ -529,6 +579,9 @@
// 鎶�鑳藉悗鎽囩粨鏉熷洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗗悗鎽囩粨鏉�
public virtual void OnFinalFrameEnd()
{
+ // 鏍囪鍔ㄧ敾鎾斁瀹屾垚
+ isMotionCompleted = true;
+ BattleDebug.LogError($"SkillBase.OnFinalFrameEnd: 鎶�鑳� {skillConfig?.SkillID} 鍔ㄧ敾鎾斁瀹屾垚");
skillEffect?.OnFinalFrameEnd(); // 淇锛氭坊鍔犵┖鍊兼鏌�
}
@@ -728,7 +781,7 @@
#endif
// 鍏堣皟鐢ㄧ洰鏍囧彈浼�
- target.Hurt(hurtParam);
+ target.Hurt(hurtParam, parentRecordAction);
// 鍐嶈皟鐢ㄦ柦娉曡�呭惛琛�/鍙嶄激
caster.OnHurtTarget(hurtParam);
@@ -1008,6 +1061,16 @@
return false;
}
+ // 濡傛灉鎶�鑳芥湁鍔ㄧ敾锛圫killMotionName涓嶄负绌猴級锛岄渶瑕佺瓑寰呭姩鐢绘挱鏀惧畬鎴�
+ if (skillConfig != null && !string.IsNullOrEmpty(skillConfig.SkillMotionName))
+ {
+ if (!isMotionCompleted)
+ {
+ BattleDebug.LogError($"SkillBase.IsFinishedForJudge: 鎶�鑳� {skillConfig.SkillID} 绛夊緟鍔ㄧ敾鎾斁瀹屾垚");
+ return false;
+ }
+ }
+
return true;
}
@@ -1067,6 +1130,7 @@
{
battleField.RemoveCastingSkill(caster.ObjID, this);
+ // 浼犻�抪arentRecordAction锛岃姝讳骸鎶�鑳界瓑寰呭綋鍓嶆妧鑳藉畬鎴�
battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
}
@@ -1089,7 +1153,8 @@
battleField.RemoveCastingSkill(caster.ObjID, this);
}
- battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
+ // 浼犻�抪arentRecordAction锛岃姝讳骸鎶�鑳界瓑寰呭綋鍓嶆妧鑳藉畬鎴�
+ battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values), parentRecordAction);
// 1. 寮哄埗缁撴潫鎶�鑳芥晥鏋�
skillEffect?.ForceFinished();
@@ -1100,7 +1165,8 @@
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
recordAction.fromSkill = this;
otherSkillActionList.Add(recordAction);
- battleField.recordPlayer.ImmediatelyPlay(recordAction);
+ // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+ battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
}
tagUseSkillAttack.subSkillList.Clear();
foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
@@ -1108,7 +1174,8 @@
SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
recordAction.fromSkill = this;
otherSkillActionList.Add(recordAction);
- battleField.recordPlayer.ImmediatelyPlay(recordAction);
+ // 瀛愭妧鑳借缃甒aitingPlay=true锛岀瓑寰呯埗鎶�鑳藉姩浣滃畬鎴�
+ battleField.recordPlayer.ImmediatelyPlay(recordAction, parentRecordAction, true);
}
tagUseSkillAttack.subSkillCombinePackList.Clear();
@@ -1173,6 +1240,9 @@
isFinished = true;
moveFinished = true;
isPlay = true;
+
+ // 寮哄埗缁撴潫鏃讹紝鏃犺鏄惁鏈夊姩鐢伙紝閮芥爣璁板姩鐢诲畬鎴�
+ isMotionCompleted = true;
// 6. 澶勭悊鎵�鏈夊墿浣欏寘锛堝寘鎷� buff 鍖咃級
// 鍏堝鐞� buffPackCollections
@@ -1377,6 +1447,26 @@
}
}
+ public virtual bool CanStartExecution()
+ {
+ if (null == caster)
+ {
+ return false;
+ }
+
+ if (null == skillConfig)
+ {
+ return false;
+ }
+
+ if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
+ {
+ return true;
+ }
+
+ return !battleField.IsCastingSkill(caster.ObjID);
+ }
+
#endregion
}
\ No newline at end of file
--
Gitblit v1.8.0