public static T[] GetStates <T, TState, TTrigger>(this IStateMachine <TState, TTrigger> fsm) { List <T> statesList = null; TState[] states = fsm.GetStates(); foreach (TState state in states) { if (fsm.GetStateById(state) is T cast) { if (statesList == null) { statesList = new List <T>(); } statesList.Add(cast); } } if (statesList != null) { return(statesList.ToArray()); } return(null); }
public static bool ContainsStateByReference <TState, TTrigger>(this IStateMachine <TState, TTrigger> fsm, IState stateRef) { TState[] states = fsm.GetStates(); foreach (TState state in states) { if (fsm.GetStateById(state) == stateRef) { return(true); } } return(false); }
public static T GetState <T, TState, TTrigger>(this IStateMachine <TState, TTrigger> fsm) { T candidate = default; TState[] states = fsm.GetStates(); foreach (TState state in states) { if (fsm.GetStateById(state) is T cast) { candidate = cast; break; } } return(candidate); }
public static void RemoveBehaviourFrom <TState, TTrigger>(this IStateMachine <TState, TTrigger> fsm, TState stateId, IStateBehaviour behaviour) { if (behaviour == null) { throw new ArgumentNullException(nameof(behaviour)); } IState stateObj = fsm.GetStateById(stateId); if (stateObj is IBehaviouralState cast) { cast.RemoveBehaviour(behaviour); } else { throw new InvalidOperationException("State object with id " + stateId + " is not of type " + typeof(IBehaviouralState).Name); } }
public static void AddBehavioursTo <TState, TTrigger>(this IStateMachine <TState, TTrigger> fsm, TState stateId, params IStateBehaviour[] behaviours) { if (behaviours.Any(behaviour => behaviour == null)) { throw new ArgumentNullException("some behaviour parameter is null"); } IState stateObj = fsm.GetStateById(stateId); if (stateObj is IBehaviouralState cast) { for (int i = 0; i < behaviours.Length; i++) { cast.AddBehaviour(behaviours[i]); } } else { throw new InvalidOperationException("State object with id " + stateId + " is not of type " + typeof(IBehaviouralState).Name); } }