From ffd55c202987fb7122e6ce19b5e6f738e33fdf01 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 20 十一月 2025 15:29:10 +0800
Subject: [PATCH] 125 战斗 技能施法容错
---
Main/System/Battle/Skill/SkillBase.cs | 213 +++++++++++++++++++++++++++++------------------------
1 files changed, 117 insertions(+), 96 deletions(-)
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 0caf1c4..e0b8c61 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -17,18 +17,18 @@
189f / 255f);
protected SkillEffect skillEffect;
- protected HB427_tagSCUseSkill tagUseSkillAttack;
+ public HB427_tagSCUseSkill tagUseSkillAttack;
public SkillConfig skillConfig;
protected bool isFinished = false;
protected BattleField battleField = null; // 鎴樺満
protected RectTransform targetNode = null; // 鐩爣鑺傜偣
- protected BattleObject caster = null; // 鏂芥硶鑰�
+ public BattleObject caster = null; // 鏂芥硶鑰�
protected List<GameNetPackBasic> packList;
protected List<SkillRecordAction> otherSkillActionList = new List<SkillRecordAction>();
protected List<H0704_tagRolePackRefresh> dropPackList = new List<H0704_tagRolePackRefresh>();
protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
protected bool moveFinished = false;
- public int fromSkillId;
+ public SkillBase fromSkill;
public bool isPlay = false;
private float MoveSpeed = 750f;
@@ -51,11 +51,38 @@
tagUseSkillAttack = vNetData;
battleField = _battleField;
packList = _packList;
+
+ SafetyCheck();
+ }
+
+ private void SafetyCheck()
+ {
+ bool safety = caster != null
+ && skillConfig != null
+ && tagUseSkillAttack != null
+ && battleField != null
+ && caster.IsDead() == false;
+
+
+ if (!safety)
+ {
+ Debug.LogError("SkillBase SafetyCheck failed! Caster or SkillConfig or TagUseSkillAttack or BattleField is null, or Caster is dead.");
+ ForceFinished();
+ }
+
+
}
// 鎶�鑳借繍琛屼富閫昏緫锛氬鐞嗘妧鑳芥晥鏋滃拰鍏朵粬鎶�鑳藉姩浣�
public virtual void Run()
{
+ // 鏂芥硶鑰呭湪鏀炬妧鑳界殑鏃跺�欐浜$殑瀹归敊
+ if (caster != null && caster.IsDead())
+ {
+ ForceFinished();
+ return;
+ }
+
if (skillEffect != null)
{
if (skillEffect.IsFinished())
@@ -219,7 +246,7 @@
return;
}
- int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
+ int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(this, caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
@@ -340,14 +367,23 @@
{
HandleDead();
- skillEffect = SkillEffectFactory.CreateSkillEffect(caster, skillConfig, tagUseSkillAttack);
+ skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack);
skillEffect.Play(OnHitTargets);
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);
}
+ foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
+ {
+ SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
+ recordAction.fromSkill = this;
+ otherSkillActionList.Add(recordAction);
+ battleField.recordPlayer.ImmediatelyPlay(recordAction);
+ }
+
isPlay = true;
}
@@ -489,25 +525,6 @@
// 澶勭悊鍗曚釜鐩爣琚懡涓�:搴旂敤浼ゅ鍜屾柦娉曡�呮晥鏋�
protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
{
- // ============ 绗竴姝�:璁$畻浼ゅ鍒嗗竷 ============
- List<int> damageDivide = new List<int>();
- if (_hitIndex == 0 && skillConfig.DamageDivide.Length <= 0)
- {
- damageDivide.Add(10000);
- }
- else
- {
- if (skillConfig.DamageDivide.Length <= _hitIndex)
- {
- Debug.LogError("鎶�鑳戒激瀹冲垎甯冮厤缃敊璇� skillId: " + skillConfig.SkillID + " hitIndex: " + _hitIndex);
- damageDivide.Add(10000);
- }
- else
- {
- damageDivide = skillConfig.DamageDivide[_hitIndex].ToList();
- }
- }
-
// 璁$畻鎬讳激瀹冲拰鍒嗘浼ゅ鍒楄〃
long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
List<long> damageList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, totalDamage);
@@ -515,29 +532,21 @@
long totalSuckHp = suckHp;
List<long> suckHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, totalSuckHp);
+ long totalReflectHp = hurt.BounceHP;
+ List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, totalReflectHp);
- // ============ 绗簩姝�:鍒锋柊瀹為檯琛�閲� ============
- long fromHp = target.teamHero.curHp;
-
-
-
- // ============澶勭悊鍙嶄激 ===============
- // 涔熻鎸夋瘡涓�鍑诲钩鍧囩畻 鏈�鍚庤琛ラ綈浼ゅ
-
- long reflectHp = hurt.BounceHP;
-
-
- List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, reflectHp);
- // long currentSuckHp = suckHp / tagUseSkillAttack.HurtCount;
-
- // 璁$畻褰撳墠杩欎竴鍑荤殑瀹為檯浼ゅ(鎵�鏈夊垎娈典激瀹充箣鍜�)
+ // 璁$畻褰撳墠杩欎竴鍑荤殑鍚勯」鏁板��
long currentHitDamage = 0;
foreach (long dmg in damageList)
{
currentHitDamage += dmg;
}
-
+ long currentHitSuckHp = 0;
+ foreach (long suck in suckHpList)
+ {
+ currentHitSuckHp += suck;
+ }
long currentHitReflectHp = 0;
foreach (long reflect in reflectHpList)
@@ -545,54 +554,74 @@
currentHitReflectHp += reflect;
}
- long shieldValue = target.buffMgr.GetShieldValue();
-
- long remainSheild = shieldValue - currentHitDamage;
-
- long toShieldValue = Math.Max(0, shieldValue - currentHitDamage);
-
- long shieldRecieveDamage = shieldValue - toShieldValue;
-
- // if (shieldValue > 0 && remainSheild >= 0)
- // {
- // currentHitDamage = 0;
- // target.buffMgr.ReduceShieldValue(currentHitDamage);
- // }
- // else if (shieldValue > 0 && remainSheild < 0)
- // {
- // currentHitDamage = Math.Abs(remainSheild);
- // target.buffMgr.ClearShield();
- // }
-
- long toHp = fromHp; //Math.Max(0, fromHp - currentHitDamage);
-
+ // ============ 绗簩姝�:鑾峰彇鐩爣褰撳墠鐘舵�� ============
+ long fromHp = target.teamHero.curHp;
+ long maxHp = target.teamHero.maxHp;
+ long fromShieldValue = target.buffMgr.GetShieldValue();
// 鍒ゆ柇鏄不鐤楄繕鏄激瀹�
- bool isHealing = ((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;
+ bool isHealing = BattleUtility.IsHealing(hurt);
+
+ // ============ 绗笁姝�:璁$畻鐩爣琛�閲忓拰鎶ょ浘鍙樺寲 ============
+ long toHp;
+ long toShieldValue;
if (isHealing)
{
- // 娌荤枟閫昏緫锛氱洿鎺ュ姞琛�锛屼笉鑰冭檻鎶ょ浘
- toHp = Math.Min(target.teamHero.maxHp, fromHp + currentHitDamage);
+ // 娌荤枟閫昏緫锛氱洿鎺ュ姞琛�锛屾姢鐩句笉鍙�
+ toHp = Math.Min(maxHp, fromHp + currentHitDamage);
+ toShieldValue = fromShieldValue;
}
else
{
- // 浼ゅ閫昏緫锛氬厛鎵f姢鐩撅紝鍐嶆墸琛�
- if (remainSheild < 0)
+ // 浼ゅ閫昏緫锛氬厛鎵f姢鐩撅紝鎶ょ浘涓嶈冻鍐嶆墸琛�
+ if (fromShieldValue >= currentHitDamage)
{
- // 鐩捐鎵撶牬
- toHp = Math.Max(0, fromHp + remainSheild);
+ // 鎶ょ浘瓒冲鎵垮彈鎵�鏈変激瀹�
+ toShieldValue = fromShieldValue - currentHitDamage;
+ toHp = fromHp;
+ }
+ else
+ {
+ // 鎶ょ浘涓嶈冻锛屽厛鎵e畬鎶ょ浘锛屽墿浣欎激瀹虫墸琛�
+ long remainingDamage = currentHitDamage - fromShieldValue;
+ toShieldValue = 0;
+ toHp = Math.Max(0, fromHp - remainingDamage);
}
}
-
- // 鏇存柊鐩爣琛�閲�
+ // ============ 绗洓姝�:鏇存柊鐩爣瀹為檯琛�閲� ============
target.teamHero.curHp = toHp;
+
+ // ============ 绗簲姝�:璁$畻骞舵洿鏂版柦娉曡�呰閲忓彉鍖� ============
+ long casterFromHp = caster.teamHero.curHp;
+ long casterMaxHp = caster.teamHero.maxHp;
+ long casterToHp = casterFromHp;
+
+ // 澶勭悊鍚歌
+ if (currentHitSuckHp > 0)
+ {
+ casterToHp = Math.Min(casterMaxHp, casterToHp + currentHitSuckHp);
+ }
+
+ // 澶勭悊鍙嶄激(鏂芥硶鑰呭彈鍒颁激瀹�)
+ if (currentHitReflectHp > 0)
+ {
+ long casterShieldValue = caster.buffMgr.GetShieldValue();
+ if (casterShieldValue >= currentHitReflectHp)
+ {
+ // 鏂芥硶鑰呮姢鐩捐冻澶�,琛�閲忎笉鍙�
+ }
+ else
+ {
+ // 鏂芥硶鑰呮姢鐩句笉瓒�,鎵h
+ long remainingReflect = currentHitReflectHp - casterShieldValue;
+ casterToHp = Math.Max(0, casterToHp - remainingReflect);
+ }
+ }
+
+ // 鏇存柊鏂芥硶鑰呰閲�
+ caster.teamHero.curHp = casterToHp;
#if UNITY_EDITOR
BattleDebug.LogError(
@@ -600,37 +629,32 @@
$"鏀诲嚮鑰�: {caster.teamHero.name}\n" +
$"鐩爣: {target.teamHero.name}\n" +
$"鎶�鑳�: {skillConfig.SkillName} (绗瑊_hitIndex}鍑�)\n" +
- $"浼ゅ: {currentHitDamage} 瀹為檯鍙楀埌浼ゅ: {fromHp-toHp} (鎬讳激瀹�: {totalDamage})\n" +
- $"鎵夸激鍓嶆姢鐩惧��: {shieldValue}\n" +
- $"鎵夸激鍚庢姢鐩惧��: {toShieldValue}\n" +
- $"鎶ょ浘鎵垮彈浼ゅ: {shieldRecieveDamage}\n" +
+ $"浼ゅ: {currentHitDamage} (鎬讳激瀹�: {totalDamage})\n" +
+ $"鍚歌: {currentHitSuckHp}\n" +
$"鍙嶄激: {currentHitReflectHp}\n" +
- $"琛�閲忓彉鍖�: {fromHp} -> {toHp}\n" +
- $"鎶�鑳藉寘閲岀殑琛�閲忔槸: {GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx)}\n"
+ $"鐩爣鎶ょ浘鍙樺寲: {fromShieldValue} -> {toShieldValue}\n" +
+ $"鐩爣琛�閲忓彉鍖�: {fromHp} -> {toHp}\n" +
+ $"鏂芥硶鑰呰閲忓彉鍖�: {casterFromHp} -> {casterToHp}\n"
);
#endif
-
- bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1;
-
- // ============ 绗笁姝�:鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
+ // ============ 绗叚姝�:鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
int objID = (int)target.ObjID;
tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack);
-
- // 鍙傛暟鎵撳寘
+ // ============ 绗竷姝�:鍙傛暟鎵撳寘骞惰皟鐢ㄧ洰鏍嘓urt ============
BattleHurtParam hurtParam = new BattleHurtParam()
{
casterObj = caster,
hurtObj = target,
damageList = damageList,
- suckHpList = suckHpList, //suckHpList,
- reflectHpList = reflectHpList,
+ suckHpList = suckHpList, // 鐢ㄤ簬casterDamageList椋樺瓧
+ reflectHpList = reflectHpList, // 鐢ㄤ簬casterDamageList椋樺瓧
fromHp = fromHp,
toHp = toHp,
- maxHp = target.teamHero.maxHp,
- fromShieldValue = shieldValue,
+ maxHp = maxHp,
+ fromShieldValue = fromShieldValue,
toShieldValue = toShieldValue,
battleDrops = battleDrops,
hurt = hurt,
@@ -639,10 +663,7 @@
skillConfig = skillConfig
};
- // ============ 绗洓姝�:鎵ц琛ㄧ幇(椋樺瓧銆佸姩鐢荤瓑) ============
target.Hurt(hurtParam);
-
-
}
// 澶勭悊HP鍒锋柊鍖咃紙绠�鍖栭�昏緫锛�
@@ -889,7 +910,7 @@
if (pack is CustomHB426CombinePack combinePack && combinePack.startTag.Tag.StartsWith("Skill_"))
{
var otherSkillAction = combinePack.CreateSkillAction();
- otherSkillAction.fromSkillId = skillConfig.SkillID;
+ otherSkillAction.fromSkill = this;
otherSkillAction.ForceFinish();
}
else
@@ -970,7 +991,7 @@
{
BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
var otherSkillAction = combinePack.CreateSkillAction();
- otherSkillAction.fromSkillId = skillConfig.SkillID;
+ otherSkillAction.fromSkill = this;
otherSkillActionList.Add(otherSkillAction);
return false;
}
--
Gitblit v1.8.0