From 61b188e1d59af9a1e3b4f005bd4b9211b2db97d8 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 09 十月 2025 15:46:31 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts
---
Main/System/Battle/Skill/SkillBase.cs | 821 +++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 557 insertions(+), 264 deletions(-)
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 4325c92..a10eec9 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -1,15 +1,20 @@
using System.Collections.Generic;
using UnityEngine;
-using System;
using DG.Tweening;
using Spine;
+using System.Linq;
+using System;
public class SkillBase
{
+ const float moveTime = 0.5f;
+
+ protected SkillEffect skillEffect;
+
protected HB427_tagSCUseSkill tagUseSkillAttack;
- protected SkillConfig skillConfig;
+ public SkillConfig skillConfig;
protected bool isFinished = false;
@@ -19,12 +24,6 @@
protected BattleObject caster = null; // 鏂芥硶鑰�
- protected bool startCounting = false;
-
- protected bool pauseState = false;
-
- protected int curFrame = 0;
-
protected List<GameNetPackBasic> packList;
protected SkillRecordAction otherSkillAction;
@@ -33,21 +32,42 @@
protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
- public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
+ protected bool moveFinished = false;
+
+ 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)
+ if (null != skillEffect)
{
- curFrame++;
+ if (skillEffect.IsFinished())
+ {
+ skillEffect = null;
+ OnSkillFinished();
+ }
+ else
+ {
+ skillEffect.Run();
+ }
+ return;
}
if (otherSkillAction != null)
@@ -59,175 +79,341 @@
}
else
{
- otherSkillAction.Run();
+ if (moveFinished)
+ {
+ otherSkillAction.Run();
+ }
}
+ return;
}
- }
-
-
- protected virtual void OnActiveSkillFrame()
- {
-
- }
-
- protected virtual void OnStartSkillFrame()
- {
-
- }
-
- protected virtual void OnEndSkillFrame()
- {
-
- }
-
- public void Pause()
- {
- pauseState = startCounting;
- startCounting = false;
- }
-
- public void Resume()
- {
- startCounting = pauseState;
}
// 0路绉诲姩鍒拌窛绂荤洰鏍噉鐮侊紝鐨勮窛绂婚噴鏀撅紙鍙厤缃紝9999鍗冲師鍦伴噴鏀撅紝璐熸暟鍒欐槸绉诲姩鍒颁汉鐗╄儗闈紝浜虹墿瑕佽浆韬級
// 1路绉诲姩鍒拌窛绂婚樀瀹逛綅缃畁鐮佺殑璺濈锛堝2鍙蜂綅锛�5鍙蜂綅锛夐噴鏀撅紙鍗虫垬鍦轰腑澶绫伙級
public virtual void Cast()
{
+ // 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();
// 璺濈閰嶆垚璐熸暟瑕佽浆韬� TurnBack
-
switch (skillConfig.castMode)
{
case SkillCastMode.Self:
- PlayCastAnimation(() => DoSkillLogic(OnSkillFinished));
+ CastImpl(OnAttackFinish);
break;
case SkillCastMode.Enemy:
- MoveToTarget(caster.GetEnemyCamp(), skillConfig, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+ CastToEnemy();
break;
case SkillCastMode.Target:
- // 鐩爣鏄晫鏂逛富鐩爣
- if (tagUseSkillAttack.HurtCount <= 0)
- {
- Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0");
- OnSkillFinished();
- return;
- }
-
- var mainHurt = tagUseSkillAttack.HurtList[0];
-
- BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)mainHurt.ObjID);
- if (mainTarget == null)
- {
- Debug.LogError("鐩爣涓虹┖ mainTarget == null ObjID : " + mainHurt.ObjID);
- OnSkillFinished();
- return;
- }
- MoveToTarget(mainTarget.Camp, mainTarget, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+ CastToTarget();
break;
case SkillCastMode.Allies:
- MoveToTarget(caster.Camp, skillConfig, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+ CastToAllies();
break;
- // case SkillCastMode.DashCast:
- // DashToTarget(() => BackToOrigin(OnSkillFinished));
- // break;
+ case SkillCastMode.DashCast:
+ DashCast(OnAttackFinish);
+ break;
default:
- Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝" + skillConfig.SkillID);
- OnSkillFinished();
+ Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
+ ForceFinished();
break;
}
+
}
- // 鍐插埡鐨勬妧鑳� 鍔ㄤ綔 璺熺Щ鍔� 鏄悓鏃惰繘琛岀殑 绉诲姩鍒扮洰鏍囩殑涓�鐬棿灏辫杩涜鎶�鑳介�昏緫
- // protected void DashToTarget(Action _onComplete)
- // {
- // TrackEntry entry = PlayCastAnimation();
- // BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.AttackID);
- // if (mainTarget == null)
- // {
- // Debug.LogError("鐩爣涓虹┖ mainTarget == null AttackID : " + tagUseSkillAttack.AttackID);
- // _onComplete?.Invoke();
- // return;
- // }
-
- // // 鍋氫竴涓井寰殑鎻愬墠
- // MoveToTarget(mainTarget.Camp, mainTarget.teamHero.positionNum, entry.AnimationEnd - 0.05f, () => DoSkillLogic(_onComplete));
- // }
-
- // 杩欓噷鍏跺疄鏄妧鑳藉悗鎽囩粨鏉熺殑鍦版柟
- protected virtual void DoSkillLogic(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 TrackEntry PlayCastAnimation(Action onComplete = null)
+ protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 500f)
{
- // 鎾斁鏂芥硶鍔ㄤ綔
- return caster.motionBase.PlaySkillAnimation(skillConfig, onComplete,
- OnStartSkillFrame,//鏀诲嚮鍓嶆憞缁撴潫
- OnActiveSkillFrame);//鏀诲嚮涓憞缁撴潫
- }
+ // 鍘熷湴閲婃斁
+ if (skillConfig.CastDistance >= 9999)
+ {
+ _onComplete?.Invoke();
+ return;
+ }
- public void MoveToTarget(BattleCamp camp, BattleObject target, float duration = 0.2f, Action _onComplete = null)
- {
- targetNode = battleField.GetTeamNode(camp, target);
-
- Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
- RectTransform selfRect = caster.heroRectTrans;
- RectTransform targetRect = targetNode;
-
- var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete);
+ caster.motionBase.PlayAnimation(MotionName.run, true);
+ var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, target, offset, () =>
+ {
+ caster.motionBase.PlayAnimation(MotionName.idle, true);
+ _onComplete?.Invoke();
+ }, speed);
battleField.battleTweenMgr.OnPlayTween(tweener);
+
+ // Debug.LogError("move to tarrget " + target.name + " offset " + offset + " speed " + speed + " time " + tweener.Duration());
}
- public void MoveToTarget(BattleCamp camp, SkillConfig skillCfg, float duration = 0.2f, Action _onComplete = null)
- {
- targetNode = battleField.GetTeamNode(camp, skillCfg);
-
- Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
- RectTransform selfRect = caster.heroRectTrans;
- RectTransform targetRect = targetNode;
-
- var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete);
- battleField.battleTweenMgr.OnPlayTween(tweener);
- }
-
- public void TurnBack(Action _onComplete)
+ protected void TurnBack(Action _onComplete, float forward)
{
if (skillConfig.CastDistance < 0)
{
// 杞韩
- caster.heroGo.transform.localScale = new Vector3(-1, 1, 1);
+ Vector3 scale = caster.heroGo.transform.localScale;
+ scale.x = Mathf.Abs(scale.x) * forward;
+ caster.heroGo.transform.localScale = scale;
}
_onComplete?.Invoke();
}
- public void BackToOrigin(Action _onComplete = null)
+ protected void CastToEnemy()
{
- RectTransform selfRect = caster.heroRectTrans;
- Vector2 targetAnchoredPos = Vector2.zero;
- var tween = selfRect.DOAnchorPos(targetAnchoredPos, 0.2f)
- .SetEase(Ease.Linear)
- .OnComplete(() =>
- {
- // 杞垚姝g‘鏂瑰悜
- caster.heroGo.transform.localScale = Vector3.one;
- _onComplete?.Invoke();
- });
- battleField.battleTweenMgr.OnPlayTween(tween);
+ RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
+
+ MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
+ {
+ // 鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
+ TurnBack(() =>
+ {
+ // 鍒拌揪鐩爣浣嶇疆
+ CastImpl(() =>
+ {
+ TurnBack(
+ () =>
+ {
+ // 鍥炲埌鍘熸潵鐨勪綅缃�
+ MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero,
+ OnAttackFinish, 750F);
+ }
+ , -1f);
+ });
+ }, -1f);
+ });
}
+
+
+
+ protected void CastToTarget()
+ {
+ // 鐩爣鏄晫鏂逛富鐩爣
+ if (tagUseSkillAttack.HurtCount <= 0)
+ {
+ Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0");
+ OnSkillFinished();
+ return;
+ }
+
+ int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
+
+ BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+
+ RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
+
+ MoveToTarget(targetTrans, new Vector2(skillConfig.CastDistance, 0), () =>
+ {
+ // 鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
+ TurnBack(() =>
+ {
+ // 鍒拌揪鐩爣浣嶇疆
+ CastImpl(() =>
+ {
+ TurnBack(
+ () =>
+ {
+ RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum);
+ // 鍥炲埌鍘熸潵鐨勪綅缃�
+ MoveToTarget(rectTransform, Vector2.zero, OnAttackFinish, 750F);
+ }
+ , -1f);
+ });
+ }, -1f);
+ });
+ }
+
+ 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), () =>
+ {
+ // 鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
+ TurnBack(() =>
+ {
+ // 鍒拌揪鐩爣浣嶇疆
+ CastImpl(() =>
+ {
+ TurnBack(
+ () =>
+ {
+ // 鍥炲埌鍘熸潵鐨勪綅缃�
+ 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);
+ }
+
+
+ // 鎵胯浇鎶�鑳藉ぇ閮ㄥ垎鐨勯�昏緫
+ protected TrackEntry CastImpl(Action onComplete = null)
+ {
+ // 鎾斁鏂芥硶鍔ㄤ綔
+ // onComplete鏄寚鏂芥硶鍔ㄤ綔鎾斁瀹岀殑鍥炶皟 涓嶄唬琛ㄦ槸鎶�鑳界粨鏉�
+ // 鍏蜂綋鎶�鑳界粨鏉熺殑鏃堕棿搴旇鐪嬫妧鑳藉搴旂殑閫昏緫
+ // 杩欓噷鍙彁渚�6涓姩浣滅浉鍏崇殑鍑芥暟
+ // OnSkillStart 鍔ㄤ綔绗竴甯�
+ // OnStartSkillFrameEnd 鍓嶆憞缁撴潫
+ // OnMiddleFrameStart 涓憞寮�濮�
+ // OnMiddleFrameEnd 涓憞缁撴潫
+ // OnFinalFrameStart 鍚庢憞寮�濮�
+ // OnFinalFrameEnd 鍚庢憞缁撴潫
+
+ return caster.motionBase.PlaySkillAnimation(skillConfig, this, onComplete);
+ }
+
+ // 鎶�鑳藉紑濮�
+ public void OnSkillStart()
+ {
+ skillEffect = SkillEffectFactory.CreateSkillEffect(
+ caster,
+ skillConfig,
+ tagUseSkillAttack
+ );
+
+ skillEffect.Play(OnHitTargets);
+ isPlay = true;
+
+ }
+
+ // 鎶�鑳藉墠鎽囧抚缁撴潫
+ public virtual void OnStartSkillFrameEnd()
+ {
+
+ }
+
+ /// <summary>
+ /// 涓憞寮�濮� times=绗嚑娆″惊鐜� 浠�0寮�濮�
+ /// </summary>
+ /// <param name="times"></param>
+ public virtual void OnMiddleFrameStart(int times)
+ {
+ skillEffect.OnMiddleFrameStart(times);
+ }
+
+ public virtual void OnMiddleFrameEnd(int times, int hitIndex)
+ {
+ skillEffect.OnMiddleFrameEnd(times, hitIndex);
+ }
+
+ /// <summary>
+ /// 鍚庢憞寮�濮�
+ /// </summary>
+ public virtual void OnFinalFrameStart()
+ {
+ skillEffect.OnFinalFrameStart();
+ }
+
+ /// <summary>
+ /// 鍚庢憞缁撴潫
+ /// </summary>
+ public virtual void OnFinalFrameEnd()
+ {
+ skillEffect.OnFinalFrameEnd();
+
+ HandleDead();
+ }
+
+
+
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
}
@@ -246,163 +432,157 @@
continue;
}
- // 浼ゅ鍒嗗竷 (涓囧垎姣�)
- int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
-
- long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
-
- // 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
- List<long> damageList = DivideDamageToList(damageDivide, totalDamage);
-
- OnHitEachTarget(target, totalDamage, damageList, ref hurt);
+ OnHitEachTarget(_hitIndex, target, hurt);
}
- }
-
- /// <summary>
- /// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
- /// </summary>
- protected List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
- {
- List<long> fixedDamageList = new List<long>();
- long assigned = 0;
- int count = damageDivide.Length;
-
- for (int i = 0; i < count; i++)
- {
- long damage;
- if (i == count - 1)
- {
- // 鏈�鍚庝竴涓垎閰嶉」淇涓哄墿浣�
- damage = totalDamage - assigned;
- }
- else
- {
- damage = (totalDamage * damageDivide[i] + 5000) / 10000; // 鍥涜垗浜斿叆
- assigned += damage;
- }
- fixedDamageList.Add(damage);
- }
- return fixedDamageList;
+
}
- protected virtual void OnHitEachTarget(BattleObject target, long totalDamage, List<long> damageList, ref HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
+
+ protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
{
- target.Hurt(damageList, totalDamage, hurt.AttackTypes);
+ // 浼ゅ鍒嗗竷 (涓囧垎姣�)
+ // Debug.LogError("skillConfig.DamageDivide.Count " + skillConfig.DamageDivide.Length + " _hitIndex " + _hitIndex);
+ bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1;
+ int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
- // 鍑讳腑鐩爣鐨勬椂鍊�,涓嶇杩戞垬杩滅▼ 閮界‘璁や竴涓嬫槸鍚︽湁鐖嗙偢鐗规晥 鐒跺悗鎾斁
- if (skillConfig.ExplosionEffectId > 0)
- {
- // 鎾斁鐖嗙偢鐗规晥
- target.battleField.battleEffectMgr.PlayEffect(
- target.ObjID,
- skillConfig.ExplosionEffectId,
- target.heroGo.transform
- );
- }
+ long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
- // 鍙椾激涔嬪悗杈ㄥ埆姝讳骸鐘舵�� 姝讳骸鍖呭叾瀹炲墠鍚庡抚浼氬娆¤Е鍙� 搴旇瑕佸嵆鏃秗emove鍏朵粬鐨勫寘鏉ヤ繚璇佷笉閲嶅
- if (target.IsDead())
- {
- // SkillRecordAction閲岀殑drop浜嬩欢鍓嶇Щ鍒癲ead涔嬪悗
- HB422_tagMCTurnFightObjDead deadPack = FindDeadPack(target);
- CheckAfterDeadhPack(target, deadPack);
- if (deadPack != null)
- {
- // 澶勭悊鎺夎惤鍖�
- for (int i = 0; i < dropPackList.Count; i++)
- {
- PackageRegedit.Distribute(dropPackList[i]);
- }
+ // 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
+ List<long> damageList = BattleUtility.DivideDamageToList(damageDivide, totalDamage);
+ // public uint ObjID;
+ // public uint AttackTypes; // 椋樿绫诲瀷姹囨�伙紝鏀寔澶氱绫诲瀷骞跺瓨锛屽鏃犺闃插尽涓旀毚鍑诲悓鏃惰鏍兼尅锛屼簩杩涘埗鎴栬繍绠楁渶缁堝�硷紱0-澶辫触锛�1-鏅�氾紱2-鍥炶锛�5-鏍兼尅锛�6-鏃犺闃插尽锛�7-鏆村嚮锛�9-闂伩
+ // public uint HurtHP; // 椋樿鍊硷紝姹備綑浜块儴鍒�
+ // public uint HurtHPEx; // 椋樿鍊硷紝鏁撮櫎浜块儴鍒�
+ // public uint CurHP; // 鏇存柊鍓╀綑琛�閲忥紝姹備綑浜块儴鍒�
+ // public uint CurHPEx; // 鏇存柊鍓╀綑琛�閲忥紝鏁撮櫎浜块儴鍒�
+ // public uint SuckHP; // 鏈浼ゅ杞寲鐨勫惛琛�閲�
+ // public uint BounceHP; // 鏈浼ゅ鍙嶅脊鐨勪激瀹抽噺
- dropPackList.Clear();
- target.PushExpPackList(new List<HB405_tagMCAddExp>(expPackList));
+ // TODO YYL AttackTypes 瑕佽〃鐜版垚浠�涔堟牱鍛紵 鏀寔澶氱绫诲瀷骞跺瓨锛屽鏃犺闃插尽涓旀毚鍑诲悓鏃惰鏍兼尅锛屼簩杩涘埗鎴栬繍绠楁渶缁堝�硷紱0-澶辫触锛�1-鏅�氾紱2-鍥炶锛�5-鏍兼尅锛�6-鏃犺闃插尽锛�7-鏆村嚮锛�9-闂伩
- expPackList.Clear();
+ List<HB422_tagMCTurnFightObjDead> deadPacks = BattleUtility.FindDeadPack(packList);
+ bool isTargetDead = deadPacks.Exists(p => p.ObjID == target.ObjID);
- // 澶勭悊姝讳骸鍖�
- PackageRegedit.Distribute(deadPack);
- packList.Remove(deadPack);
- }
-
- // 澶嶆椿鍖呮殏鏃朵笉绠� 鍙兘鏄妧鑳界殑鍖�
- // HB423_tagMCTurnFightObjReborn rebornPack = FindRebornPack(target);
- // if (rebornPack != null)
- // {
- // // 澶勭悊澶嶆椿鍖�
- // PackageRegedit.Distribute(rebornPack);
- // packList.Remove(rebornPack);
- // }
- }
+ bool playAnimation = !(isLastHit && isTargetDead);
+ target.Hurt(damageList, totalDamage, hurt, skillConfig, playAnimation);
+
+ // TODO YYL 杩欓噷鏄鍋氱粺涓�璁$畻鍚庡啀hurt璺焥uckhp杩樻槸鎬庢牱
+ caster.SuckHp(hurt.SuckHP, skillConfig);// 鍚歌
+ caster.HurtByReflect(hurt.BounceHP, skillConfig);// 鍙嶅脊浼ゅ
}
- protected HB423_tagMCTurnFightObjReborn FindRebornPack(BattleObject target)
- {
- HB423_tagMCTurnFightObjReborn rebornPack = null;
- for (int i = 0; i < packList.Count; i++)
- {
- var pack = packList[i];
- if (pack is HB423_tagMCTurnFightObjReborn)
- {
- rebornPack = pack as HB423_tagMCTurnFightObjReborn;
- if (rebornPack.ObjID == target.ObjID)
- {
- return rebornPack;
- }
- }
- else if (pack is CustomHB426CombinePack)
- {
- var combinePack = pack as CustomHB426CombinePack;
- if (combinePack.startTag.Tag.StartsWith("Skill_"))
- {
- break; // 鎵惧埌鎶�鑳藉寘灏变笉闇�瑕佸啀澶勭悊浜�
- }
- }
- }
- return null;
- }
- protected HB422_tagMCTurnFightObjDead FindDeadPack(BattleObject target)
+ protected void HandleDead()
{
- HB422_tagMCTurnFightObjDead deadPack = null;
- for (int i = 0; i < packList.Count; i++)
- {
- var pack = packList[i];
- // 瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘
- if (pack is HB422_tagMCTurnFightObjDead)
- {
- deadPack = pack as HB422_tagMCTurnFightObjDead;
- if (deadPack.ObjID == target.ObjID)
- {
- return deadPack;
- }
- }
- else if (pack is CustomHB426CombinePack)
- {
- // 鎵炬浜″寘涓嶈瓒婅繃鎶�鑳藉寘
- var combinePack = pack as CustomHB426CombinePack;
- if (combinePack.startTag.Tag.StartsWith("Skill_"))
- {
- break;
- }
- }
- }
- return null;
- }
+ var deadPackList = BattleUtility.FindDeadPack(packList);
+ int deadCount = deadPackList.Count;
- protected void CheckAfterDeadhPack(BattleObject target, HB422_tagMCTurnFightObjDead deadPack)
- {
- if (null == deadPack)
+ if (deadCount <= 0)
{
+ // 濡傛灉娌℃浜″氨涓嶇敤绠�
return;
}
- var deadPackIndex = packList.IndexOf(deadPack);
- if (deadPackIndex < 0)
+
+ CheckAfterDeadhPack();
+
+ // 澶勭悊鎺夎惤鍖� 鎻愬墠distribute涔嬪悗 PackManager鎵嶆湁鎺夎惤鐗� 鎵�浠ヤ笉璺焌ssignexp涓�鏍穌istribute
+ foreach (var _dropPack in dropPackList)
{
- return;
+ PackageRegedit.Distribute(_dropPack);
+ packList.Remove(_dropPack);
}
+
+ // 鑾峰彇鎺夎惤鐗╁搧
+ var dropPack = PackManager.Instance.GetSinglePack(PackType.DropItem);
+ var itemDict = dropPack.GetAllItems();
+ List<ItemModel> itemList = new List<ItemModel>(
+ from item in itemDict.Values
+ where item != null && item.isAuction
+ select item);
+
+
+
+ // 鍒嗛厤鎺夎惤鍜岀粡楠�
+ var dropAssign = AssignDrops(itemList, deadCount);
+ var expAssign = AssignExp(expPackList, deadCount);
+
+ // 鏋勯�� BattleDrops 骞跺垎閰�
+ for (int i = 0; i < deadCount; i++)
+ {
+ BattleObject deadTarget = battleField.battleObjMgr.GetBattleObject((int)deadPackList[i].ObjID);
+ List<ItemModel> itemModelDrops = dropAssign[i];
+ List<int> itemModelDropsIndexList = new List<int>(
+ from item in itemModelDrops select item.gridIndex);
+ BattleDrops battleDrops = new BattleDrops()
+ {
+ rectTransform = deadTarget.heroRectTrans,
+ dropItemPackIndex = itemModelDropsIndexList,
+ expDrops = expAssign[i]
+ };
+ deadTarget.PushDropItems(battleDrops);
+ }
+
+ // 鍒嗗彂姝讳骸鍖�
+
+ battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>(deadPackList));
+ foreach (var deadPack in deadPackList)
+ {
+ packList.Remove(deadPack);
+ }
+ deadPackList.Clear();
+ }
+
+
+
+ // 鍒嗛厤鎺夎惤
+ protected List<List<ItemModel>> AssignDrops(List<ItemModel> itemList, int deadCount)
+ {
+ var dropAssign = new List<List<ItemModel>>(deadCount);
+ for (int i = 0; i < deadCount; i++)
+ dropAssign.Add(new List<ItemModel>());
+ for (int i = 0; i < itemList.Count; i++)
+ dropAssign[i % deadCount].Add(itemList[i]);
+ return dropAssign;
+ }
+
+ // 鍒嗛厤缁忛獙锛氭瘡涓師濮嬪寘閮藉钩鍧囧垎閰嶅埌姣忎釜姝讳骸瀵硅薄
+ protected List<List<HB405_tagMCAddExp>> AssignExp(List<HB405_tagMCAddExp> expList, int deadCount)
+ {
+ var expAssign = new List<List<HB405_tagMCAddExp>>(deadCount);
+ for (int i = 0; i < deadCount; i++)
+ expAssign.Add(new List<HB405_tagMCAddExp>());
+
+ foreach (var expPack in expList)
+ {
+ long totalExp = GeneralDefine.GetFactValue(expPack.Exp, expPack.ExpPoint);
+ long avgExp = totalExp / deadCount;
+ long remain = totalExp % deadCount;
+
+ for (int i = 0; i < deadCount; i++)
+ {
+ long assignExp = avgExp + (i < remain ? 1 : 0);
+ long expPoint = assignExp / 100000000;
+ long exp = assignExp % 100000000;
+ var newPack = new HB405_tagMCAddExp
+ {
+ Exp = (uint)exp,
+ ExpPoint = (uint)expPoint,
+ Source = expPack.Source // 淇濇寔鍘熷寘鏉ユ簮
+ };
+ expAssign[i].Add(newPack);
+ }
+ packList.Remove(expPack);
+ }
+ return expAssign;
+ }
+
+
+
+ protected void CheckAfterDeadhPack()
+ {
List<int> removeIndexList = new List<int>();
- for (int i = deadPackIndex + 1; i < packList.Count; i++)
+ for (int i = 0; i < packList.Count; i++)
{
var pack = packList[i];
@@ -455,16 +635,122 @@
}
public virtual bool IsFinished()
{
- return isFinished;
+ if (!isPlay)
+ {
+ return false;
+ }
+
+ if (skillEffect != null)
+ {
+ if (!skillEffect.IsFinished())
+ {
+ return false;
+ }
+ else
+ {
+ skillEffect = null;
+ OnSkillFinished();
+ return false;
+ }
+ }
+
+ 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;
+ }
+ HandleDead();
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()
{
+ if (skillEffect != null)
+ {
+ if (!skillEffect.IsFinished())
+ {
+ return;
+ }
+ else
+ {
+ skillEffect = null;
+ OnSkillFinished();
+ }
+
+ }
+
+ if (otherSkillAction != null)
+ {
+ if (!otherSkillAction.IsFinished())
+ {
+ return;
+ }
+ else
+ {
+ otherSkillAction = null;
+ OnSkillFinished();
+ }
+ }
+
while (packList.Count > 0)
{
var pack = packList[0];
@@ -475,11 +761,18 @@
var combinePack = pack as CustomHB426CombinePack;
if (combinePack.startTag.Tag.StartsWith("Skill_"))
{
+ 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