From 84fba9533cc9a0f1a3400bbc3f9a36cca94a1fbc Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 26 十二月 2025 18:30:16 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts
---
Main/System/Battle/BattleUtility.cs | 640 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 591 insertions(+), 49 deletions(-)
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index 3d39c4e..f076f67 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -63,9 +63,12 @@
public static TweenerCore<Vector2, Vector2, DG.Tweening.Plugins.Options.VectorOptions> MoveToTarget(
RectTransform transform, RectTransform target, Vector2 offset, Action onComplete = null, float speed = 500f)
{
+ // 鑾峰彇鐩爣鑺傜偣鐨勪笘鐣屽潗鏍囷紙閿氱偣浣嶇疆锛�
+ Vector3 worldPos = target.position;
- // 鑾峰彇鐩爣鑺傜偣鐨勪笘鐣屽潗鏍囷紙涓績鐐癸級
- Vector3 worldPos = target.TransformPoint(target.rect.center + offset);
+ // 濡傛灉闇�瑕佸姞 offset锛岄渶鑰冭檻 scale
+ Vector3 offsetWorld = target.TransformVector(offset);
+ worldPos += offsetWorld;
RectTransform canvasRect = transform.parent as RectTransform;
@@ -77,45 +80,14 @@
null,
out localPoint);
- // 鍒涘缓RawImage
float distance = Vector2.Distance(transform.anchoredPosition, localPoint);
-
- float duration = distance / speed; // 鍋囪閫熷害涓�1000鍗曚綅/绉掞紝鍙互鏍规嵁闇�瑕佽皟鏁�
+ float duration = distance / speed;
var tween = transform.DOAnchorPos(localPoint, duration).SetEase(Ease.Linear);
tween.onComplete += () =>
{
onComplete?.Invoke();
};
-
- // MarkStartAndEnd(transform as RectTransform, target);
-
-
- // // 1. 鑾峰彇鐩爣鐨勪笘鐣屽潗鏍囷紙鍔� offset锛�
- // Vector3 targetWorldPos = target.TransformPoint(target.anchoredPosition + offset);
-
- // // 2. 鑾峰彇婧愯妭鐐圭殑 parent
- // RectTransform sourceParent = transform.parent as RectTransform;
- // if (sourceParent == null)
- // {
- // BattleDebug.LogError("婧愯妭鐐规病鏈夌埗鑺傜偣锛屾棤娉曡浆鎹㈠潗鏍囷紒");
- // return null;
- // }
-
- // // 3. 鎶婄洰鏍囦笘鐣屽潗鏍囪浆鎹㈠埌婧� parent 鐨勬湰鍦板潗鏍�
- // Vector2 targetAnchoredPos;
- // RectTransformUtility.ScreenPointToLocalPointInRectangle(
- // sourceParent,
- // RectTransformUtility.WorldToScreenPoint(CameraManager.uiCamera, targetWorldPos),
- // CameraManager.uiCamera,
- // out targetAnchoredPos);
-
- // // 4. DOTween 绉诲姩
- // var tween = transform.DOAnchorPos(targetAnchoredPos, duration).SetEase(Ease.Linear);
- // tween.onComplete += () =>
- // {
- // onComplete?.Invoke();
- // };
return tween;
}
@@ -130,13 +102,55 @@
var numChar = (char)GetDamageNumKey(config, basePowerStr[i]);
if (numChar > 0)
{
- result += numChar;
+ result += numChar;
}
}
return result;
}
- public static int GetMainTargetPositionNum(BattleObject caster, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> targetList, SkillConfig skillConfig)
+ public static string DisplayDamageNum(BattleDmg damage)
+ {
+ var config = DamageNumConfig.Get(damage.attackType);
+
+ string result = string.Empty;
+
+ // 濡傛灉鏄棯閬挎垨鍏嶇柅 鍒欏彧鏄剧ず瀵瑰簲鏂囧瓧锛屼笉鏄剧ず鏁板瓧
+ if (damage.IsType(DamageType.Dodge) || damage.IsType(DamageType.Immune))
+ {
+ result += (char)config.prefix;
+ }
+ else
+ {
+ result = ConvertToArtFont(config, damage.damage);
+ }
+
+ return result;
+ }
+
+ public static string ConvertToArtFont(DamageNumConfig config, float _num)
+ {
+ var stringBuild = new System.Text.StringBuilder();
+
+ if (0 != config.plus)
+ stringBuild.Append((char)config.plus);
+ if (0 != config.prefix)
+ stringBuild.Append((char)config.prefix);
+
+ var chars = UIHelper.ReplaceLargeArtNum(_num);
+ for (var i = 0; i < chars.Length; i++)
+ {
+ int numChar = GetDamageNumKey(config, (int)chars[i]);
+
+ if (numChar > 0)
+ {
+ stringBuild.Append((char)numChar);
+ }
+ }
+
+ return stringBuild.ToString();
+ }
+
+ public static int GetMainTargetPositionNum(SkillBase skillBase, BattleObject caster, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> targetList, SkillConfig skillConfig)
{
int returnIndex = 0;
// 鏍规嵁鏁屾柟琛�閲忛樀钀� 瀛樻椿浜烘暟鏉ラ�夋嫨
@@ -171,7 +185,7 @@
break;
case 1:
// 1 瀵逛綅锛�
- // 榛樿鍙��1涓紝瀵逛綅瑙勫垯涓篈1浼樺厛鎵揃1锛孉2浼樺厛鎵揃2锛孉3浼樺厛鎵揃3锛屽浣嶇洰鏍囨浜℃椂锛屼紭鍏堝墠鎺掞紝姣斿B2宸茬粡姝讳骸锛岄偅涔圓2灏嗕紭鍏堟墦B1锛屽墠鎺�1銆�2銆�3鍙蜂綅缃叏閮ㄦ浜′箣鍚庢墠寮�濮嬮�夋嫨鍚庢帓4銆�5銆�6鍙蜂綅缃紝瀵逛綅鍙彲閫�1涓洰鏍囷紝鍗充富鐩爣
+ // 榛樿鍙��1涓紝瀵逛綅瑙勫垯涓篈1浼樺厛鎵揃1锛孉2浼樺厛鎵揃2锛孉3浼樺厛鎵揃3锛屽浣嶇洰鏍囨浜℃椂锛屼紭鍏堝墠鎺掞紝姣斿B2宸茬粡姝讳骸锛岄偅涔圓2灏嗕紭鍏堟墦B
if (targetList.Count > 0)
{
BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)targetList[0].ObjID);
@@ -258,6 +272,19 @@
case 5:
returnIndex = caster.teamHero.positionNum;
break;
+ case 6:
+ // 璺熼殢涓绘妧鑳界殑鐩爣
+ var fromSkill = skillBase.fromSkill;
+ if (fromSkill != null)
+ {
+ returnIndex = GetMainTargetPositionNum(fromSkill, fromSkill.caster, fromSkill.tagUseSkillAttack.HurtList.ToList(), fromSkill.skillConfig);
+ }
+ else
+ {
+ Debug.LogError("GetMainTargetPositionNum 鎵句笉鍒拌窡闅忎富鎶�鑳界殑鐩爣");
+ returnIndex = 0;
+ }
+ break;
default:
Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閫夋嫨涓荤洰鏍� 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " TagAim " + skillConfig.TagAim);
returnIndex = 0;
@@ -269,18 +296,323 @@
public static int GetDamageNumKey(DamageNumConfig config, int _num)
{
- if (_num == 46) return config.nums[10]; // '.'
+ if (_num == 46) return config.nums[10]; // '.'
else if (_num == 107) return config.nums[11]; // 'k'
else if (_num == 109) return config.nums[12]; // 'm'
- else if (_num == 98) return config.nums[13]; // 'b'
+ else if (_num == 98) return config.nums[13]; // 'b'
else if (_num == 116) return config.nums[14]; // 't'
int targetNum = _num - 48;
if (targetNum >= config.nums.Length || targetNum < 0)
{
- Debug.LogError("damage config " + config.TypeID + " _num is " + _num + " out of range");
+ Debug.LogError("damage config " + config.TypeID + " _num is " + _num + " out of range");
return _num;
}
return config.nums[_num - 48];
+ }
+
+ public static bool IsHealing(HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
+ {
+ return ((hurt.AttackTypes & (int)ServerDamageType.Recovery) != 0 ||
+ (hurt.AttackTypes & (int)ServerDamageType.DamageReverse) != 0) &&
+ (hurt.AttackTypes & (int)ServerDamageType.Damage) == 0 &&
+ (hurt.AttackTypes & (int)ServerDamageType.Realdamage) == 0 &&
+ (hurt.AttackTypes & (int)ServerDamageType.SuckHpReverse) == 0 &&
+ (hurt.AttackTypes & (int)ServerDamageType.SelfHarm) == 0;
+ }
+
+ public static long GetSuckHp(HB427_tagSCUseSkill hB427_TagSCUseSkill)
+ {
+ long totalSuckHp = 0;
+ for (int i = 0; i < hB427_TagSCUseSkill.HurtList.Length; i++)
+ {
+ var hurt = hB427_TagSCUseSkill.HurtList[i];
+ totalSuckHp += hurt.SuckHP;
+ for (int k = 0; k < hurt.HurtListEx.Length; k++)
+ {
+ var hurtEx = hurt.HurtListEx[k];
+ totalSuckHp += hurtEx.SuckHP;
+ }
+ }
+ for (int i = 0; i < hB427_TagSCUseSkill.HurtListEx.Length; i++)
+ {
+ var hurt = hB427_TagSCUseSkill.HurtListEx[i];
+ totalSuckHp += hurt.SuckHP;
+ }
+ return totalSuckHp;
+ }
+
+ public static BattleHurtParam CalcBattleHurtParam(SkillBase skillBase, int hitIndex, BattleObject target,
+ HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, BattleDrops battleDrops, BattleDeadPack deadPack, bool bSuckHp = true)
+ {
+ long suckHp = GetSuckHp(skillBase.tagUseSkillAttack);
+ SkillConfig skillConfig = skillBase.skillConfig;
+ long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
+ long totalReflectHp = hurt.BounceHP;
+
+ // 璁$畻浼ゅ鍒嗘
+ long currentHitDamage = 0;
+ List<long> damageList = DivideDamageToList(skillConfig.DamageDivide, hitIndex, totalDamage, ref currentHitDamage);
+
+ // 璁$畻鍚歌鍒嗘
+ long currentHitSuckHp = 0;
+ List<long> suckHpList = bSuckHp ?
+ DivideDamageToList(skillConfig.DamageDivide, hitIndex, suckHp, ref currentHitSuckHp) : new List<long>();
+
+ // 璁$畻鍙嶄激鍒嗘
+ long currentHitReflectHp = 0;
+ List<long> reflectHpList = DivideDamageToList(skillConfig.DamageDivide, hitIndex, totalReflectHp, ref currentHitReflectHp);
+
+ // 鍒涘缓鐩爣鍙椾激瀵硅薄
+ BattleHurtObj hurter = CreateHurter(target, damageList, hurt, hitIndex, skillConfig, currentHitDamage);
+
+ // 鍒涘缓鏂芥硶鑰呭璞�
+ BattleCastObj caster = CreateCaster(skillBase, suckHpList, reflectHpList, currentHitSuckHp, currentHitReflectHp);
+
+ // 缁勮BattleHurtParam
+ BattleHurtParam battleHurtParam = new BattleHurtParam();
+ battleHurtParam.caster = caster;
+ battleHurtParam.hurter = hurter;
+ battleHurtParam.battleDrops = battleDrops;
+ battleHurtParam.hurt = hurt;
+ battleHurtParam.hB427_TagSCUseSkill = skillBase.tagUseSkillAttack;
+ battleHurtParam.hitIndex = hitIndex;
+ battleHurtParam.deadPack = deadPack;
+ battleHurtParam.skillConfig = skillConfig;
+ battleHurtParam.packUID = skillBase.tagUseSkillAttack.packUID;
+ return battleHurtParam;
+ }
+
+ public static BattleHurtObj CreateHurter(BattleObject target, List<long> damageList, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int hitIndex, SkillConfig skillConfig, long currentHitDamage)
+ {
+ BattleHurtObj hurter = new BattleHurtObj();
+ hurter.hurtObj = target;
+ hurter.damageList = damageList;
+ hurter.fromHp = target.teamHero.curHp;
+ hurter.fromShieldValue = target.buffMgr.GetShieldValue();
+
+ // 鍒ゆ柇鏄惁鏄渶鍚庝竴鍑�
+ bool isLastHit = hitIndex >= skillConfig.DamageDivide.Length - 1;
+
+ // 鍒ゆ柇鏄不鐤楄繕鏄激瀹�
+ bool isHealing = IsHealing(hurt);
+
+ // 璁$畻鐩爣琛�閲忓彉鍖�
+ if (isLastHit)
+ {
+ // 鏈�鍚庝竴鍑伙細浣跨敤鏈嶅姟鍣ㄤ笅鍙戠殑鏈�缁堣閲�
+ hurter.toHp = GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx);
+ }
+ else
+ {
+ // 闈炴渶鍚庝竴鍑伙細瀹㈡埛绔绠椾腑闂磋閲�
+ long maxHp = target.teamHero.maxHp;
+
+ if (isHealing)
+ {
+ // 娌荤枟閫昏緫锛氱洿鎺ュ姞琛�
+ hurter.toHp = Math.Min(maxHp, hurter.fromHp + currentHitDamage);
+ }
+ else
+ {
+ // 浼ゅ閫昏緫锛氬厛鎵f姢鐩撅紝鎶ょ浘涓嶈冻鍐嶆墸琛�
+ if (hurter.fromShieldValue >= currentHitDamage)
+ {
+ hurter.toHp = hurter.fromHp;
+ target.teamHero.curHp = hurter.toHp; // 淇濇寔涓�鑷存��
+ }
+ else
+ {
+ long remainingDamage = currentHitDamage - hurter.fromShieldValue;
+ hurter.toHp = Math.Max(0, hurter.fromHp - remainingDamage);
+ target.teamHero.curHp = hurter.toHp; // 淇濇寔涓�鑷存��
+ }
+ }
+ }
+
+ // 璁$畻鎶ょ浘鍙樺寲
+ if (isHealing)
+ {
+ hurter.toShieldValue = hurter.fromShieldValue;
+ }
+ else
+ {
+ if (hurter.fromShieldValue >= currentHitDamage)
+ {
+ hurter.toShieldValue = hurter.fromShieldValue - currentHitDamage;
+ }
+ else
+ {
+ hurter.toShieldValue = 0;
+ }
+ }
+
+ return hurter;
+ }
+
+ public static BattleCastObj CreateCaster(SkillBase skillBase, List<long> suckHpList, List<long> reflectHpList, long currentHitSuckHp, long currentHitReflectHp)
+ {
+ BattleCastObj caster = new BattleCastObj();
+ caster.casterObj = skillBase.caster;
+ caster.suckHpList = suckHpList;
+ caster.reflectHpList = reflectHpList;
+
+ // 鑾峰彇鏂芥硶鑰呭綋鍓嶇姸鎬�
+ long casterFromHp = skillBase.caster.teamHero.curHp;
+ long casterMaxHp = skillBase.caster.teamHero.maxHp;
+ long casterFromShield = skillBase.caster.buffMgr.GetShieldValue();
+
+ caster.fromHp = casterFromHp;
+ caster.fromShieldValue = casterFromShield;
+
+ // 璁$畻鏂芥硶鑰呰閲忓彉鍖栵紙鍚歌鍜屽弽浼わ級
+ long casterToHp = casterFromHp;
+ long casterToShield = casterFromShield;
+
+ // 澶勭悊鍚歌
+ if (currentHitSuckHp > 0)
+ {
+ casterToHp = Math.Min(casterMaxHp, casterToHp + currentHitSuckHp);
+ }
+
+ // 澶勭悊鍙嶄激锛堟柦娉曡�呭彈鍒颁激瀹筹級
+ if (currentHitReflectHp > 0)
+ {
+ if (casterToShield >= currentHitReflectHp)
+ {
+ // 鏂芥硶鑰呮姢鐩捐冻澶燂紝鍙墸鎶ょ浘
+ casterToShield -= currentHitReflectHp;
+ }
+ else
+ {
+ // 鏂芥硶鑰呮姢鐩句笉瓒筹紝鍏堟墸瀹屾姢鐩撅紝鍓╀綑鎵h
+ long remainingReflect = currentHitReflectHp - casterToShield;
+ casterToShield = 0;
+ casterToHp = Math.Max(0, casterToHp - remainingReflect);
+ }
+ }
+
+ caster.toHp = casterToHp;
+ caster.toShieldValue = casterToShield;
+ skillBase.caster.teamHero.curHp = caster.toHp; // 淇濇寔涓�鑷存��
+
+ return caster;
+ }
+
+ /// <summary>
+ /// 灏嗘暣涓妧鑳界殑鎬讳激瀹虫寜鍛戒腑娆℃暟鍜屽垎娈甸厤缃垎閰�
+ /// </summary>
+ /// <param name="damageDivideList">鏁翠釜鎶�鑳界殑鎵�鏈夊懡涓垎娈甸厤缃�</param>
+ /// <param name="hitIndex">褰撳墠鏄鍑犲嚮(浠�0寮�濮�)</param>
+ /// <param name="totalDamage">鏁翠釜鎶�鑳界殑鎬讳激瀹�</param>
+ /// <returns>杩欎竴鍑诲唴姣忎竴娈电殑浼ゅ鍊煎垪琛�</returns>
+ public static List<long> DivideDamageToList(int[][] damageDivideList, int hitIndex, long totalDamage, ref long currentHitDamage)
+ {
+ if (totalDamage <= 0)
+ {
+ return new List<long>{};
+ }
+
+ if (damageDivideList == null || damageDivideList.Length == 0)
+ {
+ Debug.LogError("damageDivideList 涓虹┖鎴栭暱搴︿负0");
+ return new List<long> { totalDamage };
+ }
+
+ if (hitIndex < 0 || hitIndex >= damageDivideList.Length)
+ {
+ Debug.LogError($"hitIndex={hitIndex} 瓒呭嚭鑼冨洿, damageDivideList.Length={damageDivideList.Length}");
+ return new List<long> { totalDamage };
+ }
+
+ int[] currentHitDivide = damageDivideList[hitIndex];
+ if (currentHitDivide == null || currentHitDivide.Length == 0)
+ {
+ Debug.LogError($"damageDivide[{hitIndex}] 涓虹┖鎴栭暱搴︿负0");
+ return new List<long> { totalDamage };
+ }
+
+ // ============ 绗竴姝�: 璁$畻姣忎竴鍑诲簲璇ラ�犳垚鐨勪激瀹� ============
+ // 鍏堣绠楁墍鏈夊嚮鐨勬�绘潈閲�
+ int totalWeight = 0;
+ for (int i = 0; i < damageDivideList.Length; i++)
+ {
+ if (damageDivideList[i] != null && damageDivideList[i].Length > 0)
+ {
+ // 姣忎竴鍑荤殑鏉冮噸鏄叾鎵�鏈夊垎娈典箣鍜�
+ for (int j = 0; j < damageDivideList[i].Length; j++)
+ {
+ totalWeight += damageDivideList[i][j];
+ }
+ }
+ }
+
+ if (totalWeight == 0)
+ {
+ Debug.LogError("totalWeight 涓� 0");
+ return new List<long> { totalDamage };
+ }
+
+ // 璁$畻褰撳墠杩欎竴鍑荤殑鏉冮噸
+ int currentHitWeight = 0;
+ for (int i = 0; i < currentHitDivide.Length; i++)
+ {
+ currentHitWeight += currentHitDivide[i];
+ }
+
+ // 璁$畻褰撳墠杩欎竴鍑诲簲璇ラ�犳垚鐨勬�讳激瀹�
+ long currentHitTotalDamage;
+ bool isLastHit = hitIndex >= damageDivideList.Length - 1;
+
+ if (isLastHit)
+ {
+ // 鏈�鍚庝竴鍑�: 璁$畻鍓嶉潰鎵�鏈夊嚮宸茬粡閫犳垚鐨勪激瀹�,鍓╀綑鐨勫叏閮ㄧ粰鏈�鍚庝竴鍑�
+ long previousHitsDamage = 0;
+ for (int i = 0; i < hitIndex; i++)
+ {
+ if (damageDivideList[i] != null)
+ {
+ int hitWeight = 0;
+ for (int j = 0; j < damageDivideList[i].Length; j++)
+ {
+ hitWeight += damageDivideList[i][j];
+ }
+ previousHitsDamage += (long)((float)totalDamage * (float)hitWeight / (float)totalWeight);
+ }
+ }
+ currentHitTotalDamage = totalDamage - previousHitsDamage;
+ }
+ else
+ {
+ // 闈炴渶鍚庝竴鍑�: 鎸夋潈閲嶈绠�
+ currentHitTotalDamage = (long)((float)totalDamage * (float)currentHitWeight / (float)totalWeight);
+ }
+
+ currentHitDamage = currentHitTotalDamage;
+
+ // ============ 绗簩姝�: 灏嗗綋鍓嶈繖涓�鍑荤殑浼ゅ鍒嗛厤鍒板悇鍒嗘 ============
+ List<long> fixedDamageList = new List<long>();
+ long accumulatedDamage = 0;
+
+ for (int i = 0; i < currentHitDivide.Length; i++)
+ {
+ long damage;
+
+ // 褰撳墠鍑荤殑鏈�鍚庝竴娈佃繘琛岃宸ˉ鍋�
+ if (i == currentHitDivide.Length - 1)
+ {
+ damage = currentHitTotalDamage - accumulatedDamage;
+ }
+ else
+ {
+ // 鎸夊綋鍓嶅嚮鐨勬潈閲嶅垎閰�
+ damage = (long)((float)currentHitTotalDamage * (float)currentHitDivide[i] / (float)currentHitWeight);
+ accumulatedDamage += damage;
+ }
+
+ fixedDamageList.Add(damage);
+ }
+
+ return fixedDamageList;
}
/// <summary>
@@ -288,31 +620,103 @@
/// </summary>
public static List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
{
+ if (damageDivide == null || damageDivide.Length == 0)
+ {
+ Debug.LogError("damageDivide 涓虹┖鎴栭暱搴︿负0");
+ return new List<long> { totalDamage };
+ }
+
List<long> fixedDamageList = new List<long>();
+ long accumulatedDamage = 0; // 绱宸插垎閰嶇殑浼ゅ
for (int i = 0; i < damageDivide.Length; i++)
{
- float fixedDamage = (float)totalDamage * (float)damageDivide[i] / 10000f;
- fixedDamageList.Add((int)fixedDamage);
+ long damage;
+
+ // 鏈�鍚庝竴娆″垎閰嶏細鐢ㄦ�讳激瀹冲噺鍘诲凡鍒嗛厤鐨勪激瀹筹紝纭繚鎬诲拰绮剧‘
+ if (i == damageDivide.Length - 1)
+ {
+ damage = totalDamage - accumulatedDamage;
+ }
+ else
+ {
+ // 璁$畻褰撳墠鍒嗘浼ゅ锛堝悜涓嬪彇鏁达級
+ damage = (long)((float)totalDamage * (float)damageDivide[i] / 10000f);
+ accumulatedDamage += damage;
+ }
+
+ fixedDamageList.Add(damage);
}
-
+
return fixedDamageList;
}
-
- public static List<HB422_tagMCTurnFightObjDead> FindDeadPack(List<GameNetPackBasic> packList)
+
+ public static HB419_tagSCObjHPRefresh FindObjHPRefreshPack(List<GameNetPackBasic> packList)
{
- List<HB422_tagMCTurnFightObjDead> deadPacks = new List<HB422_tagMCTurnFightObjDead>();
+ for (int i = 0; i < packList.Count; i++)
+ {
+ var pack = packList[i];
+ if (pack is HB419_tagSCObjHPRefresh hpRefreshPack)
+ {
+ return hpRefreshPack;
+ }
+ else if (pack is CustomHB426CombinePack)
+ {
+ break;
+ }
+ }
+ return null;
+ }
+
+ public static List<BattleDeadPack> FindDeadPack(List<GameNetPackBasic> packList)
+ {
+ List<BattleDeadPack> deadPacks = new List<BattleDeadPack>();
for (int i = 0; i < packList.Count; i++)
{
var pack = packList[i];
// 瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘
if (pack is HB422_tagMCTurnFightObjDead deadPack)
{
- deadPacks.Add(deadPack);
+ deadPacks.Add(new BattleDeadPack { deadPack = deadPack });
}
- else if (pack is CustomHB426CombinePack)
+ else if (pack is CustomHB426CombinePack combinePack)
{
- break;
+ if (deadPacks.Count > 0)
+ {
+ HB427_tagSCUseSkill hB427_TagSCUseSkill = combinePack.GetMainHB427SkillPack();
+
+ if (null == hB427_TagSCUseSkill)
+ {
+ break;
+ }
+ else
+ {
+ var skillID = hB427_TagSCUseSkill.SkillID;
+ var skillConfig = SkillConfig.Get((int)skillID);
+
+ if (skillConfig != null && (SkillTriggerTiming)skillConfig.ClientTriggerTiming == SkillTriggerTiming.Death)
+ {
+ for (int j = 0 ; j < deadPacks.Count; j ++)
+ {
+ var parentPack = deadPacks[j];
+
+ if (parentPack.IsOwnSkill(hB427_TagSCUseSkill))
+ {
+ parentPack.SetDeathSkill(combinePack);
+ break;
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
}
}
// Debug.LogError("find dead pack " + deadPacks.Count);
@@ -338,4 +742,142 @@
}
return rebornPackList;
}
+
+ // ============================================================
+ // 鏂囦欢 2: BattleUtility.cs
+ // 娣诲姞琛�閲忎竴鑷存�ч獙璇佸嚱鏁�
+ // ============================================================
+
+ /// <summary>
+ /// 楠岃瘉鐩爣琛�閲忔槸鍚︿笌鏈嶅姟鍣ㄥ寘涓�鑷达紙浠呭湪鏈�鍚庝竴鍑绘椂璋冪敤锛�
+ /// </summary>
+ public static void ValidateHpConsistency(BattleHurtParam hurtParam, string context)
+ {
+#if UNITY_EDITOR
+ BattleHurtObj hurter = hurtParam.hurter;
+ HB427_tagSCUseSkill.tagSCUseSkillHurt hurt = hurtParam.hurt;
+
+ // 鑾峰彇鏈嶅姟鍣ㄤ笅鍙戠殑鏈�缁堣閲�
+ long serverFinalHp = GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx);
+
+ // 鑾峰彇瀹㈡埛绔绠楃殑鏈�缁堣閲�
+ long clientFinalHp = hurter.toHp;
+
+ // 楠岃瘉鏄惁涓�鑷�
+ bool isConsistent = (serverFinalHp == clientFinalHp);
+
+ string logColor = isConsistent ? "<color=green>" : "<color=red>";
+ string resultStr = isConsistent ? "鉁� 涓�鑷�" : "鉁� 涓嶄竴鑷�";
+
+ BattleDebug.LogError(
+ $"{logColor}========== 琛�閲忎竴鑷存�ч獙璇� [{context}] {resultStr} ==========</color>\n" +
+ $"鐩爣: {hurter.hurtObj.teamHero.name} (ObjID:{hurter.hurtObj.ObjID})\n" +
+ $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� (鏈�鍚庝竴鍑�)\n" +
+ $"鏈嶅姟鍣ㄦ渶缁堣閲�: {serverFinalHp}\n" +
+ $"瀹㈡埛绔绠楄閲�: {clientFinalHp}\n" +
+ $"琛�閲忓樊寮�: {clientFinalHp - serverFinalHp}\n" +
+ $"\n" +
+ $"---- 琛�閲忓彉鍖栬繃绋� ----\n" +
+ $"鍒濆琛�閲�: {hurter.fromHp}\n" +
+ $"鏈浼ゅ/娌荤枟: {(hurter.damageList != null ? hurter.damageList.Sum() : 0)}\n" +
+ $"鏈�缁堣閲�: {clientFinalHp}\n" +
+ $"鏈�澶ц閲�: {hurter.hurtObj.teamHero.maxHp}\n" +
+ $"\n" +
+ $"---- 鎶ょ浘鍙樺寲杩囩▼ ----\n" +
+ $"鍒濆鎶ょ浘: {hurter.fromShieldValue}\n" +
+ $"鏈�缁堟姢鐩�: {hurter.toShieldValue}\n" +
+ $"鎶ょ浘鍙樺寲: {hurter.toShieldValue - hurter.fromShieldValue}\n"
+ );
+
+ // 濡傛灉涓嶄竴鑷达紝棰濆杈撳嚭璀﹀憡
+ if (!isConsistent)
+ {
+ Debug.LogWarning(
+ $"[琛�閲忛獙璇佸け璐 鐩爣:{hurter.hurtObj.teamHero.name} " +
+ $"鏈嶅姟鍣�:{serverFinalHp} vs 瀹㈡埛绔�:{clientFinalHp} " +
+ $"宸紓:{clientFinalHp - serverFinalHp}"
+ );
+ }
+#endif
+ }
+
+ /// <summary>
+ /// 楠岃瘉鏂芥硶鑰呰閲忔槸鍚︽纭紙浠呭湪鏈�鍚庝竴鍑绘椂璋冪敤锛�
+ /// </summary>
+ public static void ValidateHpConsistencyForCaster(BattleHurtParam hurtParam, string context)
+ {
+#if UNITY_EDITOR
+ BattleCastObj caster = hurtParam.caster;
+
+ // 鏂芥硶鑰呮病鏈夋湇鍔″櫒涓嬪彂鐨勬渶缁堣閲忥紝鍙兘楠岃瘉璁$畻閫昏緫鏄惁姝g‘
+ long clientFinalHp = caster.toHp;
+ long calculatedHp = caster.fromHp;
+
+ // 璁$畻棰勬湡鐨勮閲忓彉鍖�
+ long totalSuckHp = caster.suckHpList != null ? caster.suckHpList.Sum() : 0;
+ long totalReflectHp = caster.reflectHpList != null ? caster.reflectHpList.Sum() : 0;
+
+ // 妯℃嫙璁$畻杩囩▼
+ long expectedHp = calculatedHp;
+ long expectedShield = caster.fromShieldValue;
+
+ // 搴旂敤鍚歌
+ if (totalSuckHp > 0)
+ {
+ expectedHp = Math.Min(caster.casterObj.teamHero.maxHp, expectedHp + totalSuckHp);
+ }
+
+ // 搴旂敤鍙嶄激
+ if (totalReflectHp > 0)
+ {
+ if (expectedShield >= totalReflectHp)
+ {
+ expectedShield -= totalReflectHp;
+ }
+ else
+ {
+ long remainingReflect = totalReflectHp - expectedShield;
+ expectedShield = 0;
+ expectedHp = Math.Max(0, expectedHp - remainingReflect);
+ }
+ }
+
+ bool isConsistent = (expectedHp == clientFinalHp);
+
+ string logColor = isConsistent ? "<color=cyan>" : "<color=red>";
+ string resultStr = isConsistent ? "鉁� 璁$畻姝g‘" : "鉁� 璁$畻閿欒";
+
+ BattleDebug.LogError(
+ $"{logColor}========== 鏂芥硶鑰呰閲忛獙璇� [{context}] {resultStr} ==========</color>\n" +
+ $"鏂芥硶鑰�: {caster.casterObj.teamHero.name} (ObjID:{caster.casterObj.ObjID})\n" +
+ $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� (鏈�鍚庝竴鍑�)\n" +
+ $"棰勬湡鏈�缁堣閲�: {expectedHp}\n" +
+ $"瀹為檯鏈�缁堣閲�: {clientFinalHp}\n" +
+ $"琛�閲忓樊寮�: {clientFinalHp - expectedHp}\n" +
+ $"\n" +
+ $"---- 琛�閲忓彉鍖栬繃绋� ----\n" +
+ $"鍒濆琛�閲�: {caster.fromHp}\n" +
+ $"鍚歌鎬婚噺: {totalSuckHp}\n" +
+ $"鍙嶄激鎬婚噺: {totalReflectHp}\n" +
+ $"鏈�缁堣閲�: {clientFinalHp}\n" +
+ $"鏈�澶ц閲�: {caster.casterObj.teamHero.maxHp}\n" +
+ $"\n" +
+ $"---- 鎶ょ浘鍙樺寲杩囩▼ ----\n" +
+ $"鍒濆鎶ょ浘: {caster.fromShieldValue}\n" +
+ $"棰勬湡鎶ょ浘: {expectedShield}\n" +
+ $"瀹為檯鎶ょ浘: {caster.toShieldValue}\n" +
+ $"鎶ょ浘宸紓: {caster.toShieldValue - expectedShield}\n"
+ );
+
+ // 濡傛灉涓嶄竴鑷达紝棰濆杈撳嚭璀﹀憡
+ if (!isConsistent)
+ {
+ Debug.LogWarning(
+ $"[鏂芥硶鑰呰閲忚绠楅敊璇痌 {caster.casterObj.teamHero.name} " +
+ $"棰勬湡:{expectedHp} vs 瀹為檯:{clientFinalHp} " +
+ $"宸紓:{clientFinalHp - expectedHp}"
+ );
+ }
+#endif
+ }
}
\ No newline at end of file
--
Gitblit v1.8.0