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; } } /// /// 状态组件 /// public class StatesComponent : Component, 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); // } //} } }