123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- using XGame.Database;
- using XGame.Framework.Components;
- using XGame.Framework.Interfaces;
- using XGame.Framework.Time;
- namespace FL.Battle.Components
- {
- public interface IStatesContext
- {
- IEntity Entity { get; }
- ITimeModule Time { get; }
- IAnimator Animator { get; }
- MoveComponent Move { get; }
- SkillComponent Skill { get; }
- }
- /// <summary>
- /// 状态组件
- /// </summary>
- public class StatesComponent : Component<IStatesContext>, IReset
- {
- private ITimer _deadTimer;
- protected override void OnDispose()
- {
- _deadTimer?.Cancel();
- _deadTimer = null;
- }
- public void AddState(EEntityState state)
- {
- var entity = Context.Entity;
- if (entity.IsDead)
- { // 已经死亡,不能再修改状态
- return;
- }
- if ((state & EEntityState.Dead) != 0)
- { // 死亡,先移除所有状态
- entity.RemoveState(EEntityState.All);
- }
- var isChanged = entity.AddState(state);
- if (entity.IsDead)
- {
- Context.Move.StopMove();
- Context.Animator.Play(EAnimationName.idle);
- Context.Skill.Stop(false);
- //TODO 死亡动作 停止所有组件
- _deadTimer = Context.Time.AddDelayTimer(500, () =>
- { // 死亡事件通知
- _deadTimer = null;
- EventSingle.Instance.Notify(EventDefine.GameMainMapRemoveEntity, entity.EntityId);
- });
- }
- else if (state is EEntityState.Dizzy or EEntityState.Freeze or EEntityState.Palsy)
- {
- Context.Move.Pause();
- Context.Skill.Pause(state);
- var animation = EAnimationName.palsy;
- if (isChanged)
- { // 动作显示优先级: Dizzy > Freeze > palsy
- if (state is EEntityState.Dizzy || IsState(EEntityState.Dizzy))
- {
- animation = EAnimationName.dizzy;
- }
- else if (state is EEntityState.Freeze || IsState(EEntityState.Freeze))
- {
- animation = EAnimationName.freeze;
- }
- }
- Context.Animator.Play(animation);
- }
- }
- public void RemoveState(EEntityState state)
- {
- var entity = Context.Entity;
- if (entity.IsDead)
- { // 已经死亡,不能再修改状态
- return;
- }
- var isChanged = entity.RemoveState(state);
- if (state is EEntityState.Dizzy or EEntityState.Freeze or EEntityState.Palsy)
- { //
- // 动作显示优先级: Dizzy > Freeze > palsy
- if (isChanged == false || IsState(EEntityState.Dizzy))
- { // 状态没有改变 || 还在眩晕
- return;
- }
- if (/*state is EEntityState.Dizzy && */IsState(EEntityState.Freeze))
- { // 移除的是眩晕且还在冰冻状态,更换动作
- Context.Animator.Play(EAnimationName.freeze);
- return;
- }
- if (IsState(EEntityState.Palsy))
- {
- Context.Animator.Play(EAnimationName.palsy);
- return;
- }
- Context.Animator.Play(EAnimationName.idle);
- Context.Move.Resume();
- Context.Skill.Resume();
- }
- }
- public bool IsState(EEntityState state)
- {
- return Context.Entity.IsState(state);
- }
- public void Reset()
- {
- Context.Entity.RemoveState(EEntityState.All);
- Context.Animator.Play(EAnimationName.idle);
- }
- //public EEntityState State
- //{
- // get => Context.Entity.State;
- // set
- // {
- // var entity = Context.Entity;
- // if (value != EEntityState.Idle && value == entity.State)
- // {
- // return;
- // }
- // if (entity.IsDead)
- // { // 已经死亡,不能再修改状态
- // return;
- // }
- // entity.State = value;
- // //VM.StateText.text = value.ToString();
- // //Animation
- // if (value == EEntityState.Dead)
- // {
- // //TODO 死亡动作 停止所有组件
- // _deadTimer = Context.Time.AddDelayTimer(500, () =>
- // { // 死亡事件通知
- // _deadTimer = null;
- // EventSingle.Instance.Notify(EventDefine.GameMainMapRemoveEntity, entity.EntityId);
- // });
- // }
- // else if (value == EEntityState.Idle)
- // Context.Animator.Play(EAnimationName.idle);
- // }
- //}
- }
- }
|