Files
hjha-server/GlobalSever/FSM/FSMState.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

189 lines
5.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using MrWu.Debug;
namespace GlobalSever.FSM
{
/// <summary>
/// 有限状态机状态
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class FSMState<T> where T : class
{
/// <summary>
/// 状态类型
/// </summary>
public virtual Type StateType => this.GetType();
public virtual int StateId { get; protected set; } = -1;
internal FSMState<T> NextState;
internal FSMState<T> LastState;
/// <summary>
/// 持续时间, 单位毫秒
/// </summary>
public int RunDuratime { get; set; }
/// <summary>
/// 延迟执行任务列表
/// </summary>
private List<DelayedAction> _delayedActions = new List<DelayedAction>();
public FSMState()
{
}
public FSMState(int stateId)
{
StateId = stateId;
}
/// <summary>
/// 有限状态机初始化时调用
/// </summary>
/// <param name="fsm"></param>
public virtual void OnInit(FSM<T> fsm)
{
RunDuratime = 0;
}
/// <summary>
/// 有限状态机进入时调用
/// </summary>
/// <param name="fsm"></param>
public virtual void OnEnter(FSM<T> fsm)
{
Debug.Log($"{StateType.Name} OnEnter");
}
/// <summary>
/// 轮训
/// </summary>
/// <param name="fsm">有限状态机</param>
/// <param name="interval">时间间隔</param>
public virtual void Update(FSM<T> fsm, float interval)
{
// 处理延迟执行的任务
if (_delayedActions.Count > 0)
{
for (int i = _delayedActions.Count - 1; i >= 0; i--)
{
var delayedAction = _delayedActions[i];
delayedAction.RemainingMsTime -= (int)interval;
if (delayedAction.RemainingMsTime <= 0)
{
delayedAction.Action?.Invoke();
_delayedActions.RemoveAt(i);
}
}
}
}
/// <summary>
/// 有限状态机离开时调用
/// </summary>
/// <param name="fsm"></param>
public virtual void OnLeave(FSM<T> fsm)
{
RunDuratime = 0;
ClearDelayedActions();
Debug.Log($"{StateType.Name} OnLevel");
}
/// <summary>
/// 有限状态机销毁时调用
/// </summary>
/// <param name="fsm"></param>
public virtual void OnDestroy(FSM<T> fsm)
{
}
/// <summary>
/// 切换到下一个状态
/// </summary>
public void ChangeNextState(FSM<T> fsm, int delayTime = 0)
{
if (NextState != null)
ChangeState(fsm, NextState.StateType, delayTime);
}
/// <summary>
/// 切换状态
/// </summary>
public void ChangeState(FSM<T> fsm, FSMState<T> state)
{
ChangeState(fsm, state.StateType);
}
/// <summary>
/// 切换状态
/// </summary>
/// <param name="fsm"></param>
/// <typeparam name="TState"></typeparam>
public void ChangeState<TState>(FSM<T> fsm, int delayTime = 0) where TState : FSMState<T>
{
ChangeState(fsm, typeof(TState), delayTime);
}
/// <summary>
/// 切换状态
/// </summary>
/// <param name="fsm"></param>
/// <param name="stateType"></param>
public void ChangeState(FSM<T> fsm, Type stateType, int delayTime = 0)
{
FSM<T> fsmImplement = (FSM<T>)fsm;
if (stateType == null)
{
throw new Exception("State type is invalid.");
}
if (!typeof(FSMState<T>).IsAssignableFrom(stateType))
{
throw new Exception($"State type '{stateType}' is invalid.");
}
fsmImplement.ChangeState(stateType, delayTime);
}
/// <summary>
/// 延迟执行Action
/// </summary>
/// <param name="action">要执行的Action</param>
/// <param name="delayMs">延迟时间,单位毫秒</param>
public void DelayedExecute(Action action, int delayMs)
{
if (action == null || delayMs <= 0)
return;
_delayedActions.Add(new DelayedAction
{
Action = action,
RemainingMsTime = delayMs
});
}
/// <summary>
/// 清除所有延迟执行的任务
/// </summary>
public void ClearDelayedActions()
{
_delayedActions.Clear();
}
}
/// <summary>
/// 延迟执行任务
/// </summary>
internal class DelayedAction
{
public Action Action { get; set; }
/// <summary>
/// 剩余时间ms
/// </summary>
public int RemainingMsTime { get; set; }
}
}