S3201.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using System.Collections.Generic;
  2. using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
  3. using Common.Combat.FxAILogic;
  4. using Core.Triiger;
  5. using GameLogic.Combat.CombatTool;
  6. using UnityEngine;
  7. namespace GameLogic.Combat.Skill.MagicSkill
  8. {
  9. /// <summary>
  10. /// 法宝技能 翡翠葫芦 战场区域形成一个域。敌人的功法弹道进入域后将降低敌人的功法弹道速度
  11. /// 被影响的功法强度降低20%
  12. /// </summary>
  13. public class S3201 : MagicSkillBasic, ITriggerEntity
  14. {
  15. private List<FxAILogicBasic> _fxAILogicBasics = new List<FxAILogicBasic>();
  16. private float _currTime;
  17. private bool _update;
  18. private IUnRegister _unRegister;
  19. private IUnRegister _unRegisterExitEvent;
  20. private CombatHeroEntity target;
  21. protected Vector3 fxPlayPos;
  22. protected Vector3 dir;
  23. private TimeLineEventLogicGroupBasic loopFx;
  24. // protected Vector3 startEulerAngles;
  25. protected Quaternion endEulerAngles;
  26. private SpecialDotInfo specialDotInfo;
  27. // private List<FxAILogicBasic>
  28. protected override void ProMagicUseSkill()
  29. {
  30. CombatHeroEntity[] allHero =
  31. CombatController.currActiveCombat.CombatHeroController.GetHero(!CombatHeroEntity.IsEnemy);
  32. if (allHero == null || allHero.Length <= 0)
  33. {
  34. SkillPlayFinish();
  35. return;
  36. }
  37. target = allHero[0];
  38. Vector3 rootPos = CombatMagicWeaponEntity.RootMagicWeaponControl.combatHeroEntity.dotPos;
  39. Vector3 targetPos = target.dotPos;
  40. dir = (targetPos - rootPos);
  41. fxPlayPos = dir * 0.5f + rootPos;
  42. dir = dir.normalized;
  43. Vector3 newTargetPos = fxPlayPos + new Vector3(1, 5, 0);
  44. endEulerAngles = Quaternion.LookRotation((fxPlayPos - newTargetPos).normalized) *
  45. Quaternion.Euler(new Vector3(80, 0, 0));
  46. MoveToTargetPosShow magicAttShowBasic = InitMoveToTargetPosShow(newTargetPos, Finish);
  47. SetMagicAttShowBasic(magicAttShowBasic);
  48. }
  49. private void OnTriggerExitEvent(Collider collider, ITriggerEntity triggerEntity)
  50. {
  51. if (triggerEntity == null)
  52. {
  53. return;
  54. }
  55. FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;
  56. if (fxAILogicBasic != null && fxAILogicBasic.CombatHeroEntity.IsEnemy != CombatHeroEntity.IsEnemy)
  57. {
  58. fxAILogicBasic.extraMoveSpeed += SelfSkillConfig.effectValue[0];
  59. _fxAILogicBasics.Remove(fxAILogicBasic);
  60. }
  61. }
  62. private void OnTriggerEnter(Collider collider, ITriggerEntity triggerEntity)
  63. {
  64. if (triggerEntity == null)
  65. {
  66. return;
  67. }
  68. FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;
  69. if (fxAILogicBasic != null && fxAILogicBasic.CombatHeroEntity.IsEnemy != CombatHeroEntity.IsEnemy)
  70. {
  71. fxAILogicBasic.extraMoveSpeed -= SelfSkillConfig.effectValue[0];
  72. _fxAILogicBasics.Add(fxAILogicBasic);
  73. if (SelfSkillConfig.level > 5)
  74. {
  75. SkillFeaturesData skillFeaturesData = fxAILogicBasic.SkillFeaturesData;
  76. long v = CombatCalculateTool.Instance.GetVlaueRatioForLong(skillFeaturesData.hp, effectValue[2]);
  77. skillFeaturesData.hp -= v;
  78. }
  79. }
  80. }
  81. protected override void ProBreakMagicSkill()
  82. {
  83. AllFinish();
  84. }
  85. protected override void MagicSkillUpdate(float time)
  86. {
  87. if (_update)
  88. {
  89. _currTime += time;
  90. CombatHeroEntity.GameObject.transform.rotation =
  91. Quaternion.Lerp(CombatHeroEntity.GameObject.transform.rotation, endEulerAngles, _currTime * 2);
  92. specialDotInfo.targetTran.position = fxPlayPos;
  93. specialDotInfo.targetTran.forward = dir;
  94. if (_currTime >= SelfSkillConfig.effectValue[1])
  95. {
  96. AllFinish();
  97. }
  98. }
  99. }
  100. private void AllFinish()
  101. {
  102. loopFx.CloseLoopFx();
  103. ActivationTimeLineData("sk1_xiaoshi");
  104. _unRegister?.UnRegister();
  105. _unRegisterExitEvent?.UnRegister();
  106. _unRegisterExitEvent = null;
  107. _unRegister = null;
  108. _update = false;
  109. SkillPlayFinish();
  110. for (int i = 0; i < _fxAILogicBasics.Count; i++)
  111. {
  112. _fxAILogicBasics[i].extraMoveSpeed += SelfSkillConfig.effectValue[0];
  113. }
  114. _fxAILogicBasics.Clear();
  115. }
  116. private void Finish()
  117. {
  118. loopFx = ActivationTimeLineData("sk1", customizePos: new Vector3[] { fxPlayPos });
  119. // timeLineEventLogicGroupBasic.TimeLineUpdateEnd = () => { };
  120. specialDotInfo = CombatHeroEntity.GetSpecialDotInfo("lingyu");
  121. specialDotInfo.targetTran.position = fxPlayPos;
  122. specialDotInfo.targetTran.forward = dir;
  123. _unRegister = specialDotInfo.targetTran.gameObject.OnTriggerEnterEvent(this, OnTriggerEnter);
  124. _currTime = 0;
  125. _update = true;
  126. _unRegisterExitEvent = specialDotInfo.targetTran.gameObject.OnTriggerExitEvent(this, OnTriggerExitEvent);
  127. }
  128. public string tag { get; }
  129. }
  130. }