StatesComponent.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using XGame.Database;
  2. using XGame.Framework.Components;
  3. using XGame.Framework.Interfaces;
  4. using XGame.Framework.Time;
  5. namespace FL.Battle.Components
  6. {
  7. public interface IStatesContext
  8. {
  9. IEntity Entity { get; }
  10. ITimeModule Time { get; }
  11. IAnimator Animator { get; }
  12. MoveComponent Move { get; }
  13. SkillComponent Skill { get; }
  14. }
  15. /// <summary>
  16. /// 状态组件
  17. /// </summary>
  18. public class StatesComponent : Component<IStatesContext>, IReset
  19. {
  20. private ITimer _deadTimer;
  21. protected override void OnDispose()
  22. {
  23. _deadTimer?.Cancel();
  24. _deadTimer = null;
  25. }
  26. public void AddState(EEntityState state)
  27. {
  28. var entity = Context.Entity;
  29. if (entity.IsDead)
  30. { // 已经死亡,不能再修改状态
  31. return;
  32. }
  33. if ((state & EEntityState.Dead) != 0)
  34. { // 死亡,先移除所有状态
  35. entity.RemoveState(EEntityState.All);
  36. }
  37. var isChanged = entity.AddState(state);
  38. if (entity.IsDead)
  39. {
  40. Context.Move.StopMove();
  41. Context.Animator.Play(EAnimationName.idle);
  42. Context.Skill.Stop(false);
  43. //TODO 死亡动作 停止所有组件
  44. _deadTimer = Context.Time.AddDelayTimer(500, () =>
  45. { // 死亡事件通知
  46. _deadTimer = null;
  47. EventSingle.Instance.Notify(EventDefine.GameMainMapRemoveEntity, entity.EntityId);
  48. });
  49. }
  50. else if (state is EEntityState.Dizzy or EEntityState.Freeze or EEntityState.Palsy)
  51. {
  52. Context.Move.Pause();
  53. Context.Skill.Pause(state);
  54. var animation = EAnimationName.palsy;
  55. if (isChanged)
  56. { // 动作显示优先级: Dizzy > Freeze > palsy
  57. if (state is EEntityState.Dizzy || IsState(EEntityState.Dizzy))
  58. {
  59. animation = EAnimationName.dizzy;
  60. }
  61. else if (state is EEntityState.Freeze || IsState(EEntityState.Freeze))
  62. {
  63. animation = EAnimationName.freeze;
  64. }
  65. }
  66. Context.Animator.Play(animation);
  67. }
  68. }
  69. public void RemoveState(EEntityState state)
  70. {
  71. var entity = Context.Entity;
  72. if (entity.IsDead)
  73. { // 已经死亡,不能再修改状态
  74. return;
  75. }
  76. var isChanged = entity.RemoveState(state);
  77. if (state is EEntityState.Dizzy or EEntityState.Freeze or EEntityState.Palsy)
  78. { //
  79. // 动作显示优先级: Dizzy > Freeze > palsy
  80. if (isChanged == false || IsState(EEntityState.Dizzy))
  81. { // 状态没有改变 || 还在眩晕
  82. return;
  83. }
  84. if (/*state is EEntityState.Dizzy && */IsState(EEntityState.Freeze))
  85. { // 移除的是眩晕且还在冰冻状态,更换动作
  86. Context.Animator.Play(EAnimationName.freeze);
  87. return;
  88. }
  89. if (IsState(EEntityState.Palsy))
  90. {
  91. Context.Animator.Play(EAnimationName.palsy);
  92. return;
  93. }
  94. Context.Animator.Play(EAnimationName.idle);
  95. Context.Move.Resume();
  96. Context.Skill.Resume();
  97. }
  98. }
  99. public bool IsState(EEntityState state)
  100. {
  101. return Context.Entity.IsState(state);
  102. }
  103. public void Reset()
  104. {
  105. Context.Entity.RemoveState(EEntityState.All);
  106. Context.Animator.Play(EAnimationName.idle);
  107. }
  108. //public EEntityState State
  109. //{
  110. // get => Context.Entity.State;
  111. // set
  112. // {
  113. // var entity = Context.Entity;
  114. // if (value != EEntityState.Idle && value == entity.State)
  115. // {
  116. // return;
  117. // }
  118. // if (entity.IsDead)
  119. // { // 已经死亡,不能再修改状态
  120. // return;
  121. // }
  122. // entity.State = value;
  123. // //VM.StateText.text = value.ToString();
  124. // //Animation
  125. // if (value == EEntityState.Dead)
  126. // {
  127. // //TODO 死亡动作 停止所有组件
  128. // _deadTimer = Context.Time.AddDelayTimer(500, () =>
  129. // { // 死亡事件通知
  130. // _deadTimer = null;
  131. // EventSingle.Instance.Notify(EventDefine.GameMainMapRemoveEntity, entity.EntityId);
  132. // });
  133. // }
  134. // else if (value == EEntityState.Idle)
  135. // Context.Animator.Play(EAnimationName.idle);
  136. // }
  137. //}
  138. }
  139. }