From 63f4f6c6ebab4ce0b86cb05e949abe749cf564bf Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期六, 11 十月 2025 18:19:41 +0800
Subject: [PATCH] 136 子 【挑战】战锤秘境 / 【挑战】战锤秘境-客户端 修改红点规则
---
Main/System/Battle/Skill/SkillBase.cs | 359 +++++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 260 insertions(+), 99 deletions(-)
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 374c71f..f7009d0 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -1,9 +1,9 @@
using System.Collections.Generic;
using UnityEngine;
-using System;
using DG.Tweening;
using Spine;
using System.Linq;
+using System;
public class SkillBase
@@ -14,7 +14,7 @@
protected HB427_tagSCUseSkill tagUseSkillAttack;
- protected SkillConfig skillConfig;
+ public SkillConfig skillConfig;
protected bool isFinished = false;
@@ -23,12 +23,6 @@
protected RectTransform targetNode = null; // 鐩爣鑺傜偣
protected BattleObject caster = null; // 鏂芥硶鑰�
-
- protected bool startCounting = false;
-
- protected bool pauseState = false;
-
- protected int curFrame = 0;
protected List<GameNetPackBasic> packList;
@@ -40,28 +34,39 @@
protected bool moveFinished = false;
- public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
+ public int fromSkillId;
+
+ public bool isPlay = false;
+
+ public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
{
caster = _caster;
+ if (null == caster)
+ {
+ throw new Exception("SkillBase caster is null ");
+ }
skillConfig = _skillCfg;
tagUseSkillAttack = vNetData;
battleField = _battleField;
packList = _packList;
-
-
+ // Debug.LogError("start a skill id " + skillConfig.SkillID + " caster " + caster.teamHero.heroId + " pos " + caster.teamHero.positionNum + " camp " + caster.Camp);
}
public virtual void Run()
{
- if (startCounting)
- {
- curFrame++;
- }
-
if (null != skillEffect)
{
- skillEffect.Run();
+ if (skillEffect.IsFinished())
+ {
+ skillEffect = null;
+ OnSkillFinished();
+ }
+ else
+ {
+ skillEffect.Run();
+ }
+ return;
}
if (otherSkillAction != null)
@@ -73,30 +78,23 @@
}
else
{
- otherSkillAction.Run();
+ if (moveFinished)
+ {
+ otherSkillAction.Run();
+ }
}
+ return;
}
}
-
-
-
- public void Pause()
- {
- pauseState = startCounting;
- startCounting = false;
- }
-
- public void Resume()
- {
- startCounting = pauseState;
- }
-
// 0路绉诲姩鍒拌窛绂荤洰鏍噉鐮侊紝鐨勮窛绂婚噴鏀撅紙鍙厤缃紝9999鍗冲師鍦伴噴鏀撅紝璐熸暟鍒欐槸绉诲姩鍒颁汉鐗╄儗闈紝浜虹墿瑕佽浆韬級
// 1路绉诲姩鍒拌窛绂婚樀瀹逛綅缃畁鐮佺殑璺濈锛堝2鍙蜂綅锛�5鍙蜂綅锛夐噴鏀撅紙鍗虫垬鍦轰腑澶绫伙級
public virtual void Cast()
{
- EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, battleField.guid, skillConfig, caster.teamHero);
+ // Debug.LogError("Cast skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode);
+ string guid = battleField.guid;
+ TeamHero teamHero = caster.teamHero;
+ EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero);
// 楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣
HighLightAllTargets();
@@ -105,7 +103,7 @@
switch (skillConfig.castMode)
{
case SkillCastMode.Self:
- CastImpl();
+ CastImpl(OnAttackFinish);
break;
case SkillCastMode.Enemy:
CastToEnemy();
@@ -116,33 +114,59 @@
case SkillCastMode.Allies:
CastToAllies();
break;
- // case SkillCastMode.DashCast:
- // DashToTarget(() => BackToOrigin(OnSkillFinished));
- // break;
+ case SkillCastMode.DashCast:
+ DashCast(OnAttackFinish);
+ break;
default:
- Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
- OnSkillFinished();
+ Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
+ ForceFinished();
break;
}
}
- protected void MoveToTarget(RectTransform target, Vector2 offset, float duration, Action onComplete = null)
+ // 鍐叉挒鏀诲嚮
+ protected void DashCast(Action _onComplete)
+ {
+ Debug.LogError("DashCast 杩樻病瀹炵幇");
+ ForceFinished();
+ // YYL TODO
+
+ // var entry = caster.motionBase.PlayAnimation(skillConfig.GetMotionName(), false);
+ // float animationTime = entry.AnimationTime;
+
+ // int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
+
+ // BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+
+ // RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
+
+ // var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, targetTrans, new Vector2(skillConfig.CastDistance, 0), animationTime * 0.9f, () =>
+ // {
+ // caster.motionBase.PlayAnimation(MotionName.idle, true);
+ // _onComplete?.Invoke();
+ // });
+ // battleField.battleTweenMgr.OnPlayTween(tweener);
+ }
+
+ protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 500f)
{
// 鍘熷湴閲婃斁
if (skillConfig.CastDistance >= 9999)
{
- onComplete?.Invoke();
+ _onComplete?.Invoke();
return;
}
caster.motionBase.PlayAnimation(MotionName.run, true);
- var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, target, offset, duration, () =>
+ var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, target, offset, () =>
{
caster.motionBase.PlayAnimation(MotionName.idle, true);
- onComplete?.Invoke();
- });
+ _onComplete?.Invoke();
+ }, speed);
battleField.battleTweenMgr.OnPlayTween(tweener);
+
+ // Debug.LogError("move to tarrget " + target.name + " offset " + offset + " speed " + speed + " time " + tweener.Duration());
}
protected void TurnBack(Action _onComplete, float forward)
@@ -162,7 +186,7 @@
RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
- MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), moveTime, () =>
+ MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
{
// 鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
TurnBack(() =>
@@ -174,12 +198,8 @@
() =>
{
// 鍥炲埌鍘熸潵鐨勪綅缃�
- MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () =>
- {
- TurnBack(null, 1f);
- caster.motionBase.PlayAnimation(MotionName.idle, true);
- OnAllAttackMoveFinished();
- });
+ MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero,
+ OnAttackFinish, 750F);
}
, -1f);
});
@@ -199,17 +219,13 @@
return;
}
- var mainHurt = tagUseSkillAttack.HurtList[0];
+ int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
- BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)mainHurt.ObjID);
- if (mainTarget == null)
- {
- Debug.LogError("鐩爣涓虹┖ mainTarget == null ObjID : " + mainHurt.ObjID);
- OnSkillFinished();
- return;
- }
+ BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
- MoveToTarget(mainTarget.heroRectTrans, new Vector2(skillConfig.CastDistance, 0), moveTime, () =>
+ RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
+
+ MoveToTarget(targetTrans, new Vector2(skillConfig.CastDistance, 0), () =>
{
// 鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
TurnBack(() =>
@@ -220,13 +236,9 @@
TurnBack(
() =>
{
+ RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum);
// 鍥炲埌鍘熸潵鐨勪綅缃�
- MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () =>
- {
- TurnBack(null, 1f);
- caster.motionBase.PlayAnimation(MotionName.idle, true);
- OnAllAttackMoveFinished();
- });
+ MoveToTarget(rectTransform, Vector2.zero, OnAttackFinish, 750F);
}
, -1f);
});
@@ -237,13 +249,23 @@
protected virtual void OnAllAttackMoveFinished()
{
moveFinished = true;
+ List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
+ for (int i = 0; i < allList.Count; i++)
+ {
+ BattleObject bo = allList[i];
+ bo.layerMgr.SetFront();
+ // bo.heroRectTrans.SetParent(battleField.GetTeamNode(bo.Camp, bo.teamHero.positionNum), true);
+ bo.heroInfoBar.SetActive(true);
+ }
+ battleField.battleRootNode.skillMaskNode.SetActive(false);
+ // Debug.LogError("OnAllAttackMoveFinished skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode);
}
protected void CastToAllies()
{
RectTransform target = battleField.GetTeamNode(caster.Camp, skillConfig);
- MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), moveTime, () =>
+ MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
{
// 鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
TurnBack(() =>
@@ -255,17 +277,20 @@
() =>
{
// 鍥炲埌鍘熸潵鐨勪綅缃�
- MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () =>
- {
- TurnBack(null, 1f);
- caster.motionBase.PlayAnimation(MotionName.idle, true);
- OnAllAttackMoveFinished();
- });
+ MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum),
+ Vector2.zero, OnAttackFinish, 750F);
}
, -1f);
});
}, -1f);
});
+ }
+
+ protected void OnAttackFinish()
+ {
+ TurnBack(null, 1f);
+ OnAllAttackMoveFinished();
+ caster.motionBase.PlayAnimation(MotionName.idle, true);
}
@@ -282,30 +307,29 @@
// OnMiddleFrameEnd 涓憞缁撴潫
// OnFinalFrameStart 鍚庢憞寮�濮�
// OnFinalFrameEnd 鍚庢憞缁撴潫
+
return caster.motionBase.PlaySkillAnimation(skillConfig, this, onComplete);
}
// 鎶�鑳藉紑濮�
public void OnSkillStart()
{
+ HandleDead();
skillEffect = SkillEffectFactory.CreateSkillEffect(
caster,
skillConfig,
tagUseSkillAttack
);
- if (skillEffect != null)
- {
- skillEffect.Play(OnHitTargets);
- }
-
+ skillEffect.Play(OnHitTargets);
+ isPlay = true;
}
// 鎶�鑳藉墠鎽囧抚缁撴潫
public virtual void OnStartSkillFrameEnd()
{
-
+
}
/// <summary>
@@ -314,18 +338,12 @@
/// <param name="times"></param>
public virtual void OnMiddleFrameStart(int times)
{
- if (skillEffect != null)
- {
- skillEffect.OnMiddleFrameStart(times);
- }
+ skillEffect.OnMiddleFrameStart(times);
}
public virtual void OnMiddleFrameEnd(int times, int hitIndex)
{
- if (skillEffect != null)
- {
- skillEffect.OnMiddleFrameEnd(times, hitIndex);
- }
+ skillEffect.OnMiddleFrameEnd(times, hitIndex);
}
/// <summary>
@@ -333,15 +351,18 @@
/// </summary>
public virtual void OnFinalFrameStart()
{
-
+ skillEffect.OnFinalFrameStart();
}
/// <summary>
/// 鍚庢憞缁撴潫
/// </summary>
public virtual void OnFinalFrameEnd()
- {
+ {
+ skillEffect.OnFinalFrameEnd();
+ // 杞Щ鍒版浜″寘 battleobject.hurt 鏈�鍚庝竴鍑荤殑鏃跺�欐挱鏀�
+
}
@@ -349,11 +370,51 @@
protected void HighLightAllTargets()
{
+ caster.layerMgr.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
+
+ if (skillConfig.FuncType != 2)
+ return;
+
// 楂樹寒鎵�鏈夌洰鏍�
- HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack));
+ List<BattleObject> targetList = battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack);
+ List<BattleObject> highlightList = new List<BattleObject>(targetList);
highlightList.Add(caster);
+ List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
+ caster.heroInfoBar.SetActive(false);
+
+
+
+ for (int i = 0; i < allList.Count; i++)
+ {
+ BattleObject bo = allList[i];
+ if (highlightList.Contains(bo))
+ {
+ bo.layerMgr.SetFront();
+ bo.heroInfoBar.SetActive(true);
+ // bo.heroRectTrans.SetParent(battleField.battleRootNode.skillFrontNode, true);
+ }
+ else
+ {
+ bo.layerMgr.SetBack();
+ // bo.heroRectTrans.SetParent(battleField.battleRootNode.skillBackNode, true);
+ }
+
+ if (targetList.Contains(bo))
+ {
+ bo.heroInfoBar.SetActive(true);
+ }
+ else
+ {
+ bo.heroInfoBar.SetActive(false);
+ }
+ }
+
+
+ battleField.battleRootNode.skillMaskNode.SetActive(true);
+ battleField.battleRootNode.SetSortingOrder();
+ // caster.battleField.skillMask
// 鎶婅繖浜汢O鍏ㄩ珮浜� 鎴栬�呰鎶婇櫎浜嗚繖浜涚殑閮芥斁鍦ㄩ伄缃╁悗闈�
// YYL TODO
}
@@ -374,13 +435,14 @@
OnHitEachTarget(_hitIndex, target, hurt);
}
- HandleDead();
+
}
protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
{
// 浼ゅ鍒嗗竷 (涓囧垎姣�)
+ // Debug.LogError("skillConfig.DamageDivide.Count " + skillConfig.DamageDivide.Length + " _hitIndex " + _hitIndex);
int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
@@ -398,13 +460,21 @@
// TODO YYL AttackTypes 瑕佽〃鐜版垚浠�涔堟牱鍛紵 鏀寔澶氱绫诲瀷骞跺瓨锛屽鏃犺闃插尽涓旀毚鍑诲悓鏃惰鏍兼尅锛屼簩杩涘埗鎴栬繍绠楁渶缁堝�硷紱0-澶辫触锛�1-鏅�氾紱2-鍥炶锛�5-鏍兼尅锛�6-鏃犺闃插尽锛�7-鏆村嚮锛�9-闂伩
- target.Hurt(damageList, totalDamage, hurt, skillConfig);
+
+
+ int objID = (int)target.ObjID;
+ tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
+ tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack);
+ target.Hurt(damageList, totalDamage, hurt, skillConfig, _hitIndex, battleDrops, deadPack);
// TODO YYL 杩欓噷鏄鍋氱粺涓�璁$畻鍚庡啀hurt璺焥uckhp杩樻槸鎬庢牱
caster.SuckHp(hurt.SuckHP, skillConfig);// 鍚歌
caster.HurtByReflect(hurt.BounceHP, skillConfig);// 鍙嶅脊浼ゅ
}
+ private Dictionary<int, BattleDrops> tempDropList = new Dictionary<int, BattleDrops>();
+
+ private Dictionary<int, HB422_tagMCTurnFightObjDead> tempDeadPackList = new Dictionary<int, HB422_tagMCTurnFightObjDead>();
protected void HandleDead()
{
@@ -453,17 +523,17 @@
dropItemPackIndex = itemModelDropsIndexList,
expDrops = expAssign[i]
};
- deadTarget.PushDropItems(battleDrops);
+
+ tempDropList.Add((int)deadPackList[i].ObjID, battleDrops);
+ // deadTarget.PushDropItems(battleDrops);
}
- // 鍒嗗彂姝讳骸鍖�
-
- battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>(deadPackList));
+ // battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>(deadPackList));
foreach (var deadPack in deadPackList)
{
+ tempDeadPackList.Add((int)deadPack.ObjID, deadPack);
packList.Remove(deadPack);
}
- deadPackList.Clear();
}
@@ -568,6 +638,11 @@
}
public virtual bool IsFinished()
{
+ if (!isPlay)
+ {
+ return false;
+ }
+
if (skillEffect != null)
{
if (!skillEffect.IsFinished())
@@ -576,17 +651,77 @@
}
else
{
- OnSkillFinished();
skillEffect = null;
+ OnSkillFinished();
+ return false;
}
}
- return isFinished && moveFinished;
+ if (otherSkillAction != null)
+ {
+ if (!otherSkillAction.IsFinished())
+ {
+ return false;
+ }
+ else
+ {
+ otherSkillAction = null;
+ OnSkillFinished();
+ return false;
+ }
+ }
+
+
+ if (isFinished && moveFinished)
+ {
+ if (packList.Count > 0)
+ {
+ OnSkillFinished();
+ return false;
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
}
public virtual void ForceFinished()
{
+ skillEffect?.ForceFinished();
+ if (otherSkillAction != null)
+ {
+ otherSkillAction.ForceFinish();
+ otherSkillAction = null;
+ }
isFinished = true;
+ moveFinished = true;
+ isPlay = true;
+
+ while (packList.Count > 0)
+ {
+ var pack = packList[0];
+ packList.RemoveAt(0);
+
+ if (pack is CustomHB426CombinePack combinePack)
+ {
+ if (combinePack.startTag.Tag.StartsWith("Skill_"))
+ {
+ otherSkillAction = combinePack.CreateSkillAction();
+ otherSkillAction.fromSkillId = skillConfig.SkillID;
+ // 寮哄埗缁撴潫鍏朵粬鎶�鑳�
+ otherSkillAction.ForceFinish();
+ continue;
+ }
+ }
+ else if (pack is CustomB421ActionPack actionPack)
+ {
+ actionPack.Distribute();
+ }
+ PackageRegedit.Distribute(pack);
+ }
}
public void OnSkillFinished()
@@ -596,6 +731,25 @@
if (!skillEffect.IsFinished())
{
return;
+ }
+ else
+ {
+ skillEffect = null;
+ OnSkillFinished();
+ }
+
+ }
+
+ if (otherSkillAction != null)
+ {
+ if (!otherSkillAction.IsFinished())
+ {
+ return;
+ }
+ else
+ {
+ otherSkillAction = null;
+ OnSkillFinished();
}
}
@@ -611,9 +765,16 @@
{
BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
otherSkillAction = combinePack.CreateSkillAction();
+ otherSkillAction.fromSkillId = skillConfig.SkillID;
return;
}
}
+ else if (pack is CustomB421ActionPack actionPack)
+ {
+ actionPack.Distribute();
+ }
+
+ // Debug.LogError("Distribute pack " + pack.GetType().ToString());
PackageRegedit.Distribute(pack);
}
--
Gitblit v1.8.0