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);
// }
//}
}
}